Всем добрый вечер. Нужно вывети из тектса все слова с двумя бувами "а". Програмка просто зависает:
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:=1 to length(tt) do begin if (tt[i]=' ') then begin j:=i; bykv_a:=0; dve_a:=false; while tt[j]<>' ' do begin 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 then begin for k:=i to j-1 do 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)) do begin if (tt[i]=' ') then begin j:=i; bykv_a:=0; dve_a:=false; while tt[j]<>' ' do begin 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 then begin for k:=i to j-1 do 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
т.е. программа сводится к:
for i:=1 to length(tt) do begin if (tt[i]=' ') then begin j:=i; i:=j-1; end; end;
Оттого и виснет. 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
Всем спасибо, все учел
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.