Помощь - Поиск - Пользователи - Календарь
Полная версия: Строки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Drenchick
вводим слова через пробел. найти количество слов которые вмещают 3 буква "а"
TS*
Цитата(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
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
Вот чуть-чуть подравил код 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
Цитата(Bokul @ 26.05.2006 6:34) *

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

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

Если длина строки уже максимальная, то ничего не получится no1.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.