/ — выводится десятичное представление величины /, начиная с позиции расположения курсора:
Значение / Оператор Результат
134 Write(I) 134
287 Write(1,1,1) 287287287
1:Р — выводится десятичное представление величины /в крайние правые позиции поля шириной Р:
Значение / Оператор Результат
134 Write(I:6) 134
312 Write ((I + I):7) 624
R — в поле шириной 18 символов выводится десятичное представление величины R в формате с плавающей точкой. Если R > 0,0, используется формат _#.##########Е*##. Если R < 0,0, то формат имеет вид _-#.##########Е*##:
Значение R Оператор Результат
715.432 Write(R) _7.1543200000Е+02
-1.919Е+01 Write(R) _-1.9190000000Е+01
R: Р — в крайние правые позиции поля шириной Р символов выводится десятичное представление значения R в нормализованном формате с плавающей точкой. Минимальная длина поля вывода для положительных чисел составляет 7 символов, для отрицательных — 8 символов. После точки выводится по крайней мере одна цифра:
Значение R Оператор Результат
511.04 Write(R:15) 5.110400000Е+02
46.78 Write(-R:12) -4.67800Е+01
R:P: Q — в крайние правые позиции поля шириной Р символов выводится десятичное представление значения R в формате с фиксированной точкой, причем после десятичной точки выводится Q цифр (0 < Q< 24), представляющих дробную часть числа. Если Q— 0, то ни дробная часть, ни десятичная точка не выводятся. Если Q > 24, то при выводе используется формат с плавающей точкой:
Значение R Оператор Результат
511.04 Write(R:8:4) 511.0400
-46.78 Write(R:7:2) _-46.78
Ch:P — в крайнюю правую позицию поля шириной Р выводится значение СИ:
Значение СИ Оператор Результат
'X' Write(Ch:3) __ X
'!' Write(Ch:2,Ch:4) _!___!
S — начиная с позиции курсора выводится значение S:
Значение S Оператор Результат
'Day N' Write(S) Day N
'RRDD' Write(S,S) RRDDRRDD
S.P — значение S выводится в крайние правые позиции поля шириной Р символов:
Значение S Оператор Результат
'Day N' Write(S:10) .__ Day N
'RRDD' Write(S:5,S:5) _RRDD_RRDD
В — выводится результат выражения В: true или false, начиная с текущей позиции курсора:
Значение В Оператор Результат
True Write (В) True
False Write(В,Not B) FalseTrue
B:P — в крайние правые позиции поля шириной Рсимволов выводится результат булевского выражения:
Значение В Оператор Результат
True Write(В:6) —True
False Write (В: б,Not В: 7) _False____ True
Тема 2.4 Составной оператор. Операторы цикла. Операторы управления.
Алгоритмическая структура ветвления программируется в Паскале с помощью условного оператора. Раньше мы его описывали в таком виде:
If <условие> Then <оператор 1> Else <оператор 2>;
Кроме того, возможно использование неполной формы условного оператора:
If <условие> Then <оператор>;
Теперь дадим строгое описание условного оператора в форме синтаксической диаграммы (рис. 13).
То, что мы раньше называли условием, есть логическое выражение, которое вычисляется в первую очередь. Если его значение равно true, то будет выполняться <оператор 1> (после Then), если
Рис. 13
false, то <оператор 2> (после Else) для полной формы или сразу следующий оператор после условного для неполной формы (без Else).
Пример 1. По длинам трех сторон треугольника а, Ь, с вычислить его площадь.
Для решения задачи используется формула Герона
у]р(р-а)(р-Ь)(р-с),
где р = (а + b + с) /2 — полупериметр треугольника. Исходные данные должны удовлетворять основному соотношению для сторон треугольника: длина каждой стороны должна быть меньше длин двух других сторон.
Имея возможность в одном условном операторе записывать достаточно сложные логические выражения, мы можем сразу «отфильтровать» все варианты неверных исходных данных.
Program Geron;
Var A,B,C,P,S: Real;
Begin
WriteLn('Введите длины сторон треугольника:'); Write('a='); ReadLn(A) Write Cb='); ReadLn (В) Write('c='); ReadLn(C) If (A>0) And (B>0) And (C>0) And (A+B>C) And (B+OA) And (A+OB) Then Begin
P:=(A+B+C)/2;
S:=Sqrt(P*(P-A)*(P-B)* (P-C)); WriteLn('Площадь=',S) End Else WriteLn('Неверные исходные данные') End.
Теперь рассмотрим синтаксическую диаграмму оператора цикл-пока, или цикл с предусловием (рис. 14).
Сначала вычисляется <Логическое выражение > Пока его значение равно t r u e, выполняется <Оператор> — тело цикла. Здесь <Оператор> может быть как простым, так и составным.
Пример 2. В следующем фрагменте программы на Паскале вычисляется сумма конечного числа членов гармонического ряда
Суммирование прекращается, когда очередное слагаемое становится меньше е или целая переменная /достигает значения Maxint.
S:=0;
I: = l;
While (l/I>=Eps) And (KMaxInt) Do
Begin
S:=S+1/I;
I:=I+1
End;
Синтаксическая диаграмма оператора цикл-до, или цикл с постусловием, представлена на рис. 15.
Исполнение цикла повторяется до того момента, когда Логическое выражение станет равным true. Предыдущая задача с использованием цикла с постусловием решается так:
S:=0;
1:=1;
Repeat
S:=S+1/I; I:=I+1
Until (1/KEps) Or (I>=MaxInt);
Тема 2.4 Составной оператор. Операторы цикла. Операторы управления.
Алгоритмическая структура ветвления программируется в Паскале с помощью условного оператора. Раньше мы его описывали в таком виде:
If <условие> Then <оператор 1> Else <оператор 2>;
Кроме того, возможно использование неполной формы условного оператора:
If <условие> Then <оператор>;
Теперь дадим строгое описание условного оператора в форме синтаксической диаграммы (рис. 16).
То, что мы раньше называли условием, есть логическое выражение, которое вычисляется в первую очередь. Если его значение равно true, то будет выполняться <оператор 1> (после Then), если
false, то <оператор 2> (после Else) для полной формы или сразу следующий оператор после условного для неполной формы (без Else).
Пример 1. По длинам трех сторон треугольника а, b, с вычислить его площадь.
Для решения задачи используется формула Герона
где р = (а + b + с) /2 — полупериметр треугольника. Исходные данные должны удовлетворять основному соотношению для сторон треугольника: длина каждой стороны должна быть меньше длин двух других сторон.
Имея возможность в одном условном операторе записывать достаточно сложные логические выражения, мы можем сразу «отфильтровать» все варианты неверных исходных данных.
Program Geron;
Var A,B,C,P,S: Real;
Begin
WriteLn('Введите длины сторон треугольника:');
Write ('a='); ReadLn(A)
Write('b='); ReadLn(В)
Write('c='); ReadLn(С)
If (A>0) And (B>0) And (C>0) And (A+B>C) And (B+OA) And (A+OB)
Then Begin
P:=(A+B+C)/2;
S:=Sqrt(P*(P-A)*(P-B)* (P-C));
WriteLn('Площадь=',S)
End
Else WriteLn('Неверные исходные данные')
End.
Теперь рассмотрим синтаксическую диаграмму оператора циклока, или цикл с предусловием (рис. 17).
Сначала вычисляется <Логическое выражение Пока его значение равно true, выполняется <Оператор> — тело цикла. Здесь <Оператор> может быть как простым, так и составным.
Пример 2. В следующем фрагменте программы на Паскале вычисляется сумма конечного числа членов гармонического ряда
Суммирование прекращается, когда очередное слагаемое становится меньше или целая переменная i достигает значения Maxint.
S:=0;
I:=l;
While (l/I>=Eps) And (KMaxInt) Do
Begin
S:=S+1/I;
I:=I+1
End;
Синтаксическая диаграмма оператора цикл-до, или цикл с постусловием, представлена на рис. 18.
Исполнение цикла повторяется до того момента, когда <Логическое выражение> станет равным true.
Предыдущая задача с использованием цикла с постусловием решается так:
S:=0;
1:=1;
Repeat
S:=S+1/I; I:=I+1
Until (1/I<Eps) Or (I>=MaxInt);
Цикл по параметру
Рассмотрим следующую простую задачу: требуется вычислить сумму целых чисел от М до N путем прямого суммирования. Здесь M и N — целые числа. Задачу можно сформулировать так
Алгоритм и программа решения этой задачи с использованием структуры цикл-пока представлены на рис. 19.
А теперь введем новый тип циклической структуры, который будет называться цикл по параметру, или цикл-для. Блок-схема и программа на Паскале для решения рассматриваемой задачи с использованием этой структуры приведены на рис. 20.
Здесь целая переменная I последовательно принимает значения в диапазоне от М до N. При каждом значении I выполняется тело цикла. После последнего выполнения цикла при I= N происходит выход из цикла на продолжение алгоритма. Цикл выполняется хотя бы один раз, если M<N, и не выполняется ни разу при М > N.
В программе используется оператор цикла For, синтаксическая диаграмма которого представлена на рис. 21.
Выполнение оператора For в первом варианте (То) происходит по следующей схеме:
1. Вычисляются значения <Выражения 1> и <Выражения 2>.
Это делается только один раз при входе в цикл.
2. Параметру цикла присваивается значение <Выражения 1>.
3. Значение параметра цикла сравнивается со значением вы ражения 2>. Если параметр цикла меньше или равен этому значе нию, то выполняется тело цикла, в противном случае выполне ние цикла заканчивается.
4. Значение параметра цикла изменяется на следующее значение в его типе (для целых чисел — увеличивается на единицу); происходит возврат к пункту 3. Оператор цикла For объединяет в себе действия, которые при использовании цикла while выполняют различные операторы: присваивание параметру начального значения, сравнение с ко начнем значением, изменение на следующее.
Как известно, результат суммирования целых чисел не зависит от порядка суммирования. Например, в рассматриваемой задаче числа можно складывать и в обратном порядке, т.е. от./V до М (N S М). Для этого можно использовать второй вариант оператора цикла For:
Слово DownTo буквально можно перевести как «вниз до». В таком случае параметр цикла изменяется по убыванию, т.е. при каждом повторении цикла параметр изменяет свое значение на предыдущее (равносильно i:=pred(i)). Тогда ясно, что цикл не выполняется ни разу, если N < М.
Работая с оператором For, учитывайте следующие правила:
• параметр цикла не может иметь тип Real;
• в теле цикла нельзя изменять переменную «параметр цикла»;
• при выходе из цикла значение переменной-параметра является неопределенным.
В следующем примере в качестве параметра цикла For используется символьная переменная. Пусть требуется получить на экране десятичные коды букв латинского алфавита. Как известно, латинские буквы в таблице кодировки упорядочены по алфавиту. Вот фрагмент такой программы:
Здесь переменная с имеет тип Char. А теперь подумайте сами, как вывести кодировку латинского алфавита в обратном порядке (от z до 'а').