IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Задача на тему "Множества", Задан текст из маленьких латинских букв...
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 81
Пол: Мужской

Репутация: -  0  +


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



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


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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






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

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

Выбирай, что тебе больше нравится...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Пионер
**

Группа: Пользователи
Сообщений: 81
Пол: Мужской

Репутация: -  0  +


Цитата(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 и повторяется.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


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

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 0:23
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name