Advertisement
Guest User

Untitled

a guest
Aug 19th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.79 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <string.h>
  5.  
  6. int validate(const char *number)
  7. {
  8.     if (number == NULL)
  9.     {
  10.         return 2;
  11.     }
  12.  
  13.     if (strpbrk(number, "+*/") != NULL)
  14.     {
  15.         return 1;
  16.     }
  17.  
  18.     if (*number != '-' && strpbrk(number, "-") != NULL)
  19.     {
  20.         return 1;
  21.     }
  22.  
  23.     if (*number =='\0' || *number == '\n' || *number == '+' || *number == '/' || *number == '*' || (*number == '-' && *(number + 1) == '\0'))
  24.     {
  25.         return 1;
  26.     }
  27.  
  28.     if (strspn(number, "-1234567890") != strlen(number))
  29.     {
  30.         return 1;
  31.     }
  32.  
  33.     return 0;
  34. }
  35.  
  36. int compare(const char* number1, const char* number2)
  37. {
  38.     if (number1 == NULL || number2 == NULL)
  39.     {
  40.         return 2;
  41.     }
  42.  
  43.     if (validate(number1) == 1 || validate(number2) == 1)
  44.     {
  45.         return 3;
  46.     }
  47.  
  48.     if (strcmp(number1, number2) < 0)
  49.     {
  50.         return -1;
  51.     }
  52.  
  53.     if (strcmp(number1, number2) > 0)
  54.     {
  55.         return 1;
  56.     }
  57.  
  58.     return 0;
  59. }
  60.  
  61. char* itoa(int value, char* result, int base) {
  62.     // check that the base if valid
  63.     if (base < 2 || base > 36) { *result = '\0'; return result; }
  64.  
  65.     char* ptr = result, *ptr1 = result, tmp_char;
  66.     int tmp_value;
  67.  
  68.     do {
  69.         tmp_value = value;
  70.         value /= base;
  71.         *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + (tmp_value - value * base)];
  72.     } while (value);
  73.  
  74.     // Apply negative sign
  75.     if (tmp_value < 0) *ptr++ = '-';
  76.     *ptr-- = '\0';
  77.     while (ptr1 < ptr) {
  78.         tmp_char = *ptr;
  79.         *ptr-- = *ptr1;
  80.         *ptr1++ = tmp_char;
  81.     }
  82.     return result;
  83. }
  84.  
  85. int multiply(const char* number1, const char* number2, char** result) {
  86. if (number1 == NULL || result == NULL || number2 == NULL)
  87.     {
  88.         return 1;
  89.     }
  90.     if (validate(number1) == 1 || validate(number2) == 1)
  91.     {
  92.         return 2;
  93.     }
  94.     free(result);
  95.     *result = *(char**) malloc(200 * sizeof(char *));
  96.     if (!result)
  97.     {
  98.         return 3;
  99.     }
  100.     int n1 = atoi(number1);
  101.     int n2 = atoi(number2);
  102.     (*result) = itoa((n1 * n2), (*result), 10);
  103.  
  104.     return 0;
  105. }
  106. int subtract(const char* number1, const char* number2, char** result) {
  107. if (number1 == NULL || result == NULL || number2 == NULL)
  108.     {
  109.         return 1;
  110.     }
  111.     if (validate(number1) == 1 || validate(number2) == 1)
  112.     {
  113.         return 2;
  114.     }
  115.     free(result);
  116.     *result = *(char**) malloc(200 * sizeof(char *));
  117.     if (!result)
  118.     {
  119.         return 3;
  120.     }
  121.     int n1 = atoi(number1);
  122.     int n2 = atoi(number2);
  123.     (*result) = itoa((n1 - n2), (*result), 10);
  124.  
  125.     return 0;
  126. }
  127. int add(const char* number1, const char* number2, char** result) {
  128. if (number1 == NULL || result == NULL || number2 == NULL)
  129.     {
  130.         return 1;
  131.     }
  132.     if (validate(number1) == 1 || validate(number2) == 1)
  133.     {
  134.         return 2;
  135.     }
  136.     free(result);
  137.     *result = *(char**) malloc(200 * sizeof(char *));
  138.     if (!result)
  139.     {
  140.         return 3;
  141.     }
  142.     int n1 = atoi(number1);
  143.     int n2 = atoi(number2);
  144.     (*result) = itoa((n1 + n2), (*result), 10);
  145.  
  146.     return 0;
  147. }
  148.  
  149. int validate_expression(const char* expr) {
  150.  
  151.     for (size_t i = 0; i < strlen(expr); i++) {
  152.         if (isdigit(expr[i]))
  153.             continue;
  154.         else if ((expr[i] == '+' || expr[i] == '*' || expr[i] == '-')
  155.             && (isdigit(expr[i + 1]) || expr[i + 1] == '-'))
  156.             continue;
  157.         else if (expr[i] == '-' && !isdigit(expr[i + 1]))
  158.             return 1;
  159.         else
  160.             return 2;
  161.     }
  162.     return 0;
  163. }
  164.  
  165. int calculate(const char* expr, char** result) {
  166.     if (expr == NULL || result == NULL)
  167.     {
  168.         return 1;
  169.     }
  170.  
  171.     if (validate_expression(expr) == 1)
  172.         return 1;
  173.     else if (validate_expression(expr) == 2)
  174.         return 2;
  175.  
  176.     char* number1 = (char*)malloc(50);
  177.     if (number1 == NULL)
  178.         {
  179.             return 3;
  180.         }
  181.     char* number2 = (char*)malloc(50);
  182.     if (number2 == NULL)
  183.         {
  184.             free(number1);
  185.             return 3;
  186.         }
  187.     char sing = 0;
  188.     int count = 0;
  189.  
  190.     for (size_t i = 0; i < strlen(expr); i++) {
  191.         if (i == 0) {
  192.             while (isdigit(expr[i])) {
  193.                 number1[count] = expr[i];
  194.                 count++;
  195.                 i++;
  196.             }
  197.         }
  198.         else {
  199.             i--;
  200.             for (int j = 0; (unsigned int)j < strlen(number1); j++)
  201.                 number1[j] = '\0';
  202.             for (int j = 0; (unsigned int)j < strlen(number2); j++)
  203.                 number2[j] = '\0';
  204.             strcpy(number1, (*result));
  205.         }
  206.  
  207.         sing = expr[i];
  208.         i++;
  209.         count = 0;
  210.  
  211.         if (expr[i] == '-') {
  212.             number2[count] = expr[i];
  213.             count++;
  214.             i++;
  215.         }
  216.         while (isdigit(expr[i])) {
  217.             number2[count] = expr[i];
  218.             count++;
  219.             i++;
  220.         }
  221.  
  222.         switch (sing) {
  223.         case '+':
  224.             add(number1, number2, result);
  225.             break;
  226.         case '-':
  227.             subtract(number1, number2, result);
  228.             break;
  229.         case '*':
  230.             multiply(number1, number2, result);
  231.             break;
  232.         }
  233.     }
  234.     free(number1);
  235.     free(number2);
  236.     return 0;
  237. }
  238.  
  239. int main(void) {
  240.     char* line = (char*)malloc(500);
  241.     if (line == NULL)
  242.         return 3;
  243.  
  244.     char** res = (char**) malloc(200 * sizeof(char *));
  245.  
  246.     scanf("%499s", line);
  247.  
  248.     int _T = calculate(line, res);
  249.  
  250.     if (_T == 0) {
  251.         int answer = atoi(*res);
  252.         printf("%i\n", answer);
  253.     }
  254.     else if (_T == 1)
  255.         return 1;
  256.     else if (_T == 2)
  257.         return 2;
  258.     else if (_T == 3)
  259.         return 3;
  260.  
  261.    
  262.     free(line);
  263.     free(res);
  264.     return 0;
  265. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement