IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> частота в разных структурах данных
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 99
Пол: Женский
Реальное имя: vera

Репутация: -  0  +


Снова здравствуйте, товарищи!

у меня задание : написать программу, с помощью которой, а данном тексте, нужно найти слово, которое повторяется чаще всего. Нет различий между большими и маленькими буквами. Это нужно сделать с помощью бинарного дерева поиска, с помощью Хеш таблицы методом цепочек и ,линейным или квадратичным способом.

у меня вопрос относительно алгоритма как примерно это должно функционировать в обоих вариантах?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Пионер
**

Группа: Пользователи
Сообщений: 99
Пол: Женский
Реальное имя: vera

Репутация: -  0  +


у меня вопрос по поводу хеширования строки. Вычитала, Простая и быстрая хеш-функция для строк такая: считаешь сумму кодов символов (с переполнением), каждый раз домножая сумму на 31 или 37 ( в другом источнике прочитала, что лучше на 57 для прописных и строчных букв) В конце берем сумму по модулю равному размеру хеш таблицы.
насколько поняла делать это нужно так :

index := 0;
for i := 1 to Length(s) do
    begin
         k := ord(s[i]);
         index:= index + k;
    end;
index := (k*57) mod 256;



Добавлено через 10 мин.
кажется понимаю, что мне нужно делать. только нужно подумать как быть с прописными и строчными буквами)



а что если индех будет равен длине слова?

Добавлено через 18 мин.
ой..еще дан модуль:


(* WordRdr:                                        HDO, 03-02-27 *)
(* -------                                                       *)
(* Read single words (=seq. of characters) form a text file.     *)
(*===============================================================*)
UNIT WordRdr;

INTERFACE

   TYPE
     Conversion = (noConversion, toLower, toUpper);

   PROCEDURE OpenFile(fileName: STRING; c: Conversion);
   PROCEDURE ReadWord(VAR w: STRING);
   PROCEDURE CloseFile;

IMPLEMENTATION

  USES
    WinCrt;

  CONST
    characters = ['a' .. 'z', 'ä', 'ö', 'ü', 'ß',
                  'A' .. 'Z', 'Ä', 'Ö', 'Ü'];
    EF = CHR(0);        (*end of file character*)

  VAR
    txt: TEXT;          (*text file*)
    open: BOOLEAN;      (*file opened?*)
    line: STRING;       (*current line*)
    ch: CHAR;           (*current character*)
    cnr: INTEGER;       (*column number of current character*)
    conv: Conversion;   (*kind of conversion*)


  PROCEDURE ConvertToLower(VAR w: STRING);
    VAR
      i: INTEGER;
  BEGIN
    FOR i := 1 TO Length(w) DO BEGIN
      CASE w[i] OF
        'A'..'Z': w[i] :=CHR(ORD(w[i]) + 32) ;
        'Ä':      w[i] := 'ä';
        'Ö':      w[i] := 'ö';
        'Ü':      w[i] := 'ü';
      END; (*CASE*)
    END; (*FOR*)
  END; (*ConvertToLower*)

  PROCEDURE ConvertToUpper(VAR w: STRING);
    VAR
      i: INTEGER;
  BEGIN
    FOR i := 1 TO Length(w) DO BEGIN
      CASE w[i] OF
        'a'..'z': w[i] := UpCase(w[i]);
        'ä':      w[i] := 'Ä';
        'ö':      w[i] := 'Ö';
        'ü':      w[i] := 'Ü';
      END; (*CASE*)
    END; (*FOR*)
  END; (*ConvertToUpper*)

  PROCEDURE NextChar;
  BEGIN
    IF cnr < Length(line) THEN BEGIN
        cnr := cnr + 1;
        ch := line[cnr]
      END (*THEN*)
    ELSE BEGIN
      IF NOT Eof(txt) THEN BEGIN
          ReadLn(txt, line);
          cnr := 0;
          ch := ' '; (*separate lines by ' '*)
        END (*THEN*)
      ELSE
        ch := EF;
    END; (*ELSE*)
  END; (*NextChar*)


  (* OpenFile: opens text file named fileName                    *)
  (*-------------------------------------------------------------*)
  PROCEDURE OpenFile(fileName: STRING; c: Conversion);
  BEGIN
    IF open THEN
      CloseFile;
    Assign(txt, fileName);
    (*$I-*)
    Reset(txt);
    (*$I+*)
    IF IOResult <> 0 THEN BEGIN
      WriteLn('ERROR in WordRdr.OpenFile: file ', fileName, ' not found');
      HALT;
    END; (*IF*)
    open := TRUE;
    conv := c;
    line := '';
    cnr := 1; (*1 >= Length('') => force reading of first line*)
    NextChar;
  END; (*OpenFile*)


  (* NextWord: reads next word from file, returns '' on endfile  *)
  (*-------------------------------------------------------------*)
  PROCEDURE ReadWord(VAR w: STRING);
  BEGIN
    w := '';
    WHILE (ch <> EF) AND NOT (ch IN characters) DO BEGIN
      NextChar;
    END; (*WHILE*)
    IF ch <> EF THEN
      REPEAT
        w := Concat(w, ch);
        NextChar;
      UNTIL (ch = EF) OR NOT (ch IN characters);
    CASE conv OF
      toUpper: ConvertToUpper(w);
      toLower: ConvertToLower(w);
    END; (*CASE*)
  END; (*ReadWord*)


  (* CloseFile: closes text file                                 *)
  (*-------------------------------------------------------------*)
  PROCEDURE CloseFile;
  BEGIN
    IF open THEN BEGIN
      Close(txt);
      open := FALSE;
    END; (*IF*)
  END; (*CloseFile*)


BEGIN (*WordRdr*)
  open := FALSE;
END. (*WordRdr*)




Добавлено через 7 мин.
+ пример реализации программы

* WordCnt:                                      HDO, 2003-02-28 *)
(* -------                                                       *)
(* Template for programs to count words in text files.           *)
(* ATTENTION: Set compiler options to NO strict var-strings.     *)
(*===============================================================*)
PROGRAM WordCnt;

  USES
    WinCrt, WordRdr;

  CONST
    maxWordLen = 20;

  TYPE
    Word = STRING[maxWordLen]; (*to save memory*)

  VAR
    w: Word;
    n: LONGINT;

BEGIN (*WordCnt*)

  OpenFile('Kafka.txt', toLower);
  n := 0;
  ReadWord(w);
  WHILE Length(w) > 0 DO BEGIN
    n := n + 1;
    (*insert word in data structure and count its occurence*)
    ReadWord(w);
  END; (*WHILE*)
  CloseFile;
  WriteLn('total number of words = ', n);
  (*search in data structure for word with max. occurrence*)

END. (*WordCnt*)



Добавлено через 3 мин.
Только вот не понимаю что это в главное программе :

WHILE Length(w) > 0 DO BEGIN
    n := n + 1;
    


Сообщение отредактировано: lopata -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 22.04.2025 4:43
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name