Программа
CONST N=30; { Количество песен }
NBest=5; { Количество любимых песен }
PROCEDURE Make(var F:text); { Процедура создания файла данных }
Var i,k,j:integer; { Счетчики }
{ Буферные переменные для подготовки записи файла: }
Sex:Char; { Пол }
Age:Char; { Возраст }
SongList:array [1..NBest] of 1..N; { Список любимых песен }
RenameFlag:boolean; { Флаг ошибочно выбранной песни }
Begin
Randomize; { Инициализация генератра случайных чисел }
Rewrite(F); { Открытие файла под запись }
for i:=1 to Random(100) do { Цикл создания файла данных }
begin
if Random(2)=0 then Sex:='M' else Sex:='W'; { "Ввод" пола }
if Random(2)=0 then Age:='L' else Age:='H'; { "Ввод" возраста }
for k:=1 to NBest do { Цикл заполнения списка предпочтений }
repeat
SongList[k]:=Random(N)+1; { "Ввод" песни }
if Random(2)=0 { Корректировка предпочтения по полу }
then if Sex='M'
then if Odd(SongList[k])
then { Половина мужчин предпочитает "нечетные" песни }
else Dec(SongList[k])
else if Odd(SongList[k])
then Inc(SongList[k])
else { Половина женщин предпочитает "четные" песни }
else;
if Random(2)=0 { Корректировка предпочтения по возрасту }
then if Age='L'
then if SongList[k]<=N div 2
then { Половина "до 20" предпочитает песни из первой половины списка }
else Dec(SongList[k],N div 2)
else if SongList[k]<=N div 2
then Inc(SongList[k],N div 2)
else { Половина "после 20" предпочитает песни из второй половины списка }
else;
RenameFlag:=Random(SongList[k]+1)=0; { Последние песни - "лучше" }
for j:=k-1 downto 1 do { Цикл проверки корректности выбора песни }
RenameFlag:=RenameFlag or (SongList[j]=SongList[k])
until not RenameFlag;
{ Запись в файл: }
Write(F,Sex,Age,' ');
for j:=1 to NBest do Write(F,SongList[j]:2,' '); { Цикл записи предпочтений }
WriteLn(F) { Закрытие записи }
end;
Close(F) { Закрытие файла }
End;
PROCEDURE ViewBest(var F:text; Sex:Char; Age:Char); { Процедура просмотра популярных песен }
Type PointType=record { Тип - рейтинг песни }
SongName:1..N; { песня }
Point:integer; { рейтинг }
end;
Var PointArray:array [1..N] of PointType; { Список популярных песен }
i,k:1..N; { Счетчики }
Ch_Sex,Ch_Age:char; { Символьные буферы }
MaxSong:1..N; { Номер песни с максимальным рейтингом }
Buf:PointType; { Буфер для сортировки записей }
FlagOK:boolean; { Флаг наличия выводимых записей }
Begin
for i:=1 to N do { Цикл начальной инициализации массива }
begin
PointArray[i].Point:=0;
PointArray[i].SongName:=i
end;
Reset(F); { Открытие файла }
while not EOF(F) do { Цикл набора рейтингов }
begin
Read(F,Ch_Sex,Ch_Age); { Чтение пола и возрастного критерия }
if (Ch_Sex=Sex)and(Ch_Age=Age) { Если выборка совпадает с заданным срезом, то: }
then for i:=1 to NBest do { Цикл чтения списка песен }
begin
Read(F,k); { Чтение песни }
Inc(PointArray[k].Point,i); { Набор рейтинга }
end;
ReadLn(F) { Пропуск конца строки файла }
end;
Close(F); { Закрытие файла }
for i:=1 to N-1 do { Цикл сортировки }
begin
MaxSong:=i; { Начальное определение номера лучшей песни в неотсортированной части массива }
for k:=i+1 to N do { Цикл просмотра неотсортированной цасти массива }
if PointArray[k].Point>PointArray[MaxSong].Point { Если популярность текущей песни превосходит популярнейшую }
then MaxSong:=k; { то - переопределение популярнейшей }
if MaxSong<>i then { Если популярнейшая песня находится не в начале неотсортированной части }
begin
{ То - перестановка элементов массива: }
Buf:=PointArray[MaxSong];
PointArray[MaxSong]:=PointArray[i];
PointArray[i]:=Buf
end
end;
Write('Популярность песен среди ');
if Sex='M' then Write('мужчин ') else Write('женщин ');
if Age='L' then WriteLn('до 20 лет:') else WriteLn('после 20 лет:');
FlagOK:=FALSE; { Сброс флага }
for k:=1 to N do { Цикл вывода массива }
if PointArray[k].Point<>0 { Блокирование выввода нулевых элементов }
then begin
Write(PointArray[k].SongName:2,')',PointArray[k].Point:4,' ');
{ Вывод номера песни и рейтинга }
FlagOK:=TRUE { Подъем флага }
end;
if not FlagOk { Проверка факта вывода записей }
then WriteLn('Записи не найдены')
else WriteLn; { Пропуск строки }
WriteLn; { Пропуск строки }
End;
PROCEDURE ViewBad(var F:text); { Просмотр списка песен, неупомянутых при опросе }
Var Song:array[1..N] of boolean; { Список неупомянутых песен }
i:integer; { Счетчик }
Ch:char; { Символьный буфер }
Num:integer; { Числовой буфер }
FlagOK:boolean; { Флаг наличия выводимых записей }
Begin
for i:=1 to N do Song[i]:=FALSE; { Начальная инициализация массива }
Reset(F); { Открытие файла }
while not EOF(F) do { Цикл просмотра файла }
begin
Read(F,Ch,Ch); { Сброс начала записи }
while not SeekEOLn(F) do { Цикл чтения строки }
begin
Read(F,Num); { Чтение номера песни }
Song[Num]:=TRUE { Регистрация песни }
end;
ReadLn(F) { Пропуск конца строки }
end;
Close(F); { Закрытие файла }
FlagOK:=FALSE; { Сброс флага }
WriteLn('Список неупомянутых песен:');
for i:=1 to N do { Цикл вывода неупомянутых песен }
if not Song[i]
then begin
Write(i:4); { Вывод номера песни }
FlagOK:=TRUE { Подъем флага }
end;
if not FlagOk { Проверка факта вывода записей }
then WriteLn('Записи не найдены')
else WriteLn; { Пропуск строки }
WriteLn; { Пропуск строки }
End;
PROCEDURE Stop; { Процедура остановки программы }
Begin
WriteLn('Нажмите <Enter>'); { Вывод приглашения нажать <Enter> }
ReadLn; { Остановка программы до нажатия <Enter> }
WriteLn; { Пропуск строки }
End;
VAR F:text; { Файловая переменная }
BEGIN
WriteLn; { Пропуск строки }
WriteLn; { Пропуск строки }
Assign(F,'SONG.DAT'); { Связывание файла с файловой переменной }
Make(F); { Создание файла данных }
ViewBest(F,'M','L'); { Набор и вывод статистики по группе }
ViewBest(F,'M','H'); { Набор и вывод статистики по группе }
Stop; { Остановка программы }
ViewBest(F,'W','L'); { Набор и вывод статистики по группе }
ViewBest(F,'W','H'); { Набор и вывод статистики по группе }
Stop; { Остановка программы }
ViewBad(F); { Набор и вывод неупомянутых }
Stop; { Остановка программы }
END.
Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию