Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Program b3_3;
- Uses
- System.SysUtils, Classes;
- type
- InputType = (FromConsole, FromFile);
- ListD = record
- Name:AnsiString;
- Score:Integer;
- end;
- AoL = Array of ListD;
- Var
- Path: String;
- Size: Integer;
- List: AoL;
- function GetInputType(): InputType;
- var
- Ret: InputType;
- Input: String;
- IsCorrect: Boolean;
- begin
- IsCorrect := False;
- repeat
- Writeln('Выберите способ ввода предложения файл/консоль (ф/к)');
- Readln(Input);
- if (Input = 'ф') or (Input = 'Ф') or (Input = 'Файл')
- or (Input = 'файл')
- then
- begin
- Ret := InputType.FromFile;
- IsCorrect := True;
- end
- else if (Input = 'к') or (Input = 'К') or (Input =
- 'Консоль') or (Input = 'консоль') then
- begin
- Ret := InputType.FromConsole;
- IsCorrect := True;
- end;
- until IsCorrect;
- Result := Ret;
- end;
- function IntSize(Size: Integer): Integer;
- var
- IsCorrect: Boolean;
- Begin
- Writeln('Введите количество участников: ');
- repeat
- IsCorrect := True;
- try
- Readln(Size);
- except
- Writeln('Введите целое число!');
- IsCorrect := False;
- end;
- if Size <= 0 then
- begin
- Writeln('Введите положительное число!');
- IsCorrect := False
- end;
- until (IsCorrect);
- IntSize := Size;
- End;
- Function GetListFromConsole(List: AoL; Size: Integer): AoL;
- var
- I, J, Ind, K, B, bif: Integer;
- IsCorrect: Boolean;
- Buf: AnsiString;
- bfs: String;
- begin
- SetLength(List, Size);
- for I := 0 to Size-1 do
- begin
- repeat
- IsCorrect := True;
- Writeln('Введите фамилию участника');
- Readln(List[I].Name);
- List[I].Name := Trim(List[I].Name);
- Buf := List[I].Name;
- for J := 1 to Length(Buf) do
- begin
- if (NOT(Buf[J] in ['А'..'Я' , 'а'..'я'])) then
- begin
- IsCorrect := False;
- end;
- end;
- if IsCorrect = false then
- begin
- Writeln('Фамилия должна состоять из русских букв')
- end;
- until (IsCorrect);
- repeat
- Writeln('Введите счёт игрока');
- IsCorrect := True;
- try
- Readln(List[I].Score);
- except
- Writeln('Введите целое число!');
- IsCorrect := False;
- end;
- if List[I].Score < 0 then
- begin
- Writeln('Введите неотрицательное число!');
- IsCorrect := False
- end;
- until (IsCorrect)
- end;
- GetListFromConsole := List;
- End;
- Procedure Sorting (var List: AoL);
- Var
- J, I, BufI :Integer;
- BufS: String;
- Begin
- for J := I + 1 to Size do
- Begin
- If List[I].Score < List[J].Score then
- Begin
- BufI := List[J].Score;
- List[J].Score := List[I].Score;
- List[I].Score := BufI;
- BufS := List[I].Name;
- List[I].Name := List[J].Name;
- List[J].Name := BufS;
- End;
- End;
- End;
- Procedure Top3Output (var List: AoL; Size: Integer);
- Var
- Ind, I, J, BufOne, BufTwo: Integer;
- HelpArray: AoL;
- Begin
- //SetLength(HelpArray,
- Ind := 0;
- Writeln(List[0].Name, ' ', List[0].Score);
- For I := 0 to Size-1 do
- Begin
- if ((List[I].Score = List[0].Score) and (List[I].Name <> List[0].Name)) then
- begin
- Writeln(List[I].Name, ' ', List[I].Score);
- Ind := I;
- End;
- End;
- BufOne := Ind;
- Writeln(List[Ind+1].Name, ' ', List[Ind+1].Score);
- For I := Ind+1 to Size-1 do
- begin
- If ((List[I].Score = List[Ind+1].Score) and (List[I].Name <> List[Ind+1].Name)) then
- Begin
- Writeln(List[I].Name, ' ', List[I].Score);
- Ind := I;
- End;
- End;
- BufTwo := Ind;
- If BufOne <> BufTwo then
- Begin
- Writeln(List[Ind+1].Name, ' ', List[Ind+1].Score);
- for I := Ind+1 to Size-1 do
- If ((List[I].Score = List[Ind+1].Score) and (List[I].Name <> List[Ind+1].Name)) then
- Writeln(List[I].Name, ' ', List[I].Score)
- End
- Else
- Begin
- Writeln(List[Ind+2].Name, ' ', List[Ind+2].Score);
- For I := Ind+2 to Size-1 do
- Begin
- If ((List[I].Score = List[Ind+2].Score) and (List[I].Name <> List[Ind+2].Name)) then
- Begin
- Writeln(List[I].Name, ' ', List[I].Score)
- End;
- End
- End;
- End;
- Function IsFileCorrect(Path: String; Size:Integer): Boolean;
- Var
- ListFile: TextFile;
- I, J: Integer;
- IsCorrect: Boolean;
- Buf: String;
- Begin
- AssignFile(ListFile, Path);
- Reset(ListFile);
- IsCorrect := True;
- I := 0;
- while not(SeekEof(ListFile)) and IsCorrect do
- begin
- if I mod 2 = 1 then
- begin
- while not(SeekEoln(ListFile)) and IsCorrect do
- begin
- try
- Read(ListFile, List[I].Score);
- except
- IsCorrect := false;
- end;
- end;
- Readln(ListFile);
- end
- else
- begin
- while not(SeekEoln(ListFile)) and IsCorrect do
- begin
- Read(ListFile, List[I].Name);
- Buf := List[I].Name;
- for J := 1 to Length(Buf) do
- begin
- if (NOT(Buf[J] in ['А'..'Я' , 'а'..'я'])) then
- begin
- IsCorrect := False;
- end;
- end;
- Readln(ListFile);
- end;
- end;
- Inc(I);
- End;
- if I <> Size then
- Begin
- IsCorrect := False
- End;
- CloseFile(ListFile);
- IsFileCorrect := IsCorrect;
- End;
- Function GetFilePath(): String;
- Var
- Path: String;
- IsCorrect: Boolean;
- Begin
- Repeat
- Writeln('Введите абсолютный путь к файлу ');
- Readln(Path);
- IsCorrect := False;
- if FileExists(Path) then
- begin
- if IsFileCorrect(Path, Size) then
- IsCorrect := true
- else
- Writeln('Данные в файле некорректны');
- end
- else
- Writeln('Файл не найден');
- Until IsCorrect;
- GetFilePath := Path;
- End;
- Function GetListFromFile(List:AoL): AoL;
- Var
- SenFile: TextFile;
- I: Integer;
- Begin
- Path := GetFilePath();
- AssignFile(SenFile, Path);
- Reset(SenFile);
- for I := 0 to Size-1 do
- Begin
- If I mod 2 = 1 then
- begin
- Read(SenFile, List[I].Score)
- end
- Else
- begin
- Read(SenFile, List[I].Name)
- end;
- End;
- CloseFile(SenFile);
- GetListFromFile := List;
- End;
- function GetList():AoL;
- var
- SelectedInputType: InputType;
- begin
- SelectedInputType := GetInputType();
- if (SelectedInputType = InputType.FromConsole) then
- begin
- List := GetListFromConsole(List, Size)
- end
- else if (SelectedInputType = InputType.FromFile) then
- begin
- List := GetListFromFile(List);
- end;
- GetList := List;
- end;
- Function Output(): String;
- Var
- Patho: String;
- IsCorrect: Boolean;
- Begin
- IsCorrect := False;
- Repeat
- Writeln('Введите директорию, в которую хотите сохранить результат');
- Readln(Patho);
- If DirectoryExists(Patho) then
- IsCorrect := True
- Else
- Writeln('Такой директории не существует. Попробуйте ещё раз');
- Until IsCorrect;
- Output := Patho;
- End;
- Procedure SaveListToFile(List: AoL);
- Var
- I, J: Integer;
- OutputFile: TextFile;
- Directory: String;
- Begin
- Directory := Output();
- AssignFile(OutputFile, Directory + '\output.txt');
- Rewrite(OutputFile);
- Writeln('Результат сохранён по указанному пути');
- CloseFile(OutputFile);
- Write;
- End;
- Begin
- Size := IntSize(Size);
- List := GetList();
- Sorting(List);
- Top3Output(List, Size);
- SaveListToFile(List);
- Readln;
- End.
Advertisement
Add Comment
Please, Sign In to add comment