Guest User

Oleh

a guest
Feb 21st, 2021
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.31 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5. int menu(); void transfer(); int check(string, string);
  6. long double inputsystem(); long double inputdigit(string, int); long double toDec(string, int); void ofDec(long double, int); string allowedtoinput(int);
  7.  
  8. int main()
  9. {
  10.     setlocale(0, "");
  11.     menu();
  12.     return 0;
  13. }
  14. int menu()
  15. {
  16.     int digit = 0;
  17.     string digitstring;
  18.     cout << "Если хотите перевести число из одной системы в другую, нажмите 2, " << endl;
  19.     cout << "Если хотите завершить программу, нажмите 0: ";
  20.     getline(cin, digitstring);
  21.     if (check(digitstring, "02") == 1)  // Проверка строки
  22.     {
  23.         menu();
  24.         return 0;
  25.     }
  26.     digit = toDec(digitstring, 10); // Переводит строку в число
  27.     if (digit < 0 || digit > 5)
  28.     {
  29.         cout << "\nВведите значение от 0 до 5!\n";
  30.         menu();
  31.         return 0;
  32.     }
  33.     if (digit == 2) transfer();
  34.     else if (digit == 0) return 0;
  35.     return 0;
  36. }
  37.  
  38. void transfer() // Перевод из одной системы счисления в другую
  39. {
  40.     long double incoming, outgoing;
  41.     long double digit;
  42.     string allowed;
  43.     cout << "\nВведите исходную систему: ";
  44.     incoming = inputsystem(); // Ввод исходной системы счисления
  45.     allowed = allowedtoinput(incoming); // Разрешенные символы для ввода числа
  46.     cout << "\nВведите число: ";
  47.     digit = inputdigit(allowed, incoming); // Ввод числа
  48.     cout << "\nВведите выходящую систему: ";
  49.     outgoing = inputsystem(); // Ввод выходящей системы счисления
  50.     cout << "\nРезультат: ";
  51.     ofDec(digit, outgoing);
  52.     menu();
  53. }
  54. int check(string str, string allowed) // Полная проверка корректности ввода
  55. {
  56.     int m = 0; // Удаление пробелов перед данными, если они есть
  57.     while (str[m] == ' ' || str[m] == '\t') m++;
  58.     if (m > 0) str.erase(str.begin(), str.begin() + m);
  59.     m = str.size() - 1; // Удаление пробелов после данных, если они есть
  60.     while (str[m] == ' ' || str[m] == '\t') m--;
  61.     if (m < (str.size() - 1)) str.erase(str.begin() + m + 1, str.end());
  62.     if (str[0] == '.') // Проверка на первый и второй элемент элемент
  63.     {
  64.         cout << "\nВведите корректное значение (без пробелов и различных символов, вещественное число через точку)!\n";
  65.         return 1;
  66.     }
  67.     else if (str[0] == '-' && str[1] == '.')
  68.     {
  69.         cout << "\nВведите корректное значение (без пробелов и различных символов, вещественное число через точку)!\n";
  70.         return 1;
  71.     }
  72.     int k = 0; // Проверка точек
  73.     for (int i = 0; i < str.size(); i++) if (str[i] == '.') k++;
  74.     if (k < 1 && k > 1)
  75.     {
  76.         cout << "\nВведите корректное значение (без пробелов и различных символов, вещественное число через точку)!\n";
  77.         return 1;
  78.     }
  79.     k = 0; // Проверка минусов
  80.     for (int i = 0; i < str.size(); i++) if (str[i] == '-') k++;
  81.     if (k < 1 && k > 1)
  82.     {
  83.         cout << "\nВведите корректное значение (без пробелов и различных символов, вещественное число через точку)!\n";
  84.         return 1;
  85.     }
  86.     k = 0; // Проверка, входят ли символы в список разрешенных
  87.     for (int i = 0; i < str.size(); i++)
  88.     {
  89.         for (int j = 0; j < allowed.size(); j++)
  90.         {
  91.             if (str[i] == allowed[j]) k++;
  92.         }
  93.     }
  94.     if (k < str.size())
  95.     {
  96.         cout << "\nВведите корректное значение (без пробелов и различных символов, вещественное число через точку)!\n";
  97.         return 1;
  98.     }
  99. }
  100. long double inputsystem() // Ввод системы
  101. {
  102.     double system = 0;
  103.     string systemstring;
  104.     for (int i = 0; i < 2; i)
  105.     {
  106.         i = 0;
  107.         getline(cin, systemstring);
  108.         if (check(systemstring, "0123456789") != 1) i++; // Проверка строки
  109.         system = toDec(systemstring, 10); // Перевод строки в число
  110.         if (system < 2 || system > 16)
  111.         {
  112.             cout << "\nВведите значение от 2 до 16: ";
  113.         }
  114.         else i++;
  115.     }
  116.     return system;
  117. }
  118. long double inputdigit(string allowed, int incoming)
  119. {
  120.     long double digit = 0;
  121.     string digitstring;
  122.     for (int i = 0; i < 1; i)
  123.     {
  124.         getline(cin, digitstring);
  125.         for (int i = 0; i < digitstring.size(); i++) if (digitstring[i] == ',') digitstring[i] = '.';
  126.         if (check(digitstring, allowed) != 1) i++;
  127.         else cout << "\nВведите значение: ";
  128.         digit = toDec(digitstring, incoming); // Перевод строки в число
  129.     }
  130.     return digit;
  131. }
  132. long double toDec(string str, int incoming) // Перевод строки incoming системы в десятичное число
  133. {
  134.     long double digit = 0;
  135.     int point = 0, helpdigit = 0; // Перевод в десятичную систему
  136.     for (int i = 0; i < str.size(); i++)
  137.     {
  138.         if (str[i] == '.') point = i;
  139.     }
  140.     if (point > 0)  // Если число не целое
  141.     {
  142.         for (int i = 0; i < point; i++) // До точки
  143.         {
  144.             if (str[i] - '0' >= 0 && str[i] - '0' < 10) digit += (str[i] - '0') * pow(incoming, point - i - 1);
  145.             else
  146.             {
  147.                 switch (str[i])
  148.                 {
  149.                 case'A':case'a': helpdigit = 10; break;
  150.                 case'B':case'b': helpdigit = 11; break;
  151.                 case'C':case'c': helpdigit = 12; break;
  152.                 case'D':case'd': helpdigit = 13; break;
  153.                 case'E':case'e': helpdigit = 15; break;
  154.                 case'F':case'f': helpdigit = 16; break;
  155.                 }
  156.                 digit += helpdigit * pow(incoming, point - i - 1);
  157.             }
  158.         }
  159.         for (int i = point + 1; i < str.size(); i++) // После точки
  160.         {
  161.             if (str[i] - '0' >= 0 && str[i] - '0' < 10) digit += (str[i] - '0') * pow(incoming, point - i);
  162.             else
  163.             {
  164.                 switch (str[i])
  165.                 {
  166.                 case'A':case'a': helpdigit = 10; break;
  167.                 case'B':case'b': helpdigit = 11; break;
  168.                 case'C':case'c': helpdigit = 12; break;
  169.                 case'D':case'd': helpdigit = 13; break;
  170.                 case'E':case'e': helpdigit = 15; break;
  171.                 case'F':case'f': helpdigit = 16; break;
  172.                 }
  173.                 digit += helpdigit * pow(incoming, point - i);
  174.             }
  175.         }
  176.     }
  177.     else  // Если число целое
  178.     {
  179.         for (int i = 0; i < str.size(); i++)
  180.         {
  181.             if (str[i] - '0' >= 0 && str[i] - '0' < 10) digit += (str[i] - '0') * pow(incoming, str.size() - i - 1);
  182.             else
  183.             {
  184.                 switch (str[i])
  185.                 {
  186.                 case'A':case'a': helpdigit = 10; break;
  187.                 case'B':case'b': helpdigit = 11; break;
  188.                 case'C':case'c': helpdigit = 12; break;
  189.                 case'D':case'd': helpdigit = 13; break;
  190.                 case'E':case'e': helpdigit = 15; break;
  191.                 case'F':case'f': helpdigit = 16; break;
  192.                 }
  193.                 digit += helpdigit * pow(incoming, str.size() - i - 1);
  194.             }
  195.         }
  196.     }
  197.     return digit;
  198. }
  199. void ofDec(long double digit, int outgoing) // Перевод десятичного числа в outgoing систему
  200. {
  201.     string result;
  202.     int intdigit, discharge = 0, afterpoint = 0;
  203.     long double digithelp;
  204.     if (digit >= 0) digithelp = digit;
  205.     else digithelp = digit * (-1);
  206.     intdigit = digithelp;
  207.     long double d = (digithelp - intdigit) * outgoing;
  208.     if (digithelp == 0) cout << "0\n\n";
  209.     else
  210.     {
  211.         if (digithelp - intdigit != 0) // Если число не целое
  212.         {
  213.             while (d != 0 && afterpoint < 10)
  214.             {
  215.                 if (d >= 0 && d < 10) result += ('0' + int(d));
  216.                 else
  217.                 {
  218.                     switch (int(d))
  219.                     {
  220.                     case 10: result += 'A'; break;
  221.                     case 11: result += 'B'; break;
  222.                     case 12: result += 'C'; break;
  223.                     case 13: result += 'D'; break;
  224.                     case 14: result += 'E'; break;
  225.                     case 15: result += 'F'; break;
  226.                     }
  227.                 }
  228.                 d = (d - int(d)) * outgoing;
  229.                 afterpoint++;
  230.             }
  231.             result += '.';
  232.         }
  233.         while (intdigit != 0)
  234.         {
  235.             if (intdigit % outgoing >= 0 && intdigit % outgoing < 10)
  236.             {
  237.                 result += ('0' + (intdigit % outgoing));
  238.             }
  239.             else
  240.             {
  241.                 switch (intdigit % outgoing)
  242.                 {
  243.                 case 10: result += 'A'; break;
  244.                 case 11: result += 'B'; break;
  245.                 case 12: result += 'C'; break;
  246.                 case 13: result += 'D'; break;
  247.                 case 14: result += 'E'; break;
  248.                 case 15: result += 'F'; break;
  249.                 }
  250.             }
  251.             intdigit /= outgoing;
  252.         }
  253.         // Вывод результата
  254.         if (digit < 0) cout << '-';
  255.         if (digit < 1 && digit > 0) cout << '0';
  256.         for (int i = 0; i < result.size(); i++)
  257.         {
  258.             if (result[i] == '.') discharge = i;
  259.         }
  260.         for (int i = result.size(); i >= discharge; i--)
  261.         {
  262.             cout << result[i];
  263.         }
  264.         for (int i = 0; i < discharge; i++)
  265.         {
  266.             cout << result[i];
  267.         }
  268.         cout << endl;
  269.         if (discharge > 0)
  270.         {
  271.             cout << endl;
  272.             cout << "После запятой разрядов: " << discharge << endl;
  273.         }
  274.     }
  275. }
  276. string allowedtoinput(int system) // system = incoming/outgoing, ввод в строку разрешенных чисел равных system - 1
  277. {
  278.     string allowed;
  279.     allowed.clear();
  280.     for (int i = 0; i < system; i++)
  281.     {
  282.         if (i > 9 && i < 17)
  283.         {
  284.             switch (i)
  285.             {
  286.             case 10: allowed += 'A'; allowed += 'a'; break;
  287.             case 11: allowed += 'B'; allowed += 'b'; break;
  288.             case 12: allowed += 'C'; allowed += 'c'; break;
  289.             case 13: allowed += 'D'; allowed += 'd'; break;
  290.             case 14: allowed += 'E'; allowed += 'e'; break;
  291.             case 15: allowed += 'F'; allowed += 'f'; break;
  292.             }
  293.         }
  294.         else allowed += '0' + i;
  295.     }
  296.     allowed += '.'; allowed += '-';
  297.     return allowed;
  298. }
Advertisement
Add Comment
Please, Sign In to add comment