Задан текст из маленьких латинских букв в конце стоит точка. Напечатать в алфавитном порядке все согласные буквы которые не входят ни в одно слово с использованием процедуры.
Вот мой вариант решения: В процесе решения зашёл в тупик, нужна ваша помощь.
type mmm=setof char;
var s1:string; h:setof char;
procedure rasbuk(s:string);
var i:integer;j,t:char;n:integer; ss, dd:mmm;
begin
ss:=[];
dd:=[];
for i:=1to length(s) dowhile s[i] = '.'dobeginwhile s[i] = ' 'doif s[i] in h then ss:=ss+[s[i]];
dd:=dd-ss;
for j:='a'to'z'dobegin
n:=0;
for i:=1to length(s) doif j=s[i] then n:=n+1;
if n>=2then writeln(j);
end;
writeln('Bykvi ne vhodyawie v tekst');
for t:='a'to'z'doif t in dd thenwrite(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=setof char;
var
s1:string;
h:setof char;
procedure rasbuk(s:string);
var
i:integer;
j,t:char;
n:integer;
ss, dd:mmm;
begin
ss:=[];
dd:=[];
for i:=1to length(s) dowhile s[i]='.'dobeginwhile s[i]=' 'doif s[i] in h then ss:=ss+[s[i]];
dd:=dd-ss;
for j:='a'to'z'dobegin
n:=0;
for i:=1to length(s) doif j=s[i] then n:=n+1;
if n>=2then writeln(j);
end;
writeln('Bykvi ne vhodyawie v tekst');
for t:='a'to'z'doif t in dd thenwrite(t);
end;
begin
writeln('vvedite tekst');
readln(s1);
h:=['a'..'z'];
rasbuk(s1);
readln;
end;
end.
Сразу бросаются в глаза несколько ошибок общего плана: 1. Процедура, по всей видимости, не закрыта (нижний блок явно должен быть головным, но формально входит в процедуру). 2. Параметр цикла i используется повторно внутри цикла.
Дальше пытаемся немного вникнуть в смысл: 3. Последовательность операторов:
while s[i]='.'dobeginwhile s[i]=' '
- вызывает немалое удивление (хотя, я не утверждаю, что она не имеет право на существование).
Можно было бы продолжить и дальше, но прежде хочется знать твою реакцию..
kvadrat
19.10.2008 20:09
Цитата(Lapp @ 15.10.2008 8:52)
Сразу бросаются в глаза несколько ошибок общего плана: 1. Процедура, по всей видимости, не закрыта (нижний блок явно должен быть головным, но формально входит в процедуру). 2. Параметр цикла i используется повторно внутри цикла.
Дальше пытаемся немного вникнуть в смысл: 3. Последовательность операторов:
while s[i]='.'dobeginwhile s[i]=' '
- вызывает немалое удивление (хотя, я не утверждаю, что она не имеет право на существование).
Можно было бы продолжить и дальше, но прежде хочется знать твою реакцию..
1. Вот она оказываеься почему некомпилировалась
program z1;
type
mmm=setof char;
var
s1:string;
h:setof char;
procedure rasbuk(s:string);
var
i:integer;
j,t:char;
n:integer;
ss, dd:mmm;
begin
ss:=[];
dd:=[];
for i:=1to length(s) dowhile s[i]='.'dobeginwhile s[i]=' 'doif s[i] in h then ss:=ss+[s[i]];
dd:=dd-ss;
for j:='a'to'z'dobegin
n:=0;
for i:=1to length(s) doif j=s[i] then n:=n+1;
if n>=2then writeln(j);
end;
writeln('Bykvi ne vhodyawie v tekst');
for t:='a'to'z'doif t in dd thenwrite(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);
выведет номер позиции точки в строке Разбиении строки на слова есть на форуме (много способов)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.