SHARE
TWEET

Untitled

a guest Feb 19th, 2019 51 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <ctime>
  4.  
  5. using namespace std;
  6.  
  7. int random(int min, int max) {
  8.     return min + (int)floor((double(rand()) / RAND_MAX)*(max - min + 1));
  9. }
  10.  
  11. /* Рекурсивная функция проверки решения уравнения по двум ответам.
  12.     Хотел бы сам знать, как она может занимать 72 строки... */
  13. int check(int x1, int x2, int currentMisses) {
  14.     if (currentMisses == 2) {
  15.         cout << "Вы ошиблись 2 раза, добавлено 2 доп. уравнения";
  16.         cout << '\n';
  17.         return 2;
  18.     }
  19.     int misses = currentMisses;
  20.     int answer;
  21.     cout << "Введите первый корень: ";
  22.     cin >> answer;
  23.     if (answer == x1) {
  24.         cout << "Введите второй корень: ";
  25.         cin >> answer;
  26.         if (answer == x2 && currentMisses == 1) {
  27.             cout << "Оба ответа верны, отлично! Но вы ошиблись до этого, \n"
  28.                 << "придется решить доп. уравнение.";
  29.             cout << '\n';
  30.         }
  31.         if (answer == x2) {
  32.             cout << "Оба ответа верны, отлично!";
  33.             cout << '\n';
  34.             return misses;
  35.         }
  36.         else if (currentMisses == 0) {
  37.             cout << "Введенный корень неверен, у вас одна ошибка"
  38.                 << ", добавлено еще одно уравнение. Удачи :)";
  39.             cout << '\n';
  40.             misses++;
  41.             return misses;
  42.         }
  43.         else {
  44.             cout << "Введенный корень неверен, у вас одна ошибка"
  45.                 << ", добавлено еще одно уравнение, удачи :)";
  46.             cout << '\n';
  47.             misses++;
  48.             return misses;
  49.         }
  50.     }
  51.     else if (answer == x2) {
  52.         cout << "Введите второй корень: ";
  53.         cin >> answer;
  54.         if (answer == x1 && currentMisses == 1) {
  55.             cout << "Оба ответа верны, отлично! Но вы ошиблись до этого, \n"
  56.                 << "придется решить доп. уравнение.";
  57.             cout << '\n';
  58.         }
  59.         else if (answer == x1) {
  60.             cout << "Оба ответа верны, отлично!";
  61.             cout << '\n';
  62.             return misses;
  63.         }
  64.         else if (currentMisses == 0) {
  65.             cout << "Введенный корень неверен, у вас одна ошибка"
  66.                 << ", добавлено еще одно уравнение. Удачи :)";
  67.             cout << '\n';
  68.             misses++;
  69.             return misses;
  70.         }
  71.         else
  72.         {
  73.             cout << "Вы ошиблись 2 раза, добавлено 2 доп. уравнения";
  74.             cout << '\n';
  75.             return currentMisses;
  76.         }
  77.     }
  78.     else {
  79.         misses++;
  80.         cout << "Введенный корень неверен, у вас одна ошибка"
  81.             << ", попробуйте еще раз.";
  82.         cout << '\n';
  83.         check(x1, x2, misses);
  84.     }
  85. }
  86.  
  87. int main()
  88. {
  89.     setlocale(LC_ALL, "Russian");
  90.     srand(time(NULL));
  91.     int solNum = 13;
  92.     int i = 0;
  93.     while (i<solNum) {
  94.         /*
  95.             Корни уравнения должны быть целыми числами и не более 10 тысяч.
  96.             В таком случае, лучше сделать все коэффициенты уравнения целыми числами и так,
  97.             чтобы корень дискриминанта был также целым числом.
  98.             Будем на рандоме подбирать целые числа 'a' и 'c',
  99.             но в диапазоне от -300 до 300, чтобы было проще, а после подберем целое 'b'
  100.             таким образом, чтобы:
  101.             b >= sqrt(4*a*c)
  102.             В итоге дискриминант будет больше, либо равен нулю. Можно вычислить его корень.
  103.             Но также нужно, чтобы корень дискриминанта был целым числом, поэтому:
  104.             ...понятия не имею, как это сделать.
  105.             Пусть просто вычисляет корень, и если он является целым
  106.             числом, то вычисляем корни, и если они так же
  107.             являются целыми числами, не более 10000 и не менее -10000,
  108.             то составляем уравнения по коэффициентам,
  109.             с которыми так совпало. Да, не оптимизировано, но не знаю как иначе.
  110.         */
  111.  
  112.         int a, b, c; // Коэффициенты уравнения
  113.         int min = -300, max = 300; // Диапазон для коэффициентов
  114.  
  115.         a = random(min, max);
  116.         c = random(min, max);
  117.  
  118.         // Вычисление b, чтобы дискриминант был больше, либо равен нулю.
  119.         if (a*c > 0) {
  120.             min = (int)sqrt(4 * a*c); // Нижний порог для 'b'
  121.             max = min + 300;
  122.         }
  123.         b = random(min, max);
  124.  
  125.         double sqrtD = sqrt(pow(b, 2) - 4 * a*c); // Корень дискриминанта
  126.         if (floor(sqrtD) == sqrtD) { // Если он явл. целым числом
  127.             double x1 = (-b + sqrtD) / (2 * a);
  128.             double x2 = (-b - sqrtD) / (2 * a);
  129.             if (floor(x1) == x1 && floor(x2) == x2) { // Если корни - целые числа
  130.                 if (x1 >= -10000 && x1 <= 10000 && x2 >= -10000 && x2 <= 10000) {
  131.                     cout << i + 1 << ". ";
  132.                     cout << a << "*x^2 + " << b << "*x + " << c << " = 0\n";
  133.                     // cout << x1 << " " << x2 << '\n'; Ответы
  134.                     solNum += check(x1, x2, 0);
  135.                     i++;
  136.                     cout << '\n';
  137.                 }
  138.             }
  139.         }
  140.  
  141.     }
  142.     system("pause");
  143.     return 0;
  144. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top