Определить число встречающихся имен - 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 для подсчета упоминаний имен.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д