Advertisement
THOMAS_SHELBY_18

Lab2_4(C++)

Oct 25th, 2023 (edited)
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.33 KB | Source Code | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <cmath>
  5. #include <windows.h>
  6.  
  7. using namespace std;
  8.  
  9. const int
  10.     MIN_ARR_LENGTH = 1,
  11.     MAX_ARR_LENGTH = 20,
  12.     MIN_ARR_VALUE = 1,
  13.     MAX_ARR_VALUE = 100;
  14.  
  15. int readNum(int min, int max) {
  16.  
  17.     bool isIncorrect;
  18.     int num;
  19.  
  20.     do {
  21.         isIncorrect = true;
  22.         cin >> num;
  23.         if (cin.fail() || (cin.get() != '\n')) {
  24.             cout << "Некорректный ввод! Введите значение еще раз:" << endl;
  25.             cin.clear();
  26.             while (cin.get() != '\n');
  27.         }
  28.         else {
  29.             if (num < min || num > max) {
  30.                 cout << "Недопустимое значение! Введите значение еще раз:" << endl;
  31.             }
  32.             else {
  33.                 isIncorrect = false;
  34.             }
  35.         }
  36.     } while (isIncorrect);
  37.  
  38.     return num;
  39. }
  40.  
  41. bool checkFileData(string& path, int*& arr, int& lengthArr) {
  42.     ifstream fin;
  43.     bool isFileCorrect;
  44.     int buf, i;
  45.  
  46.     fin.open(path);
  47.     isFileCorrect = true;
  48.  
  49.     fin >> lengthArr;
  50.     if (fin.fail()) {
  51.         fin.clear();
  52.         isFileCorrect = false;
  53.         cout << "Файл не найден или данные некоректны.\nВнесите изменения в файл и повторите попытку!" << endl;
  54.     }
  55.  
  56.     else if ((MIN_ARR_LENGTH > lengthArr) || (MAX_ARR_LENGTH < lengthArr)) {
  57.         isFileCorrect = false;
  58.         cout << "Значение выходит за возможные пределы!\nВнесите изменения в файл и повторите попытку!" << endl;
  59.     }
  60.     if (isFileCorrect) {
  61.  
  62.         arr = new int[lengthArr];
  63.         i = 0;
  64.  
  65.         do {
  66.             fin >> buf;
  67.             if (fin.fail()) {
  68.                 cout << "Элементы массива введены некорректно!\nВнесите изменения в файл и повторите попытку!" << endl;
  69.                 isFileCorrect = false;
  70.                 fin.clear();
  71.             }
  72.             else
  73.                 arr[i] = buf;
  74.             i++;
  75.         } while (isFileCorrect && i < lengthArr);
  76.     }
  77.  
  78.     if (isFileCorrect && !fin.eof()) {
  79.         cout << "Элементы массива введены некорректно!\nВнесите изменения в файл и повторите попытку!" << endl;
  80.         isFileCorrect = false;
  81.     }
  82.  
  83.     fin.close();
  84.     return isFileCorrect;
  85. }
  86.  
  87. void inputArrFromConsole(int*& arr, int& lengthArr) {
  88.     int buf;
  89.     cout << "Введите количество элементов:" << endl;
  90.     lengthArr = readNum(MIN_ARR_LENGTH, MAX_ARR_LENGTH);
  91.  
  92.     arr = new int[lengthArr];
  93.  
  94.     for (int i = 0; i < lengthArr; i++) {
  95.         cout << "Введите элемент последовательности №" << i + 1 << ":" << endl;
  96.         buf = readNum(MIN_ARR_VALUE, MAX_ARR_VALUE);
  97.         arr[i] = buf;
  98.     }
  99. }
  100. void inputArray(int*& arr, int& lengthArr) {
  101.     int choice;
  102.     bool isInputFromFileSuccessfully;
  103.     string pathFile;
  104.  
  105.     cout << "Выберите вариант ввода:" << endl << "1. Ввод из консоли" << endl << "2. Ввод из файла" << endl << "Использовать вариант:";
  106.     choice = readNum(1, 2);
  107.  
  108.     if (choice == 1) {
  109.         cout << "Допустимые значения:" << endl;
  110.         cout << "Количество элементов - натуральное число от " << MIN_ARR_LENGTH << " до " << MAX_ARR_LENGTH << endl;
  111.         cout << "Элементы массива - натуральные числа от " << MIN_ARR_VALUE << " до " << MAX_ARR_VALUE << endl;
  112.         inputArrFromConsole(arr, lengthArr);
  113.     }
  114.     else {
  115.         cout << "Данные в файле должны содержать:" << endl;
  116.         cout << "Количество элементов - натуральное число от " << MIN_ARR_LENGTH << " до " << MAX_ARR_LENGTH << endl;
  117.         cout << "Элементы массива - натуральные числа от " << MIN_ARR_VALUE << " до " << MAX_ARR_VALUE << endl;
  118.  
  119.         do {
  120.             cout << "Введите путь к файлу с его раширением:";
  121.             cin >> pathFile;
  122.             isInputFromFileSuccessfully = checkFileData(pathFile, arr, lengthArr);
  123.         } while(!isInputFromFileSuccessfully);
  124.     }
  125. }
  126.  
  127. void outputData(int count) {
  128.     int  choice;
  129.     ofstream fout;
  130.     string path;
  131.     bool isFileIncorrect;
  132.  
  133.     cout << "Выберите вариант вывода:" << endl << "1. Вывод в консоль" << endl << "2. Вывод в файл" << endl << "Использовать вариант:";
  134.     choice = readNum(1, 2);
  135.  
  136.     if (choice == 1) {
  137.         if (count == 0) {
  138.             cout << "Среди элементов массива нет простых чисел";
  139.         }
  140.         else {
  141.             cout << "Количество простых чисел среди элементов массива: " << count;
  142.         }
  143.     }
  144.     else {
  145.         cout << "Для вывода введите путь к файлу и его имя c расширением." << endl;
  146.         cout << "Если файл отсутствует то он будет создан автоматически по указанному пути или в корневой папке программы (по умолчанию)" << endl;
  147.         do {
  148.             cout << "Введите путь:";
  149.             cin >> path;
  150.             fout.open(path);
  151.             isFileIncorrect = false;
  152.  
  153.             if (count == 0) {
  154.                 fout << "Среди элементов массива нет простых чисел";
  155.             }
  156.             else {
  157.                 fout << "Количество простых чисел среди элементов массива: " << count;
  158.             }
  159.  
  160.             if (fout.fail()) {
  161.                 cout << "Не удалось вывести в файл! ";
  162.                 isFileIncorrect = true;
  163.                 fout.clear();
  164.             }
  165.         } while (isFileIncorrect);
  166.  
  167.         fout.close();
  168.         cout << "Вывод данных... успешно!";
  169.     }
  170. }
  171.  
  172. bool checkNumber (int num) {
  173.     int i;
  174.     double numRoot;
  175.     bool isPrimeNumber;
  176.  
  177.     numRoot = sqrt(num);
  178.     i = 1;
  179.     do {
  180.         i++;
  181.     } while (num % i != 0 && i <= numRoot);
  182.     if (num == 1)
  183.         isPrimeNumber = false;
  184.     else
  185.         isPrimeNumber = (i > numRoot);
  186.  
  187.     return isPrimeNumber;
  188.  
  189. }
  190. int getCountOfPrimeNumbers(int*& arr, int& lengthArr) {
  191.     int count;
  192.     bool isPrimeNumber;
  193.  
  194.     count = 0;
  195.  
  196.     for (int i = 0; i < lengthArr; i++) {
  197.         isPrimeNumber = checkNumber(arr[i]);
  198.         if(isPrimeNumber) {
  199.             count++;
  200.         }
  201.     }
  202.     delete [] arr;
  203.     return count;
  204. }
  205.  
  206. int main() {
  207.     int countOfPrimeNumbers, lengthArr;
  208.     int* arrA = new int;
  209.  
  210.     SetConsoleOutputCP(CP_UTF8);
  211.  
  212.     cout << "Данная программа вычислит количество простых чисел в массиве";
  213.     inputArray(arrA, lengthArr);
  214.     countOfPrimeNumbers = getCountOfPrimeNumbers(arrA, lengthArr);
  215.     outputData(countOfPrimeNumbers);
  216.  
  217.     return 0;
  218. }
  219.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement