Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Program Lab4;
- Uses
- System.SysUtils;
- Type
- TArr = Array Of Integer;
- Const
- INPUT = 1;
- OUTPUT = 2;
- Function InputFromFile(Var InputFile: TextFile; Var Subsequence: TArr): Boolean;
- Var
- IsCorrect: Boolean;
- N, I, K: Integer;
- Begin
- IsCorrect := True;
- Try
- Read(InputFile, N);
- Except
- Writeln('В файле содержатся неверные данные! Измените содержание файла и повторите ввод его имени.');
- IsCorrect := False;
- End;
- If IsCorrect And ((N < 1) Or (N > 20000)) Then
- Begin
- Writeln('В файле содержатся неверные данные! Измените содержание файла и повторите ввод его имени.');
- IsCorrect := False;
- End
- Else
- Begin
- SetLength(Subsequence, N);
- I := 0;
- While IsCorrect And (I <= High(Subsequence)) Do
- Begin
- Try
- Read(InputFile, Subsequence[I]);
- Except
- Writeln('В файле содержатся неверные данные! Измените содержание файла и повторите ввод его имени.');
- IsCorrect := False;
- End;
- K := 0;
- While IsCorrect And (K < I) Do
- Begin
- If Subsequence[K] = Subsequence[I] Then
- Begin
- Writeln('В файле содержатся повторяющиеся элементы последовательности! Измените содержание файла и повторите ввод его имени.');
- IsCorrect := False;
- End;
- Inc(K);
- End;
- Inc(I);
- End;
- End;
- InputFromFile := IsCorrect;
- End;
- Function InputFileName(Var CheckFile: TextFile; Const InOrOut: Integer): String;
- Var
- FileName: String;
- IsCorrect: Boolean;
- Begin
- Case (InOrOut) Of
- INPUT:
- Begin
- Writeln('Введите имя файла, из которого будут вводиться данные (все входные величины в файле должны быть разделены пробелами, сначала идет число членов последовательности, затем ее члены):');
- Repeat
- IsCorrect := True;
- Readln(FileName);
- If Not FileExists(FileName) Then
- Begin
- Writeln('Файла с таким именем не существует.');
- IsCorrect := False;
- End
- Else
- Try
- Assign(CheckFile, FileName);
- Reset(CheckFile);
- Except
- Writeln('Невозможно открыть файл с таким именем! Повторите ввод имени файла:');
- IsCorrect := False;
- End;
- Until IsCorrect;
- InputFileName := FileName;
- End;
- OUTPUT:
- Begin
- Writeln('Введите имя файла, в который будут выводиться данные:');
- Repeat
- IsCorrect := True;
- Readln(FileName);
- Try
- Assign(CheckFile, FileName);
- ReWrite(CheckFile);
- Except
- Writeln('Невозможно открыть файл с таким именем! Повторите ввод имени файла:');
- IsCorrect := False;
- End;
- Until IsCorrect;
- InputFileName := FileName;
- End;
- End;
- End;
- Function ChooseWay(Const IorOput: Integer): Integer;
- Var
- Choice: Integer;
- IsCorrect: Boolean;
- Begin
- Case IorOput Of
- INPUT:
- Begin
- Writeln('Выберите вариант ввода:');
- Writeln('1.Данные вводятся из текстового файла.');
- Writeln('2.Данные вводятся через консоль.');
- End;
- OUTPUT:
- Begin
- Writeln('Выберите вариант вывода:');
- Writeln('1.Данные выводятся в текстовый файл.');
- Writeln('2.Данные выводятся в консоль.');
- End;
- End;
- Repeat
- IsCorrect := True;
- Try
- Readln(Choice);
- Except
- Writeln('Ошибка ввода. Выберите вариант 1 или 2.');
- IsCorrect := False;
- End;
- If IsCorrect And ((Choice < 1) Or (Choice > 2)) Then
- Begin
- Writeln('Ошибка ввода. Выберите вариант 1 или 2.');
- IsCorrect := False;
- End;
- Until IsCorrect;
- ChooseWay := Choice;
- End;
- Function InputFromConsole(): TArr;
- Var
- Subsequence: TArr;
- IsCorrect: Boolean;
- N, I, K: Integer;
- Begin
- Writeln('Введите количество членов последовательности:');
- Repeat
- IsCorrect := True;
- Try
- Readln(N);
- Except
- Writeln('Ошибка ввода. Введите натуральное число в диапазоне [1; 20 000]');
- IsCorrect := False;
- End;
- If IsCorrect And ((N < 1) Or (N > 20000)) Then
- Begin
- Writeln('Ошибка ввода. Введите натуральное число в диапазоне [1; 20 000]');
- IsCorrect := False;
- End;
- Until IsCorrect;
- SetLength(Subsequence, N);
- Writeln('Введите члены последовательности:');
- For I := 0 To High(Subsequence) Do
- Repeat
- IsCorrect := True;
- Try
- Readln(Subsequence[I]);
- Except
- IsCorrect := False;
- Writeln('Ошибка ввода. Введите целое число.');
- End;
- If IsCorrect Then
- For K := 0 To I - 1 Do
- If Subsequence[K] = Subsequence[I] Then
- Begin
- IsCorrect := False;
- Writeln('Ошибка ввода. Вы ввели повторяющийся элемент. Повторите ввод элемента.');
- End;
- Until IsCorrect;
- InputFromConsole := Subsequence;
- End;
- Procedure InputSubsequences(Var Subsequence1: TArr; Var Subsequence2: TArr; Var Choice: Integer);
- Var
- FileName: String;
- InputFile: Text;
- IsCorrect: Boolean;
- Begin
- Case Choice Of
- 1:
- Begin
- Repeat
- FileName := InputFileName(InputFile, INPUT);
- IsCorrect := InputFromfile(InputFile, Subsequence1);
- If IsCorrect Then
- Begin
- IsCorrect := InputFromFile(InputFile, Subsequence2);
- If IsCorrect And Not EoF(InputFile) Then
- Begin
- IsCorrect := False;
- Writeln('В файле присутствуют лишние данные! Повторите ввод имени файла:');
- End;
- End;
- Close(InputFile);
- Until IsCorrect;
- End;
- 2:
- Begin
- Subsequence1 := InputFromConsole();
- Subsequence2 := InputFromConsole();
- End;
- End;
- End;
- Function MakeCombination(Var Subsequence1: Tarr; Var Subsequence2: TArr; Var Counter: Integer): TArr;
- Var
- Combination: TArr;
- K, I, CombinationSize: Integer;
- IsInclusion: Boolean;
- Begin
- Counter := Length(Subsequence1);
- CombinationSize := Length(Subsequence1) + Length(Subsequence2);
- SetLength(Combination, CombinationSize);
- For I := 0 To High(Subsequence1) Do
- Combination[I] := Subsequence1[I];
- For I := 0 To High(Subsequence2) Do
- Begin
- IsInclusion := False;
- K := 0;
- While (Not IsInclusion And (K <= High(Subsequence1))) Do
- Begin
- If Subsequence1[K] = Subsequence2[I] Then
- IsInclusion := True;
- Inc(K);
- End;
- If Not IsInclusion Then
- Begin
- Combination[Counter] := Subsequence2[I];
- Inc(Counter);
- End;
- End;
- MakeCombination := Combination;
- End;
- Procedure OutputInFile(Var OutputFile: TextFile; Var Combination: TArr; Var CombinationSize: Integer);
- Var I: Integer;
- Begin
- For I := 0 To CombinationSize - 1 Do
- Write(OutputFile, Combination[I], ' ');
- End;
- Procedure ShowSubsequence(Var Subsequence: TArr; Var CombinationSize: Integer);
- Var
- I: Integer;
- Begin
- For I := 0 To CombinationSize - 1 Do
- Write(Subsequence[I], ' ');
- End;
- Procedure OutputSubsequences(Var Combination: TArr; Var Choice: Integer; Var CombinationSize: Integer);
- Var
- FileName: String;
- OutputFile: TextFile;
- Begin
- Case Choice Of
- 1:
- Begin
- FileName := InputFileName(OutputFile, OUTPUT);
- OutputInFile(OutputFile, Combination, CombinationSize);
- Close(OutputFile);
- Write('Искомые данные выведены в файл ');
- Writeln(FileName);
- End;
- 2:
- Begin
- Writeln('Искомая последовательность:');
- ShowSubsequence(Combination, CombinationSize);
- End;
- End;
- End;
- Var
- Choice, CombinationSize: Integer;
- Subsequence1, Subsequence2, Combination: TArr;
- Begin
- Writeln('Программа строит объединение двух последовательностей целых чисел, в которых нет повторяющихся элементов.');
- Choice := ChooseWay(INPUT);
- InputSubsequences(Subsequence1, Subsequence2, Choice);
- Combination := MakeCombination(Subsequence1, Subsequence2, CombinationSize);
- Choice := ChooseWay(OUTPUT);
- OutputSubsequences(Combination, Choice, CombinationSize);
- Readln;
- End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement