Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Turbo Pascal] Задача. Работа с текстом


Автор: METTER 9.9.2008, 20:29
Задача для зачёта. Бужу безмерно благодарен за помощь!

Дан текст, состоящий из слов, разделенных пробелами (одним или несколькими) или знаками препинания. Найти кол-во слов, которые начинаются и заканчиваются на одну и ту же букву и вывести их на экран.

Автор: mr.Anderson 9.9.2008, 20:41
В основе лежит последовательный (посимвольный) анализ текста. Я где-то приводил решение похожей задачи. Скажу алгоритм, реализуешь, я думаю, сам. Попробуй, по крайней мере.
  •  Объявляем переменную-слово (будем там слово хранить). Например, назовем ее word.
  •  Также объявляем переменную, куда запишем количество слов. Например, wordCount. Ставим ее в 0.
  •  Идем по всему тексту посимвольно (Read()).
  •  В цикле при каждом проходе проверяем. Если текущий элемент - символ (буква-цифра), то приписываем ее к word, если нет - тогда анализируем наше слово. Первая и последняя буква равны - выводим word и инкрементируем wordCount. В любом случае ее обнуляем (word := '';).
Собственно, это все.

Автор: METTER 9.9.2008, 20:57
mr.Anderson,  большое спасибо за подсказку и за помощь, но я сам не смогу это сделать ((( ибо  smile ... к сожалению и с другими задачами тоже так, потому как затянул всё.. а времени в обрез... учёба заочно даёт о себе знать..
некрасиво с моей стороны, но если не трудно, то помогите, пожалуйста, с полным решением

Автор: mr.Anderson 9.9.2008, 21:03
METTER, ок, попробуй так (проверить нечем, пишу на коленке):
Код

program FindWords;
var
 text  : String;
 i     : Integer;
 word  : String;
 wordC : Word;
begin
 wordC := 0;
 word := '';

 for i:=1 to Length(text) do
 begin
  if (text[i] in ['A'..'Z','a'..'z','0'..'9']) then
  begin
   if (word[1] = word[Length(word)]) then
   begin
    inc(wordC);
    WriteLn(word);
   end;
  
   word := '';
  
   continue;
  end
  else word := word + text[i];  
 end;

 WriteLn('Count of words: ', wordC);
end.

Кажись, не наврал.

Автор: volvo877 10.9.2008, 12:32
Цитата(mr.Anderson @  9.9.2008,  21:03 Найти цитируемый пост)
пишу на коленке

Заметно... Вообще-то это даже не откомпилируется: Word в Паскале - это тип, а ты называешь так переменную... И что в следующей строке означает Word? По-прежнему тип? Фиг там, уже переменная, ты получаешь "Error in type" и думаешь, где ж косяк-то? Но даже если переименовать переменную в _Word, оно все равно не будет работать, потому что правильно - так:
Код
...
  if not (text[i] in ['A'..'Z','a'..'z','0'..'9']) then { <--- NOT в оригинале не было }
...

... Но даже и теперь это все равно не будет работать, потому что последнее слово обрабатываться не будет... Самый простой вариант - после ввода text-а, но перед началом его обработки сделать 
Код
...
text := text + ' ';
...

Автор: mr.Anderson 10.9.2008, 13:47
volvo877, не со всеми доводами согласен, word : String компилируется без проблем в Delphi, насчет TP не знаю, просто не пишу в нем, думаю, он тоже должен это понять. Про not и обработку последнего слова да, забыл, на то она и коленка. smile

Автор: THandle 10.9.2008, 14:01
mr.Anderson, 

Цитата(mr.Anderson @  10.9.2008,  14:47 Найти цитируемый пост)
word : String компилируется без проблем в Delphi,


В Delphi да, но где ты в названии темы видишь Delphi? Там ясно что Паскаль. Если отвечаешь в тему про паскаль, то изволь иметь при себе его компилятор, чтобы проверить.

volvo877 все верно говорит.

Автор: METTER 10.9.2008, 21:54
ребят, так как всё ж будет в правильно? а то ошибку выдаёт ((

Автор: volvo877 11.9.2008, 10:17
Цитата(METTER @  10.9.2008,  21:54 Найти цитируемый пост)
как всё ж будет в правильно?

Я ж написал выше, что надо сделать... Ну, если уж писать полностью, то я бы сделал вот так:

Код

program FindWords;
var
  text, nextWord: String;
  i: Integer;
  count: Word;
begin
  write('s = '); readln(text);
  text := text + ' ';

  count := 0;
  nextWord := '';
  for i := 1 to Length(text) do begin
    if text[i] in ['A'..'Z','a'..'z','0'..'9'] then
      nextWord := nextWord + text[i]
    else begin

      if (nextWord[1] = nextWord[Length(nextWord)]) then begin
        inc(count); writeln(nextWord);
      end;
      nextWord := '';

    end;
  end;
  writeln('Count of words: ', count);
end.


P.S.
Цитата(mr.Anderson @  10.9.2008,  13:47 Найти цитируемый пост)
word : String компилируется без проблем в Delphi
  smile Это и в Турбо-Паскале компилируется... Но вот на этом:
Код
var
 word  : String;
 wordC : Word; // <--- облом будет в любом компиляторе: нужен тип, а не имя переменной

Автор: METTER 11.9.2008, 18:02
volvo877,  огромное спасибо за помощь!!!  smile  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)