Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Помогите доработать программу (файлы)


Автор: Юля2009 26.6.2009, 16:25
Вот задачка, в принципе она сделана, но считает неправильно

Условие задачи: Дан файл, содержащий текст. Выяснить входит ли данное слово в указанный текст, и если да, то сколько раз.

Код

program slovo;
uses crt;
var
filee: text;
s, sl: string;
i, d: integer;
begin
clrscr;
Writeln('Chto iskatj?');
readln(sl);
assign(filee, 'text2.txt');
reset(filee);
while not eof(filee) do
begin
readln(filee, s);
if pos(sl, s)>0 then
begin
d:=1;
i:=i+1;
end;
end;
close(filee);
If d=0 then Writeln('Slova net v texte') else begin
Write('Slovo vstrechayetsya ');
Write(i);
Write(' raz');
end;
ReadLn;
end.


Сам файл, с которого он считает:
okolo trex let nazad vozmozhno
bilo vce vce chto dyshe ygodno
i ne vashno bilo vozmozhno
ieto ili net okolo goda 
yzhe nichego ietogo ne
yvidish vce chto bilo 
to proshlo i ne prosto
proshlo a ischezlo i chto
bi nam ne govorili mi verim
chto vce bydet tak kak mi 
zaxotim i colnche i more i 
oblaka nad golovoi vce bilo
lycshe okolo trex let nazad

----------------------------------------------------------------------------------------------
В чем заключаеться проблема: Например вводим слово "vce", в тексте их всего 5, а он выводит что 4 раза... Как видите во второй строке файла, слово "vce" употребляеться 2 раза, а он считает за 1 раз... Когда используешь текст в котором на 1 строчку исп слово "vce" 1 раз, то он считает правильно, а когда используешь 2 раза, то считает за 1 слово...
Помогите пожалуйста доработать программу

Автор: ФедосеевПавел 26.6.2009, 19:22
Юля2009, а как считать, если ищем слово "vce", а в тексте присутствует "vcegda"?

Если засчитывать не надо, то алгоритм будет следующим:
1. Считать из файла следующую строку S.
2. Из строки S выделить следующее слово W, ограниченное символами [' ',',','.'].
3. Если слово W равно искомому слову - то увеличить счётчик найденных слов.
4. Выполняем п.п. 2-3 пока не закончилась строка.
5. Перейти к п.1.

Функцию выделения слова можно сделать так
Код

TYPE
  SetOfChar=Set of Char;
CONST
  {Список всех ограничителей слов в строке}
  Delim_Set : SetOfChar =[' ','.',',','!','?','-',':',';',
                          '(',')','[',']','{','}'];
{Выделение слова из строки s.
 Поиск слова начинается с позиции i.
 Если слов больше нет, то возвращается пустая строка.
 После выполнения функции переменая i равна индексу следующего за словом символа,
 т.е. вызывая из программы
  w1:=GetNextWord(s, i);
  w2:=GetNextWord(s, i);
  мы получим два идущих подряд слова из строки s}
FUNCTION  GetNextWord(CONST s:String; VAR i:Integer):String;
VAR
  ResWord       : String;
BEGIN
  ResWord:='';  {пока не найдено ни одного слова в строке}
  {i-текущая позиция в анализируемой строке}
  {ищем первую букву слова}
  while (i<=Length(s)) do
    if (s[i] in Delim_Set)
      then Inc(i)
      else Break;
  {теперь просматриваем слово пока не закончится строка или
   не начнутся ограничители слов}
  while (i<=Length(s)) do
    if (s[i] in Delim_Set)
      then Break
      else begin
        ResWord:=ResWord+s[i];  {добавляем букву слова к результату}
        Inc(i);
      end;
  GetNextWord:=ResWord;
END;

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