Họ cho rằng để tránh các ý kiến dị nghị không hay về sau, nên - chọn ngẫu nhiên các bạn gái được tặng hoa và khi đã chọn được bạn gái rồi thì - chọn ngẫu nhiên 2 bạn trai lên tặng hoa ch[r]
Trang 1BÀI TOÁN TẶNG HOA
Bài toán
Một lớp học có sonu = 16 học sinh nữ và sonam = 28 học sinh nam Nhân ngày 8 tháng 3, các bạn nam muốn tặng hoa cho các bạn nữ nhưng còn e ngại vì không biết bạn nam nào sẽ tặng hoa cho bạn nữ nào Một nhóm học sinh trong lớp đưa ra ý kiến “Chọn ngẫu nhiên” Họ cho rằng để tránh các ý kiến dị nghị không hay về sau, nên
- chọn ngẫu nhiên các bạn gái được tặng hoa và khi đã chọn được bạn gái rồi thì
- chọn ngẫu nhiên 2 bạn trai lên tặng hoa cho bạn gái đó
Giải pháp có vẻ hợp lý và công minh vì không ai có thể nói ra, nói vào dựa vào cách tặng hoa này
Tuy nhiên, để một bạn gái được 2 bạn nam tặng hoa thì số bạn nam không đủ Sẽ cần một số bạn nam tặng hoa cho 2 bạn gái Chọn ai bây giờ? Lại “Chọn ngẫu nhiên” là giải phát tốt nhất
Yêu cầu: Lập trình thực hiện cách tặng hoa như trên.
Dữ liệu: Gán thẳng trong chương trình nhờ thủ tục DuLieu.
Kết quả: Đưa ra màn hình và ghi ra tệp TANGHOA.OUT, mỗi lần tặng hoa ghi trên 1 dòng, trên dòng đó
ghi tên 2 bạn trai, tiếp đó là tên bạn gái được 2 bạn trai đó tặng hoa
MÃ NGUỒN (Tệp TANGHOA2.PAS)
{truong hop sonam < 2*sonu}
uses crt;
const
tentep = 'TANGHOA2'; {Ten tep}
sonu = 16;
sonu2 = 2*sonu;
sonam = 28;
type
TENHS = string[10];
var
dsnu: array[1 sonu] of TENHS; {Dau vao}
dsnam: array[1 sonu2] of TENHS; {Dau vao}
tang: array[1 sonu,1 3] of TENHS; {Dau ra}
dcnu: array[1 sonu] of 0 1; {bien phu}
dcnam: array[1 sonu2] of 0 1; {bien phu}
thutu: byte; {bienphu}
f:text; {Bien tep}
{tao du lieu de xu ly}
procedure DuLieu;
BEGIN
{danh sach cac ban nu}
dsnu[1] := 'nu01'; dsnu[2] := 'nu02'; dsnu[3] := 'nu03'; dsnu[4] := 'nu04';
dsnu[5] := 'nu05'; dsnu[6] := 'nu06'; dsnu[7] := 'nu07'; dsnu[8] := 'nu08';
dsnu[9] := 'nu09'; dsnu[10] := 'nu10'; dsnu[11] := 'nu11'; dsnu[12] := 'nu12';
dsnu[13] := 'nu13'; dsnu[14] := 'nu14'; dsnu[15] := 'nu15'; dsnu[16] := 'nu16';
{danh sach cac ban nam}
Trang 2dsnam[1] := 'nam01'; dsnam[2] := 'nam02'; dsnam[3] := 'nam03'; dsnam[4] := 'nam04'; dsnam[5] := 'nam05'; dsnam[6] := 'nam06'; dsnam[7] := 'nam07'; dsnam[8] := 'nam08'; dsnam[9] := 'nam09'; dsnam[10] := 'nam10'; dsnam[11] := 'nam11'; dsnam[12] := 'nam12'; dsnam[13] := 'nam13'; dsnam[14] := 'nam14'; dsnam[15] := 'nam15'; dsnam[16] := 'nam16'; dsnam[17] := 'nam17'; dsnam[18] := 'nam18'; dsnam[19] := 'nam19'; dsnam[20] := 'nam20'; dsnam[21] := 'nam21'; dsnam[22] := 'nam22'; dsnam[23] := 'nam23'; dsnam[24] := 'nam24'; dsnam[25] := 'nam25'; dsnam[26] := 'nam26'; dsnam[27] := 'nam27'; dsnam[28] := 'nam28'; END;
{xacs dinh cac ban nam tang hoa 2 lan}
procedure ThemNam;
var canthem, i, cs: byte;
BEGIN
fillchar(dcnam, sizeof(dcnam),0);
canthem := sonu2 - sonam;
for i := 1 to canthem do
begin
repeat
cs := 1 + random(sonam);
until (dcnam[cs] = 0);
dsnam[sonam + i] := dsnam[cs];
dcnam[cs] := 1;
end;
fillchar(dcnam, sizeof(dcnam),0);
END;
{chon ban nu duoc tang hoa}
procedure ChonNu;
var cs: byte; {chi so}
BEGIN
repeat
cs := 1+random(sonu);
until (dcnu[cs] = 0);
dcnu[cs] := 1;
tang[thutu][1] := dsnu[cs];
END;
{chon 2 ban nam}
procedure Chon2Nam;
var cs: byte; {chi so}
BEGIN
repeat {chon nam 1}
cs := 1+random(sonu2);
until (dcnam[cs] = 0);;
dcnam[cs] := 1;
tang[thutu][2] := dsnam[cs];
repeat {chon nam 2}
cs := 1+random(sonu2);
until (dcnam[cs] = 0);
dcnam[cs] := 1;
tang[thutu][3] := dsnam[cs];
END;
Trang 3{Chuong trinh chinh}
BEGIN
clrscr;
assign(f,tentep+'.OUT');
DuLieu;
ThemNam;
fillchar(dcnu, sizeof(dcnu),0);
randomize;
thutu := 0;
repeat
clrscr;
inc(thutu);
if thutu = 1 then rewrite(f) else append(f);
ChonNu;
Chon2Nam;
writeln('Lan thu ',thutu,': 2 ban nam ',tang[thutu][2],' va ',tang[thutu][3],' tang hoa ban nu ',tang[thutu][1]); writeln(f,tang[thutu][2],' + ',tang[thutu][3],' tang ',tang[thutu][1]);
close(f);
writeln;
if thutu<sonu then
begin
write('Nhan ENTER de chon tiep.');
readln;
end;
until (thutu>=sonu);
writeln;
write('Da xong Nhan ENTER de thoat.');
readln;
END