Консультация # 189568: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Имеется задача для Delphi: Заполните список игрушек, некоторые из которых имеются в N детских садах. Определить игрушки из списка: которых нет ни в одном из детсадов; которые есть в каждом из детсадов. У меня так получилось:
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Имеется задача для Delphi: Заполните список игрушек, некоторые из которых имеются в N детских садах. Определить игрушки из списка: которых нет ни в одном из детсадов; которые есть в каждом из детсадов.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, jpeg, ExtCtrls;
type
TForm2 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
type igr=(kb,kn,kk,ms,lg,pr,vl); //перечислимый тип
mnz=set of igr;//тип множества
const k=7;//список игрушек
sp:array[0..k-1] of string=('кубики','конструктор','кукла','машинка',
'лего','пирамидка','велосипед');
var m:array[1..20] of mnz; //массив множеств
m1:mnz;
i:igr;
n,j,v:integer;
begin
repeat
memo1.Lines[0]:='Количество детсадов до 20 n=';
n:=StrToInt(Edit1.Text);
until n in [1..20];
memo1.Lines[0]:='Перечислите в каком из '+IntToStr(n)+' детсадов какие игрушки';
for j:=1 to n do
begin
memo1.Lines[1]:='Детсад '+IntToStr(j);
m[j]:=[];
memo1.Lines[2]:='Выберите игрушки';
memo1.Lines[3]:='0-кубики 1-конструктор 2-кукла 3-машинка 4-лего 5-пирамидка 6-велосипед 7-выход';
repeat
v:=StrToInt(Edit2.Text);
if v in [0..k-1] then m[j]:=m[j]+[igr(v)];//заполняем множества
until v=7;
end;
memo1.Lines[4]:='Полный список игрушек:';
for i:=kb to vl do
memo1.Lines[5]:=sp[ord(i)]+' ';
memo1.Lines[6]:='Список игрушек в детсадах:';
for j:=1 to n do
begin
memo1.Lines[j+6]:=IntToStr(j)+' - ';
for i:=kb to vl do
if i in m[j] then memo1.Lines[j+6]:=memo1.Lines[j+6]+sp[ord(i)]+' ';
end;
memo1.Lines[n+7]:='Игрушки, которых нет ни в одном детсаду:';
m1:=[kb,kn,kk,ms,lg,pr,vl];//полное множество
for j:=1 to n do
m1:=m1-m[j];//вычитаем все по садам
if m1=[] then memo1.Lines[n+8]:='Таких игрушек нет'//если ничего не осталось
else
for i:=kb to vl do //если осталось
if i in m1 then memo1.Lines[n+8]:=sp[ord(i)];
memo1.Lines[n+9]:='Игрушки, которые есть в каждом детсаду:';
m1:=m[1]; //первый сад
for j:=1 to n do
m1:=m1*m[j];//пересекаем с остальными
if m1=[] then memo1.Lines[n+10]:='Таких игрушек нет'//если пересечение пустое
else
for i:=kb to vl do //если нет
if i in m1 then memo1.Lines[j+15]:=sp[ord(i)];
end;
end.
Только у меня не получилось реализовать заполнение множества в цикле
type igr=(kb,kn,kk,ms,lg,pr,vl); //перечислимый тип
mnz=set of igr;//тип множества
const k=7;//список игрушек
sp:array[0..k-1] of string=('кубики','конструктор','кукла','машинка',
'лего','пирамидка','велосипед');
var m:array[1..20] of mnz; //массив множеств
m1:mnz;
i:igr;
n,j,v:byte;
begin
repeat
write('Количество детсадов до 20 n=');
readln(n);
until n in [1..20];
writeln('Перечислите в каком из ',n,' детсадов какие игрушки)');
for j:=1 to n do
begin
writeln('Детсад ',j);
m[j]:=[];
writeln('Выберите игрушки');
writeln('0-кубики 1-конструктор 2-кукла 3-машинка 4-лего 5-пирамидка 6-велосипед 7-выход');
repeat
readln(v);
if v in [0..k-1] then m[j]:=m[j]+[igr(v)];//заполняем множества
until v=7;
end;
writeln('Полный список игрушек:');
for i:=kb to vl do
write(sp[ord(i)],' ');
writeln;
writeln;
writeln('Список игрушек в детсадах:');
for j:=1 to n do
begin
write(j:2,' - ');
for i:=kb to vl do
if i in m[j] then write(sp[ord(i)],' ');
writeln;
end;
writeln('Игрушки, которых нет ни в одном детсаду:');
m1:=[kb,kn,kk,ms,lg,pr,vl];//полное множество
for j:=1 to n do
m1:=m1-m[j];//вычитаем все по садам
if m1=[] then writeln('Таких игрушек нет')//если ничего не осталось
else
for i:=kb to vl do //если осталось
if i in m1 then writeln(sp[ord(i)]);
writeln;
writeln('Игрушки, которые есть в каждом детсаду:');
m1:=m[1]; //первый сад
for j:=1 to n do
m1:=m1*m[j];//пересекаем с остальными
if m1=[] then writeln('Таких игрушек нет')//если пересечение пустое
else
for i:=kb to vl do //если нет
if i in m1 then writeln(sp[ord(i)]);
readln
end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TMode=(add,dat,shw);
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Edit1: TEdit;
ListBox1: TListBox;
Memo1: TMemo;
Memo2: TMemo;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Edit1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure ListBox1Click(Sender: TObject);
private{ Private declarations }
public{ Public declarations }
end;
const
szAddList=7;
szFileList=2;
szShowList=3;
AddList:array[0..szAddList]of string=('','kubiky','konstructor','kukly','mashinky','lego','piramidy','velosiped');
FileList:array[0..szFileList]of string=('','save to file','load from file');
ShowList:array[0..szShowList]of string=('','Full toys list in all preschool','Present in all preschool','No present in any preschool');
var
Form1:TForm1;
isMode:TMode;
FileName:string;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Visible:=false;
ListBox1.Visible:=false;
Memo1.Visible:=false;
Memo2.Visible:=false;
Label1.Caption:='Select mode';
Button1.Caption:='Add';
Button2.Caption:='File';
Button3.Caption:='Show';
Edit1.Clear;
ListBox1.Clear;
Memo1.Clear;
memo2.Clear;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
isMode:=add;
Label1.Caption:='Enter preschool numbers';
Button1.Visible:=false;
Button2.Visible:=false;
Button3.Visible:=false;
Edit1.Clear;
Edit1.Visible:=true;
Memo1.Lines.Add('');
ListBox1.Items.Clear;
for i:=0 to szAddList do
ListBox1.Items.Add(AddList[i]);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i:integer;
begin
isMode:=dat;
Label1.Caption:='Enter file name';
Button1.Visible:=false;
Button2.Visible:=false;
Button3.Visible:=false;
Edit1.Clear;
Edit1.Visible:=true;
ListBox1.Items.Clear;
for i:=0 to szFileList do
ListBox1.Items.Add(FileList[i]);
Memo1.Visible:=false;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
i:integer;
begin
isMode:=shw;
Label1.Caption:='Select function';
Button1.Visible:=false;
Button2.Visible:=false;
Button3.Visible:=false;
ListBox1.Items.Clear;
for i:=0 to szShowList do
ListBox1.Items.Add(ShowList[i]);
ListBox1.Visible:=true;
Memo1.Visible:=false;
Memo2.Visible:=true;
end;
procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
a:string;
i:integer;
begin
if Key=13 then
case isMode of
add:begin
Label1.Caption:='Select toys';
i:=Memo1.Lines.Count;
a:=Edit1.Text;
while(pos(a,Memo1.Lines[i])=0)and(0<=i)do dec(i);
a:='Preschool-'+Edit1.Text+':';
if 0<=i then
begin
a:=Memo1.Lines[i];
Memo1.Lines.Delete(i);
end;
Memo1.Lines[Memo1.Lines.Count-1]:=a;{'Preschool-'+Edit1.Text+':';}
Edit1.Visible:=false;
ListBox1.Visible:=true;
Memo1.Visible:=true;
end;
dat:begin
FileName:=Edit1.Text;
Label1.Caption:='Select operation';
Edit1.Visible:=false;
ListBox1.Visible:=true;
end;
shw:{only for syntax}
end;
end;
procedure TForm1.ListBox1Click(Sender: TObject);
var
a:string;
i,j:integer;
begin
case isMode of
add:begin
if pos(ListBox1.Items[ListBox1.ItemIndex],Memo1.Lines[Memo1.Lines.Count-1])=0then
Memo1.Lines[Memo1.Lines.Count-1]:= Memo1.Lines[Memo1.Lines.Count-1]+' '+ListBox1.Items[ListBox1.ItemIndex];
end;
dat:begin
if ListBox1.ItemIndex=0
then MessageBox(Self.Handle,pchar('Select any operation'),pchar('Preschool'),mb_ok)
else
begin
case ListBox1.ItemIndex of
1:Memo1.Lines.SaveToFile(FileName);
2:Memo1.Lines.LoadFromFile(FileName);
end;
end;
end;
shw:begin
if ListBox1.ItemIndex>0 then
begin
Memo2.Lines.Add(ListBox1.Items[ListBox1.ItemIndex]+' ');
case ListBox1.ItemIndex of
1:begin
a:='';
for i:=0 to Memo1.Lines.Count-1 do
for j:=1 to szAddList do
if(pos(AddList[j],a)=0)and(pos(AddList[j],Memo1.Lines[i])>0)then
a:=a+' '+AddList[j];
end;
2:begin
a:='';
for i:=1 to szAddlist do a:=a+' '+AddList[i];
for i:=0 to Memo1.Lines.Count-1 do
for j:=1 to szAddList do
if(pos(AddList[j],a)>0)and(pos(AddList[j],Memo1.Lines[i])=0)then
delete(a,pos(AddList[j],a),length(AddList[j]));
end;
3:begin
a:='';
for i:=1 to szAddlist do a:=a+' '+AddList[i];
for i:=0 to Memo1.Lines.Count-1 do
for j:=1 to szAddList do
if(pos(AddList[j],a)>0)and(pos(AddList[j],Memo1.Lines[i])>0)then
delete(a,pos(AddList[j],a),length(AddList[j]));
end;
end;
while pos(' ',a)>0 do delete(a,pos(' ',a),1);
if length(a)<2 then a:='no any toys';
Memo2.Lines.Add(a+' ');
end;
end;
end;
if(ListBox1.ItemIndex=0)xor(isMode=dat) then
begin
ListBox1.Visible:=false;
Memo1.Visible:=false;
Memo2.Visible:=false;
Button1.Visible:=true;
Button2.Visible:=true;
Button3.Visible:=true;
end;
end;
end.
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались.
Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора -
для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение.
Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал,
который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом.
Заходите - у нас интересно!