Программа


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.

Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию