Задан текст из маленьких латинских букв в конце стоит точка. Напечатать в алфавитном порядке все согласные буквы которые не входят ни в одно слово с использованием процедуры.
Вот мой вариант решения: В процесе решения зашёл в тупик, нужна ваша помощь.
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
14.10.2008 23:11
На самом деле все гораздо проще (для поставленной тобой задачи и только для нее): достаточно заполнить множество всеми согласными, а потом пройти по всем буквам текста, и удалить каждую из них из этого множества... Все, что в множестве осталось - согласные, не используемые ни в одном слове...
Но это "поверхностное" решение, предупреждаю сразу... Если тебе потом понадобится написать программу, находящую все согласные, которые не встречаются в КАЖДОМ слове, к примеру, то программу придется переписывать полностью... Не"поверхностное" решение - разбивать строку на слова, и для каждого слова создавать множество входящих в него согласных... Тогда при изменении задания надо будет лишь чуть-чуть подправить программу...
Выбирай, что тебе больше нравится...
Lapp
15.10.2008 5:52
Цитата(kvadrat @ 14.10.2008 22:49)
В процесе решения зашёл в тупик, нужна ваша помощь.
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]=' '
- вызывает немалое удивление (хотя, я не утверждаю, что она не имеет право на существование).
Можно было бы продолжить и дальше, но прежде хочется знать твою реакцию..
kvadrat
19.10.2008 20:09
Цитата(Lapp @ 15.10.2008 8:52)
Сразу бросаются в глаза несколько ошибок общего плана: 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 и повторяется.
Client
19.10.2008 20:15
Цитата
Я пытаюсь в первом цикле найти точку (которая будет обозначать конец текста, и написаные далее символы будут не в счёт)
Все проще:
pos('.',s);
выведет номер позиции точки в строке Разбиении строки на слова есть на форуме (много способов)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.