Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <string>
- #include <set>
- const int MIN_VALUE = 2;
- const int MAX_VALUE = 255;
- void outputOfTaskInfo() {
- std::cout << "Данная программа находит все простые числа, не превосходящие данного натурального числа. \n"
- << "Диапазон для ввода ограничивающего числа: " << MIN_VALUE << "..." << MAX_VALUE << ". \n";
- }
- int getVerificationOfChoice() {
- int choice;
- bool isIncorrect;
- do {
- isIncorrect = false;
- std::cin >> choice;
- if (std::cin.fail())
- {
- std::cin.clear();
- while (std::cin.get() != '\n');
- isIncorrect = true;
- std::cout << "Проверьте корректность ввода данных! \n";
- }
- if (!isIncorrect && std::cin.get() != '\n')
- {
- std::cin.clear();
- while (std::cin.get() != '\n');
- std::cout << "Проверьте корректность ввода данных! \n";
- isIncorrect = true;
- }
- if (isIncorrect || (choice != 0 && choice != 1))
- {
- isIncorrect = true;
- std::cout << "Для выбора введите 0 или 1! \n";
- }
- } while (isIncorrect);
- return choice;
- }
- std::string inputPathToFile() {
- std::string path;
- bool isIncorrect;
- std::cout << "Укажите путь к файлу: ";
- do
- {
- isIncorrect = false;
- std::cin >> path;
- std::ifstream file(path);
- if (!file.is_open())
- {
- std::cout << "По указанному пути файл не найден! Укажите правильный путь: ";
- isIncorrect = true;
- }
- } while (isIncorrect);
- return path;
- }
- int readNumberFromConsole() {
- int number;
- bool isIncorrect;
- std::cout << "Введите ограничивающее число: ";
- do
- {
- isIncorrect = false;
- std::cin >> number;
- if (std::cin.fail())
- {
- isIncorrect = true;
- std::cout << "Проверьте корректность ввода данных! \n";
- std::cin.clear();
- while (std::cin.get() != '\n');
- }
- if (!isIncorrect && (number < MIN_VALUE || number >> MAX_VALUE))
- {
- isIncorrect = true;
- std::cout << "Введите число от " << MIN_VALUE << " до " << MAX_VALUE << "! \n";
- }
- } while (isIncorrect);
- return number;
- }
- int readNumberFromFile(const std::string path) {
- int size;
- std::string numberInp;
- bool isIncorrect = true;
- std::ifstream fin(path);
- std::cout << "Происходит чтение ограничивающего числа... \n";
- fin >> numberInp;
- try
- {
- size = atoi(numberInp.c_str());
- }
- catch (...)
- {
- isIncorrect = false;
- std::cout << "Ошибка при чтении данных! Введите ограничивающее число с консоли! \n";
- size = readNumberFromConsole();
- }
- if (!isIncorrect && (size < MIN_VALUE || size > MAX_VALUE))
- {
- std::cout << "Введите значение от " << MIN_VALUE << " до " << MAX_VALUE << "! \n";
- size = readNumberFromConsole();
- }
- fin.close();
- return size;
- }
- int readNumber(const int choice, const std::string path) {
- int number;
- if (choice == 0)
- number = readNumberFromConsole();
- if (choice == 1)
- number = readNumberFromFile(path);
- return number;
- }
- void outputNumber(const int choice, std::string path, const int number) {
- std::ofstream fout(path);
- bool isIncorrect;
- if (choice == 0)
- std::cout << "Число, ограничивающее диапазон поиска: " << number << ". \n";
- if (choice == 1)
- {
- std::cout << "Вывод ограничивающего числа в файл... \n";
- do
- {
- isIncorrect = false;
- std::ofstream fout(path);
- try
- {
- fout << number << "\n";
- }
- catch (...)
- {
- std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n";
- isIncorrect = true;
- path = inputPathToFile();
- }
- fout.close();
- } while (isIncorrect);
- std::cout << "Данные успешно записаны в файл! \n";
- }
- }
- std::set<int> EratosthenesSieve(const int number) {
- std::set<int> ansSet;
- int finalNumber = number + 1;
- for (int i = 1; i < finalNumber; i++)
- ansSet.insert(i);
- int i = 2;
- while (i * i < finalNumber)
- {
- int j = i * i;
- while (j < finalNumber)
- {
- ansSet.erase(j);
- j += i;
- }
- i++;
- }
- return ansSet;
- }
- void outputAnsSet(const int choice, std::string path, const int number, const std::set<int> ansSet) {
- bool isIncorrect;
- std::ofstream fout;
- if (choice == 0)
- {
- std::cout << "Вывод множества простых чисел до " << number << ": \n";
- for (auto i = ansSet.begin(); i != ansSet.end(); i++)
- std::cout << *i << " ";
- }
- if (choice == 1) {
- std::cout << "Вывод множества простых чисел до " << number << " в файл... \n";
- fout.open(path, std::ios::app);
- fout << "\n";
- do
- {
- isIncorrect = false;
- try
- {
- for (auto i = ansSet.begin(); i != ansSet.end(); i++)
- fout << *i << " ";
- }
- catch (...)
- {
- std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n";
- isIncorrect = true;
- path = inputPathToFile();
- }
- } while (isIncorrect);
- fout.close();
- std::cout << "Данные успешно записаны в файл! \n";
- }
- }
- void processUserInput(int& choiceForInput, std::string& pathToIn, int& number) {
- std::cout << "Вы желаете ввести данные с консоли(0) или взять данные из файла(1)? \n";
- choiceForInput = getVerificationOfChoice();
- if (choiceForInput == 1)
- pathToIn = inputPathToFile();
- number = readNumber(choiceForInput, pathToIn);
- }
- void processUserOutput(int& choiceForOutput, std::string& pathToOut, int& number, std::set<int>& ansSet) {
- std::cout << "Вы желаете получить результат в консоли(0) или в файле(1)? \n";
- choiceForOutput = getVerificationOfChoice();
- if (choiceForOutput == 1)
- pathToOut = inputPathToFile();
- outputNumber(choiceForOutput, pathToOut, number);
- outputAnsSet(choiceForOutput, pathToOut, number, ansSet);
- }
- int main() {
- setlocale(LC_ALL, "Rus");
- int choiceForInput, choiceForOutput, number;
- std::string pathToIn, pathToOut;
- std::set<int> ansSet;
- outputOfTaskInfo();
- processUserInput(choiceForInput, pathToIn, number);
- ansSet = EratosthenesSieve(number);
- processUserOutput(choiceForOutput, pathToOut, number, ansSet);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement