Показать сообщение отдельно

  #1825  
Старый 28.10.2009, 22:52
StealthMaster
Познающий
Регистрация: 03.12.2008
Сообщений: 56
С нами: 9176827

Репутация: 29
По умолчанию

Цитата:
Помогите, сделать небольшую прогу: которая вязяв из мемо(или эдит пох вообще) русский текст выдаёт сколько раз в нём повторяется самое маленькое слово.
Описание: построчно считываем текст из Memo и создаем список слов, в котором записаны слова и сколько раз каждое слово встречается. После всего этого находим в списке самое первое короткое (если слов такой длины несколько) слово и показываем сообщение с информацией о слове и количестве его вхождений в текст.

Примечание: считаем, что слова ограничены символами " . , ! ? : ;

Реализация на Delphi:
Код:
type
  // будем использовать записи с двумя полями: слово и количество таких слов в тексте 
  TWord = record
    WRD: string;
    number: byte;
  end;

type
  TWords = array of TWord;

var
  Words: TWords; // все слова текста
  EndSymbols: set of char; // символы, которые ограничивают слово

...

procedure AddWord (word: string); // добавление нового слова в список
var
  i: integer;
  lnth: byte;
  NewWord: boolean;
begin
  lnth := length(Words);
  NewWord := true;

  // проверяем, не добавлено ли это слово уже в список слов
  for i := 0 to lnth-1 do 
    if Words[i].WRD = word then
      begin
        NewWord := false;
        // если в списке, то увеличиваем счетчик для него
        Words[i].number := Words[i].number + 1; 
        break
      end;

  if NewWord then // если не в списке, то добавляем
    begin
      SetLength(Words, lnth+1);
      Words[lnth].WRD := word;
      Words[lnth].number := 1;
    end;
end;

procedure FindWords(Text: string);
var
  i: integer;
  tmpstr: string;
begin
  EndSymbols := [' ', '.', ',', '!', '?', ':', ';', '"'];
  tmpstr := '';

  for i := 1 to length(Text) do // ищем все слова в строке
    if not(Text[i] in EndSymbols)
      then
        begin
          tmpstr := tmpstr + Text[i];
          if i = length(Text) then
            AddWord(tmpstr);
        end
    else
      if length(tmpstr) > 0 then
        begin
          AddWord(tmpstr);
          tmpstr := '';
        end;
end;

function FindShortWord: TWord; // ищем самое короткое слово
var
  min: byte;
  i: integer;
begin
  min := 0;

  for i := 1 to length(Words) - 1 do
    begin
      if length(Words[i].WRD) < length(Words[min].WRD) then
        min := i;
    end;

  Result := Words[min];
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  tmp: TWord;
begin
  for i := 0 to Memo1.Lines.Count-1 do
    FindWords(memo1.Lines[i]);

 tmp := FindShortWord;
 ShowMessage('Самое короткое слово: '+ tmp.WRD + '. Встречается раз: ' + IntToStr(tmp.number));
end;

Последний раз редактировалось StealthMaster; 29.10.2009 в 09:08..
 
Ответить с цитированием