Помощь - Поиск - Пользователи - Календарь
Полная версия: прога не работает
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
art88
Люди у меня есть задача и даже прогу, которая решает эту задачу я написал но она(прога) не тработает.
ПЛЗ. пораскиньте, кто чем может.
----------------------------------------------
Задача даны числа k, l, m, выяснить, можно ли любое число преобразовать в единицу за m раз следующим образом
если число(n) чётно, то подельть его на два,
если нет, то умножить его на три и прибавить единицу.
----------------------------------------------
Прога виснет при некоторых значениях к, l, m.(см diapazon.pas)
volvo
art88,
Цитата
Прога виснет при некоторых значениях
покажи, при каких именно значениях у тебя виснет программа.

И заодно объясни, что такое K и L?
Atos
Программа виснет, потому что строчка ok1:=false может не выполняться, и тогда цикл while (n <= l) and ok1 будет крутиться вечно.
art88
Цитата(volvo @ 18.10.2005 21:38)
art88,
покажи, при каких именно значениях у тебя виснет программа.

И заодно объясни, что такое K и L?


k и l задают интервал, в котором изменяется n
прога не работает например при k=1 l=3 n=10
volvo
У тебя же программа при этих значениях крутится с одинаковыми числами (бесконечный цикл). Вот так хотя бы сделай:
program diapazon;
var
k, l, m, n : integer;
ok1, ok2 : Boolean;
i, j : integer;
begin
writeln('...:::Diapazon:::...');
{ write('k='); readln(k);
write('l='); readln(l);
write('m='); readln(m); }
k := 1;
l := 3;
m := 10;

i:=0;
n:=k-1;
ok1:=true;
ok2:=false;
while (n <= l) and ok1 do begin
n := k + 1; inc(k); { <-- Это кто будет делать? }

{ Для проверки: }
writeln('k = ', k, ' n = ', n);

while not ok2 do begin

inc(i);

if odd(n) then n := succ(3 * n)
else n := n div 2;

ok2 := (n = 1);
end;

ok1 := (i <= m);
end;

if ok1 then writeln('yes ', i)
else writeln('no ', i);
readln;
end.
art88
volovo, твой вариант программы работает не правильно, если мы вводим к=1, l=3 и m=6, то программа напишет 'yes 1' , хотя на самом деле число 3, преобразуется в единицу, указанным в задаче способом за семь раз (3, 10, 5, 16, 8, 4, 2, 1).
volvo
art88, ты меня конечно извини, но это ТВОЙ вариант программы работает неправильно, я просто вывел его из "вечного цикла", ничего при этом не меняя в логике !!!

На самом деле, вот это:
      i := 0; ok2 := false; { <-- Нужно делать именно здесь !!! }
{ Перед самым циклом, а не где-то в другом месте. Тогда все работает... }
while not ok2 do begin

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.