Программа, считающая кол-во одинаковых профессий в файле и выводящая результаты в другой файл - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Дан входной текстовый файл Input.txt со списком ФАМИЛИЯ ДОЛЖНОСТЬ (данные в строке отделены пробелами). Написать программу, считающую кол-во одинаковых профессий в файле и выводящая результаты в файл Output.txt. В выходной файл выводится вся информация из Input.txt и полученный результат. Задание выполнить с рекурсией, массивами RECORD, процедурами, текстовыми и типизированными файлами. Типизированный файл формируется в этой же программе из текстового, затем из него происходит чтение. Где-то ошибка (скорее всего именно в рекурсивной процедуре), т.к. в Output.txt выводится только одна профессия (самая первая) и четыре раза повторяется.
program I16; 
{строковые константы}
const ENTER = #13;
const NextLine = #10;
const EndOfFile=#26;
 
type Profession = record 
        data: string;   
        count: integer;  
end;
 
type Worker= record      
        family: string;   
        job: string;      
        checked: boolean; 
end;
 
type data = file of Worker; {типизированный файл рабочих}
 
function ApplicationPath:string;
var i: Byte;
    s: string;
begin
s:=Paramstr(0);
for i:=Length(s) downto 1 do
        if s[i]='\' then break;
ApplicationPath:=Copy(s,1,i);
end;
 
{Функция преобразует строку в рабочего}
function GetWorker(str: string): Worker; 
var res: Worker;  
begin
res.family:=copy(str,1,pos(' ',str)-1); 
res.job:=copy(str,pos(' ',str)+1,Length(str));
res.checked:=false; 
getWorker:=res;     
end;
 
{функция возвращает число строк в файле}
{и проводит запись данных в типизированный файл}
function StringInFile(var Spec: data; var f: text): integer;
var res:integer;
str: string;
begin
res:=0; 
reset(f);
rewrite(Spec);
while not eof(f) do  
begin
     readln(f,str);   
     write(Spec,GetWorker(str)); 
     inc(res);
end;
close(f);  
close(Spec);
StringInFile:=res; 
end;

{процедура считывающая типизированный файл}
{и записывающая всё в массив рабочих}
procedure GetWorkes(var f: data; var Workers: array of Worker);
var i: integer;
begin
reset(f); 
i:=0;
while not eof(f) do 
begin
        read(f,Workers[i]); 
        inc(i);             
end;
close(f); 
end;

{Функция принимает массив рабочих возвращает число уникальных профессий}
function NumberOfUnic(
        Workes: array of Worker): integer;
var n, unicN, i,j: integer;
begin
unicN:=0; 
n:=Length(Workes);
for i:=0 to n-1 do   
begin
        if(not Workes[i].checked) then 
        begin
                inc(unicN);  
                Workes[i].checked:=true; 
                for j:=i+1 to n-1 do 
                begin
                if (Workes[j].job=Workes[i].job) then
                        Workes[j].checked:=true;  
                end;
        end;
end;
NumberOfUnic:=unicN;  
end;
 
{РЕКУРСИВНАЯ Процедура принимает позицию обработки массива рабочих, сам массив рабочих, возвращает
                массив уникальных профессий}
procedure GetUnic(
                i: integer;
                var Workers: array of worker;
                var Unic: array of Profession);
var
       j,k,n,unicN: integer;
begin
n:=Length(Workers);    
unicN:=Length(Unic);
if i<>UnicN then       
begin
    j:=0;
    Unic[i].data:=Workers[j].job;
    Unic[i].count:=0; 
    for k:=0 to n-1 do 
        if (Unic[i].data=Workers[k].job) then
        begin
                Workers[k].checked:=true; 
                inc(Unic[i].count); 
        end;
    j:=0;
    while (j<n) do 
    begin
        if Workers[j].checked then
                inc(j)
        else
                break;  
    end;  
    GetUnic(i+1,Workers,Unic); 
end
else
        exit;       
end;

{Процедура принимает ссылки на исходный файл и файл вывода, массив уникальных профессий
и производит непосредственную запись в файл вывода}
procedure OutPutToFile(var from: text; var into: text;
                        Unic: array of Profession);
var i: integer;
str: string;
begin
rewrite(into);
reset(from);
while not eof(from) do  
begin
     readln(from,str);   
     writeln(into,str);  
end;
close(from);  
{Пишем в Output.txt}
write(into,Enter,NextLine,'Result of Algoritm', Enter, NextLine);
for i:=0 to Length(Unic)-1 do
    writeln(into,Unic[i].data,' ',Unic[i].count);
close(into);  
end;

procedure BigProcedure;  
var input, output: text; 
SpecFile: file of Worker; 
Workers: array of Worker; 
Unic: array of Profession; 
n, unicN: integer;
Path: string;
begin
Path:=ApplicationPath;
assign(input,Path+'Input.txt');
assign(SpecFile, Path+'SpecFile.dat');
assign(output,Path+'Output.txt');
 
n:=StringInFile(SpecFile,input);
 
setLength(Workers,n);
 
GetWorkes(SpecFile, Workers);
 
unicN:=NumberOfUnic(Workers);
 
setLength(Unic,unicN);
 
GetUnic(0,Workers,Unic);
 
OutPutToFile(input,output,Unic);

end;
 
{----Тело основной программы-----}
begin
BigProcedure;  
END.
Т.е. в файл Output.txt программа выводит следующую информацию:
Иванов техник
Петров инженер
Сидоров ст.инженер
Леонтьев инженер
Климов инженер
Соколов техник
Никифоров инженер
Боков ст.инженер
Ульянов вед.инженер
Баранян ст.инженер
Миллер инженер
Халецкий инженер
Демидов инженер
Хинчао инженер
Колмогоров вед.инженер
Result of Algoritm
техник 2
техник 2
техник 2
техник 2
А должна в Result of Algoritm перечислить все профессии и указать кол-во сотрудников с такой профессией. HELP!

Решение задачи: «Программа, считающая кол-во одинаковых профессий в файле и выводящая результаты в другой файл»

textual
Листинг программы
  GetUniq(Workers,Uniq);
  OutPutToFile(input,output,Uniq);
end;

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

  1. GetUniq - функция предназначенная для подсчета уникальных значений в массиве Workers.
  2. Uniq - это результат работы функции GetUniq, который содержит количество уникальных значений в массиве Workers.
  3. OutPutToFile - функция предназначенная для записи данных в файл output.
  4. input - это файл, который содержит данные для анализа.
  5. output - это файл, в который будут записаны результаты анализа.
  6. Workers - это массив, в котором содержатся данные о работниках и их профессиях.

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


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

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

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