Помощь - Поиск - Пользователи - Календарь
Полная версия: в строке подсчитать количество слов которые одинаково начинаются и заканчиваются!?
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
PORTUGAL
Здравствуйте! Сейчас решаю задачи по паскалю и застрял вот на чем: во введенной строке нужно подсчитать количество слов которые одинаково начинаются и заканчиваются, как это реализовать?
volvo
Здесь: Разбиение на слова. Все способы найдешь алгоритм выделения слов из строки...

Дальше - просто пройдешь по массиву, и проверишь каждое слово на то, подходит оно под условие, или нет... (Кстати, уточни, сколько символов должны совпадать в начале и конце слова, чтобы считалось, что оно начинается и заканчивается одинаково?)
PORTUGAL
Вот как я решил:
Код

var st,sl:string;
    i,n,beg,kol:byte;
BEGIN
write('Vvedite stroku: ');
readln(st);
beg:=1;
for i:= 1 to length(st) do
  begin
   if (st[i]=' ') or ((st[i]='.'))
   then
    begin
     sl:=copy(st,beg,i-beg);
     if sl[1]=sl[length(sl)]
     then inc(kol);
     beg:=i+1;
    end;
end;
writeln('Kolichestvo slov: ' ,kol);
readln;
end.


Нормально?
PORTUGAL
Тут возникла у меян проблема с этим кодом, суть ее вот в чем – программа работает нормально, если ввести два слова с одинаковыми буквами в начале и конце то выдает что их два, но если не поставить в конце предложения точку то пишет что слово только одно! Т.е. если не ввести точку то она подсчитывает все слова с одинаковым началом и концом кроме последнего слова в строке! Не могу понять в чем проблема!?
klem4
uses crt;
var
   s : string;
   i,back,count : byte;

begin
   clrscr;
   readln(s);
   i := 1;
   count := 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 (s[i] <> ' ') do inc(i);
         if s[pred(i)] = s[back] then inc(count);
      end;
   end;
   writeln('count = ',count);

   readln
end.

volvo
Цитата
Не могу понять в чем проблема!?
Ну, как же, у тебя слово ограничивается ТОЛЬКО пробелом или завершающей точкой, если последним символом строки точки не будет, то последнее слово просто не анализируется, т.к.
   if (st[i]=' ') or ((st[i]='.')) then begin
     { сюда программа просто не заходит ... }
     sl:=copy(st,beg,i-beg);
     if sl[1]=sl[length(sl)] then inc(kol);
     beg:=i+1;
   end;


измени цикл вот так, все должно работать:
for i:= 1 to length(st) do begin

  if (st[i]=' ') or ((st[i]='.')) or (i = length(st)) then begin
    if i = length(st) then sl := copy(st, beg, 255)
    else sl:=copy(st,beg,i-beg);

    if sl[1]=sl[length(sl)] then inc(kol);
    beg:=i+1;
  end;

end;


или еще проще:
write('Vvedite stroku: '); readln(st);
if st[length(st)] <> '.' then st := st + '.';
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.