Advertisement
anticlown

laba.3.2(C++)

Nov 17th, 2022
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.98 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <set>
  5.  
  6. const int MIN_VALUE = 2;
  7. const int MAX_VALUE = 255;
  8.  
  9. void outputOfTaskInfo() {
  10.   std::cout << "Данная программа находит все простые числа, не превосходящие данного натурального числа. \n"
  11.     << "Диапазон для ввода ограничивающего числа: " << MIN_VALUE << "..." << MAX_VALUE << ". \n";
  12. }
  13.  
  14. int getVerificationOfChoice() {
  15.   int choice;
  16.   bool isIncorrect;
  17.  
  18.   do {
  19.     isIncorrect = false;
  20.     std::cin >> choice;
  21.  
  22.     if (std::cin.fail())
  23.     {
  24.       std::cin.clear();
  25.       while (std::cin.get() != '\n');
  26.       isIncorrect = true;
  27.       std::cout << "Проверьте корректность ввода данных! \n";
  28.     }
  29.  
  30.     if (!isIncorrect && std::cin.get() != '\n')
  31.     {
  32.       std::cin.clear();
  33.       while (std::cin.get() != '\n');
  34.  
  35.       std::cout << "Проверьте корректность ввода данных! \n";
  36.       isIncorrect = true;
  37.     }
  38.  
  39.     if (isIncorrect || (choice != 0 && choice != 1))
  40.     {
  41.       isIncorrect = true;
  42.       std::cout << "Для выбора введите 0 или 1! \n";
  43.     }
  44.   } while (isIncorrect);
  45.  
  46.   return choice;
  47. }
  48.  
  49. std::string inputPathToFile() {
  50.   std::string path;
  51.   bool isIncorrect;
  52.  
  53.   std::cout << "Укажите путь к файлу: ";
  54.  
  55.   do
  56.   {
  57.     isIncorrect = false;
  58.     std::cin >> path;
  59.     std::ifstream file(path);
  60.  
  61.     if (!file.is_open())
  62.     {
  63.       std::cout << "По указанному пути файл не найден! Укажите правильный путь: ";
  64.       isIncorrect = true;
  65.     }
  66.   } while (isIncorrect);
  67.  
  68.   return path;
  69. }
  70.  
  71. int readNumberFromConsole() {
  72.   int number;
  73.   bool isIncorrect;
  74.  
  75.   std::cout << "Введите ограничивающее число: ";
  76.  
  77.   do
  78.   {
  79.     isIncorrect = false;
  80.     std::cin >> number;
  81.     if (std::cin.fail())
  82.     {
  83.       isIncorrect = true;
  84.       std::cout << "Проверьте корректность ввода данных! \n";
  85.       std::cin.clear();
  86.       while (std::cin.get() != '\n');
  87.     }
  88.     if (!isIncorrect && (number < MIN_VALUE || number >> MAX_VALUE))
  89.     {
  90.       isIncorrect = true;
  91.       std::cout << "Введите число от " << MIN_VALUE << " до " << MAX_VALUE << "! \n";
  92.     }
  93.   } while (isIncorrect);
  94.  
  95.   return number;
  96. }
  97.  
  98. int readNumberFromFile(const std::string path) {
  99.   int size;
  100.   std::string numberInp;
  101.   bool isIncorrect = true;
  102.   std::ifstream fin(path);
  103.  
  104.   std::cout << "Происходит чтение ограничивающего числа... \n";
  105.   fin >> numberInp;
  106.  
  107.   try
  108.   {
  109.     size = atoi(numberInp.c_str());
  110.   }
  111.   catch (...)
  112.   {
  113.     isIncorrect = false;
  114.     std::cout << "Ошибка при чтении данных! Введите ограничивающее число с консоли! \n";
  115.     size = readNumberFromConsole();
  116.   }
  117.  
  118.   if (!isIncorrect && (size < MIN_VALUE || size > MAX_VALUE))
  119.   {
  120.     std::cout << "Введите значение от " << MIN_VALUE << " до " << MAX_VALUE << "! \n";
  121.     size = readNumberFromConsole();
  122.   }
  123.  
  124.   fin.close();
  125.  
  126.   return size;
  127. }
  128.  
  129. int readNumber(const int choice, const std::string path) {
  130.   int number;
  131.  
  132.   if (choice == 0)
  133.     number = readNumberFromConsole();
  134.   if (choice == 1)
  135.     number = readNumberFromFile(path);
  136.  
  137.   return number;
  138. }
  139.  
  140. void outputNumber(const int choice, std::string path, const int number) {
  141.   std::ofstream fout(path);
  142.   bool isIncorrect;
  143.  
  144.   if (choice == 0)
  145.     std::cout << "Число, ограничивающее диапазон поиска: " << number << ". \n";
  146.   if (choice == 1)
  147.   {
  148.     std::cout << "Вывод ограничивающего числа в файл... \n";
  149.  
  150.     do
  151.     {
  152.       isIncorrect = false;
  153.       std::ofstream fout(path);
  154.  
  155.       try
  156.       {
  157.         fout << number << "\n";
  158.       }
  159.       catch (...)
  160.       {
  161.         std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n";
  162.         isIncorrect = true;
  163.         path = inputPathToFile();
  164.       }
  165.  
  166.       fout.close();
  167.     } while (isIncorrect);
  168.  
  169.     std::cout << "Данные успешно записаны в файл! \n";
  170.   }
  171. }
  172.  
  173. std::set<int> EratosthenesSieve(const int number) {
  174.   std::set<int> ansSet;
  175.   int finalNumber = number + 1;
  176.  
  177.   for (int i = 1; i < finalNumber; i++)
  178.     ansSet.insert(i);
  179.  
  180.   int i = 2;
  181.  
  182.   while (i * i < finalNumber)
  183.   {
  184.     int j = i * i;
  185.  
  186.     while (j < finalNumber)
  187.     {
  188.       ansSet.erase(j);
  189.       j += i;
  190.     }
  191.  
  192.     i++;
  193.   }
  194.  
  195.   return ansSet;
  196. }
  197.  
  198. void outputAnsSet(const int choice, std::string path, const int number, const std::set<int> ansSet) {
  199.   bool isIncorrect;
  200.   std::ofstream fout;
  201.  
  202.   if (choice == 0)
  203.   {
  204.     std::cout << "Вывод множества простых чисел до " << number << ": \n";
  205.  
  206.     for (auto i = ansSet.begin(); i != ansSet.end(); i++)
  207.       std::cout << *i << " ";
  208.   }
  209.  
  210.   if (choice == 1) {
  211.     std::cout << "Вывод множества простых чисел до " << number << " в файл... \n";
  212.  
  213.     fout.open(path, std::ios::app);
  214.     fout << "\n";
  215.  
  216.     do
  217.     {
  218.       isIncorrect = false;
  219.  
  220.       try
  221.       {
  222.         for (auto i = ansSet.begin(); i != ansSet.end(); i++)
  223.           fout << *i << " ";
  224.       }
  225.       catch (...)
  226.       {
  227.         std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n";
  228.         isIncorrect = true;
  229.         path = inputPathToFile();
  230.       }
  231.     } while (isIncorrect);
  232.  
  233.     fout.close();
  234.     std::cout << "Данные успешно записаны в файл! \n";
  235.   }
  236. }
  237.  
  238. void processUserInput(int& choiceForInput, std::string& pathToIn, int& number) {
  239.   std::cout << "Вы желаете ввести данные с консоли(0) или взять данные из файла(1)? \n";
  240.   choiceForInput = getVerificationOfChoice();
  241.   if (choiceForInput == 1)
  242.     pathToIn = inputPathToFile();
  243.  
  244.   number = readNumber(choiceForInput, pathToIn);
  245. }
  246.  
  247. void processUserOutput(int& choiceForOutput, std::string& pathToOut, int& number, std::set<int>& ansSet) {
  248.   std::cout << "Вы желаете получить результат в консоли(0) или в файле(1)? \n";
  249.   choiceForOutput = getVerificationOfChoice();
  250.   if (choiceForOutput == 1)
  251.     pathToOut = inputPathToFile();
  252.  
  253.   outputNumber(choiceForOutput, pathToOut, number);
  254.   outputAnsSet(choiceForOutput, pathToOut, number, ansSet);
  255. }
  256.  
  257. int main() {
  258.   setlocale(LC_ALL, "Rus");
  259.   int choiceForInput, choiceForOutput, number;
  260.   std::string pathToIn, pathToOut;
  261.   std::set<int> ansSet;
  262.  
  263.   outputOfTaskInfo();
  264.   processUserInput(choiceForInput, pathToIn, number);
  265.   ansSet = EratosthenesSieve(number);
  266.   processUserOutput(choiceForOutput, pathToOut, number, ansSet);
  267.  
  268.   return 0;
  269. }
  270.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement