Лекция №3
МАССИВЫ. ОПЕРАТОРЫЦИКЛА
Рассмотренные раньше простые типы данных позволяют использовать в программе одиночные объекты-числа, символы, строки.
В ТР могут использоваться так же объекты, содержащие множество однотипных элементов. Это массивы – формальное объединение нескольких однотипных объектов (чисел, символов и т.п.), рассматриваемое как единое целое. Для описаний массива необходимо указать:
1)имя;
2)общее число входящих в массив элементов;
3) тип этих элементов.
В общем виде массив задаётся так:
VAR <Имя>:ARRAY[размерность] OF <тип>;
При описаний массива используется зарезервированные слова - ARRAY и OF (массив, из). За словом ARRAY в квадратных скобках указывается диапазон, с помощью которого, компилятор определяет общее число элементов массива. Диапазон задаётся левой и правой границами изменения индекса массива, между которыми ставится строго две точки.
Например:
Var A: array [1..10] of real;
B: array [0..50] of char;
C: array [-3..4] of Boolean;
Массив A состоит из 10 элементов, массив B из 51, a массив C из 8 элементов. За словом OF указывается тип элементов, образующих массив.
Доступ к каждому элементу массива в программе осуществляется с помощью индекса – целого числа, служащего своеобразным именем элемента в массиве. При упоминании в программе любого элемента массива, сразу за именем массива должен следовать индекс элемента в квадратных скобках. Например:
A[1]:=6;
B[17]:=’F’;
В правильно составленной программе индекс не должен выходить за пределы, определённые диапазоном.
Массивы – структурированный тип данных. До сих пор мы рассматривали задачи, в которых использовалось небольшое количество данных. Однако часто приходиться работать с большим количеством однотипных данных.
|
Массив – совокупность однотипных данных, хранящиеся в последовательных ячейках памяти и имеющих общее имя. Ячейки называются элементами массива. Все элементы пронумерованы по порядку, и этот номер называется индексом элемента массива.
Все элементы массива имеют один и тот же тип. Сам массив имеет имя – одно для всех элементов. Для обращения к конкретному элементу массива необходимо указать имя массива и в квадратных скобках индекс элемента.
Простейший вид массива – одномерный массив.
Описание массива
<Имя массива>: array[<тип индекса>] of <тип компонентов>;
<Тип компонентов> – это тип данных, который имеет каждый элемент массива, <тип индекса> – границы изменения индекса. Например,
Var A:array[1..10] of integer;
Пример описания размерности массива через константу.
Program massiv;
Const N=10;
Var A:array[1..N] of integer;
Любое действие с массивами должно содержать в себе цикл, в котором перебираются элементы массива. Если вы пишете программу с массивом и не написали оператор цикла (for, while или repeat) – значит, вы ошиблись.
Оператор цикла for. В операторе цикла for указывается его начальное и конечное значения. Каждый раз перед выполнением тела цикла текущее значение сравнивается с конечным. После каждого выполнения тела цикла переменная N увеличивается на 1. Как только N превысит конечное значение, выполнение цикла прекращается. Счетчик цикла всегда имеет порядковый тип.
For N:=1 to 10 do
Writeln(sqr(N));
ОПЕРАТОРЫЦИКЛА (ПОВТОРЕНИЙ)
В языке TP имеются 3 различных оператора, с помощью которых, можно запрограммировать повторяющиеся фрагменты программ.
|
I. Оператор FOR имеет такую структуру:
FOR <параметр цикла>:=<начальное значение> TO <конечное значение> DO <оператор>;
Здесь FOR, TO, DO – Зарезервированные слова (для, до, выполнить).
<параметр цикла> - переменная цикла типа BYTE или INTEGER;
<начальное значение> - начальное значение того же типа;
<конечное значение> - конечное значение того же типа;
<оператор> - произвольный оператор TP (тело цикла). Если тело цикла состоит из нескольких операторов, то они заключаются в операторные скобки BEGIN … END;
В качестве иллюстраций применения оператора FOR рассмотрим программу, осуществляющую ввод с клавиатуры произвольного целого числа N и вычисление суммы всех целых чисел от 1 до N.
Program Summa;
Var i,N:Integer; {i – переменная цикла}
S:real; {S - сумма}
Begin
Writeln(‘N=’); {N – целое число}
Readln (N); {Вводим N}
S:=0; {Нахождение суммы}
For i:=1 to N do
S:=S+i;
Writeln (‘Сумма = ‘, S:6:2); {Выводим результат} End.
Блок-схема для программы Summa.
Например, N = 4
Начальное значение S=0
Первый цикл I = 1
S= 0+1 = 1
Второй цикл I = 2
S=1+2=3
Третий цикл I=3
S=3+3=6
Четвертый цикл I=4
S=6+4=10
Шаг наращивания параметра равен (+1).
Существует другая форма оператора:
FOR <параметр цикла>:=<начальное значение> DOWNTO <конечное значение> DO <оператор>;
Замена зарезервированного слова TO на DOWNTO означает, что шаг наращивания параметра цикла равен (-1).
Например, вывод элементов массива с 10 на 5:
FOR I:=10 DOWNTO 5 DO WRITE (MAS[I]);
II. Оператор цикла WHILE с предпроверкой условия:
WHILE <условие> DO <оператор>;
|
Здесь WHILE, DO – зарезервированные слова (пока [выполняется условие], делать);
<условие> - выражение логического типа.
<оператор> - произвольный оператор TP.
Алгоритм: если выражение <условие> имеет значение TRUE, то выполняется <оператор>, если <условие> имеет значение FALSE, оператор WHILE прекращает свою работу.
III. Оператор цикла REPEAT...UNTIL с постпроверкой условия:
REPEAT <тело цикла> UNTIL <условие>;
Здесь REPEAT, UNTIL – зарезервированные слова (повторять до тех пор, пока не будет выполнено условие);
<тело цикла> - произвольная последовательность операторов TP;
<условие> - выражение логического типа. Перед UNTIL; не ставится.
Алгоритм: операторы <тело цикла> выполняются хотя бы один раз, после чего вычисляется выражение <условие>: если его значение есть FALSE, операторы <тело цикла> повторяются, в противном случае, если истинно TRUE, оператор REPEAT...UNTIL завершают свою работу.
Циклы с условием.
Цикл со счетчиком for отлично выполняет свои функции, когда число повторений тела цикла известно или известны начальное и конечное значения счетчика. Однако такая радужная картина встречается в программировании далеко не всегда. Часто приходится решать задачи, когда число повторений цикла неизвестно и определяется лишь постепенно, после некоторого количества повторений тела цикла. В этом случае применяют другую разновидность цикла – цикл с условием. В языке Паскаль циклов с условием предусмотрено два: условие цикла может проверяться перед телом цикла или после него.
1. Цикл с предусловием. Цикл будет повторяться до тех пор, пока проверка этого условия будет давать результат «истина ». Если условие сразу оказывается ложным, цикл не будет выполнено ни разу.
While <логическое условие> do <оператор-тела_цикла >
Если в теле цикла нужно выполнить несколько операторов, оно оформляется как блок begin … end
|
нет
да
Цикл с постусловием. Проверяет условие после выполнения тела цикла. Цикл будет повторяться до тех пор, пока проверка этого условия будет давать результат «ложь », то есть пока условие не выполнено. Даже если условие сразу окажется истинным, цикл выполняется хотя бы один раз.
Repeat
<Тело цикла>
{Операторы begin … end не требуются!}
Until <Логическое условие>
|
нет
Да
Обращение к каждому элементу массива идет по имени массива и по индексу (номеру) элемента в массиве.
Оператор inc(k) увеличивает значение указанной переменной на единицу. То есть оператор inc(k) аналогичен оператору k :=k+1. По аналогии с inc, в Turbo Pascal имеется еще оператор dec. Он уменьшает значение указанной переменной на единицу. dec(k) аналогичен k:=k-1.
Пример №1.
Дан массив, состоящий из 10 элементов. Найти сумму этих элементов.
Правило: как только в программе появляется массив, сразу же появляется оператор цикла.
Program Lab;
Uses Crt;
Var MAS:array[1..10] of real;
I:integer; {I – переменная цикла}
S:real; {S-сумма 10 элементов}
Begin
ClrScr;
Writeln(‘Ввод массива’);
FOR I:=1 TO 10 DO BEGIN MAS[1]=5
WRITE(‘MAS[‘, I,’]=’); MAS[2]=7
READ(MAS[I]); MAS[3]=12
END;
1). S:=0;
FOR I:=1 TO 10 DO
S:=S+MAS[I];
2). S:=0;
I:=1;
While I<=10 DO Begin
S:=S+MAS[I];
I:=I+1;
End;
3).S:=0;
I:=1;
REPEAT S:=S+MAS[I];
I:=I+1 UNTIL I>10;
Writeln (‘Сумма S = ‘, S:7:2);
End.
Пример №2.
Даны массивы X1,...,X10, Y1,...,Y8. Правила:
|
Здесь: Aj – массив; B - число.
Введем обозначения:
I,J – переменные цикла
S = =x[1]+x[2]+x[3]+…+x[10]
|
Program A4;
Var X:array [1..10] of real;
Y,A:array[1..8] of real;
J,I:integer;
B,S:real; 2. Слева справа от знака = стоят массивы с одинаковой размерностью.
Begin
Writeln (‘Ввод массива X’);
For I:=1 TO 10 DO BEGIN
WRITE(‘X[‘, I,’]=’);
Read (x[I]);
END;
Writeln (‘Ввод массива Y’);
|
WRITE(‘Y[‘, J,’]=’);
Read (y[J];
END;
S:=0;
|
S:=S+x[I];
For J:=1 to 8 do
A[J]:=S/sqr(y[J]);
B:=1;
For J:=1 to 8 do
B:=B*A[J];
Writeln(‘Массив A’);
For J:=1 to 8 do
Writeln (‘A[‘, J,’]=’,A[J]:8:2);
Writeln (‘B= ‘, B:9:2);
End.
Пример №3.
Дано: массив A из 15 элементов и массив B из 10 элементов.
Определить: 1) ;
2) Минимальный элемент массива A и его индекс.
3) Среднее арифметическое для массива A.
Введем обозначения: S1 = S2 =
N- индекс минимального элемента
SR – среднее арифметическое для массива А
AMIN – минимальный элемент (имя пишется слитно).
Program Lab54_4;
Var Y,A:array [1..15] of Real;
K,B:array [1..10] of Real;
N,I,J:integer;
Sr,AMIN,S1,S2:Real;
Begin
Writeln (‘Ввод массива A’);
For I:=1 TO 15 DO BEGIN
WRITE(‘A[‘, I,’]=’);
Read (A[I]);
END;
Writeln (‘Ввод массива B’);
For J:=1 TO 10 DO BEGIN
WRITE(‘B[‘, J,’]=’);
READ (B[J]);
END;
S1:=0;
For J:=1 to 10 do
|
WRITELN(‘Массив y’);
For I:= 1 To 15 DO Begin
Y[I]:=Sqr(A[I])/S1;
Writeln (‘Y[‘, I,’]=’,Y[I]:8:3);
End;
S2:=0;
For I:=1 TO 15 DO
S2:=S2+A[I];
Sr:=S2/15;
Writeln (‘Sr =’,SR:7:2);
Writeln (‘Массив K’);
For J:=1 TO 10 DO BEGIN
K[J]:=B[J]/S2;
WRITELN (‘K[‘, J, ‘]=’,K[J]:8:3);
End;
AMIN:=A[1]; N:=1;
For I:=1 TO 15 DO
IF AMIN>A[I] THEN BEGIN
AMIN:=A[I]; N:=I;
END;
WRITELN (‘AMIN = ‘,AMIN:7:2,’ N=’,N:2);
END.
Блок-схема