Описывают некоторые действия, которые необходимо выполнить для решения задачи. Тело программы представляет собой последовательность операторов (команд), которые разделяются “;”.

Напомним порядок выполнения операторов программы: слева направо сверху вниз.

 

3.1 Оператор присваивания

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

 

Фрагмент программы: Содержимое ячеек памяти (имя указано слева) после выполнения соответствующей команды присвоения:
   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

 

3.2 Составной оператор

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

begin

  <оператор 1>;

  <оператор 2>;

  

  <оператор 3>;

end;

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

 

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

Реализует алгоритмическую конструкцию “развилка”.

Условный оператор позволяет выполнить один из двух возможных операторов в зависимости от некоторого условия. Структура условного оператора следующая:

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.

3.4 Оператор выбора CASE

С помощью этого оператора можно выбрать вариант из любого количества вариантов.

Структура оператора:

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.

3.5 Оператор цикла с параметром (цикл FOR)

Циклом называется последовательность действий, выполняемая более одного раза. В Паскаль есть три различных типа операторов, позволяющих запрограммировать циклический процесс: оператор цикла с параметром (цикл 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
  h=8
  h=11
(см. пояснения ниже)

 

Если тело цикла состоит из нескольких операторов, то организуется составной оператор 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.

Замечания:

  1. Переменная-параметр цикла должна быть обязательно описана в разделе описания переменных var. Имя параметра – любое.
  2. В теле цикла можно использовать параметр, но запрещается его явное изменение (например, присваиванием i:=… или вводом с клавиатуры read(i)).
  3. По окончании цикла переменная-параметр цикла считается неопределенной, хотя на практике последнее значение этой переменной сохраняется.

Пример:

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.

3.6 Оператор цикла с предусловием (цикл WHILE)

Обычно используется, когда число повторений заранее неизвестно.

Структура оператора:

заголовок цикла - 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.

3.7 Оператор цикла с постусловием (цикл REPEAT)

Обычно используется, когда число повторений заранее неизвестно.

Структура оператора:

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.

Основные отличия операторов цикла:

  1. Цикл FOR используется, когда число повторений заранее известно, циклы WHILE и REPEAT – когда неизвестно.
  2. В цикле FOR параметр цикла изменяется с шагом 1, в циклах WHILE и REPEAT необходимо изменять переменные, входящие в условие.
  3. В циклах FOR и WHILE несколько операторов объединяются операторными скобками begin…end, в цикле REPEAT это не требуется.
  4. В циклах FOR и WHILE проверка условия выполняется перед очередным выполнением тела цикла, в цикле REPEAT – после выполнения тела цикла.

3.8 Вложенные циклы

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

Примеры вложенного цикла 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.

3.9 Оператор перехода GOTO

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

Структура оператора:

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 ;