Помощь - Поиск - Пользователи - Календарь
Полная версия: Текст
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
TS*
Всем добрый вечер. Нужно вывети из тектса все слова с двумя бувами "а". Програмка просто зависает:

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
Цитата
Програмка просто зависает:
А я говорил неоднократно: нельзя изменять внутри цикла его счетчик, даже если компилятор этого не видит...... Ты же это делаешь:
        i:=j-1; { <--- Здесь !!! }
TS*
Спасибо, но:

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.

та же проблема wacko.gif
Malice
У тебе в коде несколько проблем, во-первых цикл 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;
пробуй, должно заработать smile.gif
arhimag
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]
Гость
Всем спасибо, все учел good.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.