Advertisement
Guest User

Challenge 3

a guest
Mar 22nd, 2013
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 21.98 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <windows.h>
  5. #include <math.h>
  6. #include <iomanip>
  7. using namespace std;
  8.  
  9. char charInput;
  10.  
  11.  
  12. long double bracket();
  13. long double exponent();
  14.  
  15. int main()
  16. {
  17.     HANDLE hConsole;
  18.     hConsole = GetStdHandle (STD_OUTPUT_HANDLE);
  19. SetConsoleTextAttribute
  20. (hConsole, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  21.  
  22.     cout.setf(ios::fixed, ios::floatfield);
  23.     cout.setf(ios::showpoint);
  24.     cout << fixed << setprecision(15);
  25.  
  26.     cout << "Challenge 3: Create a calculator that can do calculations in standard \n";
  27.     cout << "BEDMAS and use brackets" << endl << endl;
  28.     cout << "Issued by Stephen \"WhiteDragon103\" Smolley" << endl << endl;
  29.     cout << "Made by Jonathan Clement (C)2013 \n";
  30.     cout << "JonClement2012@gmail.com\n\n";
  31.  
  32.     cout << "Enter the equasion using the standard operators: (, ), +, -, *, /, ^, =" << endl;
  33.     cout << "Enter q to quit" << endl;
  34.  
  35.     for (;;)
  36.         {
  37.         long double result = bracket();
  38.         if ((charInput == 'q') || (charInput == 'Q'))
  39.             {break;}
  40.         else
  41.             {cout << result << endl << "\n";}
  42.         }
  43.     cout << "\nThank you for using my program! ^_^" << endl;
  44.     system ("PAUSE");
  45.     return 0;
  46. }
  47.  
  48. long double bracket()
  49. {
  50.     long double resultReturn = 0;
  51.     long double multStorage = 1;
  52.     long double digitReader = 0;
  53.     long double divisionEntry = 0;
  54.     long long int decimalPlacer = 1;
  55.     long double exponentEntry = 0;
  56.     bool multiplicationSlot = false;
  57.     bool negative = false;
  58.     bool decimal = false;
  59.     bool digitEntry = false;
  60.     bool divisionSlot = false;
  61.     //experimental
  62.     bool exponentSlot = false;
  63.  
  64.  
  65.     for (;;)
  66.     {
  67.         if (exponentSlot == false)
  68.         {cin >> charInput;}
  69.         switch (charInput)
  70.             {
  71.  
  72.             case '1':
  73.                 if (divisionSlot == true)
  74.                 {
  75.                 divisionEntry *= 10;
  76.                 divisionEntry += 1;
  77.                 if (decimal == true)
  78.                 {decimalPlacer *= 10;}
  79.                 digitEntry = true;
  80.                 }
  81.                 else
  82.                 {digitReader *= 10;
  83.                 digitReader += 1;
  84.                 if (decimal == true)
  85.                 {decimalPlacer *= 10;}
  86.                 digitEntry = true;
  87.                 }
  88.                 break;
  89.             case '2':
  90.                 if (divisionSlot == true)
  91.                 {
  92.                 divisionEntry *= 10;
  93.                 divisionEntry += 2;
  94.                 if (decimal == true)
  95.                 {decimalPlacer *= 10;}
  96.                 digitEntry = true;
  97.                 }
  98.                 else
  99.                 {digitReader *= 10;
  100.                 digitReader += 2;
  101.                 if (decimal == true)
  102.                 {decimalPlacer *= 10;}
  103.                 digitEntry = true;
  104.                 }
  105.                 break;
  106.             case '3':
  107.                 if (divisionSlot == true)
  108.                 {
  109.                 divisionEntry *= 10;
  110.                 divisionEntry += 3;
  111.                 if (decimal == true)
  112.                 {decimalPlacer *= 10;}
  113.                 digitEntry = true;
  114.                 }
  115.                 else
  116.                 {digitReader *= 10;
  117.                 digitReader += 3;
  118.                 if (decimal == true)
  119.                 {decimalPlacer *= 10;}
  120.                 digitEntry = true;
  121.                 }
  122.                 break;
  123.             case '4':
  124.                 if (divisionSlot == true)
  125.                 {
  126.                 divisionEntry *= 10;
  127.                 divisionEntry += 4;
  128.                 if (decimal == true)
  129.                 {decimalPlacer *= 10;}
  130.                 digitEntry = true;
  131.                 }
  132.                 else
  133.                 {digitReader *= 10;
  134.                 digitReader += 4;
  135.                 if (decimal == true)
  136.                 {decimalPlacer *= 10;}
  137.                 digitEntry = true;
  138.                 }
  139.                 break;
  140.             case '5':
  141.                 if (divisionSlot == true)
  142.                 {
  143.                 divisionEntry *= 10;
  144.                 divisionEntry += 5;
  145.                 if (decimal == true)
  146.                 {decimalPlacer *= 10;}
  147.                 digitEntry = true;
  148.                 }
  149.                 else
  150.                 {digitReader *= 10;
  151.                 digitReader += 5;
  152.                 if (decimal == true)
  153.                 {decimalPlacer *= 10;}
  154.                 digitEntry = true;
  155.                 }
  156.                 break;
  157.             case '6':
  158.                 if (divisionSlot == true)
  159.                 {
  160.                 divisionEntry *= 10;
  161.                 divisionEntry += 6;
  162.                 if (decimal == true)
  163.                 {decimalPlacer *= 10;}
  164.                 digitEntry = true;
  165.                 }
  166.                 else
  167.                 {digitReader *= 10;
  168.                 digitReader += 6;
  169.                 if (decimal == true)
  170.                 {decimalPlacer *= 10;}
  171.                 digitEntry = true;
  172.                 }
  173.                 break;
  174.             case '7':
  175.                 if (divisionSlot == true)
  176.                 {
  177.                 divisionEntry *= 10;
  178.                 divisionEntry += 7;
  179.                 if (decimal == true)
  180.                 {decimalPlacer *= 10;}
  181.                 digitEntry = true;
  182.                 }
  183.                 else
  184.                 {digitReader *= 10;
  185.                 digitReader += 7;
  186.                 if (decimal == true)
  187.                 {decimalPlacer *= 10;}
  188.                 digitEntry = true;
  189.                 }
  190.                 break;
  191.             case '8':
  192.                 if (divisionSlot == true)
  193.                 {
  194.                 divisionEntry *= 10;
  195.                 divisionEntry += 8;
  196.                 if (decimal == true)
  197.                 {decimalPlacer *= 10;}
  198.                 digitEntry = true;
  199.                 }
  200.                 else
  201.                 {digitReader *= 10;
  202.                 digitReader += 8;
  203.                 if (decimal == true)
  204.                 {decimalPlacer *= 10;}
  205.                 digitEntry = true;
  206.                 }
  207.                 break;
  208.             case '9':
  209.                 if (divisionSlot == true)
  210.                 {
  211.                 divisionEntry *= 10;
  212.                 divisionEntry += 9;
  213.                 if (decimal == true)
  214.                 {decimalPlacer *= 10;}
  215.                 digitEntry = true;
  216.                 }
  217.                 else
  218.                 {digitReader *= 10;
  219.                 digitReader += 9;
  220.                 if (decimal == true)
  221.                 {decimalPlacer *= 10;}
  222.                 digitEntry = true;
  223.                 }
  224.                 break;
  225.             case '0':
  226.                 if (divisionSlot == true)
  227.                 {
  228.                 divisionEntry *= 10;
  229.                 if (decimal == true)
  230.                 {decimalPlacer *= 10;}
  231.                 digitEntry = true;
  232.                 }
  233.                 else
  234.                 {digitReader *= 10;
  235.                 if (decimal == true)
  236.                 {decimalPlacer *= 10;}
  237.                 digitEntry = true;
  238.                 }
  239.                 break;
  240.  
  241.             //Complete for now
  242.             case '+':
  243.                 if (exponentSlot == true)
  244.                 {exponentSlot = false;}
  245.                 if (divisionSlot == true)
  246.                 {
  247.                 if (decimal == true)
  248.                     {
  249.                     divisionEntry /= decimalPlacer;
  250.                     decimalPlacer = 1;
  251.                     decimal = false;
  252.                     }
  253.                     if (negative == true)
  254.                     {
  255.                     divisionEntry = -divisionEntry;
  256.                     negative = false;
  257.                     }
  258.  
  259.                     digitReader /= divisionEntry;
  260.                     divisionSlot = false;
  261.                     divisionEntry = 0;
  262.  
  263.                     if (multiplicationSlot == true)
  264.                     {
  265.                     multStorage *= digitReader;
  266.                     resultReturn += multStorage;
  267.                     digitReader = 0;
  268.                     }
  269.                 }
  270.                 else
  271.                 {
  272.                 if (decimal == true)
  273.                 {
  274.                     digitReader /= decimalPlacer;
  275.                     decimalPlacer = 1;
  276.                     decimal = false;
  277.                 }
  278.                 if (negative == true)
  279.                 {
  280.                     digitReader = -digitReader;
  281.                     negative = false;
  282.                 }
  283.                 if (multiplicationSlot == true)
  284.                 {
  285.                     multStorage *= digitReader;
  286.                     resultReturn += multStorage;
  287.                     digitReader = 0;
  288.                 }
  289.                 }
  290.                 resultReturn += digitReader;
  291.                 digitReader = 0;
  292.                 multStorage = 1;
  293.                 multiplicationSlot = false;
  294.                 digitEntry = false;
  295.                 break;
  296.             case '-':
  297.                 if (exponentSlot == true)
  298.                 {exponentSlot = false;}
  299.                 if (digitEntry == false && negative == false)
  300.                 {
  301.                     negative = true;
  302.                     resultReturn += digitReader;
  303.                     digitReader = 0;
  304.                 }
  305.                 else if (digitEntry == false && negative == true)
  306.                 {
  307.                     negative = false;
  308.                     resultReturn += digitReader;
  309.                     digitReader = 0;
  310.                 }
  311.                 else
  312.                 {
  313.                 if (divisionSlot == true)
  314.                 {
  315.                 if (decimal == true)
  316.                     {
  317.                     divisionEntry /= decimalPlacer;
  318.                     decimalPlacer = 1;
  319.                     decimal = false;
  320.                     }
  321.                     if (negative == true)
  322.                     {
  323.                     divisionEntry = -divisionEntry;
  324.                     }
  325.  
  326.                     digitReader /= divisionEntry;
  327.                     divisionSlot = false;
  328.                     divisionEntry = 0;
  329.  
  330.                     if (multiplicationSlot == true)
  331.                     {
  332.                     multStorage *= digitReader;
  333.                     resultReturn += multStorage;
  334.                     }
  335.                     digitReader = 0;
  336.               }
  337.                 else
  338.                 {
  339.                 if (decimal == true)
  340.                 {
  341.                     digitReader /= decimalPlacer;
  342.                     decimalPlacer = 1;
  343.                     decimal = false;
  344.                 }
  345.                 if (negative == true)
  346.                 {
  347.                     digitReader = -digitReader;
  348.                 }
  349.                 if (multiplicationSlot == true)
  350.                 {
  351.                     multStorage *= digitReader;
  352.                     resultReturn += multStorage;
  353.                     digitReader = 0;
  354.                 }
  355.                 negative = true;
  356.                 }
  357.                 resultReturn += digitReader;
  358.                 digitReader = 0;
  359.                 multStorage = 1;
  360.                 multiplicationSlot = false;
  361.                 digitEntry = false;
  362.                 }
  363.                 break;
  364.  
  365.             //Seems done for now
  366.             case '*':
  367.                 if (exponentSlot == true)
  368.                 {exponentSlot = false;}
  369.                 if (divisionSlot == true)
  370.                 {
  371.                 if (decimal == true)
  372.                     {
  373.                     divisionEntry /= decimalPlacer;
  374.                     decimalPlacer = 1;
  375.                     decimal = false;
  376.                     }
  377.                     if (negative == true)
  378.                     {
  379.                     divisionEntry = -divisionEntry;
  380.                     negative = false;
  381.                     }
  382.  
  383.                     digitReader /= divisionEntry;
  384.                     divisionSlot = false;
  385.                     divisionEntry = 0;
  386.  
  387.                     if (multiplicationSlot == true)
  388.                     {
  389.                     multStorage *= digitReader;
  390.                     resultReturn += multStorage;
  391.                     digitReader = 0;
  392.                     }
  393.                 }
  394.                 else
  395.                 {
  396.                 if (decimal == true)
  397.                 {
  398.                     digitReader /= decimalPlacer;
  399.                     decimalPlacer = 1;
  400.                     decimal = false;
  401.                 }
  402.                 if (negative == true)
  403.                 {
  404.                     digitReader = -digitReader;
  405.                     negative = false;
  406.                 }
  407.                 if (multiplicationSlot == true)
  408.                 {
  409.                     multStorage *= digitReader;
  410.                     resultReturn += multStorage;
  411.                     digitReader = 0;
  412.                 }
  413.                 }
  414.                 multStorage *= digitReader;
  415.                 digitReader = 0;
  416.                 multiplicationSlot = true;
  417.                 digitEntry = false;
  418.                 break;
  419.  
  420.             //HIGHLY TENTATIVE
  421.             case '/':
  422.                 if (exponentSlot == true)
  423.                 {exponentSlot = false;}
  424.                 if (decimal == true)
  425.                 {
  426.                     digitReader /= decimalPlacer;
  427.                     decimalPlacer = 1;
  428.                     decimal = false;
  429.                 }
  430.                 if (negative == true)
  431.                 {
  432.                     digitReader = -digitReader;
  433.                     negative = false;
  434.                 }
  435.                 if (divisionSlot == true)
  436.                 {
  437.                     digitReader /= divisionEntry;
  438.                     divisionEntry = 0;
  439.                     divisionSlot = false;
  440.                 }
  441.                 divisionSlot = true;
  442.                 digitEntry = false;
  443.                 break;
  444.  
  445.             case '^':
  446.                 exponentEntry = exponent();
  447.                 digitReader = pow(digitReader, exponentEntry);
  448.                 exponentSlot = true;
  449.                 break;
  450.  
  451.  
  452.             case '=':
  453.                 if (exponentSlot == true)
  454.                 {exponentSlot = false;}
  455.                 if (divisionSlot == true)
  456.                 {
  457.                     digitReader /= divisionEntry;
  458.                     divisionSlot = false;
  459.                 }
  460.                 if (decimal == true)
  461.                 {
  462.                     digitReader /= decimalPlacer;
  463.                     decimalPlacer = 1;
  464.                     decimal = false;
  465.                 }
  466.                 if (negative == true)
  467.                 {
  468.                     digitReader = -digitReader;
  469.                     negative = false;
  470.                 }
  471.                 if (multiplicationSlot == true)
  472.                 {
  473.                     multStorage *= digitReader;
  474.                     resultReturn += multStorage;
  475.                     multiplicationSlot = false;
  476.                     multStorage = 1;
  477.                     digitReader = 0;
  478.                 }
  479.                 resultReturn += digitReader;
  480.                 digitEntry = false;
  481.                 return resultReturn;
  482.             case '.':
  483.                 decimal = true;
  484.                 break;
  485.             case '(':
  486.                    if (divisionSlot == true)
  487.                     {
  488.                        divisionEntry = bracket();
  489.                     }
  490.                    else
  491.                     {
  492.                         digitReader = bracket();
  493.                         digitEntry = false;
  494.                     }
  495.                    break;
  496.             case ')':
  497.                 if (divisionSlot == true)
  498.                 {
  499.                     digitReader /= divisionEntry;
  500.                     divisionSlot = false;
  501.                 }
  502.                 if (decimal == true)
  503.                 {
  504.                     digitReader /= decimalPlacer;
  505.                     decimalPlacer = 1;
  506.                     decimal = false;
  507.                 }
  508.                 if (negative == true)
  509.                 {
  510.                     digitReader = -digitReader;
  511.                     negative = false;
  512.                 }
  513.                 if (multiplicationSlot == true)
  514.                 {
  515.                     multStorage *= digitReader;
  516.                     resultReturn += multStorage;
  517.                     multiplicationSlot = false;
  518.                     multStorage = 1;
  519.                     digitReader = 0;
  520.                 }
  521.                 digitEntry = false;
  522.                 resultReturn += digitReader;
  523.                 return resultReturn;
  524.             case 'q':
  525.                 return 0;
  526.             case 'Q':
  527.                 return 0;
  528.             default:
  529.                 cout << "Please only use valid digits and operators!" << endl;
  530.                     resultReturn = 0;
  531.                     multStorage = 1;
  532.                     digitReader = 0;
  533.                     divisionEntry = 0;
  534.                     multiplicationSlot = false;
  535.                     negative = false;
  536.                     decimal = false;
  537.                     digitEntry = false;
  538.                     decimalPlacer = 1;
  539.  
  540.             }
  541.     }
  542. }
  543.  
  544. long double exponent()
  545. {
  546.     long double exponentEntry = 0;
  547.     long double exponentEntry2 = 0;
  548.     long double decimalDivider = 1;
  549.     bool digitEntry = false;
  550.     bool decimal = false;
  551.     bool negative = false;
  552.  for (;;)
  553.  {
  554.     cin >> charInput;
  555.     switch (charInput)
  556.     {
  557.          case '1':
  558.                 exponentEntry *= 10;
  559.                 exponentEntry += 1;
  560.                 if (decimal == true)
  561.                 {decimalDivider *= 10;}
  562.                 digitEntry = true;
  563.                 break;
  564.             case '2':
  565.                 exponentEntry *= 10;
  566.                 exponentEntry += 2;
  567.                 if (decimal == true)
  568.                 {decimalDivider *= 10;}
  569.                 digitEntry = true;
  570.                 break;
  571.             case '3':
  572.                 exponentEntry *= 10;
  573.                 exponentEntry += 3;
  574.                 if (decimal == true)
  575.                 {decimalDivider *= 10;}
  576.                 digitEntry = true;
  577.                 break;
  578.             case '4':
  579.                 exponentEntry *= 10;
  580.                 exponentEntry += 4;
  581.                 if (decimal == true)
  582.                 {decimalDivider *= 10;}
  583.                 digitEntry = true;
  584.                 break;
  585.             case '5':
  586.                 exponentEntry *= 10;
  587.                 exponentEntry += 5;
  588.                 if (decimal == true)
  589.                 {decimalDivider *= 10;}
  590.                 digitEntry = true;
  591.                 break;
  592.             case '6':
  593.                 exponentEntry *= 10;
  594.                 exponentEntry += 6;
  595.                 if (decimal == true)
  596.                 {decimalDivider *= 10;}
  597.                 digitEntry = true;
  598.                 break;
  599.             case '7':
  600.                 exponentEntry *= 10;
  601.                 exponentEntry += 7;
  602.                 if (decimal == true)
  603.                 {decimalDivider *= 10;}
  604.                 digitEntry = true;
  605.                 break;
  606.             case '8':
  607.                 exponentEntry *= 10;
  608.                 exponentEntry += 8;
  609.                 if (decimal == true)
  610.                 {decimalDivider *= 10;}
  611.                 digitEntry = true;
  612.                 break;
  613.             case '9':
  614.                 exponentEntry *= 10;
  615.                 exponentEntry += 9;
  616.                 if (decimal == true)
  617.                 digitEntry = true;
  618.                 break;
  619.             case '0':
  620.                 exponentEntry *= 10;
  621.                 if (decimal == true)
  622.                 {decimalDivider *= 10;}
  623.                 digitEntry = true;
  624.                 break;
  625.  
  626.             case '^':
  627.                 exponentEntry2 = exponent();
  628.                 if (decimal == true)
  629.                 {
  630.                 exponentEntry /= decimalDivider;
  631.                 decimalDivider = 1;
  632.                 }
  633.                 if (negative == true)
  634.                 {exponentEntry = -exponentEntry;}
  635.                 exponentEntry = pow(exponentEntry, exponentEntry2);
  636.                 return exponentEntry;
  637.             case '+':
  638.                 if (decimal == true)
  639.                 {
  640.                 exponentEntry /= decimalDivider;
  641.                 decimalDivider = 1;
  642.                 }
  643.                 if (negative == true)
  644.                 {exponentEntry = -exponentEntry;}
  645.                 return exponentEntry;
  646.             case '-':
  647.                 if (digitEntry == false)
  648.                 {
  649.                     negative = true;
  650.                     break;
  651.                 }
  652.                 else
  653.                 {
  654.                 if (decimal == true)
  655.                 {
  656.                 exponentEntry /= decimalDivider;
  657.                 decimalDivider = 1;}
  658.                 if (negative == true)
  659.                 {exponentEntry = -exponentEntry;}
  660.                 return exponentEntry;
  661.                 }
  662.             case '*':
  663.                 if (decimal == true)
  664.                 {
  665.                 exponentEntry /= decimalDivider;
  666.                 decimalDivider = 1;
  667.                 }
  668.                 if (negative == true)
  669.                 {exponentEntry = -exponentEntry;}
  670.                 return exponentEntry;
  671.             case '/':
  672.                 if (decimal == true)
  673.                 {
  674.                 exponentEntry /= decimalDivider;
  675.                 decimalDivider = 1;
  676.                 }
  677.                 if (negative == true)
  678.                 {exponentEntry = -exponentEntry;}
  679.                 return exponentEntry;
  680.             case '=':
  681.                 if (decimal == true)
  682.                 {
  683.                 exponentEntry /= decimalDivider;
  684.                 decimalDivider = 1;
  685.                 }
  686.                 if (negative == true)
  687.                 {exponentEntry = -exponentEntry;}
  688.                 return exponentEntry;
  689.             case '.':
  690.                 decimal = true;
  691.                 break;
  692.             case '(':
  693.                 exponentEntry = bracket();
  694.                 break;
  695.             case ')':
  696.                 return exponentEntry;
  697.             default:
  698.                 cout << "Please only use valid digits and operators!" << endl;
  699.         }
  700.     }
  701. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement