2361
.pdfWrite (S);
End.
ОПЕРАТОРЫ ЦИКЛА
На языке PASCAL существует три типа оператора цикла, различающиеся в основном заданным количеством циклов и заранее неизвестным количеством циклов. Рассмотрим их последовательно.
ОПЕРАТОР FOR-TO-DO
Данный оператор применим тогда, когда заранее известно количество циклов. В общем виде такой оператор можно представить:
FOR_<переменная:>=<начальное значение>_TO_<конечное значение>_DO_<какой-либо оператор>
Здесь: FOR – для; TO – до; DO – выполнить;
а значением может быть: математическое выражение целого типа, целое число или переменная целого типа.
Перевести данный оператор на русский язык можно так: для (for) какой-либо переменной в цикле необходимо изменять свое значение от начального до (to) конечного значения, выполняя (do) при этом многократно (в цикле) какой-либо оператор.
Таким образом, в цикле (как видно из общей схемы оператора) переменная на каждом цикле получает свое новое значение, и каждое из этих числовых значений подставляется каждый раз в оператор после слова DO.
Обычно в этом операторе начальное значение меньше конечного. В этом случае переменная от своего
начального до конечного значения «шагает» с шагом равным 1.
Следует отметить, что переменную в этом операторе иногда называют параметром цикла. После ключевого слова DO следует только один оператор. Если их должно быть несколько, то их необходимо заключить в операторные скобки BEGIN – END. Если операторов несколько, а операторные скобки отсутствуют, то выполнится только первый оператор в цикле, а остальные будут пропущены, а все остальные будут выполнены при выходе из цикла.
В том случае, когда в этом операторе начальное значение должно быть меньше конечного, переменная уменьшается с шагом 1, то вместо слова TO в данном операторе должно быть слово DOWNTO.
Рассмотрим конкретные примеры: Задача 1.
Пусть требуется составить программу для табулирования следующей функции в цикле.
|
|
|
|
|
Program_tab; |
||
y |
ax2 bx c , где |
|
|
Var |
|||
a=0,1, |
|
|
|
|
y, a, b, |
||
c: real; |
|
|
|
|
|
|
|
b=3,7, |
|
|
|
|
x: |
||
integer; |
|
|
|
|
|
|
|
c |
1,2 |
*10 |
1 |
|
|
Begin |
|
|
|
||||||
|
|
|
|
|
|||
|
|
|
|
|
|
a:=0.1; |
|
1 |
x |
20, |
|
|
b:=3.7; |
||
|
x =1, |
|
|
|
c:=1.2e-1; |
||
|
|
|
For_x:=1_to_20_ |
do |
|||
y:=a*sqr(x)+b*x+c; |
Begin |
|
|
|
|||
|
|
|
|||||
|
|
|
|
Writeln (‗x=‘, x, ‗y=‘, y);
End;
End.
Аналогично осуществляется цикличная процедура табулирования для разрывных функций. В этом случае после слова do в операторных скобках должен стоять оператор if-then-else…, а после оператора if, перед end, должен стоять writeln.
Рассмотрим другой пример на применение оператора цикла:
Задача 2.
Составить программу для вычисления в цикле следующего выражения:
5 |
|
|
|
|
S |
aibi |
a1b1 a2b2 |
... a5b5 |
|
i 1 |
|
|
|
|
где a1 |
1 |
|
b1 |
1 |
|
||||
a2 |
2 |
|
b2 |
2 |
. |
|
|
. |
|
. |
|
|
. |
|
. |
|
|
. |
|
a5 |
5 |
|
b5 |
5 |
Таким образом, здесь заданы два массива a и b размерностью, равной 5. Их необходимо математически обработать с помощью программы:
Program_sum;
Var
i:integer;
а, b: array 1..5 _of_integer;
Begin
For_i:=1_to_5_do |
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|||
Read (a i , b i ); |
|
|
1-ый цикл |
||||||
|
|||||||||
S:=0; |
|
|
|
|
|||||
|
|
For i:=1_to_5_do |
|
|
|
|
|||
|
|
|
|
|
|
||||
|
|
S:=s+ a i b i ); |
|
|
|
2-ой |
|||
|
|
|
|
|
цикл
Write (´s=´, s);
End.
Следует отметить, что в предыдущей программе в качестве параметра цикла выступала простая переменная x. В данной программе в качестве параметра цикла выступает индекс i массивов a и b.
Задача 3.
Составить программу для ввода и вывода на печать на экран дисплея элемента.
А(5,5) – элементарная матрица:
|
1 |
2 |
3 |
4 |
5 |
|
0 |
0 |
0 |
0 |
0 |
A |
1 |
1 |
1 |
1 |
1 |
|
3 |
3 |
3 |
3 |
3 |
|
1 |
2 |
3 |
4 |
5 |
aij |
a [i, j] |
|
|||
Примем |
|
|
|
|
Вариант программы:
Program_matr; Var
i, j: integer;
a: array [1..5, 1..5]_of_integer;
Begin
for_i:=1_to_5_do for_j:=1_to_5_do_read (a[i,j]); for_i:=1_to_5_do
begin for_j:=1_to_5_do write (a[i,j]:3); writeln;
end;
End.
В этой программе имеют место два вложенных друг в друга цикла.
Первый вложенный цикл осуществляет построчный ввод элементов матрицы А. Так как матрица двумерная, то и циклы должны быть двух вложений. При этом внешний цикл (верхний for) действует медленнее, чем внутренний (нижний for), т.е. при одном каком-то i, j изменяется от 1 до 5, тогда переход на внешний цикл осуществляется, где i меняется на 1.
Во втором вложенном цикле осуществляется построчно вывод элементов матриц.
Здесь вложенные скобки begin-end ставятся потому, что во внутреннем цикле имеются два оператора.
Пустой оператор writeln предназначен для того, чтобы осуществить переход печати строки с первой позиции экрана, т.е. для того, чтобы вторая строка была под первой. Внутренний цикл осуществляет печать в строку, writeln осуществляет переход курсора в начало строки.
Следует отметить, что writeln реализуется только при переходе на внешний цикл.
Последнюю программу возьмем за основу и приведѐм ряд программ для обработки элементов
двумерного массива согласно приведѐнным алгоритмам (заданиям).
Задача 4.
Пусть задан двумерный массив, размерностью 5 5. Требуется составить программу для вывода на экран монитора элементов главной диагонали матрицы при введенных 25 элементах.
Program_matr; Var
i, j: integer
a: array [1, 5, 1…5]_of_integer;
Begin
for_i: 1_to_5_do
for_j: 1_10_5_do_read a[i, j]; for_i:=1_to_5_do
Begin
for_j:=1 to 5 do
if i:=j then_write (a[i, j]:3)_else_write (´_´);
Writeln;
End;
End.
Здесь признаком того, что элементaij находится на главной диагонали матрицы является равенство i=j.
Задача 5.
Составить программу для нахождения элемента вышеприведенной матрицы, находящейся на
пересечении второй строки и третьего столбца (результат вывести на экран дисплея).
Program_matr; Var i, j: integer;
a: array [1..5, 1…5]_of_integer;
Begin
for_i:=1_to_5_do; for_j:=1_to_5_do_read a[i, j]; for_i:=1_to_5_do;
Begin
for_j:=1_to_5_do;
if i=2 then if j=3 then_write (a[i,j]); writeln;
end;
End.
Здесь вместо двойного оператора if можно воспользоваться таким оператором:
if (i=2) and (j=3) then write(a[I,j]);
Задача 6.
Составить программу, с помощью которой необходимо элементы главной диагонали оформить в виде одномерного массива и этот массив вывести на печать.
Program_tub;
Var a:array[1..5, 1..5]_of_integer; b:array[1..5]_of_integer;
Begin
i:=1_to_5_do j:=1_to_5_do_begin
writeln (´введите a[´, i:2, ´, ´, j:2, ´] ´);
readln (a[i, j]); end; for_i:=1_to_5_do for_j:=1_to_5_do
if_i=j then b[i]:=а[i, j]); for_i:=1_to_5_do writeln (b[i]);
End.
Задача 7.
Составить программу на обработку двумерной матрицы 5 5 по следующему алгоритму: вместо отрицательных элементов матрицы вставить нули, результат обработки вывести на экран дисплея в виде квадратной матрицы.
Program_matr;
Var a:array[1..5, 1..5]_of_integer; i, j:integer;
Begin
for_i:=1_to_5_do for_j:=1_to_5_do_begin
written (´введите a[´, i:2, ´, ´, j:2, ´] ´); readln (a[i, j]);
end;
S:=0 for_i:=1_to_5_do for_j:=1_to_5_do
if_а[i, j]<0_then_a[i, j]:=0; for_i:=1_to_5_do_begin for_:=1_to_5_do write (a[i, j]:3); Writeln;
End;
End.
Задача 8.
Составить программу для суммирования всех положительных элементов матрицы 5 5.
Pogram_matr; Var i,j:integer;
a:array[1..5,1..5]_of_integer; Begin
For_i:=1_to_5_do
For_j:=1_to_5_do Read(a[i,j]); For_i:=1_to_5_do For_j:=1_to_5_do If_a[i,j]<0_then_s:=s+a[i,j]; Write(s);
End.
Задача 9.
Pogram_matr; Var s,i,j:integer;
a:array[1..5,1..5]_of_integer; Begin
For_i:=1_to_5_do
For_j:=1_to_5_do Read(a[i,j]); For_i:=1_to_5_do For_j:=1_to_5_do If_a[i,j]<0_then_s:=s+a[i,j]; Write(s);
End.
Задача 10.
Составить программу для обработки двумерного массива на предмет определения максимальной величины элемента массива.
Program_matr;
i, j, max:integer; a:array[1..5, 1..5]_of_integer;
Begin
for_i:=1_to_5_do for_j:=1_to_5_do read a[i, j]; max:=a[1, 1]; for_i:=1_to_5_do for_j:=1_to_5_do
if_а[i, j]>max_then_max:=a[i, j]; Writeln(max);
End.