Занятие 2. Циклы в Pascal abc.net

Циклы с предусловием (while), с постусловием (repeat), циклы со счетчиком (for)

Использование функции Assert для проверки корректности ввода

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

Выполнить: Даны координаты точки (x,y) на координатной плоскости ( ≠ 0, ≠ 0). Вывести номер четверти:

✍ Решение:

    var (x,y) := ReadInteger2;
    var quarter: integer;
    Assert((x<>0) and (y<>0), 'некорректный ввод'); //  True
    if x>0 then
      if y>0 then
        quarter := 1
      else 
        quarter := 4
    else
      if y>0 then
         quarter := 2
      else 
         quarter := 3;

Цикл с предусловием (while) в Pascal abc.net

    Синтаксис цикла while:

    while <условие> do   // заголовок цикла
      <оператор>          // тело цикла

    <условие>::= <логическое выражение>

    Цикл while на блок-схеме

    Цикл с предусловием (while) в Pascal abc.net

  • Итерация — однократное повторение тела цикла.
  • В цикле while тело может не выполниться ни разу.
Пример: Вычислить сумму четных чисел от 2 до 20.

✍ Решение:
 

    sum := 0; 
    x := 2;
    while x <= 20 do
    begin
      sum += x;
      x += 2;
    end;
Задание 1: Определите наименьшее натуральное число, квадрат которого больше заданного целого числа. Стандартную функцию извлечения квадратного корня не использовать.

Пример вывода:

Введите положительное число:
>> 10
ответ: 4
Пример: Даны положительные числа A и B (A ≥ B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без наложений). Не используя операции умножения и деления, найти количество отрезков B, размещенных на отрезке A.

✍ Решение:
 

    Begin 
      var (a,b):=readInteger2;
      assert(a>=b);
      var k:=0;
      var s:=0;
      while s<=a do begin
        inc(k);
        s+=b
      end;
      writeln(k-1)
    End.

    Оператор break в цикле while

    Оператор break предназначен для экстренного выхода из цикла. Обычно используется в условном операторе: при выполнении условия — выход из цикла.
    Как работать с последовательностями чисел?

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

    begin
      // ... 
      while True do // бесконечный цикл
      begin
        // ввод очередного элемента последовательности 
        var b := ReadInteger; // или ReadReal
        if b = 0 then
          break; // выход из цикла при вводе элемента, равного нулю
         // обработка очередного элемента последовательности
      end;
      // вывод результатов
    end.
    Задание 2: Дана последовательность целых чисел, признак завершения которой — число 0 (оно не считается элементом последовательности). Вывести номера чётных чисел последовательности (числа нумеровать с 1). Если последовательность не содержит чётных элементов, выводить ничего не нужно.

    Пример вывода:

    Введите последовательность:
    >> 10  8  7  9  0
    ответ: 1 2
    

    Цикл с постусловием (repeat) в Pascal abc.net

      Синтаксис цикла repeat:

      repeat          // заголовок цикла
        <операторы>   // тело цикла
      until <условие>
      Цикл repeat на блок-схеме

      Цикл с постусловием (repeat) в Pascal abc.net

    • В цикле repeat тело выполнится хотя бы один раз.
    Пример: Вычислить сумму четных чисел от 2 до 20.

    ✍ Решение:
     

      sum := 0; 
      x := 2;
      repeat
        sum += x;
        x += 2;
      until x = 22;

    Оператор цикла со счетчиком (for) в Pascal abc.net

      Синтаксис цикла for:

      <заголовок цикла>
        <тело цикла>
      
      <заголовок цикла> выглядит так:
      for <переменная>:=<выражение1> <направление> <выражение2> do
      
      <тело цикла> выглядит так:
      <оператор> 
      
      <направление> выглядит так:
      to | downto
      
    • переменная-счетчик должна иметь порядковый тип (целый, символьный или перечислимый);
    • переменная-счетчик цикла for не должна меняться внутри цикла for;
    • Новое в Pascal abc.net:
    • описание переменной цикла в его заголовке:
    • for [var] i: integer := 1 to 5 do
        <оператор>
    • автоопределение типа при описании:
    • for var i := 1 to 5 do
        <оператор>
      Значение переменной цикла после завершения цикла будет не определено (локальная).
    Пример: Даны целые числа A и B (A < B). Вывести в порядке возрастания все целые числа, расположенные между A и B (не включая сами числа A и B), а также количество N этих чисел.

    ✍ Решение:
     

      begin
        var (a, b) := readinteger2('Введите два целых числа. Первое должно быть меньше второго:');
        assert(a < b); // проверка действительно ли a < b
        for var i := (a + 1) to (b - 1) do
          println(i);
        println(b - a - 1); // количество чисел
      end.
    Задание 3: Даны два целых числа A и B. Выведите квадраты всех целых чисел, расположенных между A и B, в порядке возрастания чисел и включая сами эти числа.

    Пример вывода:

    Введите два числа (A меньше B):
    >> 2 5
    4 9 16 25
    
    Введите два числа (A меньше B):
    >> 5 2
    assert: неверный ввод
    
    Задание 4: Дано вещественное число — цена 1 кг конфет. Вывести стоимость 1.1, 1.2, …, 2 кг конфет.

    Пример вывода:

    Введите стоимость:
    >>3
    цена за 1кг = 3 
    цена за 1.1кг = 3.3 
    цена за 1.2кг = 3.6 
    цена за 1.3кг = 3.9 
    цена за 1.4кг = 4.2 
    цена за 1.5кг = 4.5 
    цена за 1.6кг = 4.8 
    цена за 1.7кг = 5.1 
    цена за 1.8кг = 5.4 
    цена за 1.9кг = 5.7 
    
    Пример: Используя один цикл, вычислить значение суммы, заданной следующей формулой (N > 0):

    ✍ Решение:
     

      Begin 
        var n:=readInteger('N = ');
        assert(n>0);
        var x:=readReal('X = ');
        var sum:=0.0;
        var f:=-1.0;
        var num:=1.0;
        for var i:=1 to n do begin
          num*=x;
          sum+=(x+f*num)/i;
          f*=-1.0;
        end;
        writeln(sum)
      End.
    Задание 5: Используя один цикл, вычислить значение суммы, заданной следующей формулой (N > 0):

    Не забудьте, что использование функции возведения в степень запрещено.

    Пример вывода:

    Введите n:
    >>5
    Введите х:
    >>2
    слагаемое: 0.666666666666667 
    слагаемое: 0.666666666666667 
    слагаемое: 0.727272727272727 
    слагаемое: 0.8 
    слагаемое: 0.864864864864865 
    y = 3.72547092547093 
    
    Как работать с последовательностью чисел?

    Например, если необходимо как-то обработать последовательность чисел с заданным количеством элементов, то примерный код может быть таким:

    begin
      // предварительные действия
      N := ReadInteger;        // или Read(N);
      for var i := 1 to N do
      begin
        // ввод очередного элемента 
        var b := ReadInteger;  //или ReadReal, или Read(b);
        // обработка очередного элемента 
      end;
      // вывод результатов обработки
    end.
    Задание 6: Дано целое число N (N ≥ 0) и последовательность из N целых чисел. Найти количество отрицательных чисел в этой последовательности.

    Пример вывода:

    Введите n:
    >>5
    Введите последовательность:
    >>2 -3  4  6  -2
    ответ: 2
    

    Упрощенный цикл LOOP

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

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

    Обработка цифр числа

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

    Пример: Дано натуральное число N — количество цифр и последовательность из N цифр. Сформировать положительное число, состоящее из этих цифр, начиная со старшего разряда.
    Пример:

    кол-во; цифры     => результат
    N = 3;  3,7,0     => M = 370
    N = 1;  0         => M = 0
    N = 5;  0,7,0,1,6 => M = 7016
    N = 1;  2         => M = 2
    N = 2;  0,2       => M = 2
    

    Замечание: В решении должен использоваться один цикл, запрещено использовать математические функции наподобие power или ln.

    ✍ Решение:
     

      begin
        var n := readinteger('Введите количество цифр N:');
        var num := 0;
        assert(n > 0);
        println('Введите цифры:');
        loop n do 
        begin
          var a := readinteger;
          num += a;
          num := num * 10;
        end;
        println(num div 10);
      end.
    Задание 7: Дано целое число. Найти количество его цифр и их сумму.
      
    Пример:

    N = 1205 => Count = 4, Sum = 8
    N = -111 => Count = 3, Sum = 3
    N =  0   => Count = 1, Sum = 0

    Замечание: В решении должен использоваться только один цикл, запрещено использовать математические функции наподобие power или ln.

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

    Пример:

    N = 1205 => M = 5021
    N = -950 => M = -59
    N =    0 => M = 0
    N =   -4 => M = -4
    

    ✍ Решение:
     

      begin
        println('Введите целое число:');
        var n := readinteger;
        var (newnum, sign) := (0, sign(n));
        n := abs(n);
        while n > 0 do
        begin
          newnum += (n mod 10);
          newnum *= 10;
          n := n div 10;
        end;
        println(sign * (newnum div 10));
      end.
    Задание 8: Задаются два числа целого типа одинаковой разрядности. Получить из них новое положительное число, разряды которого — есть наибольшее из соответствующих разрядов исходных чисел.

    Пример:

    N1 =  29, N2 = -31 => M = 39
    N1 = 111, N2 = 103 => M = 113
    N1 = -50, N2 =  20 => M = 50
    

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

    Пример:

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

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

    11  13  15  17  19  21

    ✍ Алгоритм:

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

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

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

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

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

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

    Функция z(x)
    Пример 2:

    Выполнить: Посчитать значение функции z(x) = x3 для всех x на промежутке [1, 7] с шагом = 2. Выполнить дважды: с циклом loop и циклом for.

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

    1*1*1 = 1   3*3*3 = 27   5*5*5 = 125   7*7*7 = 343
    

    ✍ Алгоритм:

    • Решение с циклом for:
    Задание 11:
    Выполнить: Посчитать значение функции z(x) = x2 для всех x на промежутке [3, 12] с шагом = 3. Выполнить дважды: с циклом loop и циклом for.

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

    3*3 = 9   6*6 = 36   9*9 = 81   12*12 = 144
    

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

    Задание 12:
    Выполнить: Посчитать значение функции z(x) = √x для всех x на промежутке [5, 25] с шагом = 5. Выполнить дважды: с циклом loop и циклом for.

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

    sqrt(5) = 2.23606797749979   sqrt(10) = 3.16227766016838    
    sqrt(15) = 3.87298334620742   sqrt(20) = 4.47213595499958  sqrt(25) = 5
    

    [Файл: task-04func.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
    Задание 13:
    Выполнить: Вывести последовательность 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-05step.pas]

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

    Пример: Дано целое число K > 0, а также K наборов ненулевых целых чисел. Признак завершения каждого набора — число 0. Для каждого набора вывести количество его элементов. Вывести также общее количество элементов во всех наборах.
      
    Пример:

    Введите число: 3   
    7 8 6 0 
    4 5 4 3 1 0 
    4 5 6 9 0   
    Кол-во элементов для каждого: 3 5 4  
    Всего элементов: 12 
    

    ✍ Решение:
     

      begin
        var k:=ReadInteger('Введите число');
        assert(k>0);
        var st:='';
        assert(k>0);
        var c:=0;
        for var i:=1 to k do
        begin
          var count:=0;
          var x:=ReadInteger;
          while x<>0 do
          begin
            count+=1;
            read(x);
          end;
          st+=count.ToString+' ';
          c+=count;
        end;
        Println('Кол-во элементов для каждого =',st);
        println('Всего элементов',c);
      end.
    Задание 15: Даны целые числа K > 0, N ≥ 0, а также K наборов целых чисел по N элементов в каждом наборе. Найти количество наборов, содержащих число 2. Если таких наборов нет, то вывести 0.
     
    Пример:

    K = 3, N = 5;
    набор 1:  6 4 2 -3  2
    набор 2: -1 5 6  3 49
    набор 3: 31 7 7 -8 12
    ...
    Правильный ответ: 1 набор.
    
    Табулирование функции двух переменных
    Пример: На интервале 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

    ✍ Решение:
     

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

    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
    ...

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

    1 комментарий для “Занятие 2. Циклы в Pascal abc.net”

    1. Добрый день! Спасибо за Ваш труд!
      На этой странице действительно представлены коды Pascal abc.net?
      Например, «newnum += (n mod 10); newnum *= 10;» ? Или это другой язык программирования?
      С уважением.

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