Дана последовательность слов; между соседними словами запятая, за последним
словом - точка. Напечатать все слова, встречающиеся в последовательности
по одному разу.
			
		Модератор: Модераторы
Построить из этих слов хэш-таблицу с индексами, равными sha256 от каждого слова. Тогда в этой таблице автоматом останется по одному экземпляру каждого слова.Дана последовательность слов; между соседними словами запятая, за последним
словом - точка. Напечатать все слова, встречающиеся в последовательности
по одному разу.

debi12345 писал(а):Построить из этих слов хэш-таблицу


издеваетесь?

{ Дана послідовність слів; поміж сусідніми словами кома, за останнім словом -
  крапка.  Надрукувати всі слова, які зустрічаються в послідовності по одному
  разі. }
program StringHandling;
var
  CurrentPart: String;
  FinishedReading: Boolean = False;
  Words: array [1..100] of String;
  WordCounts: array [1..100] of Integer;
  WordsLength: Integer = 0;
{ Якщо слово вже було додано в масив слів, повертає його номер індекс.
  Якщо слова в послідовності немає, повертає 0. }
function GetWordIndex(S: String): Integer;
var
  I: Integer;
begin
  GetWordIndex := 0;
  for I := 1 to WordsLength do
    if Words[I] = S then begin
      GetWordIndex := I;
      Exit
    end
end;
{ Забирає пробіли з початку або кінця рядка }
function Trim(S: String): String;
var
  StartIndex: Integer = 1;
  Count: Integer;
begin
  while (StartIndex <= Length(S)) and (S[StartIndex] = ' ') do
    Inc(StartIndex);
  Count := Length(S) - StartIndex;
  while (Count > 0) and (S[StartIndex + Count] = ' ') do
    Dec(Count);
  Trim := Copy(S, StartIndex, Count + 1)
end;
{ Додає слово в масив слів або збільшує його кількість. Якщо місця в
  списку немає, закінчує процес читання та додавання, виводячи помилку
  та встановлюючи FinishedReading := True }
procedure AddWord(Word: String);
var
  TrimmedWord: String;
  Index: Integer;
begin
  TrimmedWord := Trim(Word);
  Index := GetWordIndex(TrimmedWord);
  if Index = 0 then begin
    if WordsLength >= 100 then begin
      WriteLn(StdErr, 'Ліміт слів перевищено.');
      FinishedReading := True;
      Exit
    end;
    Inc(WordsLength);
    Words[WordsLength] := TrimmedWord;
    WordCounts[WordsLength] := 1
  end else
    Inc(WordCounts[Index])
end;
{ Читає частину слів. Частина має закінчуватися на кому або крапку, інакше
  останнє слово буде викнуте. }
procedure ProcessPart(Part: String);
var
  CurrentWord: String = '';
  I: Integer;
begin
  for I := 1 to Length(Part) do begin
    if Part[I] = '.' then begin
      AddWord(CurrentWord);
      FinishedReading := True;
      Break
    end else if Part[I] = ',' then begin
      AddWord(CurrentWord);
      CurrentWord := ''
    end else
      CurrentWord := CurrentWord + Part[I];
    { AddWord може закінчити читання, якщо місця в масиві слів
      не залишилося, отож перевіримо цей випадок }
    if FinishedReading then
      Break;
  end;
end;
{ Друкує список слів, які зустрілися один раз }
procedure WriteUniqueWords();
var
  I: Integer;
begin
  for I := 1 to WordsLength do
    if WordCounts[I] = 1 then
       WriteLn(Words[I])
end;
begin
  while not FinishedReading do begin
    ReadLn(CurrentPart);
    ProcessPart(CurrentPart);
  end;
  WriteUniqueWords
end.

Вернуться в Помощь за вознаграждение
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1