Определить число встречающихся имен - Pascal
Формулировка задачи:
Дан список группы в 10 человек в виде
ФАМИЛИЯ ИМЯ ОТЧЕСТВО
20 символов 10 симв. 15 симв.
Данные в одной строке отделяются друг от друга пробелами.
Определить число встречающихся имен и напечатать в виде:
Сергей - 2
Петр - 1 и т.д.
выполнить с использованием:
1.Двумерных символьных массивов, текстовых файлов и без процедур;
2.С массивами STRING, процедурами и текстовыми файлами;
3.С массивами RECORD, процедурами, текстовыми и типизированными файлами и процедурами. Типизированный файл формируется в этой же программе из текстового , а затем из него происходит чтение .
4.С модулями (варианты 2или 3 переделываются на модульный);
5.С однонаправленными линейными списками (каждая строка исходного текстового файла рассматривается как элемент списка), процедурами и текстовыми файлами;
6.С рекурсией (любой из вариантов 2-4 переделывается на рекурсивный, поскольку везде в них есть циклы , которые можно всегда выполнить как рекурсивные процедуры).
Прошу помочь хотя бы с каким-нибудь из вариантов задания
dan.inp.txt
Решение задачи: «Определить число встречающихся имен»
textual
Листинг программы
const n=10;
type dan=record
surname:string[20];
name:string[10];
midle_name:string[15];
end;
tfile=file of dan;
imena=record
name:string[10];
kol:byte;
end;
mas=array[1..n] of imena;
procedure readfile(var f:text;var g:tfile);
var d:dan;
s:string;
begin
assign(f,'dan.inp.txt');//файл в папке с программой
reset(f);
assign(g,'dan.out');
rewrite(g);
while not eof(f) do
begin
readln(f,s);
d.surname:=copy(s,1,pos(' ',s)-1);
delete(s,1,21);
d.name:=copy(s,1,pos(' ',s)-1);
delete(s,1,11);
d.midle_name:=s;
writeln(d.surname,' ',d.name,' ',d.midle_name);
write(g,d);
end;
close(f);
close(g);
end;
procedure kol_name(var g:tfile;var a:mas;var m:byte);
var i,j,k:byte;
d:dan;
begin
reset(g);
m:=0;
for i:=0 to filesize(g)-1 do
begin
read(g,d);
if i=0 then
begin
m:=1;
a[m].name:=d.name;
a[m].kol:=1;
end
else
begin
k:=0;
j:=1;
while(j<=m)and(k=0) do
if a[j].name=d.name then k:=1
else inc(j);
if k=0 then
begin
inc(m);
a[m].name:=d.name;
a[m].kol:=1;
end
else inc(a[j].kol);
end;
end;
close(g);
writeln('Встречаемость имен');
for i:=1 to m do
writeln(a[i].name,' - ',a[i].kol);
end;
var f:text;
g:tfile;
a:mas;
m:byte;
begin
readfile(f,g);
kol_name(g,a,m);
end.
Объяснение кода листинга программы
- const n=10; - объявляется константа n со значением 10.
- type dan=record ... end; - создается тип запись (record) с полями: surname (фамилия), name (имя), midle_name (отчество).
- tfile=file of dan; - создается тип файлу (file) с записями типа dan.
- imena=record ... end; - создается тип запись imena с полями: name (имя), kol (количество).
- mas=array[1..n] of imena; - создается массив mas, содержащий n элементов типа imena.
- procedure readfile(var f:text; var g:tfile); - объявляется процедура readfile, которая открывает файл для чтения dan.inp.txt, считывает данные и записывает их в файл dan.out.
- procedure kol_name(var g:tfile; var a:mas; var m:byte); - объявляется процедура kol_name, которая считает количество упоминаний каждого имени в файле.
- var f:text; g:tfile; a:mas; m:byte; - объявляются переменные f (текстовый файл), g (файл dan.out), a (массив для хранения упоминаний имен), m (количество уникальных имен).
- begin readfile(f,g); kol_name(g,a,m); end. - вызывается процедура readfile для чтения файла и процедура kol_name для подсчета упоминаний имен.