Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информатика_Гуда

.pdf
Скачиваний:
76
Добавлен:
02.06.2015
Размер:
26.2 Mб
Скачать

Глава 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 := Zdownto Ado

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