Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- using namespace std;
- int menu(); void transfer(); int check(string, string);
- long double inputsystem(); long double inputdigit(string, int); long double toDec(string, int); void ofDec(long double, int); string allowedtoinput(int);
- int main()
- {
- setlocale(0, "");
- menu();
- return 0;
- }
- int menu()
- {
- int digit = 0;
- string digitstring;
- cout << "Если хотите перевести число из одной системы в другую, нажмите 2, " << endl;
- cout << "Если хотите завершить программу, нажмите 0: ";
- getline(cin, digitstring);
- if (check(digitstring, "02") == 1) // Проверка строки
- {
- menu();
- return 0;
- }
- digit = toDec(digitstring, 10); // Переводит строку в число
- if (digit < 0 || digit > 5)
- {
- cout << "\nВведите значение от 0 до 5!\n";
- menu();
- return 0;
- }
- if (digit == 2) transfer();
- else if (digit == 0) return 0;
- return 0;
- }
- void transfer() // Перевод из одной системы счисления в другую
- {
- long double incoming, outgoing;
- long double digit;
- string allowed;
- cout << "\nВведите исходную систему: ";
- incoming = inputsystem(); // Ввод исходной системы счисления
- allowed = allowedtoinput(incoming); // Разрешенные символы для ввода числа
- cout << "\nВведите число: ";
- digit = inputdigit(allowed, incoming); // Ввод числа
- cout << "\nВведите выходящую систему: ";
- outgoing = inputsystem(); // Ввод выходящей системы счисления
- cout << "\nРезультат: ";
- ofDec(digit, outgoing);
- menu();
- }
- int check(string str, string allowed) // Полная проверка корректности ввода
- {
- int m = 0; // Удаление пробелов перед данными, если они есть
- while (str[m] == ' ' || str[m] == '\t') m++;
- if (m > 0) str.erase(str.begin(), str.begin() + m);
- m = str.size() - 1; // Удаление пробелов после данных, если они есть
- while (str[m] == ' ' || str[m] == '\t') m--;
- if (m < (str.size() - 1)) str.erase(str.begin() + m + 1, str.end());
- if (str[0] == '.') // Проверка на первый и второй элемент элемент
- {
- cout << "\nВведите корректное значение (без пробелов и различных символов, вещественное число через точку)!\n";
- return 1;
- }
- else if (str[0] == '-' && str[1] == '.')
- {
- cout << "\nВведите корректное значение (без пробелов и различных символов, вещественное число через точку)!\n";
- return 1;
- }
- int k = 0; // Проверка точек
- for (int i = 0; i < str.size(); i++) if (str[i] == '.') k++;
- if (k < 1 && k > 1)
- {
- cout << "\nВведите корректное значение (без пробелов и различных символов, вещественное число через точку)!\n";
- return 1;
- }
- k = 0; // Проверка минусов
- for (int i = 0; i < str.size(); i++) if (str[i] == '-') k++;
- if (k < 1 && k > 1)
- {
- cout << "\nВведите корректное значение (без пробелов и различных символов, вещественное число через точку)!\n";
- return 1;
- }
- k = 0; // Проверка, входят ли символы в список разрешенных
- for (int i = 0; i < str.size(); i++)
- {
- for (int j = 0; j < allowed.size(); j++)
- {
- if (str[i] == allowed[j]) k++;
- }
- }
- if (k < str.size())
- {
- cout << "\nВведите корректное значение (без пробелов и различных символов, вещественное число через точку)!\n";
- return 1;
- }
- }
- long double inputsystem() // Ввод системы
- {
- double system = 0;
- string systemstring;
- for (int i = 0; i < 2; i)
- {
- i = 0;
- getline(cin, systemstring);
- if (check(systemstring, "0123456789") != 1) i++; // Проверка строки
- system = toDec(systemstring, 10); // Перевод строки в число
- if (system < 2 || system > 16)
- {
- cout << "\nВведите значение от 2 до 16: ";
- }
- else i++;
- }
- return system;
- }
- long double inputdigit(string allowed, int incoming)
- {
- long double digit = 0;
- string digitstring;
- for (int i = 0; i < 1; i)
- {
- getline(cin, digitstring);
- for (int i = 0; i < digitstring.size(); i++) if (digitstring[i] == ',') digitstring[i] = '.';
- if (check(digitstring, allowed) != 1) i++;
- else cout << "\nВведите значение: ";
- digit = toDec(digitstring, incoming); // Перевод строки в число
- }
- return digit;
- }
- long double toDec(string str, int incoming) // Перевод строки incoming системы в десятичное число
- {
- long double digit = 0;
- int point = 0, helpdigit = 0; // Перевод в десятичную систему
- for (int i = 0; i < str.size(); i++)
- {
- if (str[i] == '.') point = i;
- }
- if (point > 0) // Если число не целое
- {
- for (int i = 0; i < point; i++) // До точки
- {
- if (str[i] - '0' >= 0 && str[i] - '0' < 10) digit += (str[i] - '0') * pow(incoming, point - i - 1);
- else
- {
- switch (str[i])
- {
- case'A':case'a': helpdigit = 10; break;
- case'B':case'b': helpdigit = 11; break;
- case'C':case'c': helpdigit = 12; break;
- case'D':case'd': helpdigit = 13; break;
- case'E':case'e': helpdigit = 15; break;
- case'F':case'f': helpdigit = 16; break;
- }
- digit += helpdigit * pow(incoming, point - i - 1);
- }
- }
- for (int i = point + 1; i < str.size(); i++) // После точки
- {
- if (str[i] - '0' >= 0 && str[i] - '0' < 10) digit += (str[i] - '0') * pow(incoming, point - i);
- else
- {
- switch (str[i])
- {
- case'A':case'a': helpdigit = 10; break;
- case'B':case'b': helpdigit = 11; break;
- case'C':case'c': helpdigit = 12; break;
- case'D':case'd': helpdigit = 13; break;
- case'E':case'e': helpdigit = 15; break;
- case'F':case'f': helpdigit = 16; break;
- }
- digit += helpdigit * pow(incoming, point - i);
- }
- }
- }
- else // Если число целое
- {
- for (int i = 0; i < str.size(); i++)
- {
- if (str[i] - '0' >= 0 && str[i] - '0' < 10) digit += (str[i] - '0') * pow(incoming, str.size() - i - 1);
- else
- {
- switch (str[i])
- {
- case'A':case'a': helpdigit = 10; break;
- case'B':case'b': helpdigit = 11; break;
- case'C':case'c': helpdigit = 12; break;
- case'D':case'd': helpdigit = 13; break;
- case'E':case'e': helpdigit = 15; break;
- case'F':case'f': helpdigit = 16; break;
- }
- digit += helpdigit * pow(incoming, str.size() - i - 1);
- }
- }
- }
- return digit;
- }
- void ofDec(long double digit, int outgoing) // Перевод десятичного числа в outgoing систему
- {
- string result;
- int intdigit, discharge = 0, afterpoint = 0;
- long double digithelp;
- if (digit >= 0) digithelp = digit;
- else digithelp = digit * (-1);
- intdigit = digithelp;
- long double d = (digithelp - intdigit) * outgoing;
- if (digithelp == 0) cout << "0\n\n";
- else
- {
- if (digithelp - intdigit != 0) // Если число не целое
- {
- while (d != 0 && afterpoint < 10)
- {
- if (d >= 0 && d < 10) result += ('0' + int(d));
- else
- {
- switch (int(d))
- {
- case 10: result += 'A'; break;
- case 11: result += 'B'; break;
- case 12: result += 'C'; break;
- case 13: result += 'D'; break;
- case 14: result += 'E'; break;
- case 15: result += 'F'; break;
- }
- }
- d = (d - int(d)) * outgoing;
- afterpoint++;
- }
- result += '.';
- }
- while (intdigit != 0)
- {
- if (intdigit % outgoing >= 0 && intdigit % outgoing < 10)
- {
- result += ('0' + (intdigit % outgoing));
- }
- else
- {
- switch (intdigit % outgoing)
- {
- case 10: result += 'A'; break;
- case 11: result += 'B'; break;
- case 12: result += 'C'; break;
- case 13: result += 'D'; break;
- case 14: result += 'E'; break;
- case 15: result += 'F'; break;
- }
- }
- intdigit /= outgoing;
- }
- // Вывод результата
- if (digit < 0) cout << '-';
- if (digit < 1 && digit > 0) cout << '0';
- for (int i = 0; i < result.size(); i++)
- {
- if (result[i] == '.') discharge = i;
- }
- for (int i = result.size(); i >= discharge; i--)
- {
- cout << result[i];
- }
- for (int i = 0; i < discharge; i++)
- {
- cout << result[i];
- }
- cout << endl;
- if (discharge > 0)
- {
- cout << endl;
- cout << "После запятой разрядов: " << discharge << endl;
- }
- }
- }
- string allowedtoinput(int system) // system = incoming/outgoing, ввод в строку разрешенных чисел равных system - 1
- {
- string allowed;
- allowed.clear();
- for (int i = 0; i < system; i++)
- {
- if (i > 9 && i < 17)
- {
- switch (i)
- {
- case 10: allowed += 'A'; allowed += 'a'; break;
- case 11: allowed += 'B'; allowed += 'b'; break;
- case 12: allowed += 'C'; allowed += 'c'; break;
- case 13: allowed += 'D'; allowed += 'd'; break;
- case 14: allowed += 'E'; allowed += 'e'; break;
- case 15: allowed += 'F'; allowed += 'f'; break;
- }
- }
- else allowed += '0' + i;
- }
- allowed += '.'; allowed += '-';
- return allowed;
- }
Advertisement
Add Comment
Please, Sign In to add comment