Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Задача на тему "Множества"

Автор: kvadrat 15.10.2008 2:49

Задан текст из маленьких латинских букв в конце стоит точка. Напечатать в алфавитном порядке все согласные буквы которые не входят ни в одно слово с использованием процедуры.



Вот мой вариант решения: В процесе решения зашёл в тупик, нужна ваша помощь.


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 15.10.2008 3:11

На самом деле все гораздо проще (для поставленной тобой задачи и только для нее): достаточно заполнить множество всеми согласными, а потом пройти по всем буквам текста, и удалить каждую из них из этого множества... Все, что в множестве осталось - согласные, не используемые ни в одном слове...

Но это "поверхностное" решение, предупреждаю сразу... Если тебе потом понадобится написать программу, находящую все согласные, которые не встречаются в КАЖДОМ слове, к примеру, то программу придется переписывать полностью... Не"поверхностное" решение - разбивать строку на слова, и для каждого слова создавать множество входящих в него согласных... Тогда при изменении задания надо будет лишь чуть-чуть подправить программу...

Выбирай, что тебе больше нравится...

Автор: Lapp 15.10.2008 9: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]=' '

- вызывает немалое удивление (хотя, я не утверждаю, что она не имеет право на существование).

Можно было бы продолжить и дальше, но прежде хочется знать твою реакцию.. smile.gif

Автор: kvadrat 20.10.2008 0:09

Цитата(Lapp @ 15.10.2008 8:52) *

Сразу бросаются в глаза несколько ошибок общего плана:
1. Процедура, по всей видимости, не закрыта (нижний блок явно должен быть головным, но формально входит в процедуру).
2. Параметр цикла i используется повторно внутри цикла.

Дальше пытаемся немного вникнуть в смысл:
3. Последовательность операторов:
while s[i]='.' do begin
while s[i]=' '

- вызывает немалое удивление (хотя, я не утверждаю, что она не имеет право на существование).

Можно было бы продолжить и дальше, но прежде хочется знать твою реакцию.. smile.gif

1. Вот она оказываеься почему некомпилировалась good.gif
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 20.10.2008 0:15

Цитата
Я пытаюсь в первом цикле найти точку (которая будет обозначать конец текста, и написаные далее символы будут не в счёт)
Все проще:
pos('.',s);
выведет номер позиции точки в строке
Разбиении строки на слова есть на форуме (много способов)