2014-10-17 34 views
0

我寫了代碼來計算操作爲+,-,*, /,階乘和其他。問題是我的代碼有一次很好用。它顯示:問題C中的多重條件

Zadajte operaciu

這意味着 「寫你想要做什麼」。但第一次循環結束後。它顯示:

Zadajte operaciu:Zadajte operaciu:

兩次,我不知道爲什麼。

這裏是我的代碼:

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

int main() 
{ 
int a,b,vysledok; 
char s; 
do{ 

printf("Zadajte operaciu:"); 

s=getchar(); 
if(s=='+' || s== '-' ||s== '*' || s=='/' ||s== '^') 
{ 
    puts("Operacia je binarna.\nZadaj prvy operand: "); 
    scanf("%d",&a); 
    puts("Zadaj druhy operand: "); 
    scanf("%d",&b); 

    switch (s){ 
    case '+': 
     printf("Vysledok je %d.\n",a+b); 
     break; 
    case '-': 

     printf("Vysledok je %d.\n",a-b); 
     break; 
    case '/': 

     if(b==0) 
      puts("CHYBA: nulou sa delit neda.\n"); 
     else 
      printf("Vysledok je %d.\n",a/b); 
     break; 
    case '*': 
     printf("Vysledok je %d.\n",a*b); 
     break; 
    case '^': 
     for(a;a>0;a--) 
      b=b*b; 
     printf("Vysledok je %d.\n",b); 
     break; 
}} 
else if(s== '!' || s=='s') 
{ 
    puts("Operacia je unarna.\nZadaj prvy argument: "); 
    scanf("%d",&a); 
    switch (s){ 

    case '!': 
     vysledok=a; 
     for(a;a>0;a--) 
      vysledok=vysledok*a; 
     printf("Vysledok je %d.\n",vysledok); 
     break; 
    case 's': 
     vysledok=sqrt(a); 
     printf("Vysledok je %f.\n",(float)vysledok); 
     break; 
}} 
else if(s=='q') 
    puts("Zadany prikaz quit. Ukoncujem."); 

} while (s!='q'); 

return 0; 

}

回答

1

After輸入數值,您按回車鍵(\n)。這個角色留在stdin。在第二次迭代中,getchar獲取\n字符,並且由於它不符合if之後的條件,因此if的主體未得到執行,並且隨着while中的條件爲真,下一次迭代開始,因此將其打印出來兩次。

若要刪除字符,你需要clear your stdin

+0

謝謝,現在我明白的地方是問題:) – Peter2235 2014-10-17 14:11:36

0

你需要清空你的緩衝區在每次通話後的getchar這樣做如下:

s = getchar(); 
while((s = getchar()) != EOF & s != '\n'); 

,而不是一個單純:

s = getchar(); 
1

之前,S =的getchar只使用getch()函數();

getch(); 
s=getchar(); 

,可以幫助你,或者你可以使用

scanf(" %c",&s); 

的不是s =的getchar();

不要忘了把空間%C之前

+0

我用scanf函數和現在的工作。 getch()之前它沒有工作,因爲我需要把操作兩次。 :) – Peter2235 2014-10-17 14:11:07