Вывод множества из файла на экран - Pascal ABC
Формулировка задачи:
В студенческой группе 30 человек. 15 из них знают английский, 10 знают немецкий, 7 знают французский. 30 фамилий записаны в текстовом файле. Программа должна сама выбрать 15 фамилий владеющих английским, 10 немецким, 7 французским и вывести фамилии на экран. Выбор происходит рандомом.
Проблема: Не понимаю как сделать так, чтобы прога сама выбирала 15, 10 и 7 фамилий соответственно.
Помогите, второй день мучаюсь, стыдно даже как то!
Решение задачи: «Вывод множества из файла на экран»
textual
Листинг программы
var a:array[1..30] of byte;
f:text;
b,n1,n2,n3,i:byte;
s1,s2,s3:array[1..15] of string;
st:string;
m,m1,m2,m3:set of byte;
begin
randomize;
m:=[]; //пустое общее множество
m1:=[]; //пустое множество номеров англичан
for i:=1 to 15 do //генерируем 15 номеров
begin
repeat
b:=1+random(30); //от 1 до 30
until not(b in m);//пока не выпдет такое которого пока нет в множестве
m:=m+[b]; //добавим его в обшее
m1:=m1+[b];//и в первое
end;
m2:=[]; //точно так же с несмцами
for i:=1 to 10 do
begin
repeat
b:=1+random(30);
until not(b in m);
m:=m+[b];
m2:=m2+[b];
end;
m3:=[]; //французы
for i:=1 to 5 do //выбираем 5 оставщихся номеров, сейчас осенило что можно было просто
begin //m3:=[1..30]-m1-m2; хочешь переделай, а я спать
repeat
b:=1+random(30);
until not(b in m);
m:=m+[b];
m3:=m3+[b];
end;
for i:=1 to 2 do //еще 2 таких которых нет в множестве 3
begin
repeat
b:=1+random(30);
until not(b in m3);
m3:=m3+[b];
end;
{writeln('Множество 3 '); //Это убери, я для проверки делал
for i:=1 to 30 do
if i in m3 then write(i,' ');
writeln; }
assign(f,'fam.txt'); //начинаем работ с файлом
reset(f);
n1:=0; //мощности масивов-множеств
n2:=0;
n3:=0;
i:=0; //номера
while not eof(f) do
begin
readln(f,st); //читаем фамилию
i:=i+1; //определяем номер
if i in m1 then //если он в иножестве
begin
n1:=n1+1; //к англичанам
s1[n1]:=st;
end
else if i in m2 then //если во 2
begin
n2:=n2+1;
s2[n2]:=st; //к немцам
end;
//если в 3 или в 3 и 1 или в 3 и 2
if (i in m3)or((i in m3)and(i in m1))or((i in m3)and(i in m2)) then
begin
n3:=n3+1;
s3[n3]:=st;//к французам
end;
end;
close(f);
writeln('Знают английский');
for i:=1 to n1 do
write(s1[i],' ');
writeln;
writeln('Знают немецкий');
for i:=1 to n2 do
write(s2[i],' ');
writeln;
writeln('Знают французский');
for i:=1 to n3 do
write(s3[i],' ');
end.