Дана последовательность слов; между соседними словами запятая, за последним
словом - точка. Напечатать все слова, встречающиеся в последовательности
по одному разу.
Модератор: Модераторы
Построить из этих слов хэш-таблицу с индексами, равными 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