Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Program Find_Of_NoD;
- uses
- System.SysUtils;
- Type
- TArray = Array Of Integer;
- Procedure OutputTask();
- Begin
- Writeln('Данная программа находит НОД для заданных чисел.');
- End;
- Function ChooseInput() : Boolean;
- Var
- Num : Integer;
- IsCorrect : Boolean;
- Begin
- Repeat
- IsCorrect := True;
- Writeln('Выберите, откуда вводить данные: 0, если с консоли; 1, если с файла.');
- Try
- Readln(Num);
- Except
- IsCorrect := False;
- End;
- If ((Not IsCorrect) Or ((Num <> 0) And (Num <> 1))) Then
- Begin
- IsCorrect := False;
- Writeln('Ошибка ввода! Повторите попытку.');
- End;
- Until IsCorrect;
- ChooseInput := (Num = 1);
- End;
- Function ChoosePath() : String;
- Var
- Path : String;
- IsCorrect : Boolean;
- InputFile : TextFile;
- Begin
- Begin
- Repeat
- Writeln('Введите путь к файлу для ввода информации: ');
- IsCorrect := True;
- Readln(Path);
- Try
- AssignFile(InputFile, Path);
- Reset(InputFile);
- Except
- IsCorrect := False;
- End;
- If (Not IsCorrect) Or (Length(Path) < 5) Then
- Begin
- IsCorrect := False;
- Writeln('Ошибка ввода! Повторите попытку.');
- End
- Else
- Begin
- If ((Path[High(Path)] <> 't') And (Path[High(Path) - 1] <> 'x') And (Path[High(Path) - 2] <> 't') And (Path[High(Path) - 3] <> '.')) Then
- Begin
- IsCorrect := False;
- Writeln('Ошибка ввода! Повторите попытку.');
- End;
- End;
- Until IsCorrect;
- End;
- CloseFile(InputFile);
- ChoosePath := Path;
- End;
- Function InputSizeFromConsole() : Integer;
- Var
- Num : Integer;
- IsCorrect : Boolean;
- Begin
- Repeat
- Writeln('Введите количество чисел: ');
- IsCorrect := True;
- Try
- Readln(Num);
- Except
- IsCorrect := False;
- End;
- If (Not IsCorrect) Or (Num < 2) Then
- Begin
- IsCorrect := False;
- Writeln('Ошибка ввода! Повторите попытку.');
- End;
- Until IsCorrect;
- InputSizeFromConsole := Num;
- End;
- Function InputSizeFromFile(Path : String) : Integer;
- Var
- InputFile : TextFile;
- Size : Integer;
- IsCorrect : Boolean;
- Begin
- Writeln('Запись размера...');
- AssignFile(InputFile, Path);
- Reset(InputFile);
- Try
- Readln(InputFile, Size);
- Except
- IsCorrect := False;
- End;
- If (Not IsCorrect) Or (Size < 2) Then
- Begin
- Writeln('Ошибка ввода! Введите корректное значение с клавиатуры.');
- Size := InputSizeFromConsole();
- End;
- CloseFile(InputFile);
- InputSizeFromFile := Size;
- End;
- Function ExceptionRead(I : Integer) : Integer;
- Var
- Num : Integer;
- IsCorrect : Boolean;
- Begin
- Repeat
- Writeln('Введите ', (I+1), ' элемент с клавиатуры: ');
- IsCorrect := True;
- Try
- Readln(Num);
- Except
- IsCorrect := False;
- End;
- If (Not IsCorrect) Or (Num < 1) Then
- Begin
- IsCorrect := False;
- Writeln('Ошибка ввода! Повторите попытку.');
- End;
- Until IsCorrect;
- ExceptionRead := Num;
- End;
- Procedure FillNumbersFromFile(var Numbers : TArray; Path : String);
- Var
- I : Integer;
- IsCorrect : Boolean;
- InputFile : TextFile;
- Begin
- Writeln('Запись чисел...');
- AssignFile(InputFile, Path);
- Reset(InputFile);
- Readln(InputFile);
- For I := 0 To High(Numbers) Do
- Begin
- Try
- Read(InputFile, Numbers[I]);
- Except
- IsCorrect := False;
- End;
- If (Not IsCorrect) Or (Numbers[I] < 1) Then
- Begin
- Writeln('Ошибка ввода! Введите ', (I+1), ' элемент с клавиатуры!');
- Numbers[I] := ExceptionRead(I);
- End;
- End;
- CloseFile(InputFile);
- End;
- Procedure FillNumbersFromConsole(var Numbers : TArray);
- Var
- I : Integer;
- IsCorrect : Boolean;
- Begin
- For I := 0 To High(Numbers) Do
- Begin
- Repeat
- Writeln('Введите ', (I+1), ' элемент: ');
- IsCorrect := True;
- Try
- Readln(Numbers[I]);
- Except
- IsCorrect := False;
- End;
- If (Not IsCorrect) Or (Numbers[I] < 1) Then
- Begin
- IsCorrect := False;
- Writeln('Ошибка ввода! Повторите попытку.');
- End;
- Until IsCorrect;
- End;
- End;
- Procedure InputFromConsole(var Numbers : TArray);
- Var
- Size : Integer;
- Begin
- Size := InputSizeFromConsole();
- SetLength(Numbers, Size);
- FillNumbersFromConsole(Numbers);
- End;
- Procedure InputFromFile(var Numbers : TArray);
- Var
- Size : Integer;
- Path : String;
- Begin
- Writeln('При вводе из файла учтите, что в текстовом файле на 1 строке должно быть записано количество чисел, а на второй - сами числа через пробел.');
- Path := ChoosePath();
- Size := InputSizeFromFile(Path);
- SetLength(Numbers, Size);
- FillNumbersFromFile(Numbers, Path);
- End;
- Function InputNumbers(IsFromFile : Boolean) : TArray;
- Var
- Numbers : TArray;
- Begin
- If IsFromFile Then
- InputFromFile(Numbers)
- Else
- InputFromConsole(Numbers);
- InputNumbers := Numbers;
- End;
- Function FindNoD(Numbers : TArray) : Integer;
- Var
- Min : Integer;
- I, J : Integer;
- Divider : Integer;
- IsCorrect : Boolean;
- Begin
- Min := Numbers[0];
- For I := 0 To High(Numbers) Do
- Begin
- If Numbers[I] < Min Then
- Min := Numbers[I];
- End;
- For I := 1 To Min Do
- Begin
- IsCorrect := True;
- For J := 0 To High(Numbers) Do
- Begin
- If Not(Numbers[J] mod I = 0) then
- IsCorrect := False;
- End;
- If IsCorrect Then
- Divider := I;
- End;
- FindNoD := Divider;
- End;
- Function ChoosePathForOutput() : String;
- Var
- Path : String;
- IsCorrect : Boolean;
- OutputFile : TextFile;
- Begin
- Begin
- Repeat
- Writeln('Введите путь к файлу для вывода информации: ');
- IsCorrect := True;
- Readln(Path);
- Try
- AssignFile(OutputFile, Path);
- Reset(OutputFile);
- Except
- IsCorrect := False;
- End;
- If (Not IsCorrect) Or (Length(Path) < 5) Then
- Begin
- IsCorrect := False;
- Writeln('Ошибка ввода! Повторите попытку.');
- End
- Else
- Begin
- If ((Path[High(Path)] <> 't') And (Path[High(Path) - 1] <> 'x') And (Path[High(Path) - 2] <> 't') And (Path[High(Path) - 3] <> '.')) Then
- Begin
- IsCorrect := False;
- Writeln('Ошибка ввода! Повторите попытку.');
- End;
- End;
- Until IsCorrect;
- End;
- CloseFile(OutputFile);
- ChoosePathForOutput := Path;
- End;
- Procedure OutputAnswerInFile(NoD : Integer);
- Var
- Path : String;
- OutputFile : TextFile;
- Begin
- Path := ChoosePathForOutput();
- AssignFile(OutputFile, Path);
- Rewrite(OutputFile);
- Writeln(OutputFile, 'Максимальный общий делитель среди заданных чисел: ', NoD);
- Writeln('Ответ успешно записан!');
- CloseFIle(OutputFile);
- End;
- Procedure OutputAnswer(NoD : Integer);
- Begin
- Writeln('Максимальный общий делитель среди заданных чисел: ', NoD);
- OutputAnswerInFile(NoD);
- End;
- Var
- IsFromFile : Boolean;
- Numbers : TArray;
- NoD : Integer;
- Begin
- OutputTask();
- IsFromFile := ChooseInput();
- Numbers := InputNumbers(IsFromFile);
- NoD := FindNoD(Numbers);
- OutputAnswer(NoD);
- Readln;
- End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement