


Задача по программированию в Паскале
09. Вторые смыслы (100 баллов)
Иван обратил внимание, что в предложениях кроме буквального прочтения может содержаться скрытый смысл. Например, читая фразу "Этот процесс орнитологи называют миграцией" из своего учебника по биологии, Иван обнаружил слово "процессор". Очевидно, что имея некоторый словарь, можно поискать "вторые смыслы" в задаваемых текстовых фразах. Помогите Ивану написать программу, которая по введенной фразе будет выводить на экран словарные слова, которые содержатся в этой фразе. Учтите, что словарное слово может формироваться из нескольких подряд идущих слов исходной фразы без учета разделителей (пробелы, запятые и т.д.), при этом буквы словарного слова должны обязательно быть подряд идущими в анализируемой фразе. Например, если бы исходная фраза была "Этот процесс некоторые орнитологи называют миграцией", то слово "процессор" собрать было бы нельзя.
Словарь — набор из N слов введенных с клавиатуры при запуске программы. В каждой строке содержится только одно словарное слово, все символы которого кириллические.
Вводимое текстовое сообщение - строка из не более чем 255 символов, содержащая любые допустимые для набора с клавиатуры символы. Разделителями считаются любые символы не относящиеся к кириллическому алфавиту.
На экран должны выводиться все словарные слова, которые могут быть найдены во введенном тексте. Вывод слов может осуществляться в произвольном порядке. Если словарные слова не содержатся в заданном тексте, то вывести на экран фразу "Обычное предложение".
Помогите пожалуйста написать программу с объяснением в Паскале.
var dict: array of string;
n, i: integer;
flg: boolean;
s: string;
{оставляем в строке только русские буквы, приведённые к нижнему регистру}
procedure conv(var s: string);
var i: integer;
r: string;
begin
r := '';
for i := 1 to length(s) do
case s[i] of
'а'..'я', 'ё': r := r + s[i];
'А'..'Я': r := r + chr(ord(s[i]) - ord('А') + ord('а'));
'Ё': r := r + 'ё'
end;
s := r
end;
begin
readln(n);
setlength(dict, n);
for i := 0 to n - 1 do begin
readln(dict[i]);
conv(dict[i])
end;
readln(s);
conv(s);
flg := false;
for i := 0 to n - 1 do
if pos(dict[i], s) <> 0 then begin {обычно, в Pascal есть pos}
writeln(dict[i]);
flg := true
end;
if not flg then
writeln('Обычное предложение')
end.
program SecondMeanings;
const
MaxDictSize = 100;
type
Dictionary = array[1..MaxDictSize] of string;
var
dict: Dictionary;
phrase: string;
word: string;
i, j, k: integer;
found: boolean;
procedure ReadDictionary(var dict: Dictionary; var n: integer);
var
i: integer;
begin
writeln('Enter the number of words in the dictionary: ');
readln(n);
writeln('Enter the words of the dictionary:');
for i := 1 to n do
readln(dict[i]);
end;
function IsLetter(ch: char): boolean;
begin
IsLetter := ((ord(ch) >= ord('а')) and (ord(ch) <= ord('я'))) or ((ord(ch) >= ord('А')) and (ord(ch) <= ord('Я')));
end;
function CheckWordInPhrase(word: string; phrase: string): boolean;
var
i, j, k: integer;
begin
for i := 1 to length(phrase) - length(word) + 1 do
begin
j := 1;
k := i;
while (j <= length(word)) and (word[j] = phrase[k]) do
begin
j := j + 1;
k := k + 1;
end;
if j > length(word) then
begin
CheckWordInPhrase := true;
exit;
end;
end;
CheckWordInPhrase := false;
end;
begin
ReadDictionary(dict, n);
writeln('Enter the phrase:');
readln(phrase);
found := false;
for i := 1 to n do
begin
if CheckWordInPhrase(dict[i], phrase) then
begin
writeln(dict[i]);
found := true;
end;
end;
if not found then
writeln('Обычное предложение');
end.