1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Задача на тему "Множества", Задан текст из маленьких латинских букв...
Задан текст из маленьких латинских букв в конце стоит точка. Напечатать в алфавитном порядке все согласные буквы которые не входят ни в одно слово с использованием процедуры.
Вот мой вариант решения: В процесе решения зашёл в тупик, нужна ваша помощь.
type mmm=set of char; var s1:string; h:set of char; procedure rasbuk(s:string); var i:integer;j,t:char;n:integer; ss, dd:mmm; begin ss:=[]; dd:=[]; for i:=1 to length(s) do while s[i] = '.' do begin while s[i] = ' ' do if s[i] in h then ss:=ss+[s[i]]; dd:=dd-ss; for j:='a' to 'z' do begin n:=0; for i:=1 to length(s) do if j=s[i] then n:=n+1; if n>=2 then writeln(j); end; writeln('Bykvi ne vhodyawie v tekst'); for t:='a' to 'z' do if t in dd then write(t); end; begin writeln('vvedite tekst'); readln(s1); h:=['a'..'z']; rasbuk(s1); readln; end; end.
На самом деле все гораздо проще (для поставленной тобой задачи и только для нее): достаточно заполнить множество всеми согласными, а потом пройти по всем буквам текста, и удалить каждую из них из этого множества... Все, что в множестве осталось - согласные, не используемые ни в одном слове...
Но это "поверхностное" решение, предупреждаю сразу... Если тебе потом понадобится написать программу, находящую все согласные, которые не встречаются в КАЖДОМ слове, к примеру, то программу придется переписывать полностью... Не"поверхностное" решение - разбивать строку на слова, и для каждого слова создавать множество входящих в него согласных... Тогда при изменении задания надо будет лишь чуть-чуть подправить программу...
В процесе решения зашёл в тупик, нужна ваша помощь.
Volvo, безусловно, прав, как всегда, по поводу алгоритма решения. Но мне кажется, что прежде, чем советовать "неповерхностные" решения, нужно помочь человеку разобраться с его собственной попыткой решить, которая вообще далека от попадения в классификацию "поверхностных/неповерхностных" решений, ибо вообще не есть решение.
2 kvadrat: Не надо думать, что структуризация кода - удел профессионалов, а новичкам только пустая трата времени. Как раз скорее наоборот: в маленькой неструктурированной проге профи, может, и разберется, а новичок - вряд ли.. Я сделал нужные отступы и пропуски в твоей программе (никаких других изменений!), результат ниже:
type mmm=set of char;
var s1:string; h:set of char;
procedure rasbuk(s:string); var i:integer; j,t:char; n:integer; ss, dd:mmm;
begin ss:=[]; dd:=[]; for i:=1 to length(s) do while s[i]='.' do begin while s[i]=' ' do if s[i] in h then ss:=ss+[s[i]]; dd:=dd-ss; for j:='a' to 'z' do begin n:=0; for i:=1 to length(s) do if j=s[i] then n:=n+1; if n>=2 then writeln(j); end; writeln('Bykvi ne vhodyawie v tekst'); for t:='a' to 'z' do if t in dd then write(t); end;
begin writeln('vvedite tekst'); readln(s1); h:=['a'..'z']; rasbuk(s1); readln; end; end.
Сразу бросаются в глаза несколько ошибок общего плана: 1. Процедура, по всей видимости, не закрыта (нижний блок явно должен быть головным, но формально входит в процедуру). 2. Параметр цикла i используется повторно внутри цикла.
Дальше пытаемся немного вникнуть в смысл: 3. Последовательность операторов:
while s[i]='.' do begin while s[i]=' '
- вызывает немалое удивление (хотя, я не утверждаю, что она не имеет право на существование).
Можно было бы продолжить и дальше, но прежде хочется знать твою реакцию..
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой
Сразу бросаются в глаза несколько ошибок общего плана: 1. Процедура, по всей видимости, не закрыта (нижний блок явно должен быть головным, но формально входит в процедуру). 2. Параметр цикла i используется повторно внутри цикла.
Дальше пытаемся немного вникнуть в смысл: 3. Последовательность операторов:
while s[i]='.' do begin while s[i]=' '
- вызывает немалое удивление (хотя, я не утверждаю, что она не имеет право на существование).
Можно было бы продолжить и дальше, но прежде хочется знать твою реакцию..
1. Вот она оказываеься почему некомпилировалась
program z1; type mmm=set of char;
var s1:string; h:set of char;
procedure rasbuk(s:string); var i:integer; j,t:char; n:integer; ss, dd:mmm;
begin ss:=[]; dd:=[]; for i:=1 to length(s) do while s[i]='.' do begin while s[i]=' ' do if s[i] in h then ss:=ss+[s[i]]; dd:=dd-ss; for j:='a' to 'z' do begin n:=0; for i:=1 to length(s) do if j=s[i] then n:=n+1; if n>=2 then writeln(j); end; writeln('Bykvi ne vhodyawie v tekst'); for t:='a' to 'z' do if t in dd then write(t); end; end; begin writeln('vvedite tekst'); readln(s1); h:=['a'..'z']; rasbuk(s1); readln; end.
2, 3. Я пытаюсь в первом цикле найти точку (которая будет обозначать конец текста, и написаные далее символы будут не в счёт), а внутри этого цикла пытаюсь найти пробелы (которые обозначают конец слова, в которых и нужно проверять наличие согласных и вычитать их из основного множества согласных) Для этого, насколько я понимаю, нужно дважды прогнать s[i] через каждый цикл потому i и повторяется.