Технический форум
Вернуться   Технический форум > Программирование > Форум программистов


Ответ
 
Опции темы Опции просмотра
Старый 15.12.2010, 21:32   #1 (permalink)
kulisk
Member
 
Регистрация: 15.12.2010
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Question Задача на строки, Паскаль

Пожалуйста объясните программу.Вот условие:в заданной строке записаны 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.
помогите пожалуйста,очень надо!!!
kulisk вне форума   Ответить с цитированием

Старый 15.12.2010, 21:32
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Потратите минутку на прочтение, а узнаете многое

Паскаль, символы и строки
Паскаль, строки
Жесткая задача на строки

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

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

А не подскажете,как ее можно исправить?Пожалуйста!!!
kulisk вне форума   Ответить с цитированием
Старый 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 вне форума   Ответить с цитированием
Старый 18.12.2010, 17:19   #5 (permalink)
kulisk
Member
 
Регистрация: 15.12.2010
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Большое спасибо,очень сильно помогли!
kulisk вне форума   Ответить с цитированием
Ads

Яндекс

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

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.