Всем добрый вечер. Нужно вывети из тектса все слова с двумя бувами "а". Програмка просто зависает:
var
tt: string;
i, j, k: integer;
kol_slov, bykv_a: integer;
dve_a: boolean;
begin
tt:=' laba asdf baba dfsadf erer';
kol_slov:=0;
for i:=1to length(tt) dobeginif (tt[i]=' ') thenbegin
j:=i; bykv_a:=0; dve_a:=false;
while tt[j]<>' 'dobegin
j:=j+1;
if (tt[j]='a') then bykv_a:=bykv_a+1;
if (bykv_a=2) then dve_a:=true;
end;
if dve_a thenbeginfor k:=i to j-1do write(tt[k]); writeln;
kol_slov:=kol_slov+1;
end;
i:=j-1;
end;
end;
end.
volvo
12.12.2006 22:55
Цитата
Програмка просто зависает:
А я говорил неоднократно: нельзя изменять внутри цикла его счетчик, даже если компилятор этого не видит...... Ты же это делаешь:
i:=j-1; { <--- Здесь !!! }
TS*
12.12.2006 23:12
Спасибо, но:
var
tt: string;
i, j, k: integer;
kol_slov, bykv_a: integer;
dve_a: boolean;
begin
tt:=' laba asdf baba dfsadf erer';
kol_slov:=0;
while(i<>length(tt)) dobeginif (tt[i]=' ') thenbegin
j:=i; bykv_a:=0; dve_a:=false;
while tt[j]<>' 'dobegin
j:=j+1;
if (tt[j]='a') then bykv_a:=bykv_a+1;
if (bykv_a=2) then dve_a:=true;
end;
if dve_a thenbeginfor k:=i to j-1do write(tt[k]); writeln;
kol_slov:=kol_slov+1;
end;
i:=j-1;
end;
i:=i+1;
end;
end.
та же проблема
Malice
13.12.2006 1:18
У тебе в коде несколько проблем, во-первых цикл While никогда не выполняется, поскольку есть противоречие:
Цитата
if (tt[i]=' ') then begin j:=i; bykv_a:=0; dve_a:=false; while tt[j]<>' ' do begin
Оттого и виснет. 1) i:=j-1; надо делать только если while выполнялся, т.е. если j>i. 2) while выполнится, если поменять "while tt[j]<>' '" на "while tt[j+1]<>' '" 3) добавить к условию while проверку на выход за пределы строки 4) "if (bykv_a=2)" нужно за пределами цикла while, иначе будут выводится все слова, где а>=2 5) в связи с 4 наличие переменной dve_a теряет смысл 6) чтобы никто не ругался на изменения i внутри цикла, нуна переделать for в repeat .. until; пробуй, должно заработать
arhimag
13.12.2006 1:24
pзацикливаеться потому что на шаге i:=j-1; ты повторишь переход на букву и все опять пойдет по циклу, по моему надо: i:=j; но так программа не работает, поэтому свое решение [pascode]
var i,back,n : integer; tmp,s : string; count,j : integer; begin s :=' laba asdf baba dfsadf erer'; i := 1; n := 0; while(i<=length(s)) do begin while(i<=length(s)) and (s[i] = ' ') do inc(i); if i<=length(s) then begin back := i; while(i<=length(s)) and not(s[i] = ' ') do inc(i); inc(n); tmp := copy(s, back, i-back); count:=0; for j := 1 to length(tmp) do begin if tmp[j]='a' then inc(count); if count>=2 then begin writeln(tmp); break;end; end; end; end; readln; end.
[/pascode]
Гость
13.12.2006 1:30
Всем спасибо, все учел
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.