Описывают некоторые действия, которые необходимо выполнить для решения задачи. Тело программы представляет собой последовательность операторов (команд), которые разделяются “;”.
Напомним порядок выполнения операторов программы: слева направо сверху вниз.
Обозначается := . Вызывает вычисление выражения стоящего справа от него, и присваивание вычисленного значения переменной, стоящей слева. Таким образом, с помощью этого оператора в ячейку памяти, имя которой указано слева от знака := , заноситсязначение, находящееся справа от знака := .
Фрагмент программы: | Содержимое ячеек памяти (имя указано слева) после выполнения соответствующей команды присвоения: |
y:=7; x:=y; a:=3; b:=25; z:=a+b; i:=4; j:=8; res:=(i>0) and (i<100); k:=sqr(a)+i*j; |
y 7 x 7 a 3 b 25 z 28 i 4 j 8 res True k 41 |
Представляет собой совокупность последовательно выполняемых операторов, заключенных в операторные скобки begin … end. Структура оператора следующая:
begin
<оператор 1>;
<оператор 2>;
…
<оператор 3>;
end;
Используется, когда необходимо выполнить несколько действий, а синтаксисом языка допускается только один оператор. Само тело программы тоже можно считать составным оператором.
Реализует алгоритмическую конструкцию “развилка”.
Условный оператор позволяет выполнить один из двух возможных операторов в зависимости от некоторого условия. Структура условного оператора следующая:
if <условие> then <оператор 1> else <оператор 2>;
Условие должно иметь логический тип. Если значение условия равно true, то выполняется Оператор 1, если условие равно false, то Оператор 2. Перед else точка с запятой не ставится.
if a>b then max:=a else max:=b;
Например, если a=3, b=7, то выполнится оператор max:=b; в противном случае, т.е.
если a=7, b=3, то выполнится оператор max:=a;.
Часть условного оператора, начинающаяся со слова else, может отсутствовать. Тогда, если условие истинно, выполняется оператор1, если ложно, то выполняется оператор, следующий за условным.
if x=0 then writeln(‘ошибка’);
Если при выполнении или невыполнении условия необходимо выполнить несколько действий, то организуется составной оператор.
if a>b then begin max:=a; min:=b; end else begin min:=a; max:=b; end;
Например, если a=3, b=7, то выполнятся операторы min:=a; max:=b; в противном случае, т.е.
если a=7, b=3, то выполнятся операторы max:=a; min:=b;.
Для схематической записи алгоритмов решения задач существует язык блок-схем. Приведем основные элементы блок-схемы:
Действие |
Блок |
Начало процесса |
![]() |
Ввод данных |
![]() |
Присваивание |
![]() |
Проверка условия |
![]() |
Заголовок цикла |
![]() |
Вывод результатов |
![]() |
Конец процесса |
![]() |
Блок-схема нахождения корней квадратного уравнения
Схемы условного оператора:
полногосокращенного
вложенного:
if <условие 1> then <оператор 1> else if <условие 2> then <оператор 2> else <оператор 3> | if <условие 1> then if <условие 2> then <оператор 1> else <оператор 2>; |
Условные операторы могут быть вложенными друг в друга. В этом случае else связывается с ближайшим к нему if:
if (a>b) and (a>c) then max:=a else if (b>c) then max:=b else max:=c;
Например, если a=7, b=2, c=4, то выполнится оператор max:=a; , т.к. (a>b) and (a>c)=True (истина);
в противном случае, т.е. если (a>b) and (a>c)=False (ложь), выполнится оператор
if (b>c) then max:=b else max:=c;
если, например, a=2, b=7, c=4, то выполнится оператор max:=b;
если, например, a=2, b=4, c=7, то выполнится оператор max:=с;.
Пример:
var i,j: integer; ok: boolean; begin writeln('Введите i и j > 0'); readln(i,j); ok:=(i>0) and (j>0); if (not ok) then begin writeln(‘Неверный ввод’); halt; end; end.
С помощью этого оператора можно выбрать вариант из любого количества вариантов.
Структура оператора:
case <ключ выбора> of
константа1: оператор1;
константа2: оператор2;
…
константаN: операторN;
else оператор;
end;
<ключ выбора> - переменная или выражение, значение которого вычисляется. Далее выполняется оператор, которому предшествует константа, равная вычисленному значению. Если константы, соответствующей значению ключа выбора не найдено, то выполняется оператор после else (эта часть может отсутствовать).
В качестве ключа выбора может использоваться выражение порядкового типа, константа должна быть того же типа. В качестве констант можно использовать диапазоны или списки значений через запятую.
case i of 0,2,4,6,8: writeln('четная цифра'); 1,3,5,7,9: writeln('нечетная цифра'); 10..100: writeln('число от 0 до 100'); else writeln('отрицательное число или >100'); end;
Пример: программа-калькулятор
var op: char; x,y,r: real; err: boolean; begin err:=false; write('Введите х, у'); readln(x,y); write('Определите операцию'); readln(ор); case op of '+': r:=x+y; '-': r:=x-y; '*': r:=x*y; '/': r:=x/y; else err:=true; end; if err then writeln('Неверно заданная операция') else writeln(х, ор, у, '=', r); end.
Циклом называется последовательность действий, выполняемая более одного раза. В Паскаль есть три различных типа операторов, позволяющих запрограммировать циклический процесс: оператор цикла с параметром (цикл FOR); оператор цикла с предусловием (цикл WHILE) и оператор цикла с постусловием (цикл REPEAT).
Рассмотрим работу оператора цикла с параметром (цикл FOR). Начнем с примера. Пусть требуется вывести на экран строку из пяти звездочек через пробел. Рассмотрим три варианта решения:
1 вариант:
Begin Write('* * * * *'); End.
2 вариант:
Begin Write('* '); Write('* '); Write('* '); Write('* '); Write('* '); End.
3 вариант:
var i: integer; Begin for i:=1 to 5 do Write(‘* ’); End.
Команду for i:=1 to 5 do Write(‘* ’); можно прочитать так: “Для i от 1 до 5 делай команду вывода звездочки”.
Переменная i изменит автоматически свое значение 5 раз (от 1 до 5 с шагом 1), а, следовательно, и оператор, записанный после слова do, повторится 5 раз.
В данном примере самым простым является первый вариант решения, однако если потребовалось бы вывести на экран 100 звездочек, то сразу стало бы понятно преимущество третьего варианта.
Теперь перейдем к теоретической части.
Оператор цикла с параметром имеет следующую структуру:
заголовок цикла - for <параметр>:=<начальное значение> to <конечное значение> do
тело цикла - <оператор>;
Этот оператор используется, когда число повторений заранее известно.
Работает: В заголовке параметр цикла автоматически изменяется от начального значения до конечного с шагом 1 и каждый раз выполняется тело цикла - оператор после do.
for i:= 0 to 9 do write(i); {На экране: 0123456789}
T.e. сколько раз параметр цикла изменит свой значение от начального до конечного включительно с шагом один, столько раз выполнится тело цикла.
Схема оператора FOR:
Параметр цикла – переменная целого, порядкового или символьного типа, начальное и конечное значения – переменные или выражения того же типа, причем выражения вычисляются один раз, до начала выполнения цикла. Если начальное значение параметра сразу превышает конечное, то тело цикла не выполнится ни разу.
Пример 1. var k,x: integer; begin x:=2; for k:=x-2 to sqr(x) do x:=k; end.Этапы работы данной программы: 1. x:=2 2. начальное значение параметра k = 0 конечное значение параметра k = 4 3. k:=0 4. проверка: если к<=4 то на п.5 если к>4 то на п. 5. выполнение тела цикла: x:=k; Замечание: изменение значения x в теле цикла уже не влияет на начальное и конечное значения параметра цикла. 6. возврат на заголовок цикла. В заголовке: k:=k+1 (автоматически) и п.4 7. Переход к следующему оператору программы после цикла For . Пример 2. var c: char; begin for c:= 'A' to 'D' do write(c); end.На экране: ABCD Пример 3. var p, h: integer; begin h:=5; for p:=3 to 1 do h:=h+p; writeln('h=',h); end. На экране: h=5 |
Пример 4. var p, h: integer; begin h:=5; for p:=1 to 3 do h:=h+p; writeln('h=',h); end.Этапы вычисления: h + p → h : 5 + 1 → 6 6 + 2 → 8 8 + 3 → 11 На экране: h=11 Пример 5. Внесем в программу примера 4 некоторые изменения: var p, h: integer; begin h:=5; for p:=1 to 3 do begin h:=h+p; writeln(‘h=’,h); end; end.Этапы работы: h + p → h : 5 + 1 → 6 вывод на экран: h=6 6 + 2 → 8вывод на экран: h=8 8 + 3 → 11вывод на экран: h=11 В результате на экране: h=6 |
Если тело цикла состоит из нескольких операторов, то организуется составной оператор begin..end;
Пример: Вычислить и вывести на экран 100 значений
функции y=sin x. Начальное значение x=0;
x изменяется с заданным шагом H.
var x,y,H: real; i: integer; begin x:=0; H:=0,1; for i:= 1 to 100 do begin y:=sin(x); writeln('y = ', y); x:=x+H; end; end.
Таким образом, если необходимо повторить заданное количество
раз не одну команду, а последовательность команд, то эта последовательность
заключается в так называемые операторные скобки begin..end; . Если после
слова do нет слова begin, то система считает телом цикла только одну команду,
записанную после слова do. Если после слова do есть слово begin, то система
считает телом цикла все команды, записанные между словами begin и end.
А работает оператор цикла и в том и в другом случаях одинаково: тело цикла
повторяется столько раз, сколько раз меняет свое значение параметр цикла
от начального до конечного включительно с шагом 1.
Замечания:
Пример:
var k,p: integer; begin x:=5; for k:=x+1 to x+5 do {k = 6 7 8 9 10} begin x:=x-2; {x = 3 1 -1 -3 -5} p:=sqr(k); {p = 36 49 64 81 100} writeln(x,' ',p); end; end.
В результате работы программы на экране увидим:
3 36
1 49
-1 64
-3 81
-5 100
Второй вариант оператора FOR:
заголовок цикла - for <параметр>:=<начальное значение> downto <конечное значение> do
тело цикла - <оператор>;
В этом операторе параметр изменяется от начального значения до конечного с шагом -1, т.е. уменьшается на 1 при каждом выполнении цикла. Если начальное значение сразу меньше конечного, то тело цикла не выполняется ни разу.
Пример: отсчет при запуске ракеты.
uses crt; var i: integer; begin for i:= 9 downto 1 do begin write(#8,i); delay(2000); end; write(#8,'Пуск'); end.
Еще некоторые примеры программ.
Пример 1: Вычисление суммы чисел S=1+2+3+…+N.
var n, p, s: integer; begin s:=0; write('Введите n'); readln(n); for p:= 1 to n do s:=s+p; writeln('S = ', s); end.
Пример 2: Вычисление суммы чисел S=0,2+ 0,4+ 0,6+…+2.
const n=10; var p, s, x: integer; begin s:=0; x:=0.2; for p:= 1 to n do begin s:=s+ x; x:=x+ 0.2; end; writeln('S = ', s); end.
В данном примере использование оператора цикла For нецелеобразно, т.к. в задании явно не указано число повторений суммирования. В таких случаях применяют циклы с условиями: While или Repeat (см. пп. 3.6, 3.7)
Пример 3: Вычисление факториала n!=1*2*3*…*N.
var n,i: integer; f: longint; begin write('Введите n'); readln(n); f:=1; for i:= 1 to n do f:=f*i; writeln('Факториал f = ', f); end.
Обычно используется, когда число повторений заранее неизвестно.
Структура оператора:
заголовок цикла - while <условие> do
тело цикла - <оператор>;
(при условии истинном выполняется оператор)
Условие – логическое выражение, определяющее момент окончания циклических вычислений (цикл выполняется, пока условие истинно). Проверка условия производится перед каждым выполнением тела цикла. Если условие ложно сразу, телоцикла не выполняется ни разу.
Обычно в теле цикла требуется выполнить несколько операторов, поэтому используется составной оператор begin…end.
Схема оператора:
Пример:
var x:integer; Begin x:=4; while x>0 do begin x:=x-2; {На экране:} writeln(x);{2} end; {0} End.
В теле цикла должны изменяться переменные, входящие в условие, с тем, чтобы условие, в конце концов, стало ложным, и цикл завершился. В противном случае возникает так называемый бесконечный цикл. Прервать выполнение бесконечного цикла можно с помощью клавиш ctrl-break.
Пример 1: while y<0 do writeln (y); | ![]() |
бесконечные циклы (в примере 1 – если y:=-1;) |
Пример 2: while true do begin…end; |
Пример 3: Вычисление суммы чисел S=0,2+ 0,4+ 0,6+…+2.
const n=2; var s, x: integer; begin s:=0; x:=0.2; while x<=n do begin s:=s+ x; x:=x+ 0.2; end; writeln('S = ', s); end.
Пример 4: Программа вычисления суммы S=1+1/2+1/3+…+1/1000
var i: integer; s: real; begin i:=1; s:=0; while i<=1000 do begin s:=s+1/i; {или for i:= 1 to 1000 do s:=s+1/i;} i:=i+1; end; writeln(‘S’, s:7:3); end.
Пример 5: Программа вычисления суммы S=1-1/4+1/9-1/16… с точностью ε = 0,001
(считается, что требуемая точность достигнута, если очередное слагаемое по модулю меньше ε, т.е. все последующие слагаемые можно не учитывать).
1 вариант:
var i, zn: integer; s: real; begin i:=1; s:=0; zn:=1 while 1/sqr(i) > = 0.001 do begin s:=s+1/sqr(i)*zn; i:=i+1; zn:=-zn; end; writeln(‘S = ’, s); end.
2 вариант:
var i: integer; s: real; begin i:=1; s:=0; while 1/sqr(i) > = 0.001 do begin if Odd(i) then s:=s+1/sqr(i) else s:=s -1/sqr(i); i:=i+1; end; writeln(‘S = ’, s); end.
3 вариант:
var i: integer; s: real; begin i:=1; s:=0; while 1/sqr(i) > = 0.001 do begin if (i mod 2=0) then s:=s-1/sqr(i) else s:=s+-1/sqr(i); i:=i+1; end; writeln(‘S = ’, s); end.
Обычно используется, когда число повторений заранее неизвестно.
Структура оператора:
repeat < операторы > until < условие >;
(операторы повторяются до тех пор, пока не выполнится условие)
Условие – логическое выражение, определяющее момент окончания циклических вычислений (цикл выполняется, пока условие ложно). Когда условие становится истинным, осуществляется выход из цикла. Проверка условия производится в конце тела цикла, поэтому он всегда выполняется хотя бы один раз.
Под телом цикла понимается последовательность операторов между словами repeat и until. Операторов может быть один и более. В любом случае операторные скобки begin…end не требуются.
Пример:
var i:integer; Begin i:=4; repeat i:=i-1; writeln(i); until i<0; {выполнится 4 раза: i=3,2,1,0} End.
Схема оператора:
В теле цикла должны изменяться переменные, входящие в условие, чтобы не получился бесконечный цикл.
Пример 1: repeat … until false;бесконечный цикл
Пример 2: repeat until keypressed;цикл до нажатия любой клавиши
keypressed – стандартная логическая функция, принимает значение true, если была нажата клавиша.
Пример 3: Вычисление суммы чисел S=0,2+ 0,4+ 0,6+…+2.
const n=2; var s, x: integer; begin s:=0; x:=0.2; repeat s:=s+ x; x:=x+ 0.2; until x>2; writeln(‘S = ’, s); end.
Пример 4: Вычисление квадратного корня числа, введенного с клавиатуры.
var a,b: real; begin repeat writeln(‘Введите а>0’); readln(a); until a>0; b:=sqrt(a); writeln(‘b=’,b); end.
Пример 5: Программа, считывающая с клавиатуры символ и печатающая его код
var k: integer; ch: char; begin repeat writeln(‘Введите символ’); readln(ch); k:=ord(ch); writeln(‘Код символа’, ch, ‘ = ’,k); until k=13; {13 – код пробела} end.
Основные отличия операторов цикла:
Тело цикла может содержать любые операторы языка Паскаль, в т.ч. и операторы циклов. Когда один цикл находиться внутри другого, то его называют вложенным циклом.
Примеры вложенного цикла For:
1.
var a,b:integer; begin for i:= 1 to 2 do for j:= 1 to 3 do writeln(i,' ', j); {выполнится 6 раз} end.
На экране увидим:
1 1
1 2
1 3
2 1
2 2
2 3
2.
var a,b:integer; begin for i:= 1 to 2 do begin for j:= 1 to 3 do writeln(i, ' ', j); {выполнится 6 раз} writeln(‘******’); end; end.
На экране увидим:
1 1
1 2
1 3
******
2 1
2 2
2 3
Правило выполнения:
на каждом шаге внешнего цикла полностью выполняются все шаги внутреннего цикла.
Пример 1: Программа вычисления и вывода на экран таблицы умножения (Пифагора).
var i,j: integer; begin for i:=1 to 9 do begin for j:=1 to 9 do write(i*j:4); writeln; end; end.
Пример 2: Программа вычисления значений функции f(x,y)=sin(x)*cos(y), где х=0..π с шагом π/5 и у=0..1 с шагом 0,1.
var x,y,f: real; begin x:=0; repeat y:=0; while y<=1 do begin f:=sin(x)*cos(y); write(f:6:3); y:=y+0,1; end; x:=x+pi/5; writeln; until x>pi; end.
Оператор перехода позволяет изменить обычный последовательный порядок выполнения операторов в программе. Он вызывает переход к выполнению оператора, которому предшествует метка.
Структура оператора:
GOTO <метка>;
…
…
< метка >: <оператор>;
Метка – это число от 0 до 9999, или идентификатор. Метки, используемые в программе, должны быть описаны:
LABEL 1, 2, Met;
Нельзя использовать оператор GOTO для перехода в подпрограммы, а также внутрь операторов цикла, условного и составного операторов.
Использование оператора перехода в Паскаль считается избыточным, поэтому следует избегать его использования в программах. В крайнем случае можно применять GOTO для перехода вниз по тексту программы (вперед) .
Пример: Частное от деления целых чисел.
Label M1; var x,y,res: integer; begin write(‘Введите x,y’); readln(x,y); if y=0 then begin writeln(‘Деление на ноль!’); goto M1; end; res:=x div y; writeln(‘Частное = ’, res); M1: writeln(‘Конец программы’); end.
3.1. Определить, какие значения x, y, z будут напечатаны после выполнения программы.
var x,y,z: real; begin x:=-2; y:=3; z:=3.5; z:=x-2.5; y:=x-y+2*z; x:=x+y-2*z; x:=y-2*x; y:=x+2*y+z; z:=(x+y)*2; writeln('x=',x,' y=',y,' z=',z); end.
3.2. Определить значение переменной
а)Определить значение переменной x после работы следующего фрагмента программы:
a = 8; b = 3 * a – 4; x = 0; y = 2 * b; if ( 2 * a > b ) or (4 * a < y ) then begin x = 7; y = –15 end; if ( x > 0 ) and ( 2 * a + b < y ) then begin x = 5; y = –7 end;
б)Определить значение переменной x после работы следующего фрагмента программы:
a = –3; b = –4 * a –2; x = 1; y = b/2 – 1; if ( 5 * a > b ) or ( y > a ) then begin x = x + 2; y = x – 3 end; if ( 2 * a + 8 > y ) and ( y < x ) then begin x = y + 5; y = 6 end;
3.3. Определить значение переменной x после работы следующих фрагментов программы:
а)
x:=5; for i:=2 to 4 do x:= x – 2;
б)
x:=4; y:=2; While y<= 4 do begin x:=x - 2; y:=y+1; end;
в)
x:=4; y:=2; Repeat x:=x - 2; y:=y+1; until y>=4 ;