2015-05-30 4 views
-1

Итак, обзор кода Я сделал калькулятор, который выполняет обычные операции, такие как сложение и т. Д. (Here was the question). Во всяком случае, я следил за советом и обновлял программу. Однако меню исходной программы отлично работает, оно выводит меню один раз, когда пользователь запускает программу, и когда они заканчивают выполнение вычисления, программа затем снова будет возвращаться к началу и из меню. Как и любой другой бесконечный цикл. Но я решил снова сделать программу с нуля, но на этот раз программа выводит меню дважды после того, как пользователь выполнит первый расчет. Я пробовал делать for(;;) вместо цикла do-while, но у меня такая же проблема. Я понятия не имею, что пошло не так, было бы очень признательно, если бы кто-то мог это исправить для меня, и поэтому я больше не сталкивался с этой проблемой.Loop выводит меню моей программы C дважды

Вот код:

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

void getNumbers(float *, float *); 
float addition(float, float); 
float subtraction(float, float); 
float multiplication(float, float); 
float division(float, float); 

int main(void) 
{ 
    do 
    { 
     float num1, num2; 
     char choice; 

     puts("\nEnter number or letter from below\n\n" 
      "\t1. Addition\n" 
      "\t2. Subtraction\n" 
      "\t3. Multiplication\n" 
      "\t4. Division\n" 
      "\tQ. Quit program"); 

     printf("\nEnter choice: "); 
     scanf("%c", &choice); 

     if(choice == 'q' || choice == 'Q') 
     { 
      puts("\nQuitting program..."); 
      exit(0); 
     } 
     else if(choice < '1' || choice > '4') 
     { 
      puts("\nInvalid input"); 
     } 
     else 
     { 
      getNumbers(&num1, &num2); 

      if(choice == '1') 
      { 
       printf("\n%.2f + %.2f = %.2f\n", num1, num2, addition(num1, num2)); 
      } 
      else if(choice == '2') 
      { 
       printf("\n%.2f - %.2f = %.2f\n", num1, num2, subtraction(num1, num2)); 
      } 
      else if(choice == '3') 
      { 
       printf("\n%.2f * %.2f = %.2f\n", num1, num2, multiplication(num1, num2)); 
      } 
      else if(choice == '4') 
      { 
       if(num2 == 0) 
       { 
        puts("\nDivision by zero"); 
       } 
       else if(num2 != 0) 
       { 
        printf("\n%.2f/%.2f = %.2f\n", num1, num2, division(num1, num2)); 
       } 
      } 
      else 
      { 
       puts("\nInvalid input"); 
      } 
     } 
    }while(1); 
    return 0; 
} 

void getNumbers(float *num1_ptr, float *num2_ptr) 
{ 
    printf("\nEnter first number: "); 
    scanf("%f", num1_ptr); 

    printf("\nEnter second number: "); 
    scanf("%f", num2_ptr); 
} 
float addition(float num1, float num2) 
{ 
    return num1 + num2; 
} 
float subtraction(float num1, float num2) 
{ 
    return num1 - num2; 
} 
float multiplication(float num1, float num2) 
{ 
    return num1 * num2; 
} 
float division(float num1, float num2) 
{ 
    return num1/num2; 
} 
+0

Вы можете попробовать добавить '' printf''s вокруг кода, чтобы увидеть, что он делает. –

+0

try 'scanf ("% c ", & choice);' change to 'scanf ("% c ", & choice);' для пропуска новой строки. – BLUEPIXY

+0

Работает, странно, как это было. В другой программе я сделал 'scanf («% c », & choice);' но не выводил меню дважды. –

ответ

0

Это может быть ваш scanf проблема? Попробуйте это:

scanf(" %c", &choice); 

, как вы имели его scanf мог оставить строку, которая будет потребляться в следующей итерации.

0

причина, по которой программа выходов Меню дважды

(включая сообщение «Invalid Input»)

потому, что значения вводятся с помощью возврата ключа

(не так много выбора о том, что)

Код не опорожняет stdin перед тем, как зациклиться на вершине цикла.

предполагают добавление только до конца цикла:

while(getchar() != '\n'); 
Смежные вопросы