Advertisement
Elfik

Systemy liczbowy - konwerter

Jan 12th, 2018
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.76 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <string>
  4. #include <Windows.h>
  5.  
  6. std::string changeTheNumber(int inSys, int outSys, std::string inNumber);
  7.  
  8. int main()
  9. {
  10. /*  while (true) {
  11.         int inputSystem = 0; // System dla liczby wejściowej
  12.         int outputSystem = 0; // System dla liczby wyjściowej
  13.         std::string inputNumber = ""; // Liczba wejściowa
  14.         char allowedChars[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' }; // Dozwolone znaki
  15.  
  16.         do {
  17.             system("cls");
  18.             std::cout << "Podaj system startowy: ";
  19.             std::cin >> inputSystem;
  20.         } while (inputSystem <= 2 && inputSystem >= 16); // Wprowadzenie systemu wejściowego z ograniczeniem (od 2 do 16)
  21.        
  22.         do {
  23.             system("cls");
  24.             std::cout << "Podaj system docelowy: ";
  25.             std::cin >> outputSystem;
  26.         } while (outputSystem <= 2 && outputSystem >= 16); // Wprowadzenie systemu docelowego z ograniczeniem (od 2 do 16)
  27.  
  28.         system("cls");
  29.  
  30.         std::cout << "System startowy: " << inputSystem << std::endl;
  31.         std::cout << "System docelowy: " << outputSystem << std::endl;
  32.         std::cout << "Podaj liczbe do zmiany: ";
  33.         std::cin >> inputNumber; // Wprowadzenie liczby wejściowej
  34.  
  35.         bool inputNumberIsCorrect = true;
  36.  
  37.         for (int i = 0; i < inputNumber.length(); i++) { // Sprawdzanie w pętli czy liczba zawiera znaki dozwolone w podanym systemie liczbowym
  38.             for (int z = 0; z < inputSystem; z++) {
  39.                 if (inputNumber[i] == allowedChars[z])
  40.                     break;
  41.                 else if (inputNumber[i] != allowedChars[z] && z == inputSystem - 1) {
  42.                     inputNumberIsCorrect = false;
  43.                 }
  44.             }
  45.         }
  46.  
  47.         if (!inputNumberIsCorrect) { // Error w przypadku niespełnienia warunków systemu liczbowego
  48.             std::cout << "Twoja liczba jest niedobra";
  49.             Sleep(1000);
  50.             break;
  51.         }
  52.        
  53.         std::cout << std::endl << changeTheNumber(inputSystem, outputSystem, inputNumber);
  54.         break;
  55.     }
  56.     */
  57.  
  58.     std::cout << changeTheNumber(10, 16, "1803");
  59.     std::cin.get();
  60.     std::cin.get();
  61.  
  62.     return 1;
  63. }
  64.  
  65. std::string changeTheNumber(int inSys, int outSys, std::string inNumber) {
  66.     int decimalInputNumber = 0;
  67.     std::string outNumber = "";
  68.  
  69.     for (int i = 0; i < inNumber.length(); i++) {
  70.         switch (inNumber[i]) {
  71.         case '0': decimalInputNumber += (int)pow(inSys, inNumber.length() - i - 1) * 0; break;
  72.         case '1': decimalInputNumber += (int)pow(inSys, inNumber.length() - i - 1) * 1; break;
  73.         case '2': decimalInputNumber += (int)pow(inSys, inNumber.length() - i - 1) * 2; break;
  74.         case '3': decimalInputNumber += (int)pow(inSys, inNumber.length() - i - 1) * 3; break;
  75.         case '4': decimalInputNumber += (int)pow(inSys, inNumber.length() - i - 1) * 4; break;
  76.         case '5': decimalInputNumber += (int)pow(inSys, inNumber.length() - i - 1) * 5; break;
  77.         case '6': decimalInputNumber += (int)pow(inSys, inNumber.length() - i - 1) * 6; break;
  78.         case '7': decimalInputNumber += (int)pow(inSys, inNumber.length() - i - 1) * 7; break;
  79.         case '8': decimalInputNumber += (int)pow(inSys, inNumber.length() - i - 1) * 8; break;
  80.         case '9': decimalInputNumber += (int)pow(inSys, inNumber.length() - i - 1) * 9; break;
  81.         case 'A': decimalInputNumber += (int)pow(inSys, inNumber.length() - i - 1) * 10; break;
  82.         case 'B': decimalInputNumber += (int)pow(inSys, inNumber.length() - i - 1) * 11; break;
  83.         case 'C': decimalInputNumber += (int)pow(inSys, inNumber.length() - i - 1) * 12; break;
  84.         case 'D': decimalInputNumber += (int)pow(inSys, inNumber.length() - i - 1) * 13; break;
  85.         case 'E': decimalInputNumber += (int)pow(inSys, inNumber.length() - i - 1) * 14; break;
  86.         case 'F': decimalInputNumber += (int)pow(inSys, inNumber.length() - i - 1) * 15; break;
  87.         }
  88.     }
  89.  
  90.     int amountOfNumbers = 0;
  91.     for (int z = 0; ; z++) { // Szukanie najwyższej potęgi
  92.         if (pow(outSys, z) > decimalInputNumber) {
  93.             amountOfNumbers = z - 1;
  94.             break;
  95.         }
  96.     }
  97.  
  98.     while (true) {
  99.         int maxStand = 0;
  100.  
  101.         for (int z = 1; z < outSys ; z++) { // Szukanie najwyższego mnożnika
  102.             if (pow(outSys, amountOfNumbers) * z > decimalInputNumber) {
  103.                 maxStand = z - 1;
  104.                 break;
  105.             }
  106.         }
  107.  
  108.         decimalInputNumber -= (pow(outSys, amountOfNumbers) * maxStand);
  109.        
  110.         switch (maxStand) {
  111.         case 0: outNumber += '0'; break;
  112.         case 1: outNumber += '1'; break;
  113.         case 2: outNumber += '2'; break;
  114.         case 3: outNumber += '3'; break;
  115.         case 4: outNumber += '4'; break;
  116.         case 5: outNumber += '5'; break;
  117.         case 6: outNumber += '6'; break;
  118.         case 7: outNumber += '7'; break;
  119.         case 8: outNumber += '8'; break;
  120.         case 9: outNumber += '9'; break;
  121.         case 10: outNumber += 'A'; break;
  122.         case 11: outNumber += 'B'; break;
  123.         case 12: outNumber += 'C'; break;
  124.         case 13: outNumber += 'D'; break;
  125.         case 14: outNumber += 'E'; break;
  126.         case 15: outNumber += 'F'; break;
  127.         }
  128.  
  129.         if (decimalInputNumber == 0 && amountOfNumbers == 0)
  130.             break;
  131.         else
  132.             amountOfNumbers--;
  133.     }
  134.  
  135.     return outNumber;
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement