IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

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

 
 Ответить  Открыть новую тему 
> Текст, Зависание програмы
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 71
Пол: Мужской
Реальное имя: Max

Репутация: -  0  +


Всем добрый вечер. Нужно вывети из тектса все слова с двумя бувами "а". Програмка просто зависает:

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.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
Програмка просто зависает:
А я говорил неоднократно: нельзя изменять внутри цикла его счетчик, даже если компилятор этого не видит...... Ты же это делаешь:
        i:=j-1; { <--- Здесь !!! }
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 71
Пол: Мужской
Реальное имя: Max

Репутация: -  0  +


Спасибо, но:

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

Сообщение отредактировано: TS* -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


У тебе в коде несколько проблем, во-первых цикл 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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Знаток
****

Группа: Пользователи
Сообщений: 424
Пол: Мужской

Репутация: -  2  +


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]


--------------------
Чего хочет женщина – того хочет Бог
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Всем спасибо, все учел good.gif
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 26.10.2020 3:13
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name