Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <ctype.h>
- #include <string.h>
- int validate(const char *number)
- {
- if (number == NULL)
- {
- return 2;
- }
- if (strpbrk(number, "+*/") != NULL)
- {
- return 1;
- }
- if (*number != '-' && strpbrk(number, "-") != NULL)
- {
- return 1;
- }
- if (*number =='\0' || *number == '\n' || *number == '+' || *number == '/' || *number == '*' || (*number == '-' && *(number + 1) == '\0'))
- {
- return 1;
- }
- if (strspn(number, "-1234567890") != strlen(number))
- {
- return 1;
- }
- return 0;
- }
- int compare(const char* number1, const char* number2)
- {
- if (number1 == NULL || number2 == NULL)
- {
- return 2;
- }
- if (validate(number1) == 1 || validate(number2) == 1)
- {
- return 3;
- }
- if (strcmp(number1, number2) < 0)
- {
- return -1;
- }
- if (strcmp(number1, number2) > 0)
- {
- return 1;
- }
- return 0;
- }
- char* itoa(int value, char* result, int base) {
- // check that the base if valid
- if (base < 2 || base > 36) { *result = '\0'; return result; }
- char* ptr = result, *ptr1 = result, tmp_char;
- int tmp_value;
- do {
- tmp_value = value;
- value /= base;
- *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + (tmp_value - value * base)];
- } while (value);
- // Apply negative sign
- if (tmp_value < 0) *ptr++ = '-';
- *ptr-- = '\0';
- while (ptr1 < ptr) {
- tmp_char = *ptr;
- *ptr-- = *ptr1;
- *ptr1++ = tmp_char;
- }
- return result;
- }
- int multiply(const char* number1, const char* number2, char** result) {
- if (number1 == NULL || result == NULL || number2 == NULL)
- {
- return 1;
- }
- if (validate(number1) == 1 || validate(number2) == 1)
- {
- return 2;
- }
- free(result);
- *result = *(char**) malloc(200 * sizeof(char *));
- if (!result)
- {
- return 3;
- }
- int n1 = atoi(number1);
- int n2 = atoi(number2);
- (*result) = itoa((n1 * n2), (*result), 10);
- return 0;
- }
- int subtract(const char* number1, const char* number2, char** result) {
- if (number1 == NULL || result == NULL || number2 == NULL)
- {
- return 1;
- }
- if (validate(number1) == 1 || validate(number2) == 1)
- {
- return 2;
- }
- free(result);
- *result = *(char**) malloc(200 * sizeof(char *));
- if (!result)
- {
- return 3;
- }
- int n1 = atoi(number1);
- int n2 = atoi(number2);
- (*result) = itoa((n1 - n2), (*result), 10);
- return 0;
- }
- int add(const char* number1, const char* number2, char** result) {
- if (number1 == NULL || result == NULL || number2 == NULL)
- {
- return 1;
- }
- if (validate(number1) == 1 || validate(number2) == 1)
- {
- return 2;
- }
- free(result);
- *result = *(char**) malloc(200 * sizeof(char *));
- if (!result)
- {
- return 3;
- }
- int n1 = atoi(number1);
- int n2 = atoi(number2);
- (*result) = itoa((n1 + n2), (*result), 10);
- return 0;
- }
- int validate_expression(const char* expr) {
- for (size_t i = 0; i < strlen(expr); i++) {
- if (isdigit(expr[i]))
- continue;
- else if ((expr[i] == '+' || expr[i] == '*' || expr[i] == '-')
- && (isdigit(expr[i + 1]) || expr[i + 1] == '-'))
- continue;
- else if (expr[i] == '-' && !isdigit(expr[i + 1]))
- return 1;
- else
- return 2;
- }
- return 0;
- }
- int calculate(const char* expr, char** result) {
- if (expr == NULL || result == NULL)
- {
- return 1;
- }
- if (validate_expression(expr) == 1)
- return 1;
- else if (validate_expression(expr) == 2)
- return 2;
- char* number1 = (char*)malloc(50);
- if (number1 == NULL)
- {
- return 3;
- }
- char* number2 = (char*)malloc(50);
- if (number2 == NULL)
- {
- free(number1);
- return 3;
- }
- char sing = 0;
- int count = 0;
- for (size_t i = 0; i < strlen(expr); i++) {
- if (i == 0) {
- while (isdigit(expr[i])) {
- number1[count] = expr[i];
- count++;
- i++;
- }
- }
- else {
- i--;
- for (int j = 0; (unsigned int)j < strlen(number1); j++)
- number1[j] = '\0';
- for (int j = 0; (unsigned int)j < strlen(number2); j++)
- number2[j] = '\0';
- strcpy(number1, (*result));
- }
- sing = expr[i];
- i++;
- count = 0;
- if (expr[i] == '-') {
- number2[count] = expr[i];
- count++;
- i++;
- }
- while (isdigit(expr[i])) {
- number2[count] = expr[i];
- count++;
- i++;
- }
- switch (sing) {
- case '+':
- add(number1, number2, result);
- break;
- case '-':
- subtract(number1, number2, result);
- break;
- case '*':
- multiply(number1, number2, result);
- break;
- }
- }
- free(number1);
- free(number2);
- return 0;
- }
- int main(void) {
- char* line = (char*)malloc(500);
- if (line == NULL)
- return 3;
- char** res = (char**) malloc(200 * sizeof(char *));
- scanf("%499s", line);
- int _T = calculate(line, res);
- if (_T == 0) {
- int answer = atoi(*res);
- printf("%i\n", answer);
- }
- else if (_T == 1)
- return 1;
- else if (_T == 2)
- return 2;
- else if (_T == 3)
- return 3;
- free(line);
- free(res);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement