Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program laba3_2;
- Uses
- System.SysUtils;
- Type
- TByteSet = set of Byte;
- procedure PrintTask; forward;
- function GetInputValue(Min, Max: Byte): Byte; forward;
- function GetUserInputFromConsole(): Byte; forward;
- function GetUserInputFromFile(Path: String): Byte; forward;
- function CheckPath(Path: String): Boolean; forward;
- function GetUserOutputPath(): String; forward;
- procedure PrintInConsole(MySet: TByteSet; Num: Byte); forward;
- procedure PrintInFile(Path: String; MySet: TByteSet; Num: Byte); forward;
- function CheckFile(Path: String): Boolean; forward;
- function GetUserInputPath(): String; forward;
- function GetInputMethod: Word; forward;
- function GetOutputMethod(): Word; forward;
- function FillSet(Num: Byte): TByteSet; forward;
- function Eratosfen(MySet: TByteSet; Num: Byte): TByteSet; forward;
- function GetUserInput(): Byte; forward;
- procedure PrintResult(MySet: TByteSet; Num: Byte); forward;
- const
- USE_CONSOLE = 1;
- USE_FILE = 2;
- function GetInputValue(Min, Max: Byte): Byte;
- var
- CurrentValue: Integer;
- IsValid: Boolean;
- begin
- repeat
- IsValid := True;
- try
- Read(CurrentValue);
- except
- begin
- IsValid := False;
- Writeln('Введено нецелое число');
- end;
- end;
- if IsValid then
- if (CurrentValue < Min) or (CurrentValue > Max) then
- begin
- IsValid := False;
- Writeln('Введите число в заданном диапазоне');
- end;
- until IsValid;
- GetInputValue := CurrentValue;
- end;
- function GetUserInputFromConsole(): Byte;
- var
- Num: Byte;
- const MIN_SIZE = 2;
- const MAX_SIZE = 255;
- begin
- Write('Введите число, до которого нужно найти все простые числа в диапазоне ', MIN_SIZE, '..', MAX_SIZE, ': ');
- Num := GetInputValue(MIN_SIZE, MAX_SIZE);
- Readln;
- GetUserInputFromConsole := Num;
- end;
- function GetUserInputFromFile(Path: String): Byte;
- var
- Num: Byte;
- MyFile: TextFile;
- begin
- AssignFile(MyFile, Path);
- Reset(MyFile);
- Readln(MyFile, Num);
- Closefile(MyFile);
- GetUserInputFromFile := Num;
- end;
- function CheckPath(Path: String): Boolean;
- begin
- if FileExists(Path) then
- begin
- Writeln(Path, ' существует');
- CheckPath := True;
- end
- else
- begin
- Writeln(Path, ' не существует');
- Writeln('Введите корректный путь к файлу');
- end;
- end;
- function GetUserOutputPath(): String;
- var
- Path: String;
- begin
- Writeln('Введите абсолютный путь к файлу для вывода результата');
- Readln(Path);
- GetUserOutputPath := Path;
- end;
- procedure PrintInConsole(MySet: TByteSet; Num: Byte);
- var
- i: Integer;
- begin
- for i := 2 to Num do
- if i in MySet then
- Write(i, ' ');
- Writeln;
- end;
- procedure PrintInFile(Path: String; MySet: TByteSet; Num: Byte);
- var
- i: Integer;
- MyFile: TextFile;
- begin
- AssignFile(MyFile, Path);
- Rewrite(MyFile);
- for i := 2 to Num do
- if i in MySet then
- Write(MyFile, i, ' ');
- Close(MyFile);
- Writeln('Результат работы помещён в файл');
- end;
- function CheckFile(Path: String): Boolean;
- var
- IsValid: Boolean;
- n: Integer;
- MyFile: TextFile;
- const MIN_SIZE = 2;
- const MAX_SIZE = 256;
- begin
- AssignFile(MyFile, Path);
- Reset(MyFile);
- IsValid := True;
- try
- Read(MyFile, n);
- except
- IsValid := False;
- end;
- if IsValid then
- if (n < MIN_SIZE) or (n > MAX_SIZE) then
- IsValid := False;
- Close(MyFile);
- CheckFile := IsValid;
- end;
- function GetUserInputPath(): String;
- var
- Path: String;
- begin
- repeat
- repeat
- Writeln('Введите абсолютный путь к файлу с входными данными');
- Readln(Path);
- until CheckPath(Path);
- if not(CheckFile(Path)) then
- Writeln('Неккоректные данные в файле, исправьте файл');
- until (CheckFile(Path));
- GetUserInputPath := Path;
- end;
- function GetInputMethod: Word;
- var
- Method: Word;
- IsValid: Boolean;
- begin
- Writeln('Каким способом хотите ввести данные?');
- Writeln('1 - с помощью консоли');
- Writeln('2 - с помощью файла');
- repeat
- IsValid := True;
- try
- Readln(Method);
- except
- begin
- IsValid := False;
- Writeln('Введено нецелое число');
- end;
- end;
- if IsValid then
- if (Method <> USE_CONSOLE) and (Method <> USE_FILE) then
- begin
- IsValid := False;
- Writeln('Введите 1 или 2');
- end;
- until IsValid;
- GetInputMethod := Method;
- end;
- function GetOutputMethod(): Word;
- var
- Method: Word;
- IsValid: Boolean;
- begin
- Writeln('Куда хотите вывести результат?');
- Writeln('1 - в консоль');
- Writeln('2 - в файл');
- repeat
- IsValid := True;
- try
- Readln(Method);
- except
- begin
- IsValid := False;
- Writeln('Введено нецелое число');
- end;
- end;
- if IsValid then
- if (Method <> USE_CONSOLE) and (Method <> USE_FILE) then
- begin
- IsValid := False;
- Writeln('Введите 1 или 2');
- end;
- until IsValid;
- GetOutputMethod := Method;
- end;
- procedure PrintTask;
- begin
- Write('Данная программа находит все простые числа, не превосходящие n, ');
- Writeln('с помощью алгоритма «решето Эратосфена»');
- end;
- function FillSet(Num: Byte): TByteSet;
- var
- i: Integer;
- MySet: TByteSet;
- begin
- for i := 2 to Num do
- Include(MySet, i);
- FillSet := MySet;
- end;
- function Eratosfen(MySet: TByteSet; Num: Byte): TByteSet;
- var
- i, j: Integer;
- begin
- for i := 2 to Num do
- if i in MySet then
- for j := i + 1 to Num do
- if j in MySet then
- if (j mod i = 0) then
- Exclude(MySet, j);
- Eratosfen := MySet;
- end;
- function GetUserInput(): Byte;
- var
- Method: Word;
- Path: String;
- begin
- Method := GetInputMethod;
- if (Method = 1) then
- GetUserInput := GetUserInputFromConsole
- else
- begin
- Path := GetUserInputPath;
- GetUserInput := GetUserInputFromFile(Path);
- end;
- end;
- procedure PrintResult(MySet: TByteSet; Num: Byte);
- var
- Method: Word;
- Path: String;
- begin
- Method := GetOutputMethod;
- if (Method = USE_CONSOLE) then
- PrintInConsole(MySet, Num)
- else
- begin
- Path := GetUserOutputPath;
- PrintInFile(Path, MySet, Num);
- end;
- end;
- procedure Main();
- var
- Num: Byte;
- MySet: TByteSet;
- begin
- PrintTask;
- Num := GetUserInput;
- MySet := FillSet(Num);
- MySet := Eratosfen(MySet, Num);
- PrintResult(MySet, Num);
- Writeln('Нажмите Enter для выхода из программы');
- Readln;
- end;
- begin
- Main();
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement