Advertisement
Guest User

Untitled

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