Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с множествами
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
rov4
Привет всем!
Обращаюсь к вам за помощью, так как самой выполнить задания, видимо не дано... sad.gif
Необходимо написать программы к следующим заданиям:
1. Дана непустая последовательность символов. Требуется построить и напечатать множество, элементами которого являются встречающиеся в последовательности: цифры от ‘0’ до ‘9’.
2. Постановка задачи: Задан список объектов, включающий в зависимости от варианта названия ЭВМ или видов спорта. Известно, что в каждом институте имеется определенный набор вычислительных машин, а учащиеся каждой группы занимаются определенными видами спорта. Необходимо задать конкретные наборы ЭВМ (перечни видов спорта) для каждого института (каждой группы). Количество институтов(групп) указано в варианте.
Введя исходные данные, необходимо построить и распечатать множество, удовлетворяющее указанному в варианте условию.
Вариант задания: Задано множество вычислительных машин, которыми может быть обеспечен институт: IBM-386, IBM-486, Pentium, Macintosh, APPLE, ACER. Известен набор машин, имеющихся в каждом институте. Количество институтов (N) указано в варианте:
требуется построить и распечатать множество, включающее в себя вычислительные машины:
• которыми обеспечены все институты (N=10).
• которые имеют хотя бы один институт.
• которых нет ни водном институте.

Пожалуйста, помогите, чем сможете.
Заранее спасибо!
volvo
rov4
Насчет задачи №2: эту же задачу (немного в другой вариации - про магазины и продукты) я решал здесь
-rov4-
Итак, я написала программы для этих 2-х заданий, и вот что получилось:
Для № 1:
Код
program lab;
Uses crt;
TYPE SetType = set of char;
const
Length = 255;
var
m1, m2 : array [1..Length] of Char;
i, a :  Integer;
Myset:Settype;
Begin
ClrScr;
Randomize;
For i:=1 to Length do
 m1[i]:=Chr(32+Random(255-32));

Myset:=['0'..'9'];
a:=1;
For i:=1 to Length do
 if m1[i] in Myset then
   Begin
    m2[a] := m1[i];
    Inc(a);
   End;

writeln('Множество:');
For i:=1 to Length do
Write(m1[i],' ');

writeln;

writeln('В множество входят следующие цифры от 0 до 9:');

For i:=1 to a-1 do
Write(m2[i],' ');
writeln;
writeln('Программа закончена , нажмите Enter.');
ReadLn;
End.


Для № 2:
Код
Program lab;
Uses Crt;
Type
Comps = (i386, i486, Apple, Pentium, Acer, Macintosh);
TComps = set of Comps;
Const
All_comps : TComps = [i386, i486, Apple, Pentium, Acer, Macintosh];
Inst_1 : TComps = [i386,Acer, Pentium];
Inst_2 : TComps = [Acer, Pentium];
Inst_3 : TComps = [Apple, Pentium ];
Inst_4 : TComps = [Pentium, Acer, i486];
Inst_5 : TComps = [i386,Acer, Pentium];
Inst_6 : TComps = [Acer, Pentium];
Inst_7 : TComps = [Apple, Pentium ];
Inst_8 : TComps = [Pentium, Acer, i486];
Inst_9 : TComps = [Apple, Pentium ];
Inst_10 : TComps = [Pentium, Acer, i486];
Var
All_Comps_In,
NotInst_1, NotInst_2, NotInst_3, NotInst_4,
NotInst_5, NotInst_6, NotInst_7, NotInst_8,
NotInst_9, NotInst_10  : TComps;
Procedure OutPut(s : TComps);
Begin
If i386 in s then Write('i386 ');
If i486 in s then Write('i486 ');
If Pentium in s then Write('Pentium ');
If Apple in s then Write('Apple ');
If Acer in s then Write('Acer ');
If Macintosh in s then Write('Macintosh ');
End;
Begin
ClrScr;
All_Comps_In := Inst_1 + Inst_2 + Inst_3 + Inst_4+Inst_5 + Inst_6 +
Inst_7 + Inst_8+Inst_9 + Inst_10;
Write('машины, которыми обеспечены все институты:');
NotInst_1 := All_Comps_In-Inst_1;
NotInst_2 := All_Comps_In-Inst_2;
NotInst_3 := All_Comps_In-Inst_3;
NotInst_4 := All_Comps_In-Inst_4;
NotInst_5 := All_Comps_In-Inst_5;
NotInst_6 := All_Comps_In-Inst_6;
NotInst_7 := All_Comps_In-Inst_7;
NotInst_8 := All_Comps_In-Inst_8;
NotInst_9 := All_Comps_In-Inst_9;
NotInst_10 := All_Comps_In-Inst_10;
OutPut(All_Comps_In-(NotInst_1 + NotInst_2 + NotInst_3 + NotInst_4+
NotInst_5 + NotInst_6 + NotInst_7 + NotInst_8+NotInst_9 + NotInst_10));
WriteLn;
Write('машины, которые имеет хотя бы один институт:');
OutPut(All_Comps_In);
WriteLn;
Write('машины, которых нет ни в одном институте:');
OutPut(All_Comps - All_Comps_In);
WriteLn;
While not KeyPressed Do;
End.

Пока всё работает... :thanks:
volvo
blink.gif Что это? Я про задание №2 ... А можно несколько вопросов? В скольки местах программы нужно производить изменения, если изменятся входные данные для программы?
Случай 1: изменилось количество институтов (увеличилось на N). Нужно добавить как минимум 2*N переменных, плюс к этому - изменить параметры, передаваемые в OutPut ... Вероятность ошибки - высокая (достаточно забыть изменить в одном месте и результат уже будет неверным)
Случай 2: изменилось количество типов компьютеров (например, добавился еще PentiumIV). Нужно не забыть изменить OutPut, иначе новый тип компьютеров просто не будет печататься ... Вероятность ошибки - довольно высокая, если добавляется несколько типов, можно что-то упустить ...

А если делать вот так:
Код

Uses Crt;
Type
 Comps = (i386, i486, Apple, Pentium, Acer, Macintosh);
 TComps = set of Comps;

Const
 names: array[Comps] of string =
   ('i386', 'i486', 'Apple', 'Pentium', 'Acer', 'Macintosh');
 All_comps : TComps = [i386, i486, Apple, Pentium, Acer, Macintosh];
 maxInst = 10;
 Inst: array[1 .. maxInst] of TComps =
   ( [i386,Acer, Pentium],
     [Acer, Pentium],
     [Apple, Pentium ],
     [Pentium, Acer, i486],
     [i386,Acer, Pentium],
     [Acer, Pentium],
     [Apple, Pentium ],
     [Pentium, Acer, i486],
     [Apple, Pentium ],
     [Pentium, Acer, i486] );

Var
 one, all: TComps;

Procedure OutPut(s : TComps);
 Var i: Comps;
 Begin
   For i := low(Comps) To High(Comps) Do
     If i in s then write(names[i] + ' ');
   Writeln
 End;

Var
 i: integer;

Begin
 ClrScr;
 one := []; all := all_comps;
 For i := 1 To maxInst Do
   begin
     one := one + Inst[i];
     all := all * inst[i];
   end;

 Write('машины, которыми обеспечены все институты:');
 output(all);

 Write('машины, которые имеет хотя бы один институт:');
 OutPut(one);

 Write('машины, которых нет ни в одном институте:');
 OutPut(All_Comps - one);

 While not KeyPressed Do
end.

Что изменилось? Случаи те же:
1. (изменилось количество институтов). Изменяем maxInst. Теперь, пока необходимое количество данных не будет добавлено в массив (единственный !!!), программа просто не скомпилируется... Двлее в программе ничего менять не нужно...
2. (изменилось количество типов компьютеров). Добавляем новый тип в Comps... Аналогично, пока все необходимые данные не будут откорректированы, программа не запустится.

Вероятность ошибочных результатов = 0 ... ;)
-rov4-
volvo,
Когда я просила помочь мне решить эти задачи, angry.gif никто не откликнулся, пришлось просить помощи у других. И уж что получилось, то получилось. Для меня было главное - решить задачу и получить ответ. (Экспериментировать и сравнивать я не могу, так как только начала изучать Паскаль и очень слабо в этом разбираюсь.) Но спасибо за подсказку. Конечно, твоё предложение лучше. ;)
volvo
Цитата(-rov4- @ 21.02.05 10:48)
volvo,
Когда я просила помочь мне решить эти задачи,  angry.gif никто не откликнулся

angry.gif Правда? А что, так трудно было сходить по ссылке, которую я выложил через 19 минут после того, как был задан вопрос, и пройдя по которой почти всю вторую задачу можно найти решенной?

Цитата(-rov4- @ 21.02.05 8:22)
Итак, я написала программы для этих 2-х заданий

Правда?
http://www.asu.pstu.ac.ru/book/pol/progs/pr22.htm
Altair
offtop
ух какие все злые smile.gif
rov4, соглашайся во всем, и заходи еще к намsmile.gif
end offtop
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.