Разработка подпрограммы resh
Спецификация
1. Назначение: вычисление множеств наличных карандашей, отсутствующих карандашей, дублирующих карандашей (все множества типа tkorobka).
2. Имя: resh
3. Вид: процедура
4. Перечень параметров
Таблица 20.5. Перечень параметров
Статус | Назначение | Имя | Тип | Вид |
Вход | Первая коробка | n1 | tkorobka | параметр-константа |
Вход | Вторая коробка | n2 | tkorobka | параметр-константа |
Выход | Наличные карандаши | nal | tkorobka | параметр-значение |
Выход | Отсутствующие карандаши | otsut | tkorobka | параметр-значение |
Выход | Дублирующие карандаши | dubl | tkorobka | параметр-значение |
Метод решения
1) nal:=n1 n2;
2) otsut:={ krasn, gelt, zelen, sini, korichn, chern } \ nal;
3) dubl:=n1 n2.
Текст процедуры
procedure resh(const n1,n2:tkorobka;var nal, otsut, dubl :tkorobka);
begin
{имеющиеся карандаши}
nal:=n1+n2; {объединение двух множеств - коробок}
{отсутствующие карандаши}
otsut:=[krasn..chern]-nal;
{вычитание из множества возможных цветов множества наличных цветов}
{дублирующие карандаши}
dubl:=n1*n2
end;
Разработка программы
Метод решения
1) read_mn(n1);
2) read_mn(n2);
3) resh(n1,n2,nal,otsut,dubl);
4) write_mn(nal);
5) write_mn(otsut);
6) write_mn(dubl).
Информационная модель
Таблица 20.6. Информационная модель
Статус | Назначение | Имя | Тип |
Вход | Первая коробка | n1 | tkorobka |
Вход | Вторая коробка | n2 | tkorobka |
Выход | Наличные карандаши | nal | tkorobka |
Выход | Отсутствующие карандаши | otsut | tkorobka |
Выход | Дублирующие карандаши | dubl | tkorobka |
Текст программы
program color_pencil;
type
{названия возможных цветов карандашей}
tpalitra = (krasn, gelt, zelen, sini, korichn, chern);
tkorobka = set of tpalitra;{тип информационной модели коробки карандашей}
const
{массив с символьными названиями цветов карандашей}
colors:array[tpalitra]of string=('красный','желтый','зеленый','синий','коричневый','черный');
procedure read_mn(var n:tkorobka);
var i:tpalitra;
otvet:char;
begin
n:=[];{коробка пуста - пустое множество}
{перебор возможных цветов}
for i:=krasn to chern do
begin
writeln('Есть ',colors[i],' карандаш? Ответьте: д/н');
readln(otvet);
if (otvet='Д')or(otvet='д')or(upcase(otvet)='L') then
begin
n:=n+[i];{добавление элемента в мнжество}
writeln(colors[i],' карандаш находится в коробке')
end
else writeln(colors[i],' карандаш отсутствует в коробке')
end
end;
procedure write_mn(const n:tkorobka);
var k:integer;
i:tpalitra;
begin
k:=0;
for i:=krasn to chern do
if i in n then
begin
if k<>0 then write(', ');
k:=k+1;
write(colors[i])
end;
if k=0 then writeln('нет карандашей')
else if k=1 then writeln(' карандаш')
else writeln(' карандаши')
end;
procedure resh(const n1,n2:tkorobka;var nal, otsut, dubl :tkorobka);
begin
{имеющиеся карандаши}
nal:=n1+n2; {объединение двух множеств - коробок}
{отсутствующие карандаши}
otsut:=[krasn..chern]-nal;
{вычитание из множества возможных цветов множества наличных цветов}
{дублирующие карандаши}
dubl:=n1*n2
end;
var n1,n2 : tkorobka; {коробки с карандашами}
nal,otsut,dubl:tkorobka; {результаты вычислений: наличие, отсутствие, дубль}
begin
writeln('заполнение первой коробки');
read_mn(n1);
writeln('заполнение второй коробки');
read_mn(n2);
resh(n1,n2,nal,otsut,dubl);
writeln('Имеющиеся:');
write_mn(nal);
writeln('Отсутствующие:');
write_mn(otsut);
writeln('Дублирующие:');
write_mn(dubl)
end.