Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Строки

Автор: Drenchick 25.05.2006 22:57

вводим слова через пробел. найти количество слов которые вмещают 3 буква "а"

Автор: TS* 25.05.2006 23:31

Цитата(Drenchick @ 25.05.2006 18:57) *
вводим слова через пробел. найти количество слов которые вмещают 3 буква "а"


var
s:string;
i,count_a,count_words:byte;

begin
readln(s);
i:=0;
count_a:=0;
count_words:=0;
while i<=length(s) do
begin
inc(i);
if s[i]='a' then
begin
inc(count_a);
repeat
inc(i);
if s[i]='a' then inc(count_a);
if count_a=3 then inc(count_words);
until s[i]=' ';
count_a:=0;
dec(i);
end;
end;

writeln('Koluchestvo slov s 3 bykvamu a = ',count_words);
end.

Автор: volvo 25.05.2006 23:45

TS*, не-а... nea.gif

Введи строку 'dda abbaa defaaa noneeaaaa', и посмотри что выводит программа...
(под Турбо-Паскалем вообще виснет, если не завершить строку пробелом...)

Я бы делал так:

var
s: string;
i, count_a, count_words: byte;

begin
readln(s);
{
s := 'dda abbaa defaaa noneeaaaa';
}
count_words := 0; count_a := 0;
for i := 1 to length(s) do
if s[i] = 'a' then inc(count_a)
else
if s[i] = ' ' then begin
if count_a = 3 then inc(count_words);
count_a := 0;
end;
writeln('Koluchestvo slov s 3 bykvamu "a" = ', count_words);
end.

Автор: Bokul 26.05.2006 10:34

Вот чуть-чуть подравил код TS*.
Тепер программа правильно находит число слов, но всеравно виснет, если строка
не кончается пробелом, хотя я добавил проверку на конец строки...
Почему?

Код

var
s:string;
i,count_a,count_words:byte;
begin
readln(s);
i:=0;
count_a:=0;
count_words:=0;
while i<=length(s) do
begin
  inc(i);
  if s[i]='a' then
  begin
   inc(count_a);
   repeat    
    inc(i);
    if s[i]='a' then inc(count_a);
   until (s[i]=' ') or (i=length(s)); {Добавлен оператор or и еще одно условие}
   if count_a=3 then inc(count_words);{Перемещено}
   count_a:=0;
   dec(i);  
  end;
end;
    
writeln('Koluchestvo slov s 3 bykvamu a = ',count_words);
end.

Автор: Malice 26.05.2006 12:34

Цитата(Bokul @ 26.05.2006 6:34) *

Вот чуть-чуть подравил код TS*.

А не проще ли в начале добавить строчку "if s[length(s)]<>' ' then s:=s+' ';" ? ;)

Автор: volvo 26.05.2006 12:45

Цитата(Bokul @ 26.05.2006 6:34) *
все равно виснет, если строка
не кончается пробелом, хотя я добавил проверку на конец строки...
Почему?

А потому, что здесь:

if s[i]='a' then begin
inc(count_a);
repeat
inc(i);
if s[i]='a' then inc(count_a);
until (s[i]=' ') or (i=length(s)); {Добавлен оператор or и еще одно условие}
if count_a=3 then inc(count_words);{Перемещено}
count_a:=0;
dec(i); { <--- Вот именно здесь... }
end;

... ты уменьшаешь i безусловно (!!!)... А если i уже достигло значения конца строки?
Сделай так:
...
If i < length(s) then dec(i);
...

и все будет работать... yes2.gif

Автор: Bokul 27.05.2006 5:08

Цитата
А не проще ли в начале добавить строчку "if s[length(s)]<>' ' then s:=s+' ';" ? ;)

Если длина строки уже максимальная, то ничего не получится no1.gif