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

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

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

Автор: Element 23.12.2006 19:51

вот условие задачи:
type name= ( Вася, Володя Ира, Сергей и т.д.)
gosty=set of name;
gruppa=array[name] of gosty;
Программа должна определить есть ли в группе хотя бы 1 человек, побывавший в гостях у всех остальных из группы ( gruppa[x]- множество людей, бывавших в гостях у человека с именем x)



вот насколько я понимаю теорию...

type name = ( Сергей , Миша, Ира)
gosty sen of name ;
gruppa=array[name] of gosty;

получеются все подмножества множества Сергей, Миша , Ира, записанных в массиве, т.е
[];
[Сергей];
[Миша];
[Ира];
[Сергей,Миша];
[Сергей, Миша, Ира];
[Миша, Ира];
[Ира, Сергей];

вот теперь возникает вопрос что такое gruppa[Сергей] =????
как это всё распределяется в множестве... помогите кто может что подсказать
далее не совсем понятно условие задачи.. препод полный вася ничё не объясняет... это последняя задача по курсу..
вот_)
объясните мне чёнить плз

Автор: volvo 23.12.2006 19:59

В поиск... Дословно это же задание решалось!

Автор: Element 23.12.2006 20:01

я шерстил уже нифига не нашёл, помоги плз

Автор: volvo 23.12.2006 20:09

http://forum.pascal.net.ru/index.php?s=&showtopic=4434&view=findpost&p=37662
Не оно?

Автор: Element 23.12.2006 20:10

оо спс, БОЛЬШОЕ СПС))))

Автор: Element 13.06.2007 18:59

Если не сложно объясните что тут почём или дайте почитать чёнить а то я не понимаю вообще о чём тут речь идёт.. мне надо такую же прогу только чтобы чел-к с клавиатуры забивал кто у кого в гостях был... глупая задача(

Автор: Element 13.06.2007 21:28

!help.gif boredom.gif !help.gif ребят плз помогите... завтра надо сдать а то выгонят нафих(

Автор: мисс_граффити 13.06.2007 23:25

там же комментарии есть
если что-то непонятно, задавай конкретные вопросы.

Автор: Element 13.06.2007 23:55

конкретно, что нужно сделать чтобы пользователь сам вводил кто у кого в гостях был! а я ваще не врубаюсь как это сделать!(((( да и вообще есть что нить почитать о множествах а то везде как то всё скудно!!!

Автор: мисс_граффити 14.06.2007 0:21

ну например так:
1) сделать функцию, переводящую строку в имя (как перечислимый тип).
то есть передаешь ей строку, там сравниваешь (if s='misha' then... ) и возвращаешь имя.
2) спрашиваешь у кого в гостях были, преобразуешь строку с помощью этой функции, запоминаешь хозяина.
3) спрашиваешь, кто был, и делаешь include(group[хозяин],имя_гостя)

Добавлено через 1 мин.
для "почитать":
http://www.lectureroom.net/index.php?id=312
http://pascal.guti.ru/sets.html

Автор: Element 14.06.2007 0:35

а я не могу проще сделать , ведь у меня type name= ( Вася, Володя Ира, Сергей и т.д.) определённое ограниченное количество!
я не могу понять вот что:


for i:=1 to 10 do begin (по условию скоко было чел-к)
writeln('kto bil v gostax y',k[i]); k-массив содержащий список имён


а как далешь писать я не знаю) посвятите непросвященного()

Автор: мисс_граффити 14.06.2007 0:49

тогда уж так:

for i:=vasya to misha do
for j:=vasya to misha do
if j in group[i] then ...

здесь тебе будет нужна функция преобразования имени в строку

Автор: volvo 14.06.2007 0:55

Цитата
тогда уж так:
Угу... А потом преподаватель просит первым добавить Колю, последней - Люду, и Element ползает по всей программе в поисках бага: почему же Колю и Люду программа игнорирует? Не надо привязываться к конкретным значениям: для работы с перечислимыми типами специально в язык ввели High/Low

Автор: Element 14.06.2007 1:19

type
name = (vasya, volodya, ira, lida, marina, misha);
var
i, j: name ;
begin
for i := low(name) to high(name) do
begin
writeln('vvedite kto bil v gostax y',name);


так, т.е пользователь ввёл через запятую имена, надо теперь имена в строке разделить на слова и то что получится перевести в имя, я правильно понял...:::???

Автор: volvo 14.06.2007 1:32

То, что ты привел - не будет компилироваться... Смотри:

type
name = (vasya, volodya, ira, lida, marina, misha);
const
names: array[name] of string = (
'vasya', 'volodya', 'ira', 'lida', 'marina', 'misha'
);

var
i, j: name;
begin
for i := low(name) to high(name) do begin
writeln('vvedite kto bil v gostax y', names[i]);
readln(s);
{ теперь читаешь строку, разделяешь ее на слова, и ... }

{ допустим, в строке присутствует имя, хранящееся сейчас в P }
for j := low(name) to high(name) do
if names[j] = P then begin
{ J - это как раз переведенное в тип Name имя ... Делаешь с ним то, что нужно }
break;
end;



Чтобы сделать более обобщенную версию (которая не будет зависеть от регистра введенных символов, скажем), сравнивать можно и так:
    if upstr(names[j]) = upstr(P) then begin
(реализация функции upstr как для латинских символов, так и для кириллицы есть на форуме)

Автор: Element 14.06.2007 3:24

напишите мну кто нить эту прогу от начала до конца плз, извините за флуд и создание тем в задачах на заказ, напишите скоко стоить будет, оч. прошу, правда не понимаю как это делать вапще(((

Автор: volvo 14.06.2007 4:18

Я же все уже рассказал, надо было только собрать:

type
name = (vasya, volodya, ira, lida, marina, misha);
guests = set of name;
group = array[name] of guests;

const
limits = [' ', ','];
names: array[name] of string = (
'vasya', 'volodya', 'ira', 'lida', 'marina', 'misha'
);

function vezde(gr: group): boolean;
var
i, j: name;
res: boolean;
was: set of name;
begin
res := false;
for i := low(name) to high(name) do begin
was := [];
for j := low(name) to high(name) do
if (i in gr[j]) then was := was + [j];
res := res or ((was + [i]) = [low(name) .. high(name)])
end;
vezde := res
end;

var
_group: group;
i,back,n : byte;
i_name, j_name: name;
s, the_word: string;

begin

for i_name := low(name) to high(name) do begin
writeln('vvedite kto bil v gostax y ', names[i_name]);
readln(s);

i := 1;
while(i<=length(s)) do begin
while(i<=length(s)) and (s[i] in limits) do inc(i);
if i<=length(s) then begin
back := i;
while(i<=length(s)) and not(s[i] in limits) do inc(i);
inc(n);
the_word := copy(s, back, i-back);

for j_name := low(name) to high(name) do
if names[j_name] = the_word then begin
include(_group[i_name], j_name);
break;
end;

end;
end;
end;
writeln(vezde(_group))

end.

(комментарии добавлять не стал, все выдрано из уже прокомментированных программ)

Автор: Element 14.06.2007 4:21

Volvo Большое при большое списськи)) просто не понимаю я этот паскаль, мну учили сначала на си, недоучили а счас на паскале а прпод вообще ничё не грит..!"(((((((

Автор: Element 15.06.2007 2:05

извините что я ВАМ наверно надоел , но у мя такая ошибка 105 at 00404077

Автор: volvo 15.06.2007 4:03

Ошибки 105 (если ты НЕ правил мою программу) не может быть по определению: я с файлами нигде не работал... Это первое... А второе - ты разделом не ошибся? Ты получил ошибку где угодно,только не в Турбо Паскале... А в ЭТОМ разделе - программы именно для него...

Так что претензии предъявляй сам себе.