15.12.2010, 21:32 | #1 (permalink) |
Member
Регистрация: 15.12.2010
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Задача на строки, Паскаль
код прораммы: 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. помогите пожалуйста,очень надо!!! |
15.12.2010, 21:32 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Потратите минутку на прочтение, а узнаете многое Паскаль, символы и строки Паскаль, строки Жесткая задача на строки |
16.12.2010, 17:17 | #2 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
В первой части программы решается задача ввода с консоли трех слов. И делается это способом настолько диким, что ужас. Вместо того, чтобы написать три простые строчки типа WriteLn('Word 1:'); ReadLn(s1); WriteLn('Word 2:'); ReadLn(s2); WriteLn('Word 3:'); ReadLn(s3); там разведена бодяга со считыванием трех слов разом (одной строкой), после чего их натужно разделяют путем поиска символов пробелов, а в случае ненахождения пробелов программа молча вылетает, т.е. аварийно завершается. Без каких бы то ни было комментариев и пояснений. Далее приступлено к решению самой задачи. Тут требуется некое пояснение. Как я понял условие задачи, вопрос сводится к следующему: можно ли получить третье слово из букв, содержащихся в первых двух? Так вот, в программе это решается так: для каждой буквы третьего слова проверяется, есть ли такая буква в первом либо во втором слове (ну или в обоих). А теперь представьте, что первое слово - "муж", второе - "таз", третье - "мама". Программа в этом случае покажет положительный результат, между тем как понятно, что, поскольку требуется 2 буквы "м" и 2 буквы "а", результат должен быть отрицательным. Ведь в условии не сказано, что нет повторяющихся букв! Не говоря уже о том, что там всюду понатыканы аварийные прерывания (Halt;), и это вместо того, чтобы вывести на экран информативное сообщение об ошибке, приостановить программу (чтобы пользователь смог эти сообщения прочитать), а уж только потом прерывать. Тоже и в конце - никакого останова. Опять Halt; Ну вот Вам для начала материал к размышлению. Если нужна нормальная программа, можно подумать над этим. |
|
16.12.2010, 21:34 | #4 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Хорошо, предложу вариант.
Но прежде всего замечу, что был невнимателен, когда писал предыдущий пост: не обратил внимание, что в условии сказано насчет того, что все три слова вводятся одной строкой. Не заметил. Виноват. Поэтому возражения по поводу первой части в основном снимаются. Единственное, что я убрал эти прерывания и зациклил ввод. Цикл будет продолжаться до тех пор, пока не будет введена строка надлежащего вида: три слова, разделенных двумя пробелами. Алгоритм решения задачи таков: 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. |
18.12.2010, 17:19 | #5 (permalink) |
Member
Регистрация: 15.12.2010
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Большое спасибо,очень сильно помогли!
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|