Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Последовательность

Автор: asu2006 28.11.2007 16:15

7,9,13,21,37,..... и т.д
Вот код

uses
crt;
var
n,i:byte;
begin
clrscr;
i:=0;
for n:=7 to 100 do
begin

i:=i+2;
n:=n+i;

if n<100 then

write('n=', n);
break;
end;
readln;
end.



но он почему то выдает одну 9?

Автор: Lapp 28.11.2007 16:25

Во-первых, убери Break. Зачем ты его поставил вообще? Ессно отработается только один проход..

Во-вторых - никогда не меняй параметр цикла в самом цикле. Табу.

Автор: volvo 28.11.2007 16:32

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

Автор: Гость 28.11.2007 16:39

Цитата(Lapp @ 28.11.2007 12:25) *

Во-первых, убери Break. Зачем ты его поставил вообще? Ессно отработается только один проход..

Во-вторых - никогда не меняй параметр цикла в самом цикле. Табу.

Точнее, типичные циклы, где счетчик цикла меняется внцутри самого цикла, - это while и repeat.

n := 7
i := 1
repeat
writeln ('n=',n)
i := 2*i
n := n + i
until n > 100

Сойдет?

Автор: Гость 28.11.2007 17:17

А почему глюки начинаются когда изменешь 100 на 150 до максимального типа byte 255

Автор: volvo 28.11.2007 17:26

Потому что:

repeat
writeln ('n=',n); { <--- Когда здесь 133 }
i := 2*i; { <--- Тут i становится равным 128 }
n := n + i; { <--- N перескакивает через 256, и становится равно (133+128) mod 256 = 5 }
until n > 150;

, а 5 - меньше чем 150... И опять все заново...