Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Program Laba_3_2;
- Uses
- System.SysUtils;
- Const
- MIN_VALUE = 2;
- MAX_VALUE = 255;
- Type
- TSet = Set Of Byte;
- Procedure OutputTaskInfo();
- Begin
- Writeln('Данная программа находит все простые числа, не превосходящие данного натурального числа.');
- Writeln('Диапазон для ввода ограничивающего числа: ', MIN_VALUE, '...', MAX_VALUE);
- End;
- Function InputPathToFile(): String;
- Var
- Path: String;
- IsCorrect: Boolean;
- Begin
- Write('Укажите путь к файлу: ');
- Repeat
- IsCorrect := True;
- Readln(Path);
- If Not FileExists(Path) Then
- Begin
- Write('По указанному пути файл не найден! Укажите правильный путь: ');
- IsCorrect := False;
- End
- Else If ExtractFileExt(Path) <> '.txt' Then
- Begin
- Write('Ошибка, неправильный тип файла! Укажите правильный путь: ');
- IsCorrect := False;
- End;
- Until IsCorrect;
- InputPathToFile := Path;
- End;
- Function GetVerificationOfChoice(): Integer;
- Var
- Choice: Integer;
- IsCorrect: Boolean;
- Begin
- Repeat
- IsCorrect := True;
- Try
- Readln(Choice);
- Except
- Writeln('Проверьте корректность ввода данных!');
- IsCorrect := False;
- End;
- If IsCorrect And ((Choice <> 0) And (Choice <> 1)) Then
- Begin
- Writeln('Для выбора введите 0 или 1!');
- IsCorrect := False;
- End;
- Until IsCorrect;
- GetVerificationOfChoice := Choice;
- End;
- Function InputNumberFromConsole(): Integer;
- Var
- Number: Integer;
- IsCorrect: Boolean;
- Begin
- Write('Введите ограничивающее число: ');
- Repeat
- IsCorrect := True;
- Try
- Readln(Number);
- Except
- Writeln('Проверьте корректность ввода данных!');
- IsCorrect := False;
- End;
- If (IsCorrect And ((Number < MIN_VALUE) Or (Number > MAX_VALUE))) Then
- Begin
- Writeln('Введите значение от ', MIN_VALUE, ' до ', MAX_VALUE, '!');
- IsCorrect := False;
- End;
- Until IsCorrect;
- InputNumberFromConsole := Number;
- End;
- Function InputNumberFromFile(Const Path: String): Integer;
- Var
- Number: Integer;
- InputFile: TextFile;
- Begin
- Writeln('Происходит чтение ограничивающего числа...');
- AssignFile (InputFile, Path);
- Try
- Try
- Reset(InputFile);
- Readln(InputFile, Number);
- Finally
- CloseFile(InputFile);
- End;
- If (((Number < MIN_VALUE) Or (Number > MAX_VALUE))) Then
- Begin
- Writeln('В файле введено некорректное число! Введите число с консоли!');
- Number := InputNumberFromConsole();
- End;
- Except
- Writeln('Ошибка при чтении данных! Введите ограничивающее число с консоли!');
- Number := InputNumberFromConsole();
- End;
- InputNumberFromFile := Number;
- End;
- Procedure OutputNumber(Const Choice, Number: Integer; Path: String);
- Var
- OutputFile: TextFile;
- IsCorrect: Boolean;
- Begin
- If Choice = 0 Then
- Writeln('Число, ограничивающее диапазон поиска: ', Number);
- If Choice = 1 Then
- Begin
- Writeln('Вывод ограничивающего числа в файл...');
- Repeat
- IsCorrect := True;
- AssignFile(OutputFile, Path);
- Try
- Try
- Rewrite(OutputFile);
- Write(OutputFile, Number);
- Write(OutputFile, #13);
- Finally
- Close(OutputFile);
- End;
- Except
- Writeln('Ошибка! Измените параметры файла или укажите новую ссылку!');
- IsCorrect := False;
- Path := InputPathToFile();
- End;
- Until IsCorrect;
- Writeln('Данные успешно записаны в файл!');
- End;
- End;
- Function EratosthenesSieve(Const Number: Integer): TSet;
- Var
- AnsSet: TSet;
- I, J, FinalNumber: Integer;
- Begin
- AnsSet := [1..Number];
- FinalNumber := Number + 1;
- I := 2;
- While I * I < FinalNumber Do
- Begin
- J := I * I;
- While J < FinalNumber Do
- Begin
- Exclude(AnsSet, J);
- J := J + I;
- End;
- Inc(I);
- End;
- EratosthenesSieve := AnsSet;
- End;
- Procedure OutputAnsSet(Const Choice: Integer; Path: String; Const AnsSet: TSet; Const Number: Integer);
- Var
- IsCorrect: Boolean;
- OutputFile: TextFile;
- I, J: Integer;
- Begin
- If Choice = 0 Then
- Begin
- Writeln('Вывод множества простых чисел до ', Number, ': ');
- For I := 1 To Number Do
- If(I in AnsSet) Then
- Write(I, ' ');
- End;
- If Choice = 1 Then
- Begin
- Writeln('Вывод множества простых чисел до ', Number,' в файл...');
- Repeat
- IsCorrect := True;
- AssignFile(OutputFile, Path);
- Try
- Try
- Append(OutputFile);
- For I := 0 To Number Do
- If(I in AnsSet) Then
- Write(OutputFile, I, ' ');
- Finally
- Close(OutputFile);
- End;
- Except
- Writeln('Ошибка! Измените параметры файла или укажите новую ссылку!');
- IsCorrect := False;
- Path := InputPathToFile();
- End;
- Until IsCorrect;
- Writeln('Данные успешно записаны в файл!');
- End;
- End;
- Function ProcessUserInput(): Integer;
- Var
- PathToIn: String;
- ChoiceForInput, Number: Integer;
- Begin
- Writeln('Вы желаете вводить данные с консоли(0) или из файла(1)?');
- ChoiceForInput := GetVerificationOfChoice();
- If ChoiceForInput = 0 Then
- Begin
- Number := InputNumberFromConsole();
- End;
- If ChoiceForInput = 1 Then
- Begin
- PathToIn := InputPathToFile();
- Number := InputNumberFromFile(PathToIn);
- End;
- ProcessUserInput := Number;
- End;
- Procedure ProcessUserOutput(Const AnsSet: TSet; Const Number: Integer);
- Var
- PathToOut: String;
- ChoiceForOutput: Byte;
- Begin
- Writeln('Вы желаете получть данные в консоль(0) или в файл(1)?');
- ChoiceForOutput := GetVerificationOfChoice();
- If ChoiceForOutput = 1 Then
- PathToOut := InputPathToFile();
- OutputNumber(ChoiceForOutput, Number, PathToOut);
- OutputAnsSet(ChoiceForOutput, PathToOut, AnsSet, Number);
- End;
- Procedure Main();
- Var
- AnsSet: TSet;
- Number: Integer;
- Begin
- OutputTaskInfo();
- Number := ProcessUserInput;
- AnsSet := EratosthenesSieve(Number);
- ProcessUserOutput(AnsSet, Number);
- End;
- Begin
- Main();
- Readln;
- End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement