Вывести самые распространенные мужское и женское имена среди студентов - Pascal
Формулировка задачи:
Решение задачи: «Вывести самые распространенные мужское и женское имена среди студентов»
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. Если файл написан на латинице, то в процедуре убираются символы-заменители. Затем следует цикл, в котором для каждого студента выводится его фамилия, имя, отчество, пол, возраст и курс. Если пол студента - Женский, и его возраст и отчество являются самыми частыми в массиве, то его данные выводятся в таблицу. Код также содержит сортировку массива по возрастанию фамилий методом пузырька.