Циклы

Урок 12. Циклы в Pascal: repeat, while, for.

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

Циклы

 

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

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

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

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

Как вы, наверное, уже поняли из названия, 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.

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

  • Boris

    Можно ли использовать fjr с двумя переменными? пример:For i:=1 and k:=1 to n and n do

    • Нет, нельзя.

    • Петров Максим

      Можно использовать 2 цикла, используемые для обработки двумерных массивов:

      For var i:=1 to n do
      For var j:=i to n do
      begin

      end;

      Для двумерного массива i — строка, j — столбец.

  • Заманбек

    идите в попку

    • Лера

      Проще будьте пожалуйста!

  • Юра Белявцев

    Дошёл ка я до циклов и всё настроение попало.
    Может что нибудь посоветуете?

    • Данил

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

    • Петров Максим

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

  • Антон Куриленко

    А для чего нужен пустой оператор writeln?

    • alen_marzz

      Ну… Пустой оператор — это точка с запятой. А writeln без параметров нужен для вывода пустой строки (на практике его довольно часто используют для наглядного разделения чего-либо)

      • Антон Куриленко

        А readln без параметров для чего?

        • Петров Максим

          Readln; — Необходим для того, чтобы в Turbo Pascal остановить программу во время выполнения ожиданием ввода символа с клавиатуры. Иначе после компиляции программа просто мелькнет результатом и завершится.

    • Петров Максим

      Writeln; — Используется для переноса курсора (каретки) на следующую строку без вывода символов на экран.

  • Окт

    Отлично)Спасибо)

  • Петров Максим

    Придумай язык программирования более совершенный и удобный, если тебя этот не устраивает.

  • Евгений

    Добрый вечер!
    Скажите пжлста—я откомпелировал и создал exe файл—и при его вызове с window—окно маленькое получается -не во весь экран—мозя как то расширить—во весь экран,чтобы программа работала?
    С Уважением,
    Евгений

  • Ирина Афонина

    В формулировке первой задачи надо изменить «цифры» на «числа». Цифр только 10, а чисел может быть от 1 до введенного с клавиатуры числа.

  • Омар Шайхалиев

    Вы имеете полное право на своё мнение. Если вам не нравится Паскаль, то не заходите на сайт про Паскаль.

  • лили

    Не понимаю, в чем ошибка.
    Задача: сколько раз нужно разделить данное число y на 2 , чтобы получилась единица
    program _1;
    var x,y,q:real;
    begin
    write (‘введите положительное целое число y=’);readln(y);
    x:=y;
    q:=0;
    while x<=1 do
    begin
    q:=q+1;
    x:=x/2;
    end;
    write('y можно разделить на 2',q,'раз');end.

    • Юрий

      Во первых не понятно зачем тебе x:=y? Не нужная замена, можно идти дальше с переменной у, а во вторых условие, у тебя написано буквально «пока переменная меньше 1 мы выполняем следующее..» но ведь у тебя изначально числа вводятся больше 1, следовательно и условие такое же «while y>1 do»
      ну и для красоты, ябы посоветовал пробелы поставить, в итоге программа получится следующая

      program _1;
      var y,q:real;
      begin
      write (‘введите положительное целое число y=’);readln(y);x:=y;
      q:=0;
      while y>1 do
      begin
      q:=q+1;
      y:=y/2;
      end;
      write(‘y можно разделить на 2= ‘,q,’ раз(а)’);end.

      • Евгений мельник

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

  • крис

    в задаче for2
    count := B — A + 1; {считаем количество чисел}
    почему «+1»? а не «-1»
    если взять числа 8 и 10, то между ними 1 число (10-8-1)

  • Ikarus

    На главной статьи упорядочены неизвестно по какой схеме. Создайте содержание что ли.
    При масштабировании весь интерфейс сайта идёт по пизде. Блоки перекрывают друг друга, при открытии меню начинается адская свистопляска.
    Windows 10, Chrome 63.0.3239.84

    • alen_marzz

      Так содержание есть — «карта сайта» называется.

  • Максим

    Хм, почему в таких «курсах» только самое основное, что есть у всех языков программирования, это есть и в C++ и в C# (естественно есть НЕБОЛЬШИЕ отличия), изучал много языков по таким «курсам» но в них лишь самое основное, почему нет каких-то отличительных особенностей, ведь не даром СТОЛЬКО языков, у всех должно же быть что-то разное, иначе не было бы смысла во всех языках, т.к. можно было тупо использовать один конкретный, а это значит, что эти «курсы» или уроки, называйте как хотите, только для понимания каких-то основных понятий, тут не расписывают особенностей. По этому вы вряд ли в полной мере овладеете языком по таким «курсам», лучше уж на платные курсы записаться, сам по таким платным урокам начал учиться, и вам советую, узнал много нового о языке, не то что тут…
    P.S. Я никого оскорбить не пытался, и эти уроки могут научить хоть чему-то, но это лишь основные понятия, и помогут составлять просто НАИПРОСТЕЙШИЕ программы