Помощь - Поиск - Пользователи - Календарь
Полная версия: Множество
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Sav93
Задача: Есть N множеств, найти множество содержащей больше различных элементов, все возможные елементы множества заданы в массиве С.
 
Program LabRob2;
Uses CRT;
Type
TypeSet = set of byte;
Var
C:array [1..12] of TypeSet;
r,n,j,i,k:byte;
BEGIN
ClrScr;
WriteLn('Vvedite elementi mnozhestva: ');
Randomize;
For i:=1 to 12 Do
Begin
r:=Random(9);
Include(C[i],r);
end;
ReadKey;
END.


Нужно цикл, который будет заполнять все множества и цикл которы будет проверять различные элементы, тоесть цикл в цикле как я понимаю. Но не знаю как их записать...не получается что-то...
volvo
Цитата
найти множество содержащей больше различных элементов
Больше, чем что? Вообще, задание непонятно. Множество в принципе не может содержать одинаковых элементов, то есть, они все будут различными. Итак, задача сводится к тому, чтобы найти множество, содержащее максимальное количество элементов?
Sav93
Да, Вы правы, нам преподаветель прочитал условие с 2 задач...
-TarasBer-
> Да, Вы правы, нам преподаветель прочитал условие с 2 задач...

Не понял, он начал читать начало условия одной задачи, потом завтыкал, потом прочитал конец условия другой? Вас послушать, так одни маразматики в преподах.
Sav93
Цитата(-TarasBer- @ 4.03.2011 20:37) *

> Да, Вы правы, нам преподаветель прочитал условие с 2 задач...

Не понял, он начал читать начало условия одной задачи, потом завтыкал, потом прочитал конец условия другой? Вас послушать, так одни маразматики в преподах.


Все вы поняли правельно, ну ошибся преподаватель...он у нас старенький и материал не особо выложить умеет... wink.gif
volvo
В таком случае о чем тема? О возрасте преподавателя? Может, все-таки будет приведено правильно звучащее задание?
Sav93
Дано N множеств, найти множество содержащее максимальное количество элементов, все возможные елементы множества заданы в массиве С.
Вот так она звучит.
Lapp
Цитата(Sav93 @ 4.03.2011 21:00) *
Дано N множеств, найти множество содержащее максимальное количество элементов, все возможные елементы множества заданы в массиве С.
Вот так она звучит.

Если она так звучит, то ты начал делать неправильно: у тебя массив C - это как раз массив множеств.
Вот, как-то так, думаю, нужно..
Program LabRob2;

const
n= 12; {кол-во множеств}
l= 50; {кол-во возможных элементов}
d= 10;

Type
TypeSet = set of byte;

Var
s:array [1..n] of TypeSet;
c: array [1..l] of byte;
t: TypeSet;
i,j,k,m,max: byte;

BEGIN
{зададим массив c (в данном случае просто от d+1 до d+l}
for i:=1 to l do c[i]:=i+d;

{заполняем вспомогательное множество t всеми элементами из c}
t:= [];
for i:=1 to l do Include(t,c[i]);

{заполняем множества случайным образом}
For i:=1 to n Do
for j:=1 to l do begin
k:= Random(256);
if k in t then Include(s[i],k)
end;

{считаем мощность каждого множества и одновременно ищем максимум}
max:= 0;
k:= 1;
for i:=1 to n do begin
m:=0;
for j:=1 to l do if c[j] in s[i] then Inc(m);
if m>max then begin
max:= m;
k:= i
end
end;
writeln('множество номер ',k,' имеет максимальное количество элементов (',max,')');
readln
END.

Sav93
Вроде все ясно, кроме 1-го... зачем нам d?
Lapp
Цитата(Sav93 @ 9.03.2011 19:14) *
Вроде все ясно, кроме 1-го... зачем нам d?

Переменная d не относится к решению, она относится только к первоначальному заданию условий, а именно - к заданию массива C. Сказано, что этот массив содержит все возможные элементы системы множеств. Но как он задается - не сказано. Вот я и задал его, как захотел - промежутком чисел, начинающимся с некоторого числа, которое я назвал d. Длина же этого промежутка равна длине массива C. Если хочешь, можешь задавать значения элементов C как-то иначе - вводом с клавы или случайно, или еще как-нить..

Пока я просматривал код, чтобы вспомнить, что такое d, я заметил, что генерация множеств s[i] у меня сделана не очень хорошо.. Ниже я даю вариант более эффективного заполнения множеств (к тому же, без использования дополнительного множества t).
Program LabRob2;

const
n= 12; {кол-во множеств}
l= 50; {кол-во возможных элементов}
d= 10;

Type
TypeSet = set of byte;

Var
s:array [1..n] of TypeSet;
c: array [1..l] of byte;
i,j,k,m,max: byte;

BEGIN
{зададим массив c (в данном случае просто от d+1 до d+l}
for i:=1 to l do c[i]:=i+d;

{заполняем множества случайным образом}
For i:=1 to n Do
for j:=1 to l do Include(s[i],c[Random(l)+1]);

{считаем мощность каждого множества и одновременно ищем максимум}
max:= 0;
k:= 1;
for i:=1 to n do begin
m:=0;
for j:=1 to l do if c[j] in s[i] then Inc(m);
if m>max then begin
max:= m;
k:= i
end
end;
writeln('множество номер ',k,' имеет максимальное количество элементов (',max,')');
readln
END.
Sav93
Ага...ясненько...2-й вариант для меня более понятный, спасибо.
Sav93
Еще 1 вопрос...
Так можно задать?
Program LabRob2;

const
n= 12; {кол-во множеств}
l= 255; {кол-во возможных элементов}
d= 10;

Type
TypeSet = set of byte;

Var
s:array [1..n] of TypeSet;
c: array [1..l] of byte;
i,j,k,m,max: byte;

BEGIN
Randomize;
{зададим массив c (в данном случае просто от d+1 до d+l}
for i:=1 to l do c[i]:=i+d;

{заполняем множества случайным образом}
For i:=1 to n Do
for j:=1 to l do Include(s[i],c[Random(l)]);

{считаем мощность каждого множества и одновременно ищем максимум}
max:= 0;
k:= 1;
for i:=1 to n do begin
m:=0;
for j:=1 to l do if c[j] in s[i] then Inc(m);
if m>max then begin
max:= m;
k:= i
end
end;
writeln('множество номер ',k,' имеет максимальное количество элементов (',max,')');
readln
END.

Не будет ли это ошибкой?
Lapp
Цитата(Sav93 @ 10.03.2011 16:24) *
Так можно задать?
    for j:=1 to l do Include(s[i],c[Random(l)]);

Не будет ли это ошибкой?

Конечно, будет. Random(l) принимает значения от 0 до l-1, а диапазон индекса массива c - от 1 до l. Думаешь, я прибавил 1 просто, чтоб размять пальцы? smile.gif
Sav93
А если +1 оставить, рандомайз может там присутствовать с l = 255?
Lapp
Цитата(Sav93 @ 10.03.2011 23:40) *
А если +1 оставить, рандомайз может там присутствовать с l = 255?
Что бы сие значило? при чем тут "рандомайз"?
Ты имей в виду только, что l и d нужно выбирать так, чтоб сумма l+d не превышала 255.


Добавлено через 4 мин.
если ты хочешь, чтобы в массиве C были ВСЕ возможные числа типа byte (от 0 до 255, всего 256 штук), то положи l=256, а d=-1
Sav93

Цитата
то положи l=256, а d=-1

Так не работает... ерор 76 выписывает...только если l= 255, все ок.
volvo
Тип переменных i и j поменяй с Byte на что-нибудь более ёмкое, на Word например. У тебя банальный выход за пределы значений, тип Byte может хранить 0 .. 255, а ты хочешь затолкать в него в цикле 256... Не получится.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.