Технический форум

Технический форум (http://www.tehnari.ru/)
-   Форум программистов (http://www.tehnari.ru/f22/)
-   -   Задача на строки, Паскаль (http://www.tehnari.ru/f22/t43387/)

kulisk 15.12.2010 21:32

Задача на строки, Паскаль
 
Пожалуйста объясните программу.Вот условие:в заданной строке записаны 3 слова.Возможно ли переставляя и удаляя буквы первого слова добавляя буквы второго получить третье слово.Сама программа уже написана,мне нужно поэтапное объяснение к ней.
код прораммы:
uses crt;
var s,s1,s2,s3:string;
counter:byte;
begin
clrscr;
writeln('Введите 3 слова');
readln(s);
counter:=pos(' ',s);
if counter=0 then halt;
s1:=copy(s,1,counter);
s:=copy(s,counter+1,length(s));
counter:=pos(' ',s);
if counter=0 then halt;
s2:=copy(s,1,counter);
s3:=copy(s,counter+1,length(s));
for counter:=1 to length(s3) do
begin
s:=copy(s3,counter,1);
if pos(s,s1)=0 then
begin
if pos(s,s2)=0 then
begin
writeln('Нельзя');
halt;
end;
end;
end;
writeln('Можно');
end.
помогите пожалуйста,очень надо!!!

Vladimir_S 16.12.2010 17:17

Цитата:

Сообщение от kulisk (Сообщение 430055)
Пожалуйста объясните программу.Вот условие:в заданной строке записаны 3 слова.Возможно ли переставляя и удаляя буквы первого слова добавляя буквы второго получить третье слово.Сама программа уже написана,мне нужно поэтапное объяснение к ней.

М-да... Мягко говоря, очень странный опус. На мой взгляд, программа вообще не решает поставленной задачи, т.е. работает неправильно. Ну давайте разбираться.
В первой части программы решается задача ввода с консоли трех слов. И делается это способом настолько диким, что ужас. Вместо того, чтобы написать три простые строчки типа
WriteLn('Word 1:'); ReadLn(s1);
WriteLn('Word 2:'); ReadLn(s2);
WriteLn('Word 3:'); ReadLn(s3);
там разведена бодяга со считыванием трех слов разом (одной строкой), после чего их натужно разделяют путем поиска символов пробелов, а в случае ненахождения пробелов программа молча вылетает, т.е. аварийно завершается. Без каких бы то ни было комментариев и пояснений.
Далее приступлено к решению самой задачи.
Тут требуется некое пояснение. Как я понял условие задачи, вопрос сводится к следующему: можно ли получить третье слово из букв, содержащихся в первых двух? Так вот, в программе это решается так: для каждой буквы третьего слова проверяется, есть ли такая буква в первом либо во втором слове (ну или в обоих). А теперь представьте, что первое слово - "муж", второе - "таз", третье - "мама". Программа в этом случае покажет положительный результат, между тем как понятно, что, поскольку требуется 2 буквы "м" и 2 буквы "а", результат должен быть отрицательным. Ведь в условии не сказано, что нет повторяющихся букв!
Не говоря уже о том, что там всюду понатыканы аварийные прерывания (Halt;), и это вместо того, чтобы вывести на экран информативное сообщение об ошибке, приостановить программу (чтобы пользователь смог эти сообщения прочитать), а уж только потом прерывать. Тоже и в конце - никакого останова. Опять Halt;
Ну вот Вам для начала материал к размышлению. Если нужна нормальная программа, можно подумать над этим.

kulisk 16.12.2010 19:10

А не подскажете,как ее можно исправить?Пожалуйста!!!

Vladimir_S 16.12.2010 21:34

Цитата:

Сообщение от kulisk (Сообщение 430435)
А не подскажете,как ее можно исправить?Пожалуйста!!!

Хорошо, предложу вариант.
Но прежде всего замечу, что был невнимателен, когда писал предыдущий пост: не обратил внимание, что в условии сказано насчет того, что все три слова вводятся одной строкой. Не заметил. Виноват. Поэтому возражения по поводу первой части в основном снимаются. Единственное, что я убрал эти прерывания и зациклил ввод. Цикл будет продолжаться до тех пор, пока не будет введена строка надлежащего вида: три слова, разделенных двумя пробелами.
Алгоритм решения задачи таков:
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-Паскаль). Это, если надо, легко поправите сами.

kulisk 18.12.2010 17:19

Большое спасибо,очень сильно помогли!


Часовой пояс GMT +4, время: 14:45.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.