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