Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на Список
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Bandit
Задача состоит в чтении некоторого текста, выборе из него слов и подсчете частоты их появления, то есть, в составлении частотного словаря. Для чего нужно составить список слов, найденных в тексте. Каждое очередное слово, прочитанное в тексте, ищется в списке. Если слово найдено, то счетчик его частоты увеличивается, в противном случае слово добавляется к списку.Предполагается, что слова уже выделены из исследуемого текста
и находятся во входном файле.

Что -то я никак не могу сообразить. cray.gif Помогите пожалуйста, если не трудно. Заранее, большое спасибо!!!!
Lapp
1. Объясни мне, неучу, что такое ЛОС. Честно искал в словарях и просто в Яндексе, не нашел ничего подходящего.. sad.gif

2. Текст на каком языке? На русском? Тогда как ты собираешься поступать с различными формами слова? разные окончания, суффиксы, приставки.. Или это не есть реальный текст, а просто набор слов, и о таких вещах беспокоиться не нужно?
Гость
Цитата(Lapp @ 9.12.2007 1:15) *

1. Объясни мне, неучу, что такое ЛОС. Честно искал в словарях и просто в Яндексе, не нашел ничего подходящего.. sad.gif

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



ЛОС- Линейный Односвязный Список. Слова скорее всего любые. Должно быть 100% совпадение. Я думаю здесь лучше тип String использовать.
Bandit

ЛОС- Линейный Односвязный Список. Слова скорее всего любые. Должно быть 100% совпадение. Я думаю здесь лучше тип String использовать.

Я первый раз забыл на форум зайти. blush.gif
Bandit
 Type
te=string;
pe=^el;
el=Record
   inf:te;
   next:pe
   end;
 Var sag,p,q,sag2:pe;
     n,i,j:integer;
procedure COPY (sag:pe; Var sag2:pe); //Копирование списка sag в список sag2
    begin
      if sag=nil then sag2:=nil
                 else begin
                      new (sag2);
                      sag2^.inf:=sag^.inf;
                      COPY (sag^.next, sag2^.next)
                      end;
      end;
procedure PRINT (sag:pe);// вывод на экран
    Var q:pe;
    begin
      q:=sag^.next;
      while q<>nil do
        begin write (q^.inf, ' ');
              q:=q^.next
              end;
     end;          
 {--------------------------------------------------------------------------------}



begin
New (sag);
sag^.next:=Nil;
p:=sag;
writeln ('Zadayte kol-vo elementov LOS');
readln (n);
For i:=1 to n do
    Begin
    New (q);
    Writeln ('Vvedite zna4 o4erednogo elementa:');
    readln (q^.inf);
    p^.next:=q; p:=q;
    end;
    q^.next:=Nil;//Ввод ЛОСа
    PRINT (sag);
    COPY (sag, sag2);
    PRINT (sag2);
    writeln;
    writeln ('Lx');
    PRINT (sag);
      readln;
      end. 



Написал вот как вводить Список и вывести его.
Мне для этой задачи как я понял нужно при вводе слова или символа его нужно искать в списке. Если его там нет, добавить к списку, а если есть повысить счётчик данного слова/символа.

Вот у меня вопрос: как реализовать счетчик у каждого символа, и что б к ним ещё можно было потом обратится для увеличения счётчика. Для этого, что нужно создать ещё один Список, или тут чем-то другим можно обойтись?
klem4
разберешься ?

type
  PTListElem = ^TListElem;

  TListElem = record
     data: String;
    count: Integer;
     next: PTLIstElem
  end;

  PTList = ^TList;

  TList = object
    head, last: PTListElem;

    constructor Create;
    destructor  Free;

    function Empty: Boolean;

    procedure Push(const value: String);
    procedure  Pop(var value: TListElem);

    procedure PrintList;
  end;

constructor TList.Create;
begin
  head := nil;
  last := nil;
end;

destructor TList.Free;
var
  T: PTListElem;
begin
  while not Empty do begin
    T := head;
    head := head^.next;
    dispose(T);
  end;
end;

function TList.Empty: Boolean;
begin
  Empty := head = nil;
end;

procedure TList.Pop(var value: TListElem);
var
  T: PTListElem;
begin
  if not Empty then begin
    T := head;
    head := head^.next;
    value := T^;
    dispose(T);
  end;
end;

procedure TList.Push(const value: String);
var
  R, first: PTListElem;
begin
  first := head;

  while (head <> nil) and (head^.data <> value) do
    head := head^.next;

  if head <> nil then begin
    inc(head^.count);
    head := first;
  end else begin
    new(r);

    R^.data  := value;
    R^.count := 1;
    R^.next  := nil;

    head := first;

    if Empty then begin
      head := R;
      last := head;
    end else begin
      last^.next := R;
      last := R;
    end;
  end;

end;

procedure TList.PrintList;
var
  T: TListElem;
begin
  while not Empty do begin
    Pop(T);
    writeln(T.data, ': ', T.count);
  end;
end;

var
  list: PTList;

begin
  new(list, Create);

  list^.Push('asd');
  list^.Push('asd');
  list^.Push('123');
  list^.Push('qwerty');
  list^.Push('asd');
  list^.Push('123');
  list^.Push('poiuytrewq');
  list^.Push('asd');

  list^.PrintList;

  dispose(list, Free);
end.
Bandit
Спасибо, попробую разобраться. smile.gif Но, когда попробовал запустить выдал ошибку.

Эта ошибка как я заметил, появляется в крупных программах. mad.gif Что это за ошибка и как от неё избавиться!!??
klem4
ну это явно не Паскалевский еррор ... В Паскале 105 - я ошибка связана с использованием inline вроде ... Какой у тебя компилятор ?
volvo
Если в Runtime - "File not open for output"

Особенно актуально при запуске на Дельфи неконсольного приложения, и попытке выполнить WriteLn smile.gif
Bandit
У меня Delphi 7. Прогу пишу в Console Application.
volvo
Тогда проверь наличие директивы {$APPTYPE CONSOLE}, потому что с ней ошибки не возникает, а вот без нее - очень даже...
Lapp
Цитата(Bandit @ 13.12.2007 9:27) *

У меня Delphi 7. Прогу пишу в Console Application.


М
Разговоры про Дельфи - в раздел Дельфи.

Bandit
Спасибо!!! respect.gif Всё заработало!!! Я думал, что эта строчка какая-то лишняя и удалял её всегда, чтоб место не занимала. blush.gif

Прошу прощения, что не в том разделе форума тему создал. Но ведь консоль Делфи, это ж Турбо Паскаль.
Lapp
Цитата(Bandit @ 13.12.2007 10:11) *
Прошу прощения, что не в том разделе форума тему создал. Но ведь консоль Делфи, это ж Турбо Паскаль.

Да?.. Ну, тогда вставляй эту строчку во все ТР-программы и ни в коем случае не выбрасывай! smile.gif
Тема, может, и в том разделе, если ты касаешься только того, что совместимо с ТР.
Но вопрос про ошибку - уже не в том.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.