Pascal: Занятие №3. Часть 3: Паскаль цикл for

На занятии изучается работа в Паскаль с циклом for — цикл с параметром или счетчиком. Рассматриваются примеры работы операторов Continue и Break в Паскале

Цикл со счетчиком в Паскаль (цикл for)

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

Блок-схема, соответствующая циклу For:
паскаль цикл for блок-схема

Ну или если на простом примере:

Пример: вывести пять раз слово «Привет!»

цикл for

Паскаль цикл For: синтаксис:

Прямое направление цикла (от меньшего значения к большему):

{при движении от меньшего значения к большему, например, от 1 до 10}
for счетчик:=значение to конечное_значение do 
  тело_цикла;

Обратное направление (от большего к меньшему):

{при движении от большего значения к меньшему, например, от 10 до 1}
for счетчик:=значение downto конечное_значение do 
  тело_цикла;

Решение на Паскале:
цикл for Паскаль

Оператор в теле конструкции может быть одиночным или составным оператором.

составной оператор в цикле for

Счетчик цикла или параметр цикла — это обычная переменная, которая может быть только порядкового (целочисленного, символьного, логического) или перечислимого типа.

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

Важно знать: счетчик (параметр цикла) нельзя изменять внутри тела цикла! Кроме того, нельзя менять его начальное и конечное значения.
PascalABC.NET:

  • описание переменной цикла в его заголовке:
  • for [var] i: integer := 1 to 5 do
      <оператор>
  • автоопределение типа при описании:
  • for var i := 1 to 5 do
      <оператор>
    Значение переменной цикла после завершения цикла будет не определено (локальная).

    Рассмотрим на решенном примере, как используется в Паскаль цикл for:

    Пример: Печатать «ноль» указанное количество раз
    Pascal PascalABC.NET
    1
    2
    3
    4
    5
    6
    7
    
    var i,n:integer;
    begin
    write ('количество раз');
    readln(n);
    for i:=1 to n do
      write(0);
    end.
    1
    2
    3
    4
    5
    
    begin
    var n:=readInteger('количество раз');
    for var i:=1 to n do 
      write(0);
    end.

    Более детально цикл со счетчиком в Паскале рассмотрен в видеоуроке:
    youTube

    Пример: Вывести на экран квадраты и кубы целых чисел от 1 до 8 (от a до b). Реализовать двумя способами: 1. переменная цикла должна увеличиваться и 2. переменная цикла должна уменьшаться.

    Решение в виде блок-схемы:
    цикл с счетчиком

    Решение на Паскале:

    Вариант 1 Вариант 2
    3 4
    Задача 8. Найти среднее арифметическое чисел в Паскале, числа вводятся с клавиатуры, их количество произвольно. Использовать цикл for
      
    [Название файла: L3task8.pas]
    Задача 9. Составить блок-схему по программе нахождения среднего арифметического в pascal.
      
    [Название файла: L3task9.pas]
    Пример: Вывести на экран квадраты и кубы нечётных целых чисел от 1 до 9.

    Решение:

    Вариант 1
    неэффективное решение
    Вариант 2
    эффективное решение
    1 эффективное решение
    Вариант 3
    эффективное решение

    1_11

    Pascal: выход из цикла

    Break и Continue

    Для выхода из цикла предусмотрена процедура break в Паскале. Break досрочно прекращает выполнение циклов while, repeat и for.

    Процедура Continue досрочно выходит из текущей итерации цикла, но, не завершая его, а переходя к следующей итерации.

    Рассмотрим использование процедур выхода из цикла Continue и Break в Паскале (будем использовать цикл while):

    Пример: Программа вывода на экран степеней двойки с использованием процедур break и continue
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    var a:integer;
    begin
    a:=1;
    while a<1000 do
    begin
          a:=a*2;
          if a=64 then continue;
          if a=256 then break;
          write(a:4); {4 позиции на вывод каждого числа}
    end;
    end.

    В результате программы на экране будут напечатаны: 2 4 8 16 32 128.
    Число 64 пропущено, так как при условии a=64 происходит выход из текущей итерации (continue) и число не выводится на экран, а при a=256 выполнение цикла прерывается окончательно (break), так и не распечатав число 256.

    Задача 10. Решить рассмотренную задачу с процедурами break и continue для циклов repeat и for
      
    [Название файла: L3task10.pas]

    Произвольный шаг в цикле for

    Пример:

    Выполнить: Выведите все двухзначные нечетные числа от 11 до 21.

    Примерный результат:

    11  13  15  17  19  21

    ✍ Алгоритм:

    • Решение 1. С циклом loop
    • Решение 2. С циклом for loop
    Задание 1 (step):
    Выполнить: Выведите последовательность 3 5 7 9 … 21 (от 3 до 21 с шагом = 2). Выполнить дважды: с циклом loop и циклом for.

    Фрагмент программы:

    begin
    println('результат с циклом loop');
    var ...;
    loop ...;
      ...
    println('результат с циклом FOR');
    for var ...
      ...
    end.

    [Файл: task-01step.pas]

    Задание 2 (step):
    Выполнить: Вывести последовательность: 20 18 16 … 2 (от 20 до 2 с шагом = 2). Выполнить дважды: с циклом loop и циклом for.

    [Файл: task-02step.pas]

    Пример 3:
    Выполнить: Вывести последовательность: 1.0    1.1   1.2    1.3   1.4    1.5   1.6    1.7  1.8    1.9   2.0.

    ✍ Алгоритм:

    • Решение 1. С циклом loop
    • Решение 2. С циклом for
    Задание 3 (step):
    Выполнить: Вывести последовательность 0.1   0.3  0.5   0.7  0.9   1.1. Выполнить дважды: с циклом loop и циклом for.

    Примерный результат:

    0.1   0.3   0.5   0.7   0.9   1.1
    

    [Файл: task-03step.pas]

    Табулирование функции на отрезке с заданным шагом

    * Следует учесть, что эта тема не обязательна для школьного курса информатики, в основном предполагается ознакомление студентами.

    Табулирование функции одной переменной
    Пример: На отрезке [a,b] с шагом h протабулировать функцию f(x)=x2+Ln|x| и вывести на печать значения этой функции.

    Алгоритм:
    Для решения задачи в области определения функции вводится сетка – совокупность точек:

    {x0, x1, x2, …, xi}, 
    где x0 = а, 
    x1= x0+h,
    …, 
    xi = xi-1+h, xn = b.

    Тогда задача сводится к вычислению функции f в точках xi, то есть нужно вычислить:

    f(x0), f(x1), …, f(xi), f(xn)

    ✍ Решение:
     

      Pascal PascalABC.NET
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      
      var
        x, a, b, f, h: real;
       
      begin
        writeln('отрезок от ... и до ...');
        readln(a, b);
        writeln('шаг');
        readln(h);
        x := a;
        while x <= b do
        begin
          f := sqr(x) + ln(abs(x));
          writeln('x= ', x, ' f= ', f);
          x := x + h;
        end
      end.
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      
      begin
        writeln('отрезок от ... и до ...');
        var (a, b):=readReal2;
        var h:=readReal('шаг');
        var x := a;
        while x <= b do
        begin
          var f := sqr(x) + ln(abs(x));
          writeln('x= ', x, ' f= ', f);
          x := x + h;
        end
      end.
    Пример: Вычислить 7 значений функций

        0.15x + a
    y= -----------
        a2 + x2
    

    где начальное значение а=0.14х, шаг Δа=0.22

    Результаты для x = 2:

    a =0.28 y = 0.142212632404865
    a =0.5 y = 0.188235294117647
    a =0.72 y = 0.225743626062323
    a =0.94 y = 0.253911049225981
    a =1.16 y = 0.273121819814427
    a =1.38 y = 0.284533568186437
    a =1.6 y = 0.289634146341463

    ✍ Решение:
     

      var
        x, a, y, h: real;
        i:integer;
       
      begin
        writeln('ведите x');
        readln(x);
        h:=0.22;
        a := 0.14*x;
        for i:=1 to 7 do
        begin
          y := (0.15*x + a)/(sqr(a)+sqr(x));
          writeln('a =', a, ' y = ', y);
          a := a + h;
        end
      end.
    Табулирование функции двух переменных
    Пример: На интервале xn≤x≤xk с шагом Δх, для каждого у из интервала уn≤y≤yk с шагом Δу вычислить значение функции f=x2+ln|y|.
    Например:

    если 
    xn = 2; xk = 3
    уn = -1; yk = 1
    шаг Δх = 1, шаг Δy = 0.5
    
    то f1 = 22+ln|-1| = 4
    f2 = 22+ln|-0.5|= 3.30685281944005
    ...

    Результат:

    x= 2 y= -1 f= 4
    x= 2 y= -0.5 f= 3.30685281944005
    x= 2 y= 0 f= -∞
    x= 2 y= 0.5 f= 3.30685281944005
    x= 2 y= 1 f= 4
    x= 3 y= -1 f= 9
    x= 3 y= -0.5 f= 8.30685281944005
    x= 3 y= 0 f= -∞
    x= 3 y= 0.5 f= 8.30685281944005
    x= 3 y= 1 f= 9

    ✍ Решение:
     

      var
        xn, xk, yn, yk, f, hx, hy,x,y: real;
      begin
        writeln('отрезок для x от ... и до ...');
        readln(xn, xk);
        writeln('отрезок для y от ... и до ...');
        readln(yn, yk);
        writeln('шаг для x');
        readln(hx);
        writeln('шаг для y');
        readln(hy);
        x := xn;
        y := yn;
        while x <= xk do
        begin
          while y <= yk do
          begin
            f := sqr(x) + ln(abs(y));
            writeln('x= ', x, ' y= ', y, ' f= ', f);
            y := y + hy;
          end;
          x := x + hx;
          y:=yn;
        end
      end.
    Задача 11:
    Вычислить значение функции:

    z(x, у) = sin x + cos y

    при всех х, изменяющихся на интервале [-1, 1] с шагом Δх = 0.2, и у, изменяющихся на интервале [0, 1] с шагом Δу = 0.1.
    Результат:

     x=-1.00 y=0.00 z=0.16
     x=-1.00 y=0.10 z=0.15
     x=-1.00 y=0.20 z=0.14
     x=-1.00 y=0.30 z=0.11
     x=-1.00 y=0.40 z=0.08
     x=-1.00 y=0.50 z=0.04
     x=-1.00 y=0.60 z=-0.02
     x=-1.00 y=0.70 z=-0.08
     x=-1.00 y=0.80 z=-0.14
     x=-1.00 y=0.90 z=-0.22
     x=-1.00 y=1.00 z=-0.30
    
     x=-0.80 y=0.00 z=0.28
    ...

    Дополните код в местах, где стоят троеточия:

    var
      x, y, z: real; // описание переменных
     
    begin
      writeln('x y z(x,y)'); 
      x := -1.0; 
      y := ...; // начальное значение
      while (x <= 1) do
      begin
        while (...) do  //запуск внутреннего цикла
        begin
          z := sin(x) + cos(y); 
          write(' x=', x:3:2, ' y=', y:3:2, ' z=', z:3:2 ); 
          y := y + ...; 
          writeln();
        end;
        writeln();
        x := ...; // изменение параметра х на шаг
        y:= 0; 
      end
    end.

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

    Exit и Halt

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

    Процедура halt в pascal завершает работу программы.

    Потренируйтесь в решении задач по теме, щелкнув по пиктограмме:

    проверь себя

    6 комментариев для “Pascal: Занятие №3. Часть 3: Паскаль цикл for”

    1. Пример: Вывести на экран квадраты и кубы нечётных целых чисел от 1 до 9.i :=i+2;? мы же не можем менять параметр в теле цикла?

    Обсуждение закрыто.