Программа, считающая кол-во одинаковых профессий в файле и выводящая результаты в другой файл - Free Pascal
Формулировка задачи:
Дан входной текстовый файл Input.txt со списком ФАМИЛИЯ ДОЛЖНОСТЬ (данные в строке отделены пробелами). Написать программу, считающую кол-во одинаковых профессий в файле и выводящая результаты в файл Output.txt. В выходной файл выводится вся информация из Input.txt и полученный результат. Задание выполнить с рекурсией, массивами RECORD, процедурами, текстовыми и типизированными файлами. Типизированный файл формируется в этой же программе из текстового, затем из него происходит чтение.
Где-то ошибка (скорее всего именно в рекурсивной процедуре), т.к. в Output.txt выводится только одна профессия (самая первая) и четыре раза повторяется.
А должна в Result of Algoritm перечислить все профессии и указать кол-во сотрудников с такой профессией. HELP!
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 |
Решение задачи: «Программа, считающая кол-во одинаковых профессий в файле и выводящая результаты в другой файл»
textual
Листинг программы
GetUniq(Workers,Uniq); OutPutToFile(input,output,Uniq); end;
Объяснение кода листинга программы
GetUniq
- функция предназначенная для подсчета уникальных значений в массивеWorkers
.Uniq
- это результат работы функцииGetUniq
, который содержит количество уникальных значений в массивеWorkers
.OutPutToFile
- функция предназначенная для записи данных в файлoutput
.input
- это файл, который содержит данные для анализа.output
- это файл, в который будут записаны результаты анализа.Workers
- это массив, в котором содержатся данные о работниках и их профессиях.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д