Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Раздел 3_2.pdf
Скачиваний:
23
Добавлен:
11.02.2016
Размер:
1.22 Mб
Скачать

Writeln(элемент:ширина:количество_десятичных_цифр, ...);

В следующем фрагменте программы вторая цифра формата указывает количество полей, отводимых для размещения дробной части числа, выводимого в форме с фиксированной точкой:

х:=421.53; Writeln(х:6:2); 421.53 Writeln(х:8:2); 421.53 Writeln(х:8:4); 421.5300

Некоторые замечания по оформлению ввода данных в программу. Следует помнить, что пользоваться написанной программой будет не только ее составитель. Поэтому необходимо предварять ввод каждой переменной ее описанием. Это позволит избежать многих ошибок, которые обнаружить практически невозможно. Исходя из этих соображений, приведенные ниже рекомендации определяют хороший стиль написания ввода данных в программу:

в начале программы необходимо выводить на экран ее назначение (для чего создана программа);

ввод каждой переменной должен происходить в одной строке и предваряться описанием ее назначения и размерности вводимой величины (если необходимо);

перед вводом массива значений необходимо выводить общее назначение массива и его размеры;

перед вводом каждого элемента массива необходимо выводить его имя с индекса-

ми.

Структурные операторы

Составной оператор. Составной оператор (простой блок) представляет собой начинающуюся служебным словом begin последовательность из произвольного числа отделенных друг от друга точкой с запятой операторов, которая оканчивается служебным словом end. Можно сказать, что служебные слова begin и end играют роль операторных скобок, позволяющих в Паскаль программах размещать последовательности операторов там, где синтаксисом языка предусмотрено использование одиночного оператора. Формат оператора:

begin

оператор; оператор;

end;

например: begin

a := a*b+(n-f); res:= a+b*pi; Writeln(res:12:3)

end;

Составной оператор очень часто используется в условных операторах и операторах цикла.

Условные операторы

Условные операторы позволяют описывать ветвящиеся вычислительные процессы, т.е. ситуации, когда направление дальнейших вычислений зависит от выполнения (не выполнения) некоторых заданных условий. В Паскале такие ветвления описываются с помощью операторов ветвления по условию if и ветвления по ключу case.

Оператор ветвления по условию. Оператор if имеет формат: if логическое_выражение then оператор1

49

else оператор2;

где логическое_выражение есть любое булево выражение или переменная булевого типа (вырабатывающие в качестве результата значения True или False), содержащее условие, отражающее признак выбора, какой из операторов будет выполняться. Содержащее условие выражение может быть произвольной степени сложности. Сложные условия образуются с помощью логических операций And, Or, Not и операций отношений.

Оператор if работает следующим образом: если выражение принимает значение True, то выполняется оператор1 (говорят, что управление передается оператору 1). В противном случае управление получает оператор2.

Конструкция else не является обязательной, т.е. можно использовать оператор if в форме

if логическое_выражение then оператор1;

Как и в полной форме в этом случае оператор1 выполняется тогда, когда логическое_выражение принимает значение True. В противном случае оператор1 не выполняется и управление передается оператору следующему за оператором if. Необходимо иметь в виду, что при использовании полной формы if после выполнения любой его ветви управление также передается следующему оператору программы, если конечно оператор1 или оператор2 не являются операторами безусловной передачи управления вида goto (такая конструкция с точки зрения Паскаля является признаком «дурного» стиля программирования) или операторами if.

В том случае, когда в ветвях оператора if необходимо выполнить более одного оператора, используется рассмотренный ранее составной оператор. В приведенном далее примере использования оператора if в ветви then размещен один оператор, а в ветви else группа операторов, объединенных в операторный блок:

if B = 0.0 then

Writeln('Деление на нуль невозможно') else begin

Ratio:=А/В;

Writeln (' Отношение =', Ratio);

еnd;

Оператор if может входить в состав другого оператора if. В таких случаях говорят, что один из операторов вложен в другой оператор, например:

if условие1 then

Это оператор1 для первого if

if условие2 then

оператор1_1

 

else

 

оператор1_2

 

else

 

оператор2;

 

Таким образом, для вложенных операторов каждое else соответствует тому then, которое непосредственно ему предшествует, например:

if A <= 20 then if A >= 15 then

writeln('A в диапазоне 15-20') else

writeln('A меньше 15')

else

50

writeln('А больше 20');

Далее приведен пример программы, использующей оператор if. Пусть необходимо вычислить корни квадратного уравнения общего вида

Ax2 + Bx + C = 0, A<>0

Введем следующие идентификаторы: A, B, C – коэффициенты уравнения; D – дискриминант;

X1, X2 – корни.

Программа вычисления корней уравнения будет выглядеть следующим образом:

program korni; var

A, B, C, X1, X2, D: real; begin

writeln('Введите коэффициенты уравнения ->>'); write('A= '); read(A);

write('B= '); read(B); write('C= '); read(C); D := sqr(B) - 4*A*C; if D<0.0 then

Writeln ('Корни мнимые') else begin

if D = 0.0 then begin

X1:= -B/(2*A); X2:= X1;

end

else begin

X1 := (-B+Sqrt(D))/(2*A);

X2 := (-B-Sqrt(D))/(2*A) end; writeln('x1=',x1,'x2=',x2)

end; end.

Оператор ветвления по ключу case. В случае ветвления по ключу алгоритм предполагает наличие выбора одного из нескольких возможных направлений продолжения процесса обработки в зависимости от текущего значения ключа - переменной, принимающей одно значение из некоторого заранее заданного набора. При этом вычислительный процесс пойдет далее по той ветви вычислений, которая обозначена значением, совпадающим с текущим значением ключа.

Формат оператора case: case выражение of

ключ1: оператор1; ключ2: оператор2;

...

else

оператор_если_нет_совпадений; end;

В соответствии с назначением, синтаксически оператор case состоит из выражения, определяющего значение ключа и списка операторов, каждому из которых предшествует присвоенное ему определенное значение ключа (внутренняя метка), присоединяемое к оператору с помощью двоеточия. Все константы выбора (метки) должны

51

быть различными, а их тип должен быть идентичен типу выражения (селектора ключа). В качестве типа констант допустим любой порядковый тип.

Если текущее значение ключа не совпадает ни с одним значением "меток", входящих в конструкцию case операторов, то выполняется оператор, стоящий после необязательного слова else, а в случае отсутствия служебного слова else управление передается следующему за case оператору программы.

Завершается конструкция оператора case обязательным служебным словом end. Необходимо отметить, что константы выбора похожи на метки операторов Паскаля, которые используются для управления порядком выполнения операторов в Паскаль

программах, однако таковыми не являются и их не следует перечислять в разделе описания меток, на них нельзя ссылаться в операторах перехода.

Как было сказано, смысл работы оператора Case заключается в том, что в данный момент управление получит (т.е. будет выполняться) тот оператор у которого "внутренняя метка" совпадает с вычисленным текущим значением ключа (значением селектора).

"Внутренние метки" операторов могут состоять из одной или нескольких констант, разделенных запятыми, либо представлять собой диапазон значений, за которыми следует двоеточие (:), например:

case BirdSight of

Сurlens+1;

'С','с' : Curlens:=

'H','h' : Неrons :=

Неrons+1;

'Е','е' : Еgrets :=

Еgrets+1;

'K'..'R': Теrns :=

Теrns+1;

еnd; {case}

 

В данном примере значением ключа (значением переменной BirdSight), при котором может быть выполнен один из операторов тела выбора, должна быть одна из букв латинского алфавита, выступающих в качестве "меток" этих операторов.

Если в качестве "меток" используется диапазон возможных значений (записываемый в виде двух констант, разделенных двумя точками , например, 'K'..'R'), то для выполнения помеченного оператора достаточно, чтобы ключ получил одно из значений, входящих в этот диапазон.

Операторы цикла

В процессе вычислений часто возникают ситуации, требующие повторного выполнения одной или группы операций, что применительно к программированию означает повторное выполнение одного или последовательности операторов. Такие вычисления называют циклическими, а повторяющиеся группы операторов - циклами.

Управление повторением операторов с целью организации циклов можно осуществить с помощью условных операторов (типа if и goto). Однако, в связи с важностью циклических структур для практического программирования, во всех алгоритмических языках для описания циклических вычислений имеются специальные средства, называемые операторами цикла.

В Паскале такими операторами поддерживаются три вида циклов: цикл while,

цикл repeat until и цикл for.

Цикл while. Оператор типа while удобно использовать в тех случаях, когда признак окончания (продолжения) цикла необходимо проверять перед очередным повторением этого цикла. Формат оператора цикла:

while выражение do оператор;

52

где выражение есть булево выражение или переменная, принимающее значения True или False, а оператор - один из операторов Паскаля. В первом случае (когда выражение принимает значение True) выполняется оператор, размещенный после служебного слова do, во втором - выполнение цикла завершается.

Пример: program Hello; var

Count : integer; begin

Count := 1;

while (Count <= 10) do begin

Writeln('Проход цикла # ', Count); Inc(Count);

end;

Writeln ('Конец работы'); end.

В рассмотренном примере первым выполняемым оператором программы переменной Count присвоится значение равное 1. Затем, при входе в цикл в заголовке цикла про-

веряется условие "Значение переменной Count меньше или равно 10?". Если про-

верка дает результат True, то выполняется тело цикла (операторы, находящиеся между ключевыми словами begin....end.). При этом на экран выводится сообщение "Проход цикла # 1", затем значение Count увеличивается на 1 и управление передается на начало цикла. Происходит очередная проверка значения Count и процесс повторяется до тех пор, пока значение переменной Count удовлетворяет указанному условию. При этом каждый раз в выводимом программой сообщении меняется номер прохода. Как только значение Count станет равным 11 выражение Count <= 10 примет значение False, цикл завершается, а на экран будет выведено сообщение "Конец работы".

Оператор repeat...until. По алгоритму работы оператор rереаt until отличается от оператора while тем, что проверка признака окончания цикла перенесена здесь в конец цикла (т.е. операторы в теле цикла, заключенные между служебными словами repeat until, выполнится, как минимум, один раз), а цикл завершается когда выражение, содержащее условие его окончания, принимает значение True (а не значение False, как это было в предыдущем случае). Кроме того, при использовании этого оператора, благодаря наличию в его структуре собственных "операторных скобок" (служебные слова repeat until) нет необходимости использовать операторные скобки (begin end).

Формат оператора цикла repeat until: repeat

оператор;

...

оператор

until логическое_выражение;

где логическое_выражение есть булево выражение принимающее значения True или False, а оператор - один из операторов Паскаля. Повторное выполнение операторов тела цикла прекращается, когда после очередного прохода логическое_выражение принимает значение True. Пример:

program DoRatio; var

A,B: integer; Ratio: real; Ans: char;

53

begin repeat

Write('Введите два числа '); Readln(A,B); Ratio := A/B;

Writeln('Отношение равно',Ratio); Writeln('Повторить (Y/N)'); Readln(Ans);

until (Ans = 'N')or(Ans=’n’); end.

В этой программе выполнение операторов будет продолжаться до тех пор, пока в ответ на вопрос «Повторить? (Y/N)» с клавиатуры не будет введен символ "N". Другими словами тело цикла (операторы, заключенные между служебными словами repeat и until) будет повторяться, пока значение выражения в строке until не примет значение True.

Еще раз повторим основные отличия оператора repeat от оператора while:операторы тела цикла repeat выполняются по крайней мере один раз, поскольку проверка признака окончания цикла осуществляется в конце тела цикла. В цикле while, если при первой проверке значение выражения оказывается равным False, операторы тела цикла не выполняются ни разу;

цикл repeat выполняется до тех пор, пока выражение не примет значения True, в то время как цикл while выполняется до тех пор, пока выражение имеет значение

True.

Для сравнения алгоритмов работы рассмотренных операторов цикла еще раз вернемся к программе Hello, заменив в ней цикл while циклом repeat:

program Hello; var

Count : integer; begin

Count := 1; repeat

Writeln('Проход цикла # ', Count); Inc (Count)

until Count > 10; end.

Оператор for. Оператор цикла типа for удобен в тех случаях, когда необходимое количество повторных выполнений операторов, включаемых в тело цикла, известно заранее и управление числом повторений можно организовать с помощью простого счетчика, значение которого в каждый момент времени содержит информацию о текущем состоянии цикла. Подсчет реализованного количества прохождений цикла осуществляется увеличением (или уменьшением) на 1 к содержимого счетчика по окончании очередного выполнения операторов тела цикла.

Формат оператора цикла типа for :

for индекс := выражение1 to(или downto) выражение2 do оператор;

где: индекс переменная целого, символьного, булевого или перечислимого типов (счетчик цикла);

выражение1 выражение совместимое с типом индекса, определяющее начальное значение счетчика цикла;

выражение2 выражение совместимое с типом индекса, определяющее конечное значение счетчика цикла;

оператор одиночный или составной оператор Паскаля.

54