Вопрос по задаче №2 из главы 12.2. Переделать цикл while на for

Вопрос по задаче №2 из главы 12.2

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

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

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

Как получить результат через 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
Но как это сделать?

vedro-compota's picture

добавьте цитату условия, вопрос должен быть оформлен понятно.

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

vedro-compota's picture

код должен быть подсвечен.

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

vedro-compota's picture

Я заметил что числа заканчиваются на 1 и 6

на самом деле не важно чем они заканчиваются - важно как работает цикл:
то что они заканчивают на 1 и 6 есть просто следствие того, что цикл while "шагает" пятерками.
Вам нужно понять как он работает - сам ряд чисел тут не имеет особого значения, но да - ряды должны в конечном итоге совпадать.

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

gani84's picture

Цикл for будет с шагом 1.

vedro-compota's picture

while i<=100 do
  begin
    write(i, ' ');
    i:=i+5;
  end;

тут можно решить как минимум двумя способами:

  1. - надо понимать, что вы не обязаны в решении с for выводить именно значение счетчика,
  2. хотя можно сделать и со счетчиком, но тогда выводить значение нужно будет не на каждый шаг.

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

gani84's picture

while i<=100 do //пока i меньше или равно 100
  begin
    write(i, ' '); //выводим i 
    i:=i+5; // задаем шаг +5 (каждый виток будет прибавляться 5)
  end;
vedro-compota's picture

теперь давайте ваш вариант решения.

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

gani84's picture

var i,a:integer;
begin
    a:=1; //инициализация переменной
   for i:=-4 to 15 do
     begin
     a:=a+4; //задаем шаг 4
     write(i+a ,' ');  // складываем предыдущее число счетчика и число а с шагом 4
     end;
   writeln();
   readln();
end.   
vedro-compota's picture

распечатка этой программы совпадает с тем, что выводит исходный код с while?

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

gani84's picture

Да совпадают полностью 1 6 11 16 21 26 31 36 41 46 51 56 61 66 71 76 81 86 91 96
Можете проверить!!!

vedro-compota's picture

хорошо, переделайте теперь так, чтобы счетчик цикла (все также через for) не исползовался в процессе формирования очередного числа для вывода.

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

gani84's picture

чтобы счетчик цикла (все также через for) не исползовался в процессе формирования очередного числа для вывода.

не совсем понял? Предлагаете в write(i+a ,' ') убрать i

vedro-compota's picture

Предлагаете в write(i+a ,' ') убрать i

да, i не должна использоваться. Напишите решение.

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

gani84's picture

Не хватает 1 в начале не знаю почему?

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

    for i:=1 to 18 do
    begin
      a:=a+5; //задаем шаг 5
      write(a,' ');
    end;
   writeln();
   readln();
end.    
vedro-compota's picture

Не хватает 1 в начале не знаю почему?

потому что первое значение, которое вы выводите это 6. можно сначала выводить, а потом прибавлять.

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

gani84's picture

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

    for i:=1 to 20 do
    begin
     write(a,' ');
     a:=a+5; //задаем шаг 5
    end;
   writeln();
   readln();
end.  
vedro-compota's picture

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

хорошо, это тоже работающий вариант, он быстр по времени, так как ни один виток не проходит в холостую, но для лучшего понимания давайте сделаем решение, где счетчик в for используется и проходит точно такой же диапазон как в while, тогда:

  • печать придётся делать не каждый раз, а первый раз и потом каждый пятый раз
  • например можно завести какую-то переменную, изначально равную 5, далее в теле цикла если она равна 5, то мы выводит значение счетчика (первый раз это будет как раз один), а саму переменную сбрасываем в ноль или 1 (проверьте во что именно) - это позволит задать в шапке for-а тот же диапазон и не подбирать конечное значение, как в двух ваших решениях выше

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

gani84's picture

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

Не совсем понял, но решил ее так

неправильно, подразумевается, что i должна изменяться от 1 до 100, как и в исходном коде.

выше же написано что-то вообще невнятно с непонятно зачем добавленным условием.

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

gani84's picture

var i,a,b:integer;
begin
    a:=1;
    b:=20;//переменная задает количество циклов, которые надо пройти
    for i:=1 to 100 do
    begin
     if i <= b then
        write(a,'  ');
     a:=a+5; //задаем шаг 5
    end;
   writeln();
   readln();
end.  

vedro-compota's picture

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

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

gani84's picture

Если честно не совсем понял что значит в холостую. Можете подробнее описать. Но решил

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

var i,a,b:integer;
begin
    a:=1;
    b:=20;//переменная задает количество циклов, которые надо пройти
    for i:=1 to 100 do
    begin
     if i <= b then
         write(a,'  ');
     a:=a+5; //задаем шаг 5
     if i >= b then
         break;
    end;
   writeln();
   readln();
end.
vedro-compota's picture

if i <= b then
         write(a,'  ');
     a:=a+5; //задаем шаг 5
     if i >= b then
         break;

как-то с условиями все нездорово, вспомните что существует else.

Если честно не совсем понял что значит в холостую.

то есть впустую, зря, когда ничего не происходит полезного.

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

gani84's picture

var i,a,b:integer;
begin
    a:=1;
    b:=20;//переменная задает количество циклов, которые надо пройти
    for i:=1 to 100 do
    begin
     if i <= b then
         write(a,'  ')
     else
         break;
     a:=a+5; //задаем шаг 5
   end;
   writeln();
   readln();
end.
vedro-compota's picture

это верно. Далее нужно ещё одно альтернативное решение.

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

vedro-compota's picture

Ну и давайте теперь вернёмся к исходной мысли:

1 6 11 16 21 26 31 36 41 46 51 56 61 66 71 76 81 86 91 96
Я заметил что числа заканчиваются на 1 и 6

математически тут важно другое, если из этого числа вычесть 1, то оно будет делиться на что?
запрограммируйте задачу используя этот факт, пусть счетчик реально пройдет все i:=1 to 100.

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

gani84's picture

Можете более подробнее пояснить вопрос. Если честно не совсем понял)

vedro-compota's picture

Можете более подробнее пояснить вопрос. Если честно не совсем понял)

  1. вы проходите все числа от 1 до 100
  2. вам надо понять когда именно число выводится
  3. посмотрев на ряд 1 6 11 16 21 26 31 36 41 46 51 56 61 66 71 76 81 86 91 96 можно заметить, что если вычесть из каждого числа 1, то оно делится на 5 нацело - это можно использовать для решения.

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

gani84's picture

var i,a,b:integer;
begin
    a:=1;
    b:=20;//переменная задает количество циклов, которые надо пройти
    for i:=1 to 100 do
    begin
     if i <= b then // если количество циклов меньше или равно 20 тогда
       if ((a-1) mod 5)=0 then //если а-1 делиться нацело тогда
          write(a,'  ') // тогда выводим а
     else
         break;
     a:=a+5; //задаем шаг 5
   end;
   writeln();
   readln();
end.  
vedro-compota's picture

посмотрев на ряд 1 6 11 16 21 26 31 36 41 46 51 56 61 66 71 76 81 86 91 96 можно заметить, что если вычесть из каждого числа 1, то оно делится на 5 нацело - это можно использовать для решения.

переменная "a" тут не нужна (почему?). Сейчас вы просто слепили в кучу все что смогли. переделайте.

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