1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
| 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. |