Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program laba_3_2_del;
- uses
- System.SysUtils,
- System.RegularExpressions;
- type
- TSet = Set of Byte;
- const
- MES_TASK = 'Дана непустая последовательность символов, требуется построить и напечатать ' +
- 'множество, элементами которого являются встречающиеся в последовательности знаки арифметических операций и нечётные цифры.';
- ERROR_FILE_NOT_FOUND = 'Файл не найден.';
- MES_INPUT_OF_PATH = 'Пожалуйста, введите путь к файлу';
- MES_ASK_INPUT_METHOD = 'Откуда брать данные?' + #10#13 + '1 - из файла' + #10#13 + '2 - ввести вручную';
- MES_ASK_AGAIN_INPUT_METHOD = '"1" - повторить попытку.' + #10#13 + '"2" - ввести данные из консоли.';
- ERROR_FILE_CANNOT_BE_READ_OR_IS_EMPTY = 'Файл не может быть прочитан или пуст.';
- MES_ASK_OUTPUT_TO_FILE = 'Хотите вывести ответ в файл?' + #10#13 + '1 - да' + #10#13 + '2 - нет';
- ERROR_FILE_CANNOT_BE_CREATED_OT_OPENED = 'Файл не может быть создан или открыт. Повторите попытку:';
- ERROR_CHOICE_IS_INCORRECT = 'Надо ввести "1" или "2".' + #10#13 + 'Повторите попытку: ';
- ERROR_EMPTY_STRING = 'Обнаружена пустая строка. ';
- MES_NO_APPROPRIATE_CHARS_FOUND = 'Нет ни одного подходящего под описание символа';
- SPACE = ' ';
- END_OF_ROW = #10;
- NEW_ROW = #13;
- function Choose(SChoice1: String; SChoice2: String; SQuestion: String) : String;
- var
- NChoice: ShortInt;
- BIsCorrect: Boolean;
- SAnswer: String;
- begin
- NChoice := 2;
- writeln(sQuestion, END_OF_ROW + NEW_ROW + 'Ваш выбор: ');
- repeat
- BIsCorrect := true;
- try
- readln(NChoice);
- except
- BIsCorrect := false;
- end;
- if (BIsCorrect and (nChoice <> 1) and (nChoice <> 2)) then
- BIsCorrect := false;
- if (not BIsCorrect) then
- writeln(ERROR_CHOICE_IS_INCORRECT);
- until (BIsCorrect);
- if (NChoice = 1) then
- SAnswer := sChoice1
- else
- SAnswer := sChoice2;
- Choose := SAnswer;
- end;
- function InputPathToFile(IsInput: Boolean) : String;
- var
- SPartOfText, SPath: String;
- begin
- if (IsInput) then
- SPartOfText := 'ввода'
- else
- SPartOfText := 'вывода';
- writeln('Пожалуйста, введите путь к файлу ', SPartOfText, ': ');
- readln(SPath);
- InputPathToFile := SPath;
- end;
- function ReadStringFromFile(SPathToFile: String; var MyError: ShortInt) : String;
- var
- FInput: TextFile;
- SInput: String;
- begin
- SInput := '';
- if (FileExists(SPathToFile)) then
- try
- AssignFile(FInput, SPathToFile);
- Reset(FInput);
- except
- MyError := 1;
- end
- else
- MyError := 1;
- if (MyError = 0) then
- begin
- if (Eof(FInput)) then
- MyError := 2
- else
- begin
- readln(FInput, SInput);
- end;
- CloseFile(FInput);
- end;
- ReadStringFromFile := SInput;
- end;
- function ReadStringFromConsole() : String;
- var
- SInput: String;
- begin
- writeln('Введите строку:');
- readln(SInput);
- readStringFromConsole := SInput;
- end;
- function GetInput() : String;
- var
- SInput, SInputMethod, SPathToFile: String;
- BInputIsDone: Boolean;
- MyError: ShortInt;
- begin
- SInput := '';
- BInputIsDone := false;
- SInputMethod := Choose('FromFile', 'FromConsole', MES_ASK_INPUT_METHOD);
- repeat
- if (SInputMethod = 'FromFile') then
- begin
- MyError := 0;
- SPathToFile := InputPathToFile(true);
- SInput := ReadStringFromFile(SPathToFile, MyError);
- if (MyError > 0) then
- begin
- case MyError of
- 1: writeln(ERROR_FILE_NOT_FOUND);
- 2: writeln(ERROR_FILE_CANNOT_BE_READ_OR_IS_EMPTY);
- end;
- SInputMethod := choose('FromFile', 'FromConsole', MES_ASK_AGAIN_INPUT_METHOD);
- end
- else
- BInputIsDone := true;
- end
- else
- begin
- SInput := ReadStringFromConsole();
- BInputIsDone := true;
- end
- until (BInputIsDone);
- GetInput := SInput;
- end;
- function ComputeAns(SInput: String) : TSet;
- var
- SetSet: TSet;
- RegEx: TRegEx;
- MatchCollection: TMatchCollection;
- i: Integer;
- SOneChar: String;
- ChChar: Char;
- begin
- SetSet := [];
- RegEx := TRegEx.Create('[13579+*/-]');
- MatchCollection := RegEx.Matches(SInput);
- for i := 0 to MatchCollection.Count - 1 do
- begin
- SOneChar := MatchCollection.Item[i].Value;
- ChChar := SOneChar[1];
- Include(SetSet, Ord(ChChar));
- end;
- ComputeAns := SetSet;
- end;
- procedure OutputToFile(SetSet: TSet; SPathToFIle: String);
- var
- BOutputNotReady: Boolean;
- FOutput: TextFile;
- i: Integer;
- begin
- BOutputNotReady := true;
- repeat
- try
- AssignFile(FOutput, SPathToFIle);
- Rewrite(FOutput);
- for i := 0 to 255 do
- if (i in SetSet) then
- write(FOutput, Chr(i), SPACE);
- CloseFile(FOutput);
- BOutputNotReady := false;
- except
- writeln(ERROR_FILE_CANNOT_BE_CREATED_OT_OPENED);
- end;
- until (bOutputNotReady);
- end;
- procedure OutputAnswer(SetSet: TSet);
- var
- SShouldOutputInfoToFile, SPathToFile: String;
- BOutputIsReady: Boolean;
- i: Integer;
- begin
- writeln('Ответ:');
- for i := 0 to 255 do
- if (i in SetSet) then
- write(Chr(i) + SPACE);
- writeln;
- repeat
- BOutputIsReady := true;
- SShouldOutputInfoToFile := Choose('Output to file', 'Don''t output to file', MES_ASK_OUTPUT_TO_FILE);
- if (SShouldOutputInfoToFile = 'Output to file') then
- begin
- SPathToFile := InputPathToFile(false);
- if (FileExists(SPathToFile)) then
- OutputToFile(SetSet, SPathToFile)
- else
- begin
- BOutputIsReady := false;
- writeln(ERROR_FILE_NOT_FOUND);
- end;
- end;
- until (BOutputIsReady);
- end;
- var
- SInput: String;
- SetSet: TSet;
- begin
- writeln(MES_TASK);
- // Путь к моему файлу ввода: C:\Users\Aleksandr\Desktop\input.txt
- // Путь к моему файлу вывода: C:\Users\Aleksandr\Desktop\output.txt
- SInput := GetInput();
- SetSet := ComputeAns(SInput);
- OutputAnswer(SetSet);
- readln;
- end.
Advertisement
Add Comment
Please, Sign In to add comment