Определить число встречающихся имен - 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.

Объяснение кода листинга программы

  1. const n=10; - объявляется константа n со значением 10.
  2. type dan=record ... end; - создается тип запись (record) с полями: surname (фамилия), name (имя), midle_name (отчество).
  3. tfile=file of dan; - создается тип файлу (file) с записями типа dan.
  4. imena=record ... end; - создается тип запись imena с полями: name (имя), kol (количество).
  5. mas=array[1..n] of imena; - создается массив mas, содержащий n элементов типа imena.
  6. procedure readfile(var f:text; var g:tfile); - объявляется процедура readfile, которая открывает файл для чтения dan.inp.txt, считывает данные и записывает их в файл dan.out.
  7. procedure kol_name(var g:tfile; var a:mas; var m:byte); - объявляется процедура kol_name, которая считает количество упоминаний каждого имени в файле.
  8. var f:text; g:tfile; a:mas; m:byte; - объявляются переменные f (текстовый файл), g (файл dan.out), a (массив для хранения упоминаний имен), m (количество уникальных имен).
  9. begin readfile(f,g); kol_name(g,a,m); end. - вызывается процедура readfile для чтения файла и процедура kol_name для подсчета упоминаний имен.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5
Похожие ответы