Информатика_Гуда
.pdfГлава 6. Алгоритмизация и программирование
Для выполнения операций вывода используются операторы WRITE и WRITELN.
Формат оператора вывода (записи): WRITE (V1, V2,...,VN);
где V1, V2,..., VN — выражение целочисленного типа, вещественного, символьного, строкового, логического.
В операторе вывода можно указывать также формат данных. Для данных типа REAL это делается следующим образом:
WRITE(VAR1: P: Q);
где VAR1 — выражение типа REAL, P — общее число знакомест, Q — число цифр, выводимых после десятичной точки.
Примеры:
Значение А |
Оператор |
Результат |
210.11 |
WRITE(A:8:4) |
210.0400 |
–21.7822 |
WRITE(A:7:2) |
–21.78 |
В последнем примере символ «_» означает пробел.
Если выражение имеет тип integer, char, boolean, то указывается общее число позиций:
WRITE(V1: P);
Для случая вещественного типа выражения и отсутствия указателя числа позиций вывод осуществляется в формате с плавающей точкой, а под число отводится поле шириной 18 символов. Данные типа BOOLEAN, INTEGER, CHAR при отсутствии указателя числа отводимых под результат позиций выводятся, начиная с позиции расположения курсора.
Примеры:
Значение А |
Оператор |
Результат |
123 |
WRITE(A,A:4,A:4) |
123_123_123 |
‘D’ |
WRITE(A,A) |
DD |
TRUE |
WRITE(A,A) |
TRUETRUE |
834.218 |
WRITE(A) |
8.3421800000E+02 |
–2.111E+01 |
WRITE(A) |
–2.1110000000E+01 |
Оператор вывода WRITELN действует подобно оператору WRITE, но в отличие от него, после вывода значения последнего элемента списка выполняется перевод курсора к началу следующей строки. WRITELN
241
Информатика
без параметров выполняет перевод курсора к началу следующей строки. Таким образом, оператор WRITELN (V1,...,VN) эквивалентен двум операторам WRITE(V1,...,VN); WRITELN.
Ввод данных
KОператоры ввода данных позволяют задать значения переменным во время выполнения программы с клавиатуры или из файла.
Формат оператора:
READ (VAR1, VAR2, ... , VARN);
где VAR1, VAR2, ... , VARN — идентификаторы переменных. Значения переменных VAR1, VAR2, ... , VARN вводятся с клавиатуры (друг от друга они должны отделяться хотя бы одним пробелом). После набора данных для одного оператора READ нажимается клавиша «Enter». При этом необходимо, чтобы вводимые данные и переменные в операторе READ имели один и тот же тип или совместимый тип.
Пример:
Оператор |
Набираемый на клавиатуре текст |
1. READ (A,B); (A, B – INTEGER) |
10 12 <ââîä> |
2. READ (A,B); |
10 12 <ââîä>14 16 <ââîä> |
READ (C,D); (C, D - INTEGER) |
|
Оператор READLN действует аналогично оператору READ с той разницей, что после считывания последнего значения в списке для оператора READLN осуществляется автоматический переход к считыванию следующей строки данных.
Пример:
Оператор |
Набираемый на клавиатуре текст |
READLN (A,B); READLN (C,D); |
10 12 <ââîä> |
|
14 16 <ââîä> |
Пример программы расчета площади прямоугольника по известным его сторонам.
Program prim5;
Var A, B, S: real; {A, B — стороны, S — площадь} Begin
Readln (A, B); S := A*B;
242
Глава 6. Алгоритмизация и программирование
Write (‘для сторон A= ’, A:10:2, ‘B= ’, B:10:2, ‘-’); Writeln (‘площадь прямоугольника S=’, S:12:4) End.
6.6.3. Составной оператор
Часто при некотором условии необходимо выполнить определенную последовательность операторов, а по правилам языка допускается использование только одного оператора. В этом случае последовательность операторов объединяют в один составной оператор, который воспринимается как единое целое и может располагаться в любом месте программы.
Составной оператор начинается с зарезервированного слова BEGIN и заканчивается словом END, между которыми размещаются требуемые операторы, отделенные друг от друга символом «точка с запятой». После BEGIN ставятся пробелы, а после END — символ «точка с запятой». Операторы, входящие в составной оператор, выполняются последовательно (если среди них нет операторов перехода).
Пример составного оператора:
Begin I:= 8; C:=16; writeln (I*C: 10) end;
6.6.4. Условный оператор
KУсловныйоператорпозволяетвыполнитьнекоторыйоператортолько в том случае, если истинно некоторое условие (логическое выражение).
Формат условного оператора:
IF <выражение> THEN <оператор1> [ ELSE <оператор2>];
Здесь «выражение» — выражение логического типа. Если оно истинно, выполняется оператор1. Если оно ложно, то либо управление передается на оператор, следующий сразу за оператором IF, либо выполняется оператор2, расположенный после слова ELSE. Здесь и далее «Операторы» — любые операторы Паскаля, простые или составные.
Примеры:
If A>B then C:=D else C:=8;
If R then C:=10; {R имеет тип boolean}
If (A>B) and (D<>K) Then
Begin A:=B; D:=K end Else A:=B-C+K;
243
Информатика
Пример программы расчета корней квадратного уравнения ax2+bx+c=0.
Program prim6;
Var A, B, C, D, X1, X2: real; Begin
Readln (A, B, C);
Writeln (’A=’, A, ’ B=’, B, ’ C=’, C); If sqr(B)-4*A*C<0
Then writeln (’Действительных корней нет’) Else
Begin D:=sqrt(sqr(B)-4*A*C);
X1:=(-B-D)/(2*A); X2:=(-B+D)/(2*A); Writeln(’корни уравнения X1=’, X1, ’X2=’,X2) End
End.
6.6.5. Оператор варианта CASE
KCASE используется, когда необходимо выбрать вариант направления расчетов не из двух, а из большего числа вариантов.
Формат оператора:
CASE <выражение> OF X1: <оператор 1>;
X2: <оператор 2>;
…
XN: <оператор N> ELSE <оператор> END;
Метки операторов X1, X2, … , XN представляют собой либо отдельнуюконстанту,либосписокконстант,перечисленныхчереззапятые,либо диапазон.Типвыраженияиконстантдолженбытьоднимитемже.ИспользуемыевоператореCASE меткиX1, X2, …, XN неописываютсявразделе описанияметокиотличаютсяпосмыслуотметок,тамописанных.
Оператор выполняется следующим образом: вычисляется значение выражения, далее выполняется только тот оператор, константа выбора которого равна значению выражения. Если среди констант нет равной
244
Глава 6. Алгоритмизация и программирование
значению выражения, то выполняется оператор, следующий за словом ELSE (при отсутствии слова ELSE выполняется оператор, следующий за словом END). Выражение может иметь любой дискретный тип.
Пример программы вывода дня недели в зависимости от значения введенного числа:
Program prim7;
Var den: integer;
Begin
Readln (den);
Case den of
1:writeln (’Понедельник’);
2:writeln (’Вторник’);
3:writeln (’Среда’);
4:writeln (’Четверг’);
5:writeln (’Пятница’);
6:writeln (’Суббота’);
7:writeln (’Воскресенье’);
Else writeln (’Вы неверно ввели число’)
End
End.
6.6.6. Операторы цикла
KЦиклом называется многократное повторение определенного действия или группы действий. В Паскале различают 3 вида циклов.
6.6.6.1 Оператор цикла по счетчику (цикл с параметром )
Оператор цикла с параметром используется, когда число повторений цикла заранее известно. Формат:
FOR<Параметрцикла>:=<Выражение1> TO |
<Выражение2>DO |
|
<Оператор>; |
DOWNTO |
Данныйоператорназывают«цикломспараметром»,таккакчислоповторенийподсчитываетсявпеременной,называемойпараметромцикла.
«Параметр цикла» — это имя, описанное в разделе VAR дискретного типа (Boolean, Integer, Char, Byte и т.д.). В ней подсчитывается число повторений цикла. «Выражение1», «Выражение2» — выражения, оп-
245
Информатика
ределяющие, соответственно, начало и конец значения параметра цикла; по типу они должны совпадать с типом параметра цикла (обозначим их, соответственно, Выр. 1 и Выр. 2).
TO — означает возрастание параметра цикла (Выр. 1 > Выр. 2) с шагом 1.
DOWNTO — убывание параметра цикла (Выр. 1 > Выр. 2) с шагом 1; «Оператор» — любой оператор ( в том числе и составной).
Порядок выполнения цикла FOR:
1.Переменной — параметру цикла присваивается значение Выражения 1.
2.Выполняется оператор.
3.Параметр увеличивается (уменьшается) на 1.
4.Значение параметра сравнивается с Выражением 2.
Цикл прекращается, выполняется следующий за ним оператор:
—если значение параметра < Выражения 1 (для TO );
—если значение параметра > Выражения 2 (для DOWNTO);
—иначе повторяются действия, начиная с п. 2.
Пример 1. Вычислить n! (1Ч 2 Ч 3 Ч 4 … Ч n).
Program fact_1;
Var i,n : integer; {i — параметр цикла, n — его конечное значение}
f: longint; {результат}
Begin
Write (’Введите n ’); readln(n); f:=1; For i:=1 to n do f:=f * i; Writeln (’при n= ’, n,’n!=’ ,f)
End.
Пример 2. Распечатать буквы латинского алфавита в обратном порядке.
Program for_2;
Var c: char;
Begin
For c := ’Z’ downto ’A’ do
Write (c)
End.
246
Глава 6. Алгоритмизация и программирование
|
10 |
10 |
1 |
− x |
2 |
||
Пример 3. Найти значение выражений: ∑x2 ; ∏ |
|
||||||
|
|
x |
|
|
|||
|
x =1 |
x =1 |
|
|
|
||
|
|
|
|
|
|
|
|
(сумму S и произведение П считать в одном цикле). |
|
||||||
Program for_3; |
|
|
|
|
|
|
|
Var X, S: integer; |
|
|
|
|
|
|
|
P: real; |
|
|
|
|
|
|
|
Begin S := 0; |
P := 1; |
|
|
|
|
|
|
For X :=1 |
to 10 do |
|
|
|
|
|
|
Begin |
|
|
|
|
|
|
|
S := S + sqr(X); |
|
|
|
|
|
|
|
P := P * (1 — sqr(X))/abs(X) |
|
|
|
|
|||
End; |
|
|
|
|
|
|
|
Writeln (’S=’, S, ’P=’, P ) |
|
|
|
|
|
|
|
End. |
|
|
|
|
|
|
|
6.6.6.2. Оператор цикла с предусловием
Проверка условия выполнения тела цикла с предусловием производится в самом начале оператора (следовательно, может не выполняться ни разу). Формат оператора:
WHILE <Выражение> DO <Оператор>;
«Выражение» — условие логического типа.
«Оператор» — любой оператор Паскаля, простой или составной. Оператор WHILE задает многократное выполнение оператора, сто-
ящего после DO. Перед каждым выполнением тела цикла вычисляется значение выражения — условия. Если результат равен True (истина), то выполняется оператор после DO, если False (ложь), то действие оператора WHILE прекращается.
Программа вычисления факториала с использованием данного вида цикла будет выглядеть следующим образом:
{фрагмент программы}
Begin
i := 1; f:=1; readln(n); While i < =n do
Begin
f : = f * i; inc(i); End;
247
Информатика
Пример. Подсчитать сумму чисел в интервале от 100 до 150, вводимых с клавиатуры. Как только введено отрицательное число, ввод и суммирование прекратить.
{Текст программы}
Program |
while_2; |
Const |
Amin = 100; Amax = 150; |
Var |
A, Summa : integer; |
Begin |
|
Summa:=0;
Writeln(“Введите А “); Readln(A); While A >= 0 do {заголовок цикла}
Begin
If (A > 100) and (A < 150) then Summa := Summa + A; Inc (Summa, A);
Readln (A) {читаем новое значение А} End; {конец цикла}
Writeln( ’Значение суммы = ’, Summa) End.
6.6.6.3. Оператор цикла с постусловием
Формат:
REPEAT <Оператор>
UNTIL <Выражение>;
«Оператор» — любой оператор Паскаля. «Выражение» — выражение логического типа.
Данный оператор аналогичен оператору цикла с предусловием. Отличия состоят в том, что:
1)условие проверяется после выполнения оператора, следовательно, хотя бы один раз оператор выполнится;
2)цикл прекращает выполняться, когда значение выражения равно true (истина). Если результат логического выражения false (ложь), то тело цикла активизируется (выполняется) еще раз.
Факториал n! с помощью цикла Repeat можно вычислить следующим образом:
248
Глава 6. Алгоритмизация и программирование
{фрагмент программы}
i := 1; f := 1; readln(n); Repeat
f := f * i; inc(i) Until i > n;
Пример. С клавиатуры вводятся числа. Найти сумму этой последовательности. Как только введено число большее 999, суммирование выполнить последний раз и выдать результат на печать.
{Программа подсчета суммы} Program sum;
Const |
PRK = 999; |
Var |
X, Summa: real; |
Begin |
|
Summa := 0;
Repeat
Readln(X) ;
Summa := Summa + X
Until X > PRK;
Writeln (Summa:10:4)
End.
6.7. Структурированные типы данных
6.7.1. Массивы
K Массив представляет собой структуру, состоящую из фиксированного числа компонент одного типа. В качестве компонент можно использовать как ранее описанные типы, так и следующие: массивы, записи, множества, указатели и т. п. Число элементов в массиве фиксируется при описании и далее при выполнении программы не меняется.
Определение типа, значения которого являются массивами, выполняется следующим образом:
TYPE <имя типа> = ARRAY[<диапазон первого индекса>,..., <диапазон n-го индекса>] OF <тип компонент>;
Количество индексов n определяет размерность массива, а сами индексы разделяются запятыми и заключаются в квадратные скобки.
249
Информатика
Пример:
Type matr=array[1..2,1..12] of real;
Var A,B,C: matr;
Массив можно описать в разделе Var следующим образом:
<идентификатор>: ARRAY [<диапазон первого индекса>,..., <диапазон n-го индекса>] OF <тип компонент>;
Пример:
Var A, B, C: array[1..10] of integer;
Для обращения к элементам массива используются конкретные значе- ния индексов. Индекс представляет собой выражение любого простого (скалярного) типа (кроме real). К примеру, оператор B[3] := 10; присваивает третьему элементу одномерного массива с именем B значение 10.
Пример. Пусть двумерный массив описан следующим образом:
Var |
A : array[1..2,1..4] of integer; а в памяти ЭВМ |
||
записана таблица чисел, представляющая этот массив: |
|||
17 |
11 |
4 |
5 |
22 |
8 |
16 |
12 |
Все элементы в таблице имеют тип integer. При обращении к элементам матрицы А первый индекс указывает номер строки таблицы (изменяется в данном случае от 1 до 2), второй — номер столбца (в нашем примере изменяется от 1 до 4). Если задать оператор присваивания в виде X := А[2,3]; то после его выполнения значение некоторой переменной X будет равно 16. Ввод и вывод значений элементов массива производится поэлементно.
Рассмотрим несколько типичных задач, связанных с применением массивов.
1. {Программа, позволяющая найти сумму элементов одномерного массива}
Program msg1;
Const n=15; {число элементов массива}
Var |
a : array [1..n] of real; |
summa: real; i:integer;
250