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

Дата изменения: 7 августа 2019
Циклы с предусловием (while), с постусловием (repeat), циклы со счетчиком (for)

Цикл с предусловием (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;
Задание: Определите наименьшее натуральное число, квадрат которого больше заданного целого числа. Стандартную функцию извлечения квадратного корня не использовать.
Пример: Даны положительные числа 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.
    Задание: Дана последовательность целых чисел, признак завершения которой — число 0 (оно не считается элементом последовательности). Вывести номера чётных чисел последовательности (числа нумеровать с 1). Если последовательность не содержит чётных элементов, выводить ничего не нужно.

    Цикл с постусловием (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.
    Задание: Даны два целых числа A и B. Выведите квадраты всех целых чисел, расположенных между A и B, в порядке возрастания чисел и включая сами эти числа.
    Задание: Дано вещественное число — цена 1 кг конфет. Вывести стоимость 1.2, 1.4, …, 2 кг конфет.
    Пример: Используя один цикл, вычислить значение суммы, заданной следующей формулой (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.
    Задание: Используя один цикл, вычислить значение суммы, заданной следующей формулой (N > 0):

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

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

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

    Упрощенный цикл 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.
    Задание: Дано целое число. Найти количество его цифр и их сумму.
      
    Пример:

    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.
    Задание: Задаются два числа целого типа одинаковой разрядности. Получить из них новое положительное число, разряды которого — есть наибольшее из соответствующих разрядов исходных чисел.

    Пример:

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

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

    Пример: Дано целое число 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.
    Задание: Даны целые числа 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 набор.
    
    Один комментарий

      Лилия

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

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

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

    *
    *


    Вставить формулу как
    Блок
    Строка
    Дополнительные настройки
    Цвет формулы
    Цвет текста
    #333333
    Используйте LaTeX для набора формулы
    Предпросмотр
    \({}\)
    Формула не набрана
    Вставить