Задание 1
I. Постановка задачи
Разработать в среде Turbo Pascal программу решения четырех взаимосвязанных задач:
a. расчет элементов квадратной матрицы A = (aij), i,j – 1,2,…,n по заданной формуле:
b. вычисление элементов вектора X = (xi), i = 1,2,…,n по заданному правилу:
c. упорядочить элементы четных строк матрицы А по убыванию значений;
d. вычисление значения y по заданной формуле:
Решение:
II. Алгоритм задачи, описанный в виде блок-схемы:
задача а):
3
|
|
|
|
|
задача b):
|
|
12
|
|
15
16
|
задача с):
| |||
|
|
20
|
|
|
|
|
|
|
Задача d):
|
|
|
|
|
Описание блоков схемы:
Задача а):
1 - начало алгоритма;
2 - ввод n- размерности матрицы А;
3,4,5 – расчёт значений элементов матрицы по заданной формуле:
;
6,7,8 – вывод матрицы;
Задача b):
9 – начальное значение суммы S:=0;
10 – начальное значение произведения P:=1;
11,12,13,14,15 – расчет значений элементов вектора х по правилу:
16 – вывод вектора Х;
Задача с):
17 – организация цикла по i;
18 – проверка условия чётности строк;
19 – организация цикла по j;
20,21,22,23,24 – сортировка элементов чётных строк матрицы А по убыванию значений методом пузырька;
25,26,27 – вывод преобразованной матрицы А;
Задача d):
28 – первоначальное значение суммы Y=0;
29 - организация цикла по i;
30 – проверка условия чётности строк;
31 – расчёт значения у по заданной формуле:
32 – вывод значения y;
33 – конец алгоритма.
III. Алгоритм задачи, описанный на языке программирования Pascal-программа:
Program zadaha;
Const r=100;
Var a: array[1..r,1..r] of real; x: array[1..r] of real;
i,j,n,k: integer; s,p,m,z,y: real;
begin {задача а}
writeln(‘vvedite razmernost matrizi n=?’); {запрашиваем и
readln(n); вводим размер матрицы А}
for i:=1 to n do {расчёт элементов
for j:=1 to n do матрицы А по формуле}
a[i,j]:=sin(2*i+5*j);
writeln(‘matriza A:’);
writeln;
for i:=1 to n do
begin
for j:=1 to n do {вывод матрицы А}
writeln(a[i,j]:6:2,’ ‘);
writeln;
end;
s:=0; {задача b;}
{ сумме присваиваем нулевое, произведению единичное значение}
p:=1;
writeln(‘vector X:’);
writeln;
for i:=1 to n do
begin
for j:=1 to n do
begin {вычисление элементов вектора Х}
p:=p*a[i,j];
s:=s+cos(a[i,j]);
x[i]:=p+s;
writeln(x[i]:6:2,’ ‘); {вывод вектора Х}
writeln;
end;
end;
for i:=1 to n do {задача с}
if i mod 2 =0 then {условие чётности строк}
begin
{сортировка элементов чётных строк матрицы A по убыванию методом пузырька}
for j:=1 to n-1 do
begin
for k:=1 to n-1 do
if a[i,k]>a[i,k+1] then
begin
z:=a[i,k];
a[i,k]:=a[i, k+1];
a[i, k+1]:=z;
end;
end;
writeln(‘otsortirovannay matriza A:’);
writeln;
for i:=1 to n do
begin {вывод преобразованной матрицы А}
for j:=1 to n do
writeln(a[i,j]:6:2,’ ‘);
writeln;
end;
y:=0; {задача d}
for i:=2 to n do
begin
if i mod 2 = 0 then {условие чётности строк}
y:=y+x[i]*x[n+1-i]; {расчёт значений у}
end;
writeln(‘y=’,y:6:2); {вывод y}
readln;
end.
IV. Описание используемых модулей и основных операторов.
При решении задачи № 1 использовались следующие операторы
Операторы — отдельные инструкции, входящие в программу.
Простые операторы. Простыми называются операторы, которые не содержат в себе других операторов.
К простым операторам относятся:
¨ оператор присваивания;
¨ оператор безусловного перехода;
¨ пустой оператор;
¨ операторы ввода-вывода.
Оператор присваивания
Оператор присваивания является важнейшим оператором любого языка программирования. С его помощью можно присвоить переменной значение выражения.
Имеет вид:
<имя>:= <выражение>;
Оператор работает следующим образом:
· вначале оценивается выражение, т.е. определяется его значение;
· полученное значение присваивается идентификатору, стоящему в левой части оператора.
В результате прежнее значение идентификатора перезаписывается, а поэтому старое значение утрачивается. Знаком присваивания в Паскале является совокупность знаков (:=).
Нужно запомнить: слева от знака присваивания не может быть выражение.
При использовании оператора присваивания следует учитывать, что идентификатор и выражение должны иметь одинаковый тип. Имеется лишь одно исключение из этого правила: идентификатор может иметь тип REAL, а выражение значение типа INTEGER.
Операторы ввода данных
Для ввода данных в языке Паскаль предусмотрены стандартные зарезервированные слова — READ и READLN.
Оператор ввода служит для ввода данных в процессе выполнения программы и используется в виде:
READ (а1, а2, а3, …,аn) — каждое вводимое значение присваивается последовательно переменным а1, а2, а3, …,аn;
READLN (а1, а2, а3, …,аn) — каждое вводимое значение присваивается последовательно переменным а1, а2, а3, …,аn, после чего происходит переход на новую строку (следующий оператор ввода будет вводить данные с новой строки);
READLN — переход на новую строку при вводе данных.
Логические данные в Паскале вводить не разрешается.
При вводе числовые данные должны разделяться пробелом или символом окончания ввода (клавиша enter).
Пример ввода:
VAR a, b, c: REAL;
k, t: INTEGER;
....
READ (a, b, c);
READLN;
READ (k, t);
После набора на экране дисплея всей программы и запуска ее на выполнение происходит останов машины при встрече READ (a, b, c). На клавиатуре компьютера необходимо набрать три действительных числа, затем с новой строки (выполняется оператор READLN) — два
Числа можно отделять друг от друга не только пробелами, но и символом окончания ввода (клавиша enter), т.е. каждое число вводится с новой строки.
Операторы вывода
Для вывода значений в языке Паскаль предусмотрены стандартные зарезервированные слова — WRITE и WRITELN.
Общий вид записи при выводе значений целого типа:
WRITE (b: m);
WRITELN (b: m); где b — имя выводимой переменной, m — константа или выражение целого типа.
Например: WRITE (х: 6, у: 8);
Значения переменных х и у размещаются в одной строке и занимают соответственно шесть и восемь позиций. Каждое значение размещается в отведенном поле и занимает крайние правые позиции. При этом незаполненные позиции остаются свободными, образуя пробелы. Если значение переменной не размещается в отведенном поле, то увеличивается число позиций.
Общий вид записи при выводе значений действительного типа с фиксированной точкой:
WRITE (b: m: n);
WRITELN (b: m: n); где m — поле, отводимое под все значение, n — часть поля, отводимого под дробную часть числа.
С т р у к т у р и р о в а н н ы е о п е р а т о р ы. Структурированными называются операторы, состоящие из других операторов.
Они подразделяются:
¨ составной оператор;
¨ условный оператор;
¨ операторы повтора.
Составной оператор
Составной оператор — это последовательность произвольных операторов программы, заключенная в операторные скобки – зарезервированные слова BEGIN…END. Операторы разделяются “; ”.
Составной оператор служит, в первую очередь, для того, чтобы несколько операторов синтаксически объединить в один. Это часто требуется там, где нужно выполнить несколько операторов, когда допустим лишь один. Понятие составного оператора позволяет с помощью команд BEGIN и END объединить несколько операторов и рассматривать их с точки зрения синтаксиса как один оператор. На характер операторов, входящих в составной оператор, не накладывается никаких ограничений.
Среди них могут быть и другие составные операторы.
BEGIN
………
BEGIN
………
………
END;
………
END;
Условный оператор
Условный оператор позволяет проверить некоторое условие и в зависимости от результата выполнить то или иное действие. С помощью этого оператора программируются алгоритмы разветвляющейся структуры.
Структура условного оператора:
IF <условие> THEN <оператор 1> ELSE<оператор 2>, где IF, THEN, ELSE — зарезервированные слова (если, то, иначе); <условие> — произвольное выражение логического типа; <оператор 1>, <оператор 2> — любые операторы языка.
Условный оператор работает по следующему алгоритму:
¨ вначале вычисляется выражение <условие>;
¨ если результат есть TRUE (истина), то выполняется <оператор 1>, а оператор <оператор 2> пропускается;
¨ если результат есть FALSE (ложь), наоборот, <оператор 1> пропускается, а выполняется <оператор 2>.
Правила использования условного оператора:
1. Перед ELSE никогда не ставится точка с запятой (поскольку это еще не конец оператора IF).
2. Если требуется выполнить после THEN и ELSE несколько операторов, они обрамляются командами BEGIN и END, образуя тем самым составной оператор.
3. Часть ELSE<оператор 2> условного оператора может быть опущена. Тогда при значении TRUE условного выражения выполняется <оператор 1>, в противном случае этот оператор пропускается.
Если ELSE отсутствует, а после оператора THEN вновь стоит оператор IF, то возникает неоднозначность трактовки условий. Эта неоднозначность решается следующим образом: любая встретившаяся часть ELSE соответствует ближайшей к ней “сверху” части THEN условного оператора.
Операторы повтора. Циклы
Алгоритмы циклической структуры (повторение) —