Advertisement
katersaid11

SuperStringCalculator nur positive und ganze zahlen.

May 21st, 2017
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.02 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <windows.h>
  4. /*
  5.     +,-,*,/
  6.     Ich garantiere nicht für Fehlerfreie Anwendung und jeder darf das verwenden. Auch wenn es eigentlich voll unnötig ist und Performance lastig. Vielleicht interessiert sich ja der ein oder andere. Kommazahlen und negative zahlen werden nicht unterstützt. Nur das Ergebnis wird als negativ angezeigt beim subtrahieren z.B: 20-50 = -30 oder die Kommazahlen beim dividieren. 5 / 2 = 2,5. Sonst nicht. D.H.: Die Eingabe von Kommazahlen und negativen zahlen ist zu vermeiden.
  7.  
  8.                                         <<<Consolen Anwendung>>>
  9.  
  10.     Man kann Addieren, Subtrahieren, Multiplizieren und Dividieren zwischen 2 zahlen. Zusätzlich gibt es noch kleine extra Funktionen, die ich auch gemacht habe und mir beim programmieren geholfen haben.
  11.  
  12.     Der Calculator war nur ein kleines Spaß Projekt und hat keinen größeren Sinn außer das man mit sehr großen zahlen rechnen kann. Bedenke aber, dass zum Beispiel beim Multiplizieren schon zahlen im 6 Stelligem Bereich sehr lange brauchen, da ich die Multiplikation mit der Addition verwende um es mir schön einfach zu machen. Vielleicht schau ich mal, wie man das beschleunigen kann und füge noch ein paar andere Funktionen hinzu, wenn ich Lust habe oder einen größeren Nutzen darin sehe.
  13.  
  14.     Ich Hab den auch nur gemacht, weil mit diese Begrenzung von int und double gestört hat. Zwar ist dieser auch begrenzt, da ich string.length() benutze und dieser halt ein Wert und keinen Text zurückgibt, aber nur auf die Stellenanzahl. Heißt wenn int nur den maximalen Wert von 10 sein kann, kann meiner ein Wert von 10 Stellen sein. int x=10; string y= 1000000000. Denke ich mal. Keine Garantie.
  15. */
  16.  
  17. using std::string;
  18. using std::cout;
  19. using std::cin;
  20. using std::endl;
  21.  
  22. char intToChar(int x);              //Gibt eine einstellige Zahl als char zurück
  23. int charToInt(char x);              //Gibt ein char als Int aus. Sofern es eine einstellige Zahl ist
  24. string invert(string);              //Gibt den String von rechst nach links zurück
  25. string nullPruefer(string);         //Entfernt alle Nullen von rechts nach links bis zu einer Zahl die nicht 0 ist
  26. string bigger(string, string);      //Gibt den Wert der größeren Zahl(in String Form) zurück
  27. string move(string, string, char);  //Verschiebt ein String um x Stellen nach links mit dem gegebenem Symbol.
  28. bool kleinerGleich(string, string); //Kleinergleich Vergleich mit Stringzahlen
  29. bool kleiner(string, string);       //Kleiner Vergleich mit Stringzahlen
  30. bool groesser(string, string);      //Größer Vergleich mit Stringzahlen
  31.  
  32. string add(string, string);         //Addieren x+y
  33. string sub(string, string);         //Subtrahieren x-y
  34. string mult(string, string);        //Multiplizieren x*y
  35. string div(string, string);         //Division x/y
  36.  
  37. void SuperStringCalcMenue();        //Gibt ein Menue aus, zur einfachen Eingabe von Zahlen die dann mit dem String Calculator gerechnet werden.
  38.  
  39.  
  40.  
  41.  
  42. int main()
  43. {
  44.     SuperStringCalcMenue();
  45.  
  46.     return 0;
  47. }
  48.  
  49. //Konverter Start
  50. char intToChar(int x)
  51. {
  52.     switch (x)
  53.     {
  54.         case 1:
  55.             return '1';
  56.             break;
  57.         case 2:
  58.             return '2';
  59.             break;
  60.         case 3:
  61.             return '3';
  62.             break;
  63.         case 4:
  64.             return '4';
  65.             break;
  66.         case 5:
  67.             return '5';
  68.             break;
  69.         case 6:
  70.             return '6';
  71.             break;
  72.         case 7:
  73.             return '7';
  74.             break;
  75.         case 8:
  76.             return '8';
  77.             break;
  78.         case 9:
  79.             return '9';
  80.             break;
  81.         case 0:
  82.             return '0';
  83.             break;
  84.         default:
  85.             cout << "Fehler beim convertieren intToChar" << endl;
  86.             cin.ignore();
  87.             return -1;
  88.         }
  89.     }
  90.  
  91. int charToInt(char x)
  92. {
  93.     switch (x)
  94.     {
  95.         case '1':
  96.             return 1;
  97.             break;
  98.         case '2':
  99.             return 2;
  100.             break;
  101.         case '3':
  102.             return 3;
  103.             break;
  104.         case '4':
  105.             return 4;
  106.             break;
  107.         case '5':
  108.             return 5;
  109.             break;
  110.         case '6':
  111.             return 6;
  112.             break;
  113.         case '7':
  114.             return 7;
  115.             break;
  116.         case '8':
  117.             return 8;
  118.             break;
  119.         case '9':
  120.             return 9;
  121.             break;
  122.         case '0':
  123.             return 0;
  124.             break;
  125.         default:
  126.             cout << "Fehler beim convertieren charToInt" << endl;
  127.             cin.ignore();
  128.             return -1;
  129.         }
  130.     }
  131. //Konverter End
  132.  
  133. //Inverter Start
  134. string invert(string x)
  135. {
  136.     string tmp;
  137.     for (int i = x.length() - 1; i >= 0; i--)
  138.     {
  139.         tmp += x[i];
  140.     }
  141.     return tmp;
  142. }
  143. //Inverter End
  144.  
  145. //nullPruefer Start
  146. string nullPruefer(string x)
  147. {
  148.     string text;
  149.     int counter = 0;
  150.     for (int i = 0; i < x.length(); i++)
  151.     {
  152.         if (x[i] == '0')
  153.         {
  154.             counter++;
  155.         }
  156.         else
  157.         {
  158.             counter = 0;
  159.         }
  160.     }
  161.  
  162.     if (counter < 0)
  163.     {
  164.         return x;
  165.     }
  166.     else
  167.     {
  168.         for (int i = 0; i < (x.length() - counter); i++)
  169.         {
  170.             text += x[i];
  171.         }
  172.         return text;
  173.     }
  174.  
  175. }
  176. //nullPruefer End
  177.  
  178. //bigger Start
  179. string bigger(string x, string y)
  180. {
  181.     char tmp;
  182.     if (x.length() == y.length())
  183.     {
  184.         for (int i = 0; i < x.length(); i++)
  185.         {
  186.             if (charToInt(x[i]) < charToInt(y[i]))
  187.             {
  188.                 return y;
  189.             }
  190.             else if( charToInt(y[i]) < charToInt(x[i]) )
  191.             {
  192.                 return x;
  193.             }
  194.             else if ( i >= x.length()-1 )
  195.             {
  196.                 return x;
  197.             }
  198.             else
  199.             {
  200.                 //Nothing
  201.             }
  202.         }
  203.     }
  204.     else if (x.length() < y.length())
  205.     {
  206.         return y;
  207.     }
  208.     else
  209.     {
  210.         return x;
  211.     }
  212.  
  213. }
  214. //bigger End
  215.  
  216. //move Start
  217. string move(string txt, string s, char z)
  218. {
  219.     string text = invert(txt);
  220.     for (string i = "0"; i != s; i = add(i, "1"))
  221.     {
  222.         text += z;
  223.     }
  224.     return invert(text);
  225. }
  226. //move End
  227.  
  228. //kleinergleich Start
  229. bool kleinerGleich(string x, string y)        //x<=y
  230. {
  231.     if (x == bigger(x, y) && y == bigger(x, y))
  232.     {
  233.         return true;
  234.     }
  235.     else if (y == bigger(x, y))
  236.     {
  237.         return true;
  238.     }
  239.     else
  240.     {
  241.         return false;
  242.     }
  243. }
  244. //kleinergleich End
  245.  
  246. //kleiner Start
  247. bool kleiner(string x, string y)
  248. {
  249.     if (x == bigger(x, y) && y == bigger(x, y))
  250.     {
  251.         return false;
  252.     }
  253.     else if (y == bigger(x, y))
  254.     {
  255.         return true;
  256.     }
  257.     else
  258.     {
  259.         return false;
  260.     }
  261. }
  262. //kleiner End
  263.  
  264. //groesser Start
  265. bool groesser(string x, string y)
  266. {
  267.     if (x == bigger(x, y) && y == bigger(x, y))
  268.     {
  269.         return false;
  270.     }
  271.     else if (x == bigger(x, y))
  272.     {
  273.         return true;
  274.     }
  275.     else
  276.     {
  277.         return false;
  278.     }
  279. }
  280. //groesser End
  281.  
  282. //Calculation Start
  283. string add(string x, string y)
  284. {
  285.     int calc = 0;
  286.     int tmp = 0;
  287.     string erg;
  288.     int length_x = x.length();
  289.     int length_y = y.length();
  290.  
  291.     while (true)
  292.     {
  293.         length_x--;
  294.         length_y--;
  295.  
  296.         if (length_x < 0 && length_y < 0)
  297.         {
  298.             if (tmp > 0)
  299.             {
  300.                 erg += intToChar(tmp);
  301.             }
  302.  
  303.             return invert(erg);
  304.         }
  305.         else if (length_x < 0)
  306.         {
  307.             calc = charToInt(y[length_y]);
  308.             calc += tmp;
  309.             erg += intToChar(calc%10);
  310.             tmp = calc / 10;
  311.         }
  312.         else if (length_y < 0)
  313.         {
  314.             calc = charToInt(x[length_x]);
  315.             calc += tmp;
  316.             erg += intToChar(calc % 10);
  317.             tmp = calc / 10;
  318.         }
  319.         else
  320.         {
  321.             calc = charToInt(x[length_x]);
  322.             calc += charToInt(y[length_y]);
  323.             calc += tmp;
  324.             erg += intToChar(calc % 10);
  325.             tmp = calc / 10;
  326.         }
  327.  
  328.  
  329.     }
  330. }
  331. string sub(string x, string y)
  332. {
  333.     //return "Noch nicht fertig";
  334.     int calc = 0;
  335.     int tmp = 0;
  336.     string erg;
  337.     int length_x = x.length();
  338.     int length_y = y.length();
  339.  
  340.     while (true)
  341.     {
  342.         length_x--;
  343.         length_y--;
  344.  
  345.         if (x == bigger(x, y))
  346.         {
  347.             if (length_x < 0 && length_y < 0)
  348.             {
  349.                 erg += intToChar(tmp);
  350.                 erg = nullPruefer(erg);
  351.                 if (erg == "")
  352.                 {
  353.                     return "0";
  354.                 }
  355.                 else
  356.                 {
  357.                     return invert(erg);
  358.                 }
  359.             }
  360.             else if (length_y < 0)
  361.             {
  362.                 calc = charToInt(x[length_x]);
  363.                 calc -= tmp;
  364.  
  365.                 if (calc < 0)
  366.                 {
  367.                     tmp = 1;
  368.                     erg += intToChar(calc + 10);
  369.                 }
  370.                 else
  371.                 {
  372.                     tmp = 0;
  373.                     erg += intToChar(calc);
  374.                 }
  375.             }
  376.             else
  377.             {
  378.                 calc = charToInt(x[length_x]);
  379.                 calc -= charToInt(y[length_y]);
  380.                 calc -= tmp;
  381.  
  382.                 if (calc < 0)
  383.                 {
  384.                     tmp = 1;
  385.                     erg += intToChar(calc + 10);
  386.                 }
  387.                 else
  388.                 {
  389.                     tmp = 0;
  390.                     erg += intToChar(calc);
  391.                 }
  392.  
  393.             }
  394.         }
  395.         else // y==bigger(x,y)
  396.         {
  397.             if (length_x < 0 && length_y < 0)
  398.             {
  399.                 erg += intToChar(tmp);
  400.                 erg = nullPruefer(erg);
  401.                 erg += "-";
  402.                 if (erg == "" || erg=="-")
  403.                 {
  404.                     return "0";
  405.                 }
  406.                 else
  407.                 {
  408.                     return invert(erg);
  409.                 }
  410.             }
  411.             else if (length_x < 0)
  412.             {
  413.                 calc = charToInt(y[length_y]);
  414.                 calc -= tmp;
  415.  
  416.                 if (calc < 0)
  417.                 {
  418.                     tmp = 1;
  419.                     erg += intToChar(calc + 10);
  420.                 }
  421.                 else
  422.                 {
  423.                     tmp = 0;
  424.                     erg += intToChar(calc);
  425.                 }
  426.             }
  427.             else
  428.             {
  429.                 calc = charToInt(y[length_y]);
  430.                 calc -= charToInt(x[length_x]);
  431.                 calc -= tmp;
  432.  
  433.                 if (calc < 0)
  434.                 {
  435.                     tmp = 1;
  436.                     erg += intToChar(calc + 10);
  437.                 }
  438.                 else
  439.                 {
  440.                     tmp = 0;
  441.                     erg += intToChar(calc);
  442.                 }
  443.  
  444.             }
  445.         }
  446.     }
  447. }
  448. string mult(string x, string y)
  449. {
  450.     string erg = "0";
  451.  
  452.     if (x == bigger(x, y))
  453.     {
  454.         for (string i = "0"; kleiner(i, y); i = add(i, "1"))
  455.         {
  456.             erg = add(erg, x);
  457.         }
  458.     }
  459.     else
  460.     {
  461.         for (string i = "0"; kleiner(i, x); i = add(i, "1"))
  462.         {
  463.             erg = add(erg, y);
  464.         }
  465.     }
  466.     return erg;
  467. }
  468. string div(string x, string y)
  469. {
  470.     if (y == "0")
  471.     {
  472.         cout << "You can't divide by 0";
  473.         cin.ignore();
  474.         return "Unendlich";
  475.     }
  476.  
  477.     string erg;
  478.     string counter = "0";
  479.     string i = "0";
  480.     bool komma = false;
  481.     bool kommaHook = true;
  482.  
  483.     do
  484.     {
  485.         if (x == bigger(x, y))
  486.         {
  487.             while(x == bigger(x, y))
  488.             {
  489.                 x = sub(x, y);
  490.                 counter = add(counter, "1");
  491.             }
  492.             if (komma && kommaHook)
  493.             {
  494.                 erg += ",";
  495.                 kommaHook = false;
  496.             }
  497.         }
  498.         erg += counter;
  499.         counter = "0";
  500.  
  501.         if (groesser(x,"0"))
  502.         {
  503.             x = mult(x, "10");
  504.             komma = true;
  505.         }
  506.  
  507.  
  508.         i = add(i, "1");
  509.     } while (kleinerGleich(i, "5") && komma);
  510.  
  511.     if (erg == "0")
  512.     {
  513.         return "0";
  514.     }
  515.  
  516.     erg = nullPruefer(erg);
  517.     return erg;
  518. }
  519. //Calculation End
  520.  
  521. //Menue Start
  522. void SuperStringCalcMenue()
  523. {
  524.     string x, y;
  525.     char auswahl, weiter;
  526.  
  527.     do
  528.     {
  529.         system("cls");
  530.         cout << "<1>Addieren" << endl;
  531.         cout << "<2>Subtrahieren" << endl;
  532.         cout << "<3>Multiplizieren" << endl;
  533.         cout << "<4>Dividieren" << endl;
  534.  
  535.         cin >> auswahl;
  536.         cin.ignore();
  537.         system("cls");
  538.  
  539.         switch (auswahl)
  540.         {
  541.         case '1':
  542.             cout << "Erste Zahl eingeben:" << endl;
  543.             cin >> x;
  544.             cin.ignore();
  545.             cout << "Zweite Zahl eingeben:" << endl;
  546.             cin >> y;
  547.             cin.ignore();
  548.             system("cls");
  549.  
  550.             cout << x << " + " << y << " = " << add(x, y) << endl;
  551.             break;
  552.  
  553.         case '2':
  554.             cout << "Erste Zahl eingeben:" << endl;
  555.             cin >> x;
  556.             cin.ignore();
  557.             cout << "Zweite Zahl eingeben:" << endl;
  558.             cin >> y;
  559.             cin.ignore();
  560.             system("cls");
  561.  
  562.             cout << x << " - " << y << " = " << sub(x, y) << endl;
  563.             break;
  564.  
  565.         case '3':
  566.             cout << "Erste Zahl eingeben:" << endl;
  567.             cin >> x;
  568.             cin.ignore();
  569.             cout << "Zweite Zahl eingeben:" << endl;
  570.             cin >> y;
  571.             cin.ignore();
  572.             system("cls");
  573.  
  574.             cout << x << " * " << y << " = " << mult(x, y) << endl;
  575.             break;
  576.  
  577.         case '4':
  578.             cout << "Erste Zahl eingeben:" << endl;
  579.             cin >> x;
  580.             cin.ignore();
  581.             cout << "Zweite Zahl eingeben:" << endl;
  582.             cin >> y;
  583.             cin.ignore();
  584.             system("cls");
  585.  
  586.             cout << x << " / " << y << " = " << div(x, y) << endl;
  587.             break;
  588.  
  589.         default:
  590.             cout << "Falsche Eingabe.";
  591.             cin.ignore();
  592.             exit;
  593.         }
  594.         cout << "Weitere Eingabe?(y/n): ";
  595.         cin >> weiter;
  596.         cin.ignore();
  597.  
  598.     } while (weiter == 'y' || weiter == 'Y');
  599. }
  600. //Menue End
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement