Цитата:
Сообщение от kulisk
А не подскажете,как ее можно исправить?Пожалуйста!!!
|
Хорошо, предложу вариант.
Но прежде всего замечу, что был невнимателен, когда писал предыдущий пост: не обратил внимание, что в условии сказано насчет того, что все три слова вводятся одной строкой. Не заметил. Виноват. Поэтому возражения по поводу первой части в основном снимаются. Единственное, что я убрал эти прерывания и зациклил ввод. Цикл будет продолжаться до тех пор, пока не будет введена строка надлежащего вида: три слова, разделенных двумя пробелами.
Алгоритм решения задачи таков:
1. Первые два слова объединяются.
2. Организован цикл по буквам третьего слова. Проверяется, сколько раз каждая буква входит в само это третье слово и сколько раз она же входит в соединенные остальные два слова. И если первое число превышает второе (хотя бы по одной букве!), то ответ отрицательный. Если же для всех букв третьего слова соотношение числа вхождений обратное, то - положительный.
Главный недостаток моей программы - наличие заведомо лишних проверок. Например, если для какой-то буквы число вхождений в третье слово оказалось бОльшим, чем в соединение первого со вторым, то на этом программу можно было бы прервать и остальные буквы уже не проверять. Также, если в третьем слове есть одинаковые буквы, то делается столько идентичных проверок, сколько раз буква повторяется.
Всё это можно было бы обойти, но тогда программа сильно "раздуется" и существенно потеряет наглядность. Поэтому я оставил так, несколько не оптимально. Надеюсь, устроит.
Код:
uses crt;
var
s,s1,s2,s3:string;
counter,i,j,Ns3,Ns:byte;
b:boolean;
begin
Repeat
repeat
clrscr;
writeln('Enter the string:');
readln(s);
counter:=pos(' ',s);
until counter>0;
s1:=copy(s,1,counter);
s:=copy(s,counter+1,length(s));
counter:=pos(' ',s);
Until counter>0;
s2:=copy(s,1,counter);
s3:=copy(s,counter+1,length(s));
s:=s1+s2;
b:=true;
for i:=1 to Length(s3) do
begin
Ns3:=0;
for j:=1 to Length(s3) do
if s3[j]=s3[i] then Inc(Ns3);
Ns:=0;
for j:=1 to Length(s) do
if s[j]=s3[i] then Inc(Ns);
if Ns3>Ns then b:=false;
end;
If b then Writeln('YES!') else Writeln('NO!');
ReadLn;
end.
P.S. Английский язык я применяю исключительно, чтобы не путаться с кодировками кириллицы (я использую DOS-Паскаль). Это, если надо, легко поправите сами.