2014-10-14 2 views
-2

Мне нужна ваша помощь при проверке ошибок для простого калькулятора. Большая часть кодирования выполнена, но у меня есть трудности с двумя вещами. Во-первых - когда пользователь вводит номер 45, пространство 5 + 5 должно быть ошибкой, так как существует пробел между 45 и 5, то же самое происходит со вторым номером, если есть пробел между двумя номерами Ошибка. Во-вторых - мне нужно включить его в цикл «do while». Я попытался, но не смог. Любая помощь приветствуется.Ошибка проверки простого калькулятора в C [Решено]

#include <stdio.h> 
#include <math.h> 

int addition(int num1, int num2); 
int subtract(int num1, int num2); 
int multi(int num1, int num2); 
int div(int num1, int num2); 
int modul(int num1, int num2); 

int main(void){ 


    int ch, sum = 0, num1 = 0, num2 = 0,operand =0, opcount =0, numcount1 = 0,numcount2 = 0; 


     while (((ch = getchar()) != EOF) && ch != '\n') { 
      if ((ch >= '0') && (ch <= '9')) { // digits 
       if (operand == 0) { 
        numcount1++; 
        num1 = ((num1 * 10) + (ch - '0')); // no operand so use num1 
       } 
       else { 
        numcount2++; 
        num2 = ((num2 * 10) + (ch - '0')); // operand has been assigned 
       } 
      } 
      else { // non digits 
       if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '%'){ 
        opcount++; 
        if (operand == 0) { // do not re-assign operand 
         operand = ch; // assign operand 
        } 
       } 
      } 

    } /* End of the while loop*/ 

    /*printf("\n Result of num1 %d \n", num1);  
    printf("\n Result of oper %c \n", operand);  
    printf("\n Result of num2 %d \n", num2); */  

    if (operand == '+' && opcount == 1 && numcount1 > 0 && numcount2 > 0) 
     printf("\n Result of %d + %d = %d \n",num1,num2, addition(num1,num2)); 
    else if (operand == '-' && opcount == 1 && numcount1 > 0 && numcount2 > 0) 
     printf("\n Result of %d - %d = %d \n", num1, num2, subtract(num1, num2)); 
    else if (operand == '*' && opcount == 1 && numcount1 > 0 && numcount2 > 0) 
     printf("\n Result of %d * %d = %d \n", num1, num2, multi(num1, num2)); 
    else if (operand == '/' && opcount == 1 && num2 != 0 && numcount1 > 0 && numcount2 > 0) 
     printf("\n Result of %d/%d = %d \n", num1, num2, div(num1, num2)); 
    else if (operand == '%' && opcount == 1 && num2 != 0 && numcount1 > 0 && numcount2 > 0) 
     printf("\n Result of %d %% %d = %d \n", num1, num2, modul(num1, num2)); 
    else printf("\n Expression Error \n"); 

} /* End of main*/ 


/********************************** FUNCTIONS ********************************************/ 

int addition(num1, num2){ 
    int sum = 0; 
    sum = num1 + num2; 
    return sum; 
} 

int subtract(num1, num2){ 
    int sub = 0; 
    sub = num1 - num2; 
    return sub; 
} 

int multi(num1, num2){ 
    int mul = 0; 
    mul = num1 * num2; 
    return mul; 
} 

int div(num1, num2){ 
    int d = 0; 
    d = num1/num2; 
    return d; 
} 

int modul(num1, num2){ 
    int m = 0; 
    m = num1 % num2; 
    return m; 
} 
+1

'INT сложение (num1, пит2)' должен быть 'INT сложение (INT num1, Int пит2)'. То же самое относится к другим функциям. – user1336087

+0

Спасибо, исправлено – Max

+0

В чем смысл «multi (num1, num2)», когда вы можете написать 'num1 * num2'? если бы у вас были указатели на функции, это имело бы смысл, но не так, как вы его используете. это просто * шум *. много этого. –

ответ

0

Этот цикл в то время как должны сообщать об ошибках, если пробелы включены в целочисленных входов

while (((ch = getchar()) != EOF) && ch != '\n') { 
    if ((ch >= '0') && (ch <= '9')) { // digits 
     if (operand == 0) { 
      if (whitespace && numcount1) { 
       printf ("error spaces between digits not allowed\n"); 
       return 1; 
      } 
      num1 = ((num1 * 10) + (ch - '0')); // no operand so use num1 
      numcount1++; 
      whitespace = 0; 
     } 
     else { 
      if (whitespace && numcount2) { 
       printf ("error spaces between digits not allowed\n"); 
       return 1; 
      } 
      num2 = ((num2 * 10) + (ch - '0')); // operand has been assigned 
      numcount2++; 
      whitespace = 0; 
     } 
    } 
    else { // non digits 
     if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '%'){ 
      if (operand == 0) { // do not re-assign operand 
       operand = ch; // assign operand 
       whitespace = 0; 
      } 
      else { 
       printf ("multiple operators not allowed\n"); 
       return 1; 
      } 
     } 
     whitespace = 1; 
    } 
} 
+0

большое спасибо. это то, что мне нужно. Он отлично работает, кроме цикла while. – Max

+0

спасибо user3121023. Я могу сделать цикл с функцией scanf, такой как scanf («% c% * c», и ответить), он отлично работает, но в getchar я не знаю, как получить символ без символа новой строки во входном файле. – Max

Смежные вопросы