Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*********************************************
- * THE SCIENTIFIC PIECE OF CRAP CALCULATOR *
- *********************************************/
- // BUGFIXED VERSION
- #include <stdio.h>
- #include <math.h>
- double rounddouble(double input, int precision)
- {
- return floor(input * pow(10, precision) + 0.5) / pow(10, precision);
- }
- double inputdouble(char *query)
- {
- double temp;
- while (1)
- {
- printf("%s", query);
- if (scanf(" %lf", &temp) == 1)
- {
- getchar();
- return temp;
- } else
- {
- while (getchar() != '\n')
- {
- }
- }
- }
- }
- char inputrestricted(char *query, char *formatstring)
- {
- int temp;
- //BUGFIX
- while (1)
- {
- printf("%s", query);
- if (scanf(formatstring, (char *) &temp) == 1)
- //BUGFIX
- {
- getchar();
- return temp;
- } else
- {
- while (getchar() != '\n')
- {
- }
- }
- }
- }
- int main(void)
- {
- double op_1, op_2, result, resultrounded;
- unsigned int op1query = 0;
- unsigned int exitflag = 0;
- unsigned int precision = 3;
- unsigned char operator;
- printf("**********************************************\n");
- printf("* THE SCIENTIFIC PIECE OF CRAP CALCULATOR *\n");
- printf("**********************************************\n\n");
- printf("VALID OPERATORS: + - * / ^ S C T L R . Q\n");
- printf("QUIT: Q\n");
- printf("DISCARD ANS RESULT: .\n");
- printf("ROUND RESULT: R\n");
- precision = inputrestricted("DISPLAY SIGN.DIGITS [A,0,1,3]: ", " %[aA013]") - 0X30;
- printf("%d", precision);
- op_1 = inputdouble("#: ");
- while (!exitflag)
- {
- switch (inputrestricted("OP: ", " %[+-*/^lLcCsStTqQrR.]"))
- {
- case '+':
- op_2 = inputdouble("+: ");
- result = op_1 + op_2;
- switch (precision)
- {
- case 0:
- printf("%.f + %.f = %.f\n", op_1, op_2, result);
- break;
- case 1:
- printf("%.1f + %.1f = %.1f\n", op_1, op_2, result);
- break;
- case 3:
- printf("%.3f + %.3f = %.3f\n", op_1, op_2, result);
- break;
- default:
- printf("%G + %G = %G\n", op_1, op_2, result);
- break;
- }
- break;
- case '-':
- op_2 = inputdouble("-: ");
- result = op_1 - op_2;
- switch (precision)
- {
- case 0:
- printf("%.f - %.f = %.f\n", op_1, op_2, result);
- break;
- case 1:
- printf("%.1f - %.1f = %.1f\n", op_1, op_2, result);
- break;
- case 3:
- printf("%.3f - %.3f = %.3f\n", op_1, op_2, result);
- break;
- default:
- printf("%G - %G = %G\n", op_1, op_2, result);
- break;
- }
- break;
- case '*':
- op_2 = inputdouble("*: ");
- result = op_1 * op_2;
- switch (precision)
- {
- case 0:
- printf("%.f * %.f = %.f\n", op_1, op_2, result);
- break;
- case 1:
- printf("%.1f * %.1f = %.1f\n", op_1, op_2, result);
- break;
- case 3:
- printf("%.3f * %.3f = %.3f\n", op_1, op_2, result);
- break;
- default:
- printf("%G * %G = %G\n", op_1, op_2, result);
- break;
- }
- break;
- case '/':
- if (op_2 = inputdouble("/: "))
- {
- result = (double) op_1 / (double) op_2;
- switch (precision)
- {
- case 0:
- printf("%.f / %.f = %.f\n", op_1, op_2, result);
- break;
- case 1:
- printf("%.1f / %.1f = %.1f\n", op_1, op_2, result);
- break;
- case 3:
- printf("%.3f / %.3f = %.3f\n", op_1, op_2, result);
- break;
- default:
- printf("%G / %G = %G\n", op_1, op_2, result);
- break;
- }
- break;
- } else
- {
- printf("? DIVISOR ZERO\n");
- break;
- }
- break;
- case '^':
- op_2 = inputdouble("^: ");
- if ((op_2 < 1 && op_1 > 0) || op_2 >= 1 || op_2 == 0)
- {
- result = pow(op_1, op_2);
- switch (precision)
- {
- case 0:
- printf("%.f ^ %.f = %.f\n", op_1, op_2, result);
- break;
- case 1:
- printf("%.1f ^ %.1f = %.1f\n", op_1, op_2, result);
- break;
- case 3:
- printf("%.3f ^ %.3f = %.3f\n", op_1, op_2, result);
- break;
- default:
- printf("%G ^ %G = %G\n", op_1, op_2, result);
- break;
- }
- break;
- } else
- {
- printf("? COMPLEX ROOT\n");
- break;
- }
- break;
- case 's':
- case 'S':
- result = sin(op_1 * M_PI / 180);
- switch (precision)
- {
- case 0:
- printf("SIN(%.f) = %.f\n", op_1, result);
- break;
- case 1:
- printf("SIN(%.1f) = %.1f\n", op_1, result);
- break;
- case 3:
- printf("SIN(%.3f) = %.3f\n", op_1, result);
- break;
- default:
- printf("SIN(%G) = %G\n", op_1, result);
- break;
- }
- break;
- case 'c':
- case 'C':
- result = cos(op_1 * M_PI / 180);
- switch (precision)
- {
- case 0:
- printf("COS(%.f) = %.f\n", op_1, result);
- break;
- case 1:
- printf("COS(%.1f) = %.1f\n", op_1, result);
- break;
- case 3:
- printf("COS(%.3f) = %.3f\n", op_1, result);
- break;
- default:
- printf("COS(%G) = %G\n", op_1, result);
- break;
- }
- break;
- case 't':
- case 'T':
- if (fmod(op_1 - 90, 180))
- {
- result = tan(op_1 * M_PI / 180);
- switch (precision)
- {
- case 0:
- printf("TAN(%.f) = %.f\n", op_1, result);
- break;
- case 1:
- printf("TAN(%.1f) = %.1f\n", op_1, result);
- break;
- case 3:
- printf("TAN(%.3f) = %.3f\n", op_1, result);
- break;
- default:
- printf("TAN(%G) = %G\n", op_1, result);
- break;
- }
- } else
- {
- printf("? NOT DEFINED\n");
- }
- break;
- case 'l':
- case 'L':
- if (op_1 > 0)
- {
- result = log(op_1);
- switch (precision)
- {
- case 0:
- printf("LOG(%.f) = %.f\n", op_1, result);
- break;
- case 1:
- printf("LOG(%.1f) = %.1f\n", op_1, result);
- break;
- case 3:
- printf("LOG(%.3f) = %.3f\n", op_1, result);
- break;
- default:
- printf("LOG(%G) = %G\n", op_1, result);
- break;
- }
- } else
- {
- printf("? COMPLEX LOG\n");
- }
- break;
- case '.':
- printf("ANS DISCARDED.\n");
- op1query = 1;
- break;
- case 'Q':
- case 'q':
- exitflag = 1;
- break;
- case 'R':
- case 'r':
- precision = inputrestricted("SIGN.DIGITS [0,1,3]: ", " %[013]") - 0X30;
- printf("ROUNDED %G", result);
- result = rounddouble(result, precision);
- printf("-> %G\n", result);
- break;
- default:
- printf("? ERROR, UNFORSEEN CASE.\n");
- return -1;
- break;
- }
- if (op1query)
- {
- op_1 = inputdouble("#: ");
- } else
- {
- op_1 = result;
- }
- op1query = 0;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement