Advertisement
Guest User

Untitled

a guest
Jun 25th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.24 KB | None | 0 0
  1. /*********************************************
  2.  *  THE SCIENTIFIC PIECE OF CRAP CALCULATOR  *
  3.  *********************************************/
  4. // BUGFIXED VERSION
  5.  
  6. #include <stdio.h>
  7. #include <math.h>
  8.  
  9. double rounddouble(double input, int precision)
  10. {
  11.     return floor(input * pow(10, precision) + 0.5) / pow(10, precision);
  12. }
  13.  
  14. double inputdouble(char *query)
  15. {
  16.     double temp;
  17.     while (1)
  18.     {
  19.         printf("%s", query);
  20.         if (scanf(" %lf", &temp) == 1)
  21.         {
  22.             getchar();
  23.             return temp;
  24.         } else
  25.         {
  26.             while (getchar() != '\n')
  27.             {
  28.             }
  29.         }
  30.     }
  31. }
  32.  
  33. char inputrestricted(char *query, char *formatstring)
  34. {
  35.     int temp;
  36.     //BUGFIX
  37.         while (1)
  38.     {
  39.         printf("%s", query);
  40.         if (scanf(formatstring, (char *) &temp) == 1)
  41.             //BUGFIX
  42.         {
  43.             getchar();
  44.             return temp;
  45.         } else
  46.         {
  47.             while (getchar() != '\n')
  48.             {
  49.             }
  50.         }
  51.     }
  52.  
  53. }
  54.  
  55. int main(void)
  56. {
  57.     double op_1, op_2, result, resultrounded;
  58.     unsigned int op1query = 0;
  59.     unsigned int exitflag = 0;
  60.     unsigned int precision = 3;
  61.     unsigned char operator;
  62.     printf("**********************************************\n");
  63.     printf("*  THE SCIENTIFIC PIECE OF CRAP CALCULATOR   *\n");
  64.     printf("**********************************************\n\n");
  65.     printf("VALID OPERATORS: + - * / ^ S C T L R . Q\n");
  66.     printf("QUIT: Q\n");
  67.     printf("DISCARD ANS RESULT: .\n");
  68.     printf("ROUND RESULT: R\n");
  69.     precision = inputrestricted("DISPLAY SIGN.DIGITS [A,0,1,3]: ", " %[aA013]") - 0X30;
  70.     printf("%d", precision);
  71.     op_1 = inputdouble("#: ");
  72.     while (!exitflag)
  73.     {
  74.         switch (inputrestricted("OP: ", " %[+-*/^lLcCsStTqQrR.]"))
  75.         {
  76.         case '+':
  77.             op_2 = inputdouble("+: ");
  78.             result = op_1 + op_2;
  79.             switch (precision)
  80.             {
  81.             case 0:
  82.                 printf("%.f + %.f = %.f\n", op_1, op_2, result);
  83.                 break;
  84.             case 1:
  85.                 printf("%.1f + %.1f = %.1f\n", op_1, op_2, result);
  86.                 break;
  87.             case 3:
  88.                 printf("%.3f + %.3f = %.3f\n", op_1, op_2, result);
  89.                 break;
  90.             default:
  91.                 printf("%G + %G = %G\n", op_1, op_2, result);
  92.                 break;
  93.             }
  94.             break;
  95.         case '-':
  96.             op_2 = inputdouble("-: ");
  97.             result = op_1 - op_2;
  98.             switch (precision)
  99.             {
  100.             case 0:
  101.                 printf("%.f - %.f = %.f\n", op_1, op_2, result);
  102.                 break;
  103.             case 1:
  104.                 printf("%.1f - %.1f = %.1f\n", op_1, op_2, result);
  105.                 break;
  106.             case 3:
  107.                 printf("%.3f - %.3f = %.3f\n", op_1, op_2, result);
  108.                 break;
  109.             default:
  110.                 printf("%G - %G = %G\n", op_1, op_2, result);
  111.                 break;
  112.             }
  113.             break;
  114.         case '*':
  115.             op_2 = inputdouble("*: ");
  116.             result = op_1 * op_2;
  117.             switch (precision)
  118.             {
  119.             case 0:
  120.                 printf("%.f * %.f = %.f\n", op_1, op_2, result);
  121.                 break;
  122.             case 1:
  123.                 printf("%.1f * %.1f = %.1f\n", op_1, op_2, result);
  124.                 break;
  125.             case 3:
  126.                 printf("%.3f * %.3f = %.3f\n", op_1, op_2, result);
  127.                 break;
  128.             default:
  129.                 printf("%G * %G = %G\n", op_1, op_2, result);
  130.                 break;
  131.             }
  132.             break;
  133.         case '/':
  134.             if (op_2 = inputdouble("/: "))
  135.             {
  136.                 result = (double) op_1 / (double) op_2;
  137.                 switch (precision)
  138.                 {
  139.                 case 0:
  140.                     printf("%.f / %.f = %.f\n", op_1, op_2, result);
  141.                     break;
  142.                 case 1:
  143.                     printf("%.1f / %.1f = %.1f\n", op_1, op_2, result);
  144.                     break;
  145.                 case 3:
  146.                     printf("%.3f / %.3f = %.3f\n", op_1, op_2, result);
  147.                     break;
  148.                 default:
  149.                     printf("%G / %G = %G\n", op_1, op_2, result);
  150.                     break;
  151.                 }
  152.                 break;
  153.             } else
  154.             {
  155.                 printf("? DIVISOR ZERO\n");
  156.                 break;
  157.             }
  158.             break;
  159.         case '^':
  160.             op_2 = inputdouble("^: ");
  161.             if ((op_2 < 1 && op_1 > 0) || op_2 >= 1 || op_2 == 0)
  162.             {
  163.                 result = pow(op_1, op_2);
  164.                 switch (precision)
  165.                 {
  166.                 case 0:
  167.                     printf("%.f ^ %.f = %.f\n", op_1, op_2, result);
  168.                     break;
  169.                 case 1:
  170.                     printf("%.1f ^ %.1f = %.1f\n", op_1, op_2, result);
  171.                     break;
  172.                 case 3:
  173.                     printf("%.3f ^ %.3f = %.3f\n", op_1, op_2, result);
  174.                     break;
  175.                 default:
  176.                     printf("%G ^ %G = %G\n", op_1, op_2, result);
  177.                     break;
  178.                 }
  179.                 break;
  180.             } else
  181.             {
  182.                 printf("? COMPLEX ROOT\n");
  183.                 break;
  184.             }
  185.             break;
  186.         case 's':
  187.         case 'S':
  188.             result = sin(op_1 * M_PI / 180);
  189.             switch (precision)
  190.             {
  191.             case 0:
  192.                 printf("SIN(%.f) = %.f\n", op_1, result);
  193.                 break;
  194.             case 1:
  195.                 printf("SIN(%.1f) = %.1f\n", op_1, result);
  196.                 break;
  197.             case 3:
  198.                 printf("SIN(%.3f) = %.3f\n", op_1, result);
  199.                 break;
  200.             default:
  201.                 printf("SIN(%G) = %G\n", op_1, result);
  202.                 break;
  203.             }
  204.             break;
  205.         case 'c':
  206.         case 'C':
  207.             result = cos(op_1 * M_PI / 180);
  208.             switch (precision)
  209.             {
  210.             case 0:
  211.                 printf("COS(%.f) = %.f\n", op_1, result);
  212.                 break;
  213.             case 1:
  214.                 printf("COS(%.1f) = %.1f\n", op_1, result);
  215.                 break;
  216.             case 3:
  217.                 printf("COS(%.3f) = %.3f\n", op_1, result);
  218.                 break;
  219.             default:
  220.                 printf("COS(%G) = %G\n", op_1, result);
  221.                 break;
  222.             }
  223.             break;
  224.         case 't':
  225.         case 'T':
  226.             if (fmod(op_1 - 90, 180))
  227.             {
  228.                 result = tan(op_1 * M_PI / 180);
  229.                 switch (precision)
  230.                 {
  231.                 case 0:
  232.                     printf("TAN(%.f) = %.f\n", op_1, result);
  233.                     break;
  234.                 case 1:
  235.                     printf("TAN(%.1f) = %.1f\n", op_1, result);
  236.                     break;
  237.                 case 3:
  238.                     printf("TAN(%.3f) = %.3f\n", op_1, result);
  239.                     break;
  240.                 default:
  241.                     printf("TAN(%G) = %G\n", op_1, result);
  242.                     break;
  243.                 }
  244.             } else
  245.             {
  246.                 printf("? NOT DEFINED\n");
  247.             }
  248.             break;
  249.         case 'l':
  250.         case 'L':
  251.             if (op_1 > 0)
  252.             {
  253.                 result = log(op_1);
  254.                 switch (precision)
  255.                 {
  256.                 case 0:
  257.                     printf("LOG(%.f) = %.f\n", op_1, result);
  258.                     break;
  259.                 case 1:
  260.                     printf("LOG(%.1f) = %.1f\n", op_1, result);
  261.                     break;
  262.                 case 3:
  263.                     printf("LOG(%.3f) = %.3f\n", op_1, result);
  264.                     break;
  265.                 default:
  266.                     printf("LOG(%G) = %G\n", op_1, result);
  267.                     break;
  268.                 }
  269.             } else
  270.             {
  271.                 printf("? COMPLEX LOG\n");
  272.             }
  273.             break;
  274.         case '.':
  275.             printf("ANS DISCARDED.\n");
  276.             op1query = 1;
  277.             break;
  278.         case 'Q':
  279.         case 'q':
  280.             exitflag = 1;
  281.             break;
  282.         case 'R':
  283.         case 'r':
  284.             precision = inputrestricted("SIGN.DIGITS [0,1,3]: ", " %[013]") - 0X30;
  285.             printf("ROUNDED %G", result);
  286.             result = rounddouble(result, precision);
  287.             printf("-> %G\n", result);
  288.             break;
  289.         default:
  290.             printf("? ERROR, UNFORSEEN CASE.\n");
  291.             return -1;
  292.             break;
  293.         }
  294.         if (op1query)
  295.         {
  296.             op_1 = inputdouble("#: ");
  297.         } else
  298.         {
  299.             op_1 = result;
  300.         }
  301.         op1query = 0;
  302.     }
  303.     return 0;
  304. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement