Показать сообщение отдельно
Старый 16.12.2010, 21:34   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от 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-Паскаль). Это, если надо, легко поправите сами.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070