Дана строка S, состоящая из слов, разделённых пробелами. Выведите все слова, которые встречаются в S...

Тематика Информатика
Уровень 10 - 11 классы
строка слова уникальные слова латинский алфавит Free Pascal обработка строк единственное вхождение текстовый анализ программирование
0

Дана строка S, состоящая из слов, разделённых пробелами. Выведите все слова, которые встречаются в S ровно один раз. Формат входных данных Во входном файле дана строка S. Строка S состоит из строчных букв латинского алфавита и пробелов; в ней есть хотя бы одна буква, ёe длина не превышает 100 символов. Формат выходных данных Выведите все слова, которые встречаются в S ровно один раз. Каждое слово выводите на новой строке в том порядке, в котором они встречаются в S. Примеры: Вход to be or not to be Выход or not.

UPD. На Free Pascal надо

avatar
задан месяц назад

2 Ответа

0

Вот решение задачи на языке Free Pascal. Мы будем использовать стандартные функции и структуры, такие как массивы и циклы, чтобы обработать строку и найти слова, которые встречаются ровно один раз.

Подробное объяснение алгоритма:

  1. Разделим строку на слова, используя пробел как разделитель.
  2. Для каждого слова подсчитаем, сколько раз оно встречается в строке, используя массивы для хранения слов и их частот.
  3. Выведем только те слова, частота которых равна 1, и сохраним их порядок изначального появления в строке.

Код на Free Pascal:

program UniqueWords;

uses SysUtils;

var
  S: string;
  Words: array[1.100] of string;
  Frequencies: array[1.100] of integer;
  WordCount, i, j: integer;
  CurrentWord: string;
  IsUnique: boolean;

begin
  // Читаем строку
  ReadLn(S);

  // Инициализируем переменные
  WordCount := 0;

  // Разделяем строку на слова
  while Length(S) > 0 do
  begin
    // Найти первое слово (до пробела)
    i := Pos(' ', S);
    if i = 0 then
    begin
      CurrentWord := S; // Если пробелов больше нет, берём всю строку
      S := '';
    end
    else
    begin
      CurrentWord := Copy(S, 1, i - 1); // Извлекаем слово
      Delete(S, 1, i); // Удаляем слово из строки вместе с пробелом
    end;

    // Проверяем, есть ли уже это слово в массиве Words
    IsUnique := True;
    for j := 1 to WordCount do
    begin
      if Words[j] = CurrentWord then
      begin
        Frequencies[j] := Frequencies[j] + 1; // Увеличиваем частоту
        IsUnique := False;
        Break;
      end;
    end;

    // Если слово уникально, добавляем его в массив Words
    if IsUnique then
    begin
      WordCount := WordCount + 1;
      Words[WordCount] := CurrentWord;
      Frequencies[WordCount] := 1;
    end;
  end;

  // Выводим слова, которые встречаются ровно один раз
  for i := 1 to WordCount do
  begin
    if Frequencies[i] = 1 then
      WriteLn(Words[i]);
  end;
end.

Как работает программа:

  1. Чтение строки: Программа считывает строку S с входа.
  2. Разделение на слова: Используется цикл while, чтобы последовательно извлекать слова из строки. Функция Pos находит первое вхождение пробела, чтобы выделить слово.
  3. Подсчет частот: Каждое слово сравнивается с уже сохраненными в массиве Words. Если слово уже встречалось, увеличивается его частота в массиве Frequencies. Если слово новое, оно добавляется в массив Words, а его частота устанавливается равной 1.
  4. Вывод результата: Программа выводит только те слова, частота которых равна 1, сохраняя порядок их появления.

Пример работы программы:

Для входной строки:

to be or not to be

Программа выполнит следующие шаги:

  1. Разделит строку на слова: to, be, or, not, to, be.
  2. Подсчитает частоты:
    • to — 2 раза,
    • be — 2 раза,
    • or — 1 раз,
    • not — 1 раз.
  3. Выведет только слова с частотой 1:
    or
    not
    

Ограничения:

  • Длина строки не превышает 100 символов.
  • Все слова состоят только из строчных латинских букв.

Этот код полностью соответствует условиям задачи и работает эффективно для заданных ограничений.

avatar
ответил месяц назад
0

Для решения задачи на Free Pascal, необходимо выполнить следующие шаги:

  1. Считать входную строку.
  2. Разбить строку на слова, используя пробел как разделитель.
  3. Подсчитать количество вхождений каждого слова в строке.
  4. Вывести только те слова, которые встречаются ровно один раз, в порядке их появления в исходной строке.

Вот пример кода на Free Pascal, который реализует описанный алгоритм:

program UniqueWords;

uses SysUtils;

const
  MaxWords = 100;

var
  S: string;
  Words: array[1.MaxWords] of string;
  WordCount: array[1.MaxWords] of integer;
  i, j, n: integer;
  Found: boolean;

begin
  // Читаем строку S
  ReadLn(S);
  
  // Приводим строку к нижнему регистру (если необходимо) и разбиваем на слова
  n := 0;
  S := Trim(S); // Убираем пробелы в начале и конце строки
  while Length(S) > 0 do
  begin
    // Находим первое слово
    j := Pos(' ', S);
    if j = 0 then
    begin
      // Если пробелов больше нет, добавляем последнее слово
      Inc(n);
      Words[n] := S;
      S := ''; // Завершаем цикл
    end
    else
    begin
      Inc(n);
      Words[n] := Copy(S, 1, j - 1); // Скопировать слово до пробела
      S := Copy(S, j + 1, Length(S)); // Удалить слово и пробел из строки
    end;
  end;

  // Инициализируем массив для подсчета количества вхождений
  for i := 1 to n do
    WordCount[i] := 0;

  // Подсчитываем количество вхождений каждого слова
  for i := 1 to n do
  begin
    for j := 1 to n do
    begin
      if Words[i] = Words[j] then
        Inc(WordCount[i]);
    end;
  end;

  // Выводим слова, встречающиеся ровно один раз
  for i := 1 to n do
  begin
    if WordCount[i] = 1 then
      WriteLn(Words[i]);
  end;
end.

Объяснение кода:

  1. Считывание строки: С помощью ReadLn(S) мы считываем строку S.
  2. Разбиение строки на слова: С помощью цикла while и функции Pos мы находим пробелы и извлекаем слова из строки, сохраняя их в массиве Words.
  3. Подсчет вхождений: Мы используем вложенные циклы для подсчета количества вхождений каждого слова. Если слово совпадает с другим, мы увеличиваем счетчик в массиве WordCount.
  4. Вывод уникальных слов: В последнем цикле мы проверяем, сколько раз каждое слово встречается, и выводим те, которые встречаются ровно один раз.

Этот код корректно решает поставленную задачу и выводит необходимые слова в требуемом формате.

avatar
ответил месяц назад

Ваш ответ

Вопросы по теме