Как составить цикл с постусловием паскаль

На занятии рассматривается цикл с постусловием в Паскаль Repeat и происходит знакомство со строковым типом данных

Основной задачей портала labs-org.ru является предоставление возможности получения навыков решения практических задач с использованием языка программирования Pascal. На основе решенных примеров и заданий по Паскалю, изложенных по мере увеличения их сложности, даже новичкам будет достаточно просто усвоить предоставленный материал.

Цикл с постусловием в Паскаль (repeat)

Пример: Ввести целое положительное число (n) и определить четное ли оно.

Проблема 1: Как избежать ввода отрицательного числа или нуля?
Решение 1: Если вводится неверное число, то нужно вернуться назад к вводу данных (цикл).

Проблема 2: Неизвестно, сколько шагов надо сделать.
Решение 2: Надо остановиться, когда n > 0, т.е. надо делать «до тех пор пока n не станет больше0».

  • Один раз тело цикла надо сделать в любом случае => проверку условия цикла надо делать в конце цикла (цикл с постусловием)!.
    • Цикл Repeat в Паскале используется для организации повторений (итераций) с заранее неизвестным их числом.
    • Цикл повторяется до тех пор, пока не станет истинным некоторое условие.
    repeat
      оператор1;
      оператор2;
      . . .;
      операторN
    until условие {до тех пор, пока условие не станет истинным}

    Блок-схема решения примера:

    Блок-схема решения примера

    Блок-схема решения примера

    Решение на Паскале:
    Цикл repeat пример на паскале

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

    Еще одно использование цикла Repeat рассмотрим на примере с решением.

    Пример: Печатать «ноль» указанное количество раз

    Показать решение:

    Pascal PascalABC.NET
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    var i,n:integer;
    begin
    write ('количество раз');
    readln(n);
    i:=1;
    repeat
      write(0);
      i:=i+1
    until i>n
    end.
    1
    2
    3
    4
    5
    6
    7
    8
    
    begin
    var n:=readInteger('количество знаков');
    var i:=1;
    repeat
      write(0);
      i:=i+1
    until i>n
    end.

    В решенной задаче оператор 8-й строки — это счетчик (i:=i+1), который просчитывает количество раз и одновременно является условием для выхода из цикла.


    PascalABC.NET:

    Для того, чтобы реализовать цикл с конкретным числом итераций, не используя счетчик цикла, возможен упрощенный вариант с использованием цикла Loop:

    Пример:

    // Выводить 5 раз слово "Привет!"
    loop 5 do 
      begin
        println('Привет!');
      end;
    // ...

    Задача 1. Написать программу решения задачи о печати чисел 3 5 7 9 11 13. Решите задачу дважды в одном файле: используя цикл Repeat и цикл loop (если вы его рассмотрели).

      
    [Название файла: L3task1.pas]

    Узнать о работе оператора с постусловием в Паскале можно также из видеоурока:

    Строковый тип данных в Паскаль

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

    Объявление строковой переменной:

    Присваивание значения строковой переменной:

    str:='вот такая вот строка';

    Пример использования строковых переменных в Паскале

    Pascal PascalABC.NET
    1
    2
    3
    4
    5
    6
    7
    
    var str1,str2: string;
    begin
         str1:='Привет, ';
         writeln('Ваше имя?');
         readln(str2);
         writeln(str1,str2)
    end.
    1
    2
    3
    4
    5
    6
    7
    
    begin
         var str1:='Привет,';
         var str2: string;
         writeln('Ваше имя?');
         readln(str2);
         print(str1,str2)
    end.

    Теперь снова возвращаемся к нашему циклу repeat.

    Задача 2. Компьютер предлагает человеку ввести слово, после чего распечатывает это слово, снабдив его восклицательным знаком. Затем снова предлагает ввести слово и так до тех пор, пока человек не введет слово «Хватит». Распечатав его с восклицательным знаком, компьютер отвечает: «Хватит так хватит» и заканчивает работу.
    Решите задачу дважды в одном файле: для решения использовать цикл с постусловием в Паскаль и цикл loop (если вы его рассмотрели).

      
    [Название файла: L3task2.pas]

    Дополнительно: Перед выводом каждого слова необходимо выводить его порядковый номер.

    Задача 3. Составьте блок-схему решенного задания.

      
    [Название файла: L3task3.pas]

    Циклы

    Здравствуйте, дорогие читатели! Вот мы с вами и подошли к изучению циклов. Циклы в Паскаль. Что это такое? Как этим пользоваться? Для чего они нужны? Именно на эти вопросы я сегодня и отвечу.
    Если вы читали этот урок, то знаете, что существует три вида алгоритмов: линейный, разветвляющийся и циклический. Мы с вами уже знаем, как реализовывать линейные и разветвляющиеся алгоритмы на Паскале. Приступим к изучению последнего типа алгоритмов.
    В языке Pascal, как и в большинстве языков программирования, существует три типа циклических конструкций.

    Циклы

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

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

    Задача 1. Вывести все числа от 1 до числа, введенного с клавиатуры.

    Как вы, наверное, уже поняли из названия, while — это цикл, в котором условие стоит перед телом. Причем тело цикла выполняется тогда и только тогда, когда условие true; как только условие становится false, выполнение цикла прекращается.

    While имеет формат:

    while < условие> do <оператор 1>;  {Пока … делай ….}

    Данный цикл подходит только для одного оператора, если же вы хотите использовать несколько операторов в своем коде, вам следует заключить их в операторные скобки — begin и end;.

    Решение задачи.

    program example_while; 
    
    var
      i, N: integer; { объявляем переменные }
    
    begin
      i := 1; { Присваиваем i значение 1 }
      readln(N); { Считываем последнее число }
      while i <= N do {Как только i станет больше N, цикл прекратится (можно было бы написать просто <, но пришлось бы добавлять 1 к N) }
      begin {Открываем операторные скобки}
        write(i, ' '); {Выводим i}
        Inc(i);  {увеличиваем i на один.}
      end; { закрываем скобки }
    end.

    Repeat, или цикл с постусловием

    Repeat  — полная противоположность while. Repeat — это цикл, в котором условие стоит после тела. Причем оно выполняется тогда и только тогда, когда результат условия false; как только логическое выражение становится true, выполнение цикла прекращается.

    Repeat имеет формат:

    repeat { повторяй … }
    <оператор 1>;
    < оператор 2>;

    until {до…} <условие>

    Begin и end не требуются.

    Решение задачи.

    program example_repeat;
    
    var
      i, N: integer;{ объявляем переменные }
    
    begin
      i := 1; { Присваиваем i значение 1 }
      readln(N); { Считываем последнее число }
      repeat {после repeat не требуется begin и end }
        write(i, ' '); {Выводим i}
        Inc(i);  {увеличиваем i на один.}
      until i = N + 1; {Например, i = 11, а N = 10. Цикл прекратится, так условие стало true.}
    end.

    For, или цикл с параметром

    For — это  цикл, в котором тело выполняется заданное количество раз.

    Существует две формы записи этого цикла:

    Первая форма

    for <счетчик1> := <значение1> to <конечное_значение> do <оператор1>;

    После каждой итерации значение <счетчик1> будет увеличиваться на 1.

    <значение1> — это начальное значение счетчика. Это может быть переменная или число.
    <конечное_значение> : как только значение <счетчик1> станет больше <конечное_значение>, выполнение цикла прекратится.

    Если требуется написать несколько операторов в теле цикла, используем begin и end.

    И <счетчик1>, и <конечное_значение>, и <значение1> —  переменные целого типа.

    Чаще всего в качестве счетчика используется переменная i.

    Вторая форма

    for <счетчик2> := <значение2> downto <конечное_значение> do <оператор1>;

    После каждой итерации значение <счетчик2> будет уменьшатся на 1.

    <значение2> — это начальное значение счетчика.
    <конечное_значение> : как только значение <счетчик2> станет меньше <конечное_значение>, выполнение цикла прекратится.

    Два важных примечания:

    1. Цикл повторяется, пока значение значение счетчика лежит в отрезке [значение ; конечное_значение].
    2. Изменять значение счетчика внутри тела нельзя!  Вот что выводит компилятор:

    for

    Решение задачи:

     
    program example_for;
    
    var
      i, N: integer;
    
    begin
      read(N); {предположим, что мы ввели 10}
      for i := 1 to N do write(i, ' '); {количество итераций - 10 - 1 + 1 = 10}
    end.

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

    Давайте решим пару задач.

    For1. Даны целые числа K и N  (N > 0). Вывести N раз число K.

    Организовываем простой цикл от 1 до требуемого числа.

    program for1;
    
    var
      K, N, i: integer;
    
    begin
      read(K, N);
      for i := 1 to N do write(K, ' '); {Пишем К через пробел }
    end.

    For2. Даны два целых числа A и B (A < B). Вывести в порядке возрастания все целые числа, расположенные между A и B (включая сами числа A и B), а также количество N этих чисел.

    Так как A < B, то цикл должен будет выводить все числа от А до B. Чтобы сосчитать количество чисел, используем формулу: <конечное_значение> — <начальное_значение> + 1.

    program for2;
    
    var
      A, B, i, count: integer;
    
    begin
      read(A, B);
      for i := A to B do write(i, ' '); {выписываем числа от меньшего к большему}
      count := B - A + 1; {считаем количество чисел}
      writeln;
      write( 'Количество чисел - ', count);
    end.

    For9. Даны два целых числа A и B (A < B). Найти сумму квадратов всех целых чисел от A до B включительно.

    Организовываем такой же цикл, как и в предыдущей задаче, но одновременно суммируем квадраты всех чисел. Чтобы высчитать квадрат, используем функцию Sqr.

    program for9;
    
    var
      A, B, i, S: integer;
    
    begin
      read(A, B);
      S := 0; {PascalABC делает это автоматически, но если у вас другой компилятор советуем обнулять переменные вручную}
      for i := A to B do S := S + Sqr(i);  {складываем все квадраты}
      writeln;
      write( 'Сумма квадратов - ', S);
    end.

    For13°. Дано целое число N (> 0). Найти значение выражения 1.1 – 1.2 + 1.3 – … (N слагаемых, знаки чередуются). Условный оператор не использовать.

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

    program for13;
    
    var
      N, A, i: integer;
      S: real;
    
    begin
      Write('N = ');
      readln(N); 
      S := 1.1; 
      A := 1; {Сначала положительное}
      for i := 2 to N do {первую итерацию цикла мы уже произвели, поэтому начинаем отсчет с 2}
      begin 
       A := -A; {Теперь отрицательное}
       S := S + A * (1 + i / 10);  {Складываем}
      end;
      Writeln(S:5:1); {Отдадим под дробную часть одно знакоместо}
    end.

    While1°. Даны положительные числа A и B (A > B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без наложений). Не используя операции умножения и деления, найти длину незанятой части отрезка A.

    Каждый раз вычитаем B из А, пока А — В  >= 0.

    program while1;
    
    var
      A, B: integer;
    
    begin
      readln(A, B);
      while (A - B) >=  0 do A := A - B; {Пока разница положительная, вычитаем. Необходимо предусмотреть вариант с кратностью А и B, поэтому >=}
      write(A);
    end.

    While4°. Дано целое число N (> 0). Если оно является степенью числа 3, то вывести True, если не является — вывести False.

    Действуем следующим образом: пока N делится нацело на три, делим N нацело. Затем, если N = 1 — число является степенью тройки; если N <> 1, тогда число — не степень тройки. Для того чтобы решить эту задачу, требуется знать, что такое div и   mod,  и как работают логические выражения.

    program while4;
    
    var
      N: integer;
    
    begin
      readln(N);
      while N mod 3 = 0 do N := N div 3; {Пока остаток от деления на три равен нулю, делим N нацело } 
      writeln(N = 1); {логическое выражение}
    end.

    На сегодня все! Не забывайте почаще заходить на наш сайт и кликать по кнопочкам, которые расположены перед комментариями.

    Когда в алгоритме некоторое действие нужно выполнить несколько раз, используются циклы. В программирование цикл — это многократное повторение определенных инструкций. Циклы состоят из заголовка и тела. Заголовок содержит в себе условия, которые определяют работу цикла, а тело – повторяющиеся действия. В этом уроке рассмотрим:

    • цикл со счетчиком (с параметром);
    • цикл с предусловием;
    • цикл с постусловием.
    • вложенные циклы/a>.

    Их алгоритмы выполнения различны, но есть и общее: после выполнения тела цикла, проверяется условие, и в зависимости от него работа цикла заканчивается, либо снова выполняется тело.

    1 For — цикл с параметром

    Цикл с параметром, известный также как цикл со счетчиком, используется при известном количестве повторений. Он имеет две формы записи. В любом случае он выполняет следующий после него оператор (как правило, это составной оператор заключенный в «операторные скобки» Begin..End), каждый раз изменяя переменную цикла с шагом 1

    For <счетчик>:=< начальное значение> To <конечное значение> Do <тело цикла>;
    
    For <счетчик>:=<начальное значение> Downto <конечное значение> Do <тело цикла>;

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

    Условия выполнения цикла проверяются перед выполнением блока операторов. Если переменная цикла больше максимального значения (при to) или меньше минимального (downto), то цикл FOR не выполняется.

    Формы записи, представленные выше, отличаются словами To и Downto. Если Вы используете цикл с To, то значение счетчика с каждым шагом будет увеличиваться на единицу, а если с Downto, то уменьшаться. Из этого следует, что в первом варианте начальное значение не должно превышать конечное, во втором — верно противоположное. В программе ниже, указанное пользователем количество раз, будут выводиться символы.

    program for_primer;
    uses crt;
    var i, x: integer;
    begin
      write('X=');
      readln(x);
      for i:=1 to x do
        write('a');
    readkey;
    end.

    Здесь тело цикла не заключено в Begin-End, так как оператор всего один. Но если их будет больше, то операторные скобки обязательны. Стоит также отметить, что счетчик по выходу из цикла не будет иметь определенного значения, но если цикл закончиться раньше положенного, то счетчик сохранит последнее, записанное в него значение.

    Другой пример — вычисление суммы чисел от A до B:

    Program Summa;
    Var a, b, S: Integer;
    Begin
      ClrScr;
      Write('a = ');
      Readln(a);
      Write('b = ');
      Readln(b);
      S:=0;
      For I:=a To b Do
        S:=S + I;
      Writeln ('Cумма = ', S);
      ReadLn
    End. 

    2 While – цикл с предусловием

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

    While <выражение> Do <тело цикла>;

    Если выражение истинно, то тело выполняется, иначе цикл завершается. Поэтому нужно составить такой код, чтобы на какой-то из итераций выражение стало ложным, и цикл не выполнялся бесконечно.

    Пример программы написанный с использованием цикла While:

    program while_primer;
    uses crt;
    var i, x, limit: integer;
    begin
      write('Предел=');
      readln(limit);
      write(' Числа Фибоначчи: ');
      i:=1; x:=1;
      while i<=limit do
      begin
        write(i,' ');
        i:=i+x;
        x:=i-x;
      end;
      readkey;
    end.

    В данном коде использовался составной оператор Begin-End, так как операторов в теле цикла несколько.

    3 Repeat – цикл с постусловием

    Главной особенностью цикла с постусловием (часто встречается название: цикл-ДО) является выполнение его тела минимум один раз. Это связано с тем, что условие записывается в конце и соответственно вначале выполнится тело, а затем провериться условие. Формально он выглядит так:

    Repeat
      <тело цикла>
    Until <условие>

    В противоположность двум рассмотренным прежде циклам, этот прекращает свое выполнение тогда, когда условие становиться истинным, т. е. чтобы итерации продолжались условие должно быть ложно. Рассмотрим работу цикла с постусловием на примере:

    program repeat_primer;
    uses crt;
    var i, otvet: integer;
    begin
      i:=1;
      repeat
        i:=i+1;
        write(i,'+',i,'*2=');
        read(otvet);
      until otvet<>i+i*2;
      readkey;
    end.

    Программа продолжает работать до тех пор, пока пользователь не допустит ошибку в ответе. Думаю, Вы заметили, что в примере (непосредственно в цикле) составной оператор Begin-End, несмотря на количество операторов не поставлен. Просто его роль выполняют слова repeat и until.

    Для переходных манипуляций с циклом обычно используются три оператора:

    • Goto – переходит в отмеченную область;
    • Break – производит безусловный выход из цикла;
    • Continue – осуществляет переход к новой итерации.

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

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

    Рассмотрим вложенные циклы на примере цикла с параметром:

    For <счетчик 1>:=<начальное знач.> To <конечное знач.> Do <тело цикла 1>;
    For <счетчик 2>:=<начальное знач.> To <конечное знач.> Do <тело цикла 2>;
    …
    For <счетчик n>:=<начальное знач.> To <конечное знач.> Do <тело цикла n>;

    Вернувшись к терминологии, отметим, что в таких структурах одни циклы называются внешними, а другие внутренними. Так цикл 2 относительно цикла 1 является внутренним, а для цикла n он внешний.

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

    Предположим у нас есть вложенные циклы for:

    for i:=1 to m1 do
    for j:=1 to m2 do
    …
    for k:=1 to mn do

    Количество проходов по первому циклу = m1, второму = m2*m1, n-ому = mn*mn-1*mn-2*..*m2*m1. В качестве доказательства предлагаю разобраться в следующей программе.

    program counter_performance;
    uses crt;
    var i, j, k, g, h: integer;
    s_i, s_j, s_k, s_g, s_h: integer;
    begin
      s_i:=0; s_j:=0; s_k:=0; s_g:=0; s_h:=0;
      for i:=1 to 5 do
      begin
        s_i:=s_i+1;
        for j:=1 to 3 do
        begin
          s_j:=s_j+1;
          for k:=1 to 19 do
          begin
            s_k:=s_k+1;
            for g:=1 to 10 do
            begin
              s_g:=s_g+1;
              for h:=1 to 6 do
                s_h:=s_h+1;
            end;
          end;
        end;
      end;
      write('i=',s_i,' j=',s_j,' k=',s_k,' g=',s_g,' h=',s_h);
      readkey;
    end.

    Имеются 5 циклов со счётчиками от i до h. В каждом из них при помощи переменных подсчитывается, сколько раз выполняется каждый цикл. Запустив программу на своем компьютере, Вы должны увидеть такой результат:


    Результат работы вложенных циклов

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

    program nested_loops;
    uses crt;
    var i, j: integer;
    begin
      i:=1; j:=1;
      while i<20 do begin
        while j<i+1 do begin
          write('');
          j:=j+1;
        end;
        j:=1;
        i:=i+1;
        writeln;
      end;
      readkey;
    end.

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

    “Программы без ошибок можно написать
    двумя способами, но работает — третий”
    Алан Джей Перлис

    Сегодня будем говорить об операторе Repeat.

    В переводе Repeat значит повторение. Давайте рассмотрим общую структуру этого цикла.
    структура оператора Repeat в Паскале
    где
    repeat – зарезервированное слово (повторение);
    until – зарезервированное слово (до тех пор пока);
    выражение – условие, управляющее повторениями, должно быть логического типа;
    оператор – любые операторы языка Pascal

      Принцип действия данного цикла схож с циклом while, но есть некоторые отличия:

    1. Выполняется оператор. Это главное отличие от цикла while, в котором сначало проверялось условие;
    2. После того, как оператор выполнился, проверяется выражение. Если его значение false, то цикл повторяется. В противном случае оператор Repeat завершает свою работу (если условие в цикле While является условием продолжения повторений, то условие в цикле Repeat – условием выхода из цикла, его завершения. Поэтому для одной и той же задачи эти условия противоположны).

    В принципе, ничего сложного. Поэтому приступим к разбору задачи с циклом Repeat:

    Вычислить факториал целого положительного числа N.

    Я надеюсь, что все знакомы с понятием факториал числа. Нет? Тогда вам стоит подучить математику, а затем вернуться сюда и продолжить)) Для ленивых, которые не хотят идти учить математику, напомню в двух словах. Факториа́л числа n – произведение всех натуральных чисел от 1 до n включительно. Обозначается факториал восклицательным знаком (!). Если простым языком то, например, 5! = 1*1*2*3*4*5. А факториал трех 3! = 1*1*2*3. Я думаю принцип понятен, нам нужно перемножить последовательно все члены ряда.

    В общем как мы будем решать эту архи сложную задачу при помощи цикла с постусловием? Для начала разберемся с переменными. По условию нам дана переменная N, значит она будет присутствовать в нашей программе. Далее нам нужно ввести некоторую переменную (возьмем F), в которой будет подсчитываться значение факториала. Изначально данная переменная будет равна 1 (потому что самый маленький факториал, учитывая возможное число N будет равен 1). Если посмотреть внимательно чуть выше, там где я расписал факториал пяти, то можно заметить одну особенность – каждый раз мы умножаем на число, которое на единицу больше предыдущего. Какой вывод из этого можно сделать? Правильно, нам нужна некоторая переменная – счетчик (обычно берут i), которая будет с каждой новой итерацией (повторением) цикла увеличиваться на единицу. Изначально данная переменная будет равна 0. Все, больше переменных нам не нужно.

    Осталось правильно составить цикл Repeat. Еще разок взгляните на это 5! = 1*1*2*3*4*5. Для начала нам нужно организовать это умножение 1*1. Первая единица – это наша переменная F. Второй множитель это наша переменная i, которая у нас пока равна нулю. Значит перво-наперво в теле цикла Repeat нам нужно прописать строчку i:=i+1;, которая будет каждый раз увеличивать значение множителя на единицу. Хорошо, два первых множителя у нас есть, теперь сделаем так чтобы результат этого умножения сохранился в нашей переменной F. Для этого в блоке операторов цикла Repeat допишем строчку F:=F*i;. Готово, теперь у нас множитель каждый раз будет повышаться на единицу и умножаться на результат предыдущего произведения. Осталось составить условие для выхода из цикла. Цикл прекратит свое выполнение тогда, когда условие станет истинным. Какое бы нам условие написать? Да вот какое – i=N, т.е. пока у нас переменная i меньше заданного с клавиатуры числа N, цикл Repeat будет повторяться. Как только переменная i станет равна N произойдет выход из цикла.

    Ну а дальше стандарт – вывод переменной F, содержащей результат на экран и завершение программы. Посмотрим на то, что у нас получилось в итоге:

    program factorial;
    var
       F,N,I:integer;
    begin
       F:=1;
       I:=0;
       writeln('N = ');
       readln(N);
       
       Repeat
         I:=I+1;
         F:=F*I;
       until
         I=N;
    
       writeln('N! = ',F);
    end.

    На сегодня это все. Жду вас на следующих занятиях.

    Когда в алгоритме некоторое действие нужно выполнить несколько раз, используются циклы. В программирование цикл — это многократное повторение определенных инструкций. Циклы состоят из заголовка и тела. Заголовок содержит в себе условия, которые определяют работу цикла, а тело – повторяющиеся действия. В ЯП Pascal есть три вида циклов:

    цикл с параметром;

    цикл с предусловием;

    цикл с постусловием.

    Их алгоритмы выполнения различны, но есть и общее: после выполнения тела цикла, проверяется условие, и в зависимости от него работа цикла заканчивается, либо снова выполняется тело.

    For — цикл с параметром

    Цикл с параметром, известный также как цикл со счетчиком, используется при известном количестве повторений. Он имеет две формы записи:

    1. For <счетчик>:=< начальное значение> To <конечное значение> Do <тело цикла>;
    2. For <счетчик>:=<начальное значение> Downto <конечное значение> Do <тело цикла>;

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

    Формы записи, представленные выше, отличаются словами To и Downto. Если Вы используете цикл с To, то значение счетчика с каждым шагом будет увеличиваться на единицу, а если с Downto, то уменьшаться. Из этого следует, что в первом варианте начальное значение не должно превышать конечное, во втором — верно противоположное. В программе ниже, указанное пользователем количество раз, будут выводиться символы.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    program for_primer;
    uses crt;
    var i, x: integer;
    begin
    write(‘X=’);
    readln(x);
    for i:=1 to x do
    write(#3, #6);
    readkey;
    end.

    Здесь тело цикла не заключено в Begin-End, так как оператор всего один. Но если их будет больше, то операторные скобки обязательны. Стоит также отметить, что счетчик по выходу из цикла не будет иметь определенного значения, но если цикл закончиться раньше положенного, то счетчик сохранит последнее, записанное в него значение.

    While – цикл с предусловием

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

    While <выражение> Do <тело цикла>;

    Если выражение истинно, то тело выполняется, иначе цикл завершается. Поэтому нужно составить такой код, чтобы на какой-то из итераций выражение стало ложным, и цикл не выполнялся бесконечно.

    Пример программы написанный с использованием цикла While:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    program while_primer;
    uses crt;
    var i, x, limit: integer;
    begin
    write(‘Предел=’);
    readln(limit);
    write(‘ Числа Фибоначчи: ‘);
    i:=1; x:=1;
    while i<=limit do
    begin
    write(i,‘ ‘);
    i:=i+x;
    x:=ix;
    end;
    readkey;
    end.

    В данном коде использовался составной оператор Begin-End, так как операторов в теле цикла несколько.

    Repeat – цикл с постусловием

    Главной особенностью цикла с постусловием (часто встречается название: цикл-ДО) является выполнение его тела минимум один раз. Это связано с тем, что условие записывается в конце и соответственно вначале выполнится тело, а затем провериться условие. Формально он выглядит так:

    Repeat

    <тело цикла>

    Until <условие>

    В противоположность двум рассмотренным прежде циклам, этот прекращает свое выполнение тогда, когда условие становиться истинным, т. е. чтобы итерации продолжались условие должно быть ложно. Рассмотрим работу цикла с постусловием на примере:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    program repeat_primer;
    uses crt;
    var i, otvet: integer;
    begin
    i:=1;
    repeat
    i:=i+1;
    write(i,‘+’,i,‘*2=’);
    read(otvet);
    until otvet<>i+i*2;
    readkey;
    end.

    Программа продолжает работать до тех пор, пока пользователь не допустит ошибку в ответе. Думаю, Вы заметили, что в примере (непосредственно в цикле) составной оператор Begin-End, несмотря на количество операторов не поставлен. Просто его роль выполняют слова repeat и until.

    Для переходных манипуляций с циклом обычно используются три оператора:

    Goto – переходит в отмеченную область;

    Break – производит безусловный выход из цикла;

    Continue – осуществляет переход к новой итерации.

    Добавить комментарий