1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Всем добрый вечер. Нужно вывети из тектса все слова с двумя бувами "а". Програмка просто зависает:
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.
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.
У тебе в коде несколько проблем, во-первых цикл 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; пробуй, должно заработать
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.