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


Автор: Frogs2009 19.6.2008, 12:51
Дан файл, содержащий текст на русском языке. Определить, сколько раз встречается в нем самое длинное слово.           

Автор: Snowy 19.6.2008, 14:00
Перенесено из Pascal

Автор: Frogs2009 19.6.2008, 14:41
эту задачу мне сказали решить в Pascal, не могли бы помочь чем нибудь?

Автор: THandle 20.6.2008, 01:17
Код

program Project1;

var
  F : text;
  s, sub, mlens : string;
  i : integer;

function MLenCount(sp : string) : integer;
var
  j, ps : integer;
begin
  j := 0;
  repeat
    ps := pos(mlens, sp);
    if ps <> 0 then
      begin
        inc(j);
        delete(sp, 1, ps);
      end;
  until ps = 0;
  MLenCount := j;
end;
begin
  write('Enter file name: ');
  readln(sub);
  AssignFile(F, sub);
  reset(F);
  while not Eof(F) do
    begin
      readln(f, sub);
      s := s + ' ' + sub;
    end;
  sub := '';
  mlens := '';
  for i := 1 to length(s) do
    if s[i] <> ' ' then
      sub := sub + s[i]
    else
      begin
        if Length(sub) > Length(mlens) then
          mlens := sub;
        sub := '';
      end;
  i := MLenCount(s);
  writeln('Count: ', i);
  readln;
end.




Пример файла:
Цитата


addsdj chfj dif hudyd7ejv ufj fi kffl
dds
dfggb  dghh d    si hudyd7ejv k l l;;k
xff hudyd7ejv    hudyd7ejv kklk k
add hudyd7ejv
ddsffff fffff ff d    a
ss
hudyd7ejv


Файл на любом языке подойдет, хотя на китайском smile 

Автор: greenpc 20.6.2008, 09:15
THandle, мне кажется что есть органичение в Вашем коде.
max размер string какой? 
поэтому не рекомендую сливать все в одну строку

Автор: Frogs2009 20.6.2008, 14:22
спасибо большое за программку!!!! очень благодарен!

Автор: Frogs2009 20.6.2008, 14:44
Цитата(THandle @ 20.6.2008,  01:17)


Файл на любом языке подойдет, хотя на китайском smile

а откуда брать файл-то???? я не понимаю,запускаю прогу, а она пишет "Fale not found"

Автор: dimafeng 21.6.2008, 09:59
Где exe'шник задачи, т.е. в общем случае в папку, где паскаль )

Автор: Frogs2009 21.6.2008, 12:24
все равно не получается! smile у меня ехе-к и файл лежат на диске С: а он все равно пишет что не находит его(((

Автор: dimafeng 21.6.2008, 13:58
а ты в программе правильно пишешь название правила? )

Автор: Frogs2009 21.6.2008, 14:59
заработало!!!! вот только воожу  имя файда, а он у меня выводит "1", код переписал правильно, десять раз проверял,почему он выводит только единицу???? 

Автор: dimafeng 21.6.2008, 16:30
Ну значит ошибка где-то...

Добавлено через 5 минут и 15 секунд
Код

............
      end;
  i := MLenCount(mlens);
  writeln('Count: ', i);
  readln;
..................

Там так должно быть...

Автор: THandle 22.6.2008, 01:09
Цитата(greenpc @  20.6.2008,  10:15 Найти цитируемый пост)
THandle, мне кажется что есть органичение в Вашем коде.
max размер string какой? 
поэтому не рекомендую сливать все в одну строку


Согласен. Просто писал то в Делфе. И забыл. Так вроде бы ничего больше подозрительного там нет, должно работать. smile 

Автор: dimafeng 22.6.2008, 10:53
THandle
разве не так должно быть 
Код

............
      end;
  i := MLenCount(mlens);
  writeln('Count: ', i);
  readln;
..................

???

Автор: Frogs2009 22.6.2008, 13:36
нет,все равно единицу выводит((( блин, что делать то smile 

Автор: THandle 23.6.2008, 01:39
Цитата(dimafeng @  22.6.2008,  11:53 Найти цитируемый пост)
THandle, 
разве не так должно быть 


Ни в коем случае... mlens - самое длинное слово в тексте.

В функцию мы передаём весь текст и ищем число вхождений в него строки находящейся в mlens.

Если мы передадим строку содержащую эту самое строку, то и число вхождений будет равно только единице. Так что в данном моменте в коде все правильно. В Делфи этот код выдает достоверный результат. В Паскале, из за строк может выдавать меньший. Сейчас просто чисто нет возможности поставить паскаль.  

Вся проблема в паскалевских строках. Надо читать каждый раз новую строку. Искать в ней самое длинное слово. Если его длина больше чем длина самого длинного слова в предыдущих строчках, то делать его более длинным. Можно два раза считывать с файла, но я сейчас напишу немного по другому. 

Программа будет выводить количество слов, самых длинных в файле, но не являющихся одинаковыми. Если надо будет переделать - переделаю.

Автор: THandle 23.6.2008, 02:44
Код

program Project1;

var
  F : text;
  s, sub, mlens : string;
  i : integer;
  count : integer;

begin
  write('Enter file name: ');
  readln(s);
  AssignFile(F, s);
  reset(F);
  mlens := '';
  count := 0;
  while not Eof(F) do
    begin
      readln(f, s);
      sub := '';
      s := s + ' ';
      for i := 1 to length(s) do
        if s[i] <> ' ' then
          sub := sub + s[i]
        else
          begin
            if Length(sub) > Length(mlens) then
              begin
                mlens := sub;
                count := 1;
              end
            else
              if Length(sub) = Length(mlens) then
                inc(count);
            sub := '';
          end;
    end;
  writeln('Count: ', count);
  readln;
end.


Примитивно, но должно работать...

Автор: deswars 26.6.2008, 12:07
Преодолеть ограничение можна. Надо считывать по словам и одновременно считать количество самого длинного слова на данный момент. 

Автор: THandle 27.6.2008, 01:00
deswars, см мой пост выше. там сделано так. Считывается одна строка, если в ней нет слова длиннее текущего самого длинного то так и оставляем, если есть, то счетчик самого длинного ставим в 1, а самое длинное становится как раз слово из новой строки. Если есть слово по длине совподающее с текущим самым длинным то увеличиваем счетчик...  

Автор: deswars 4.7.2008, 09:25
Я предлага считывать по словам, а не по строчкам smile

Добавлено через 1 минуту и 40 секунд
А можна сделать array [{...}] of char smile 

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