Решение задачи №2 из главы 12.2

Задача №2 из главы 12.2

У вас есть программа, использующая цикл while:

var
   i: integer;
begin
  i:=1;
  while i<=100 do
  begin
    write(i, ' ');
    i:=i+5;
  end;
   readln();
end.

1.Объясните что делает эта программа (что будет выведено на экран и почему)
2. Перепешите её с помощью цикла repeat/until
3. Перепешите её с помощью цикла for

Ответы:
1. Цикл While используется для проверки истинности. Если условие истинно то выполняется очередной виток цикла, до тех пор пока условие не станет ложным. Тогда цикл прерывается! И далее выполняется ниже прописанный код.
Выведется на экран следующее: 1 6 11 16 21 26 31 36 41 46 51 56 61 66 71 76 81 86 91 96

2.

var i:integer;
begin
    i := 1;
  repeat    // начало тела цикла
    write(i, ' ');
    i := i + 5; // увеличиваем счетчик на 1
  until ( i >= 100); // выход из цикла только если счетчик станет больше n

  readln();
end. 

3.

var i,a:integer;
begin
   for i:=0 to 100 do
   begin
        a := i;
        a := a + 5;
        write(a, ' ');
   end;
   readln();
end. 
vedro-compota's picture

  1. until ( i >= 100); 

    -- тут есть неточность. Какая?

  2. var i,a:integer;
    begin
       for i:=0 to 100 do
       begin
            a := i;
            a := a + 5;
            write(a, ' ');
       end;
       readln();
    end.
    

    Сколько раз выполнится ваша программа? А сколько выполнялась исходная? Вы невнимательно пишите код тут. Результат на экране должен быть один и тот же.

_____________
матфак вгу и остальная классика =)

gani84's picture

1)

until ( i >= 100);

Можно убрать знак = так как следующее значение будет 101. И получается условие он не нарушает.
2) Не совсем понимаю как задать так как for просто пересчитывает все числа.

vedro-compota's picture

Можно убрать знак = так как следующее значение будет 101. И получается условие он не нарушает.

переформулирую - неточность в том смысле, что вы рассматриваете не весь диапазон. Слово "можно" в ответе не подходит. Переделывайте.

_____________
матфак вгу и остальная классика =)

gani84's picture

переформулирую - неточность в том смысле, что вы рассматриваете не весь диапазон.

В принципе он также перебирает диапазон, даже если не убирать знак = .
Но я переделал

var i:integer;
begin
    i := 1;
  repeat    // начало тела цикла
    write(i, ' ');
    i := i + 5; // увеличиваем счетчик на 5
  until ( i > 100); // выход из цикла только если счетчик станет больше 100
readln();
end.     
vedro-compota's picture

Не совсем понимаю как задать так как for просто пересчитывает все числа.

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

_____________
матфак вгу и остальная классика =)

gani84's picture

Как получить результат через for, которые были получены через циклы repeat-until и while:
1 6 11 16 21 26 31 36 41 46 51 56 61 66 71 76 81 86 91 96
Я заметил что числа заканчиваются на 1 и 6
но никак не могу сообразить как задать условие для for
Думаю задать через if и mod, div
Но как это сделать?

gani84's picture

var i,a:integer;
begin
    a:=1; //инициализация переменной

    for i:=1 to 19 do
    begin
      write(a,' ');
      a:=a+5; //задаем шаг 5

    end;
   writeln();
   readln();
end. 
vedro-compota's picture

 for i:=1 to 19 do

это 20 раз или 19?

_____________
матфак вгу и остальная классика =)

gani84's picture

это 20 раз или 19?

19 раз

vedro-compota's picture

сделайте 20

_____________
матфак вгу и остальная классика =)

gani84's picture

var i,a:integer;
begin
    a:=1; //инициализация переменной
    for i:=0 to 19 do
    begin
      write(a,' ');
      a:=a+5; //задаем шаг 5
    end;
   writeln();
   readln();
end.
vedro-compota's picture

решение засчитано

_____________
матфак вгу и остальная классика =)