Вывести самые распространенные мужское и женское имена среди студентов - Pascal

Узнай цену своей работы

Формулировка задачи:

Во входном файле записана следующая информация о каждом из 20 студентов некоторого вуза: <фамилия>, <имя>, <отчество>, <пол>, <возраст>, <курс> причем в фамилии, имени и отчестве -- не более 12 букв, пол указывается буквами "М" и "Ж", возраст -- целое от 16 до 35, курс -- целое от 1 до 5. Сведения о студентах отделены друг от друга точкой с запятой. Написать программу, которая вводит эту информацию и печатает следующие данные: самые распространенные мужское и женское имена;

Решение задачи: «Вывести самые распространенные мужское и женское имена среди студентов»

textual
Листинг программы
uses crt;
const n=20;{количество записей по условию}
type Tstud=record{тип запись}
           f,i,o:string[12];{фамилия, имя, отчество}
           p:string[1];{пол}
           v:16..35;{возраст}
           k:1..5;{курс}
           end;
procedure Convert(var a:string);{процедура для перевода русских символов из кодировки ANSI(в текстовом файле) в кодировку ASCII(в Паскаль). Если файл написан на латинице, нужно убрать}
var i:integer;
begin
for i:=1 to length(a) do
if ord(a[i]) in [192..239] then a[i]:=chr(ord(a[i])-64)
else if ord(a[i]) in [240..255] then a[i]:=chr(ord(a[i])-16)
else if ord(a[i])=168 then a[i]:=chr(ord(240))
else if ord(a[i])=184 then a[i]:=chr(ord(241));
end;
var sp,sp1,sp2:array[1..n] of Tstud;{массив записей и 2 массива-клоны исходного при поске частых возрастов и отчеств}
    f:text;{текстовый файл}
    bf:Tstud;{переменная типа записи-буфер при сортировке обменом}
    s,s1:string;{вспомогательные строки при преобразовании текста в запись}
    cho:string[12];{самое частое отчество}
    chv:byte;{самый частый возраст}
    i,j,k,l:byte;{счетчики циклов}
    max,imaxv,imaxo:byte;{максимальное значения и его номера при поиске самых частых возраста(imaxv) и отчества(imaxo)}
    n1,n2:byte;{размер массива при поиске}
    t,c:integer;{переменные для перевода строки в число, t-число, с- код ошибки}
begin
clrscr;
assign(f,'file1.txt');{связываем переменную с файлом}
reset(f);{открываем его для чтения}
writeln('Полный список студентов:':40);{создаем таблицу}
writeln('-------------------------------------------------------------');
writeln('|  Фамилия  |     Имя    |  Отчество  | Пол | Возраст | Курс|');
writeln('-------------------------------------------------------------');
for i:=1 to n do
   begin
    readln(f,s);{читаем строку}
    Convert(s);{конвертируем}
    sp[i].f:=copy(s,1,pos(';',s)-1);{первое слово до точкм с запятой-фамилия}
    gotoXY(1,whereY);write('| ',sp[i].f);{ставим курсор на текущей строке(whereY) в позицию 1, вводим фамилию}
    delete(s,1,pos(';',s));{удаляем это слово вмесе с точкой с запятой}
    sp[i].i:=copy(s,1,pos(';',s)-1);{второе слово-имя, тоже}
    gotoXY(13,whereY);write('| ',sp[i].i);
    delete(s,1,pos(';',s));
    sp[i].o:=copy(s,1,pos(';',s)-1);{3 слово-отчество}
    gotoXY(26,whereY);write('| ',sp[i].o);
    delete(s,1,pos(';',s));
    sp[i].p:=copy(s,1,pos(';',s)-1);{4 слово из 1 буквы-пол }
    gotoXY(39,whereY);write('|  ',sp[i].p);
    delete(s,1,pos(';',s));
    s1:=copy(s,1,pos(';',s)-1);{запоминаем 5 слово-возраст}
    val(s1,t,c);{преобразуем в число}
    sp[i].v:=t;{заносим в запись}
    gotoXY(45,whereY);write('|   ',sp[i].v);
    delete(s,1,pos(';',s));
    val(s,t,c);{последнее слово(точки с запятой нет) - курс, тоже как возраст}
    sp[i].k:=t;
    gotoXY(55,whereY);write('|  ',sp[i].k);
    gotoXY(61,whereY);write('|');{последняя вертикальная черта}
    writeln;
  end;
writeln('-------------------------------------------------------------');
readln;{читаем}
clrscr;{очищаем экран}
{ищем самый частый возраст}
n1:=n;sp1:=sp;{запоминаем размер массива и сам массив, т.к. при поиске они изменятся}
i:=1;max:=0;imaxv:=0;{первый элемент массива}
while i<=n1 do{пока не конец массива}
  begin
   k:=1;{встретили 1 раз}
   for j:=n1 downto i+1 do {смотрим до конца}
   if sp1[j].v=sp1[i].v then {если еще такой же}
     begin
       k:=k+1;{пртбавляем}
       if k>max then{если насчитали больше чем до этого}
         begin
           max:=k;{это макс}
           imaxv:=i;{запомним его номер}
         end;
      for l:=j to n1-1 do{от этого элемента до предпоследнего}
      sp1[l]:=sp1[l+1];{присваиваем значения следующего, сдвигаем массив влево, удаляем повторяющиеся элементы}
      n1:=n1-1;{уменьшаем длину массива}
     end;
    i:=i+1;{переходим к следующему элементу}
   end;
chv:=sp[imaxv].v;{запоминаем самый частый возраст}
{поиск самого частого отчества точно также}
n2:=n;sp2:=sp;
i:=1;max:=0;imaxo:=0;
while i<=n2 do
  begin
   k:=1;
   for j:=n2 downto i+1 do
   if sp2[j].o=sp2[i].o then
     begin
       k:=k+1;
       if k>max then
         begin
           max:=k;
           imaxo:=i;
         end;
      for l:=j to n2-1 do
      sp2[l]:=sp2[l+1];
      n2:=n2-1;
     end;
    i:=i+1;
   end;
cho:=sp[imaxo].o;{запоминаем самое частое отчество}
{сортируем массив по возрастанию фамилий, т.е. по алфавиту обменом, методом пузырька}
for i:=1 to n-1 do
for j:=i+1 to n do
if sp[i].f>sp[j].f then
   begin
    bf:=sp[i];
    sp[i]:=sp[j];
    sp[j]:=bf;
   end;
writeln('Список студенток с самым частым возрастом и отчеством:');
writeln;
writeln('-------------------------------------------------------------');
writeln('|  Фамилия  |     Имя    |  Отчество  | Пол | Возраст | Курс|');
writeln('-------------------------------------------------------------');
for i:=1 to n do
if (sp[i].p='Ж')and(sp[i].v=chv)and(sp[i].o=cho)then{если пол Ж и самые частые возраст и отчество, выводим в таблицу}
  begin
    gotoXY(1,whereY);write('| ',sp[i].f);
    gotoXY(13,whereY);write('| ',sp[i].i);
    gotoXY(26,whereY);write('| ',sp[i].o);
    gotoXY(39,whereY);write('|  ',sp[i].p);
    gotoXY(45,whereY);write('|   ',sp[i].v);
    gotoXY(55,whereY);write('|  ',sp[i].k);
    gotoXY(61,whereY);write('|');
    writeln;
  end;
readln
end.

Объяснение кода листинга программы

Этот код написан на языке Pascal и предназначен для вывода самых распространенных мужских и женских имен среди студентов. В коде используется структура Tstud, которая представляет собой запись с полями: фамилия, имя, отчество, пол, возраст и курс. Процедура Convert используется для перевода русских символов из кодировки ANSI в кодировку ASCII. Если файл написан на латинице, то в процедуре убираются символы-заменители. Затем следует цикл, в котором для каждого студента выводится его фамилия, имя, отчество, пол, возраст и курс. Если пол студента - Женский, и его возраст и отчество являются самыми частыми в массиве, то его данные выводятся в таблицу. Код также содержит сортировку массива по возрастанию фамилий методом пузырька.

Оцени полезность:

10   голосов , оценка 3.7 из 5
Похожие ответы