2016-03-13 78 views
1

有史以來第一次C編程類。我必須使用putchar/getchar創建一個C計算器。下面的代碼,如果我有什麼,並循環詢問用戶輸入。我遇到的問題是如何在輸入之前考慮空格/多個空格,數字和操作數之間的空格/多個空格,操作數和數字之間沒有空格,以及用戶輸入完成後的空格。C計算器與getchar/putchar

現在代碼將在數字和操作數之間使用一個空格。

含義,10 + 5作品。但是,例如,10 + 5不會和____5 + 10(其中__ =空格)或10 + 5 ______或10 _________ + 10不起作用。

任何建議或幫助如何計算數字和操作數之間的多個空間,以及在任何用戶輸入之後如何計算非常大的讚賞。

非常感謝您對當前代碼的所有幫助。真的很感謝你的幫助和時間!

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

int add(int input1, char operand, int input2); 
int subtract(int input1, char operand, int input2); 
int mod(int input1, char operand, int input2); 
int multiply(int input1, char operand, int input2); 
int divide(int input1, char operand, int input2); 
char cont(void); 

int main() 
{ 

    int answer = 0; 
    int ch = 0; 
    int input1 = 0; 
    char operand = 0; 
    int input2 = 0; 
    int function = 0; 
    char flag; 

    do { 

     input1 = 0, input2 = 0, operand = 0; 

     printf("\nPlease enter a calculation to be made.\n"); 

      while (((ch = getchar()) != ' ') && (ch != EOF) && (ch != '\n')){ 

      if (ch == '-') { 
      printf("\nError: no negatives allowed.\n"); 

      } 

      else if (!isdigit(ch)){ 
       printf("\nError: number not inputted (first number).\n"); 
       } 

     else { 

      input1 = (input1 * 10) + (ch - '0'); 
     } 
    } 


     while (((ch = getchar()) != ' ') && (ch != EOF) && (ch != '\n')){ 

      switch (ch){ 

      case '+': 
       operand = '+'; 
       break; 

      case '-': 
       operand = '-'; 
       break; 

      case '%': 
       operand = '%'; 
       break; 

      case '*': 
       operand = '*'; 
       break; 

      case '/': 
       operand = '/'; 
       break; 

      default: 
       printf("Error: input is not one of the allowed operands."); 
       break; 

      } 

     } 

    while (((ch = getchar()) != ' ') && (ch != '\n')){ 

     if (ch == '-') { 
      printf("\nError: no negatives allowed.\n"); 
     } 

     else if (!isdigit(ch)){ 
      printf("\nError: number not inputted (second number).\n"); 
     } 

     else { 
      input2 = (input2 * 10) + (ch - '0'); 
      } 
     } 

     printf("%d", input1); 
     putchar(' '); 

     printf("%c", operand); 
     putchar(' '); 

     printf("%d", input2); 

     putchar(' '); 
     putchar('='); 
     putchar(' '); 

     if (operand == '+'){ 
     answer = add(input1, operand, input2); 
     printf("%d", answer); 
    } 
    else if (operand == '-'){ 
     answer = subtract(input1, operand, input2); 
     printf("%d", answer); 
    } 
    else if (operand == '%'){ 
     answer = mod(input1, operand, input2); 
     printf("%d", answer); 
    } 
    else if (operand == '*'){ 
     answer = multiply(input1, operand, input2); 
     printf("%d", answer); 
    } 
    else if (operand == '/'){ 
     answer = divide(input1, operand, input2); 
     printf("%d", answer); 

    } 

    flag = cont(); 

    } 

    while (flag == 'y' || flag == 'Y'); 

    return 0; 
    } 

int add(int input1, char operand, int input2){ 

    return input1 + input2; 

} 

int subtract(int input1, char operand, int input2){ 

    return input1 - input2; 

} 

int mod(int input1, char operand, int input2){ 

    return input1 % input2; 

} 

int multiply(int input1, char operand, int input2){ 

    return input1 * input2; 

} 

int divide(int input1, char operand, int input2){ 

    return input1/input2; 

} 

char cont() 
{ 

    char flag; 
    printf("\nDo you want to process another calculation (y/n)? "); 
    scanf("%c%*c", &flag); 
    return flag; 
} 
+0

在'case'+''while()'循環中,代碼需要在'+'之後跳出循環。不需要尋找更多的操作數。 – chux

+0

你應該考慮爲你的輸入創建2個函數。第一個接受數字,第二個接受操作數。如果不是一致的字符,如空格,兩者都必須小心。你的代碼會更簡單,你可以更好地調試它。 – LPs

回答

0

好的!該問題的解決方案涉及瞭解getchar()如何工作。它還包括來自標準輸入[stdin]的輸入如何工作的概念。因此,無論何時使用scanf()/ getchar()進行變量輸入時,都需要進行任何操作,以便提醒編譯器確認變量的輸入。一個是新行\n(按Enter鍵),另一個是white-space。他們會警惕輸入是最終確定的。

這通過輸入10 + 5 [Press Enter]解釋。第一個空格確保ch的值爲10,因此input1的值爲10.然後+接通,operand的值得到+。之後,在寫入5之後,Enter被按下。這將在input2中節省價值5。其餘的操作完美無缺。

在其他情況下,我們有這麼多的空間____5 + 10/10+5______/10_________+ 10我們必須看看代碼將如何跟隨這種輸入。

  1. _____5+10第一個空間將錯過第一個while循環,因爲空間是退出條件。然後控制轉到第二個while循環,其中第二個空間也將是循環的退出條件。第三個while循環也會發生同樣的情況,它也會退出。因此,答案將是input1 operand input2,並且所有這些都具有默認值,即0,0(當縮小到字符時爲空)和0。
  2. 10+5_____這裏的第一空間顯得5之後,因此,getchar()將飼料input1與價值觀10+5和其他兩個變量甚至沒有得到分配。

這顯示了爲什麼變量無法賦值給我們預期的值。這個問題的解決方案可以通過額外的處理來解決,但是會對空間的顯示方式進行檢查。