1

我有一个 C 类作业来制作一个执行三个计算的简单计算器。我还没有完成所有的功能,但是我的 calcMenu 功能有问题。当函数被调用时,程序运行所有的 if else 语句并且我不知道,只执行 else 语句,它是错误检查。然后再次运行该函数,但这次它没有运行所有 if else 语句并允许用户做出选择。我知道我做了一些非常愚蠢的事情,但在过去的一个小时里一直在绞尽脑汁。如果有人对我有任何不满,请指出我正确的方向。我知道所有的系统调用都会惹恼一些,但这是一门基础课,我们的教练告诉我们要使用它们。

提前致谢,

麦克风

#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#define pause system ("pause")
#define cls system ("cls")

//Prototype calculate functions here
void evenOrOdd(int userNumber);
void squareNum(int userNumber);
void cubeNum(int userNumber);
void calcMenu(int userNumber);

void main() {
    //Declare local variables here
int userNumber = 0;
printf("\t\t\tThe amazing three function caluculator\n\n\n");
printf("Please enter a whole number that you would like to calculate\n");
scanf("%d", &userNumber);


calcMenu(userNumber);
}



void calcMenu(int userNumber)
{
char calculateOption;
printf("\nWhat calculation would you like to perform with your number?\n\n");
printf("Press A.) to check if your number is even or odd.\n\n");
printf("Press B.) to calculate the square of your number.\n\n");
printf("Press C.) to calculate the cube of your number.\n\n");
printf("press D.) to exit the program.\n");
scanf("%c", &calculateOption);
calculateOption = toupper (calculateOption);



if (calculateOption == 'A')
{
    evenOrOdd(userNumber);
}
else if (calculateOption == 'B')
{
    squareNum(userNumber);
}
else if (calculateOption == 'C')
{
    cubeNum(userNumber);
}
else if (calculateOption == 'D')
{
    system("cls");
    printf("Thank You for using my amazing calculator.\n\n");
    system ("pause");
    system ("exit");
}
else
{
    printf("Please enter a valid choice");
    calcMenu(userNumber);
}


}


void evenOrOdd(int userNumber) {
userNumber = userNumber %2;
if (userNumber == 0)
{
    printf("Your number is even. \n");
}
else
{
    printf("Your number is odd. \n");
}

}
void squareNum(int userNumber) {

}
void cubeNum(int userNumber){

}
4

2 回答 2

2

当您阅读输入时,scanf您必须按Enter键以使程序继续。您的scanf调用从输入中读取单个字符,但Enter仍将密钥留在输入缓冲区中,以便下次调用时读取scanf

有一个非常简单的技巧可以解决这个问题:在scanf格式字符串的"%c". 这将scanf跳过空格。

scanf("%c ", &calculateOption);

如果您使用调试器单步执行代码,您会很容易看到这calculateOption将是换行符。

于 2013-01-17T00:34:20.313 回答
1

首先,您可以将所有这些 printf 语句压缩到一个函数中以节省额外的调用。

接下来,您可能应该缩进您的函数,我无法一眼看出一个从哪里开始,另一个在哪里结束。

三、不要用system("pause"),用getchar()

第四,这是可选的,您可能希望将这些 if 语句转换为 switch 语句。

现在,关于你的问题。首先,不要使用scanf("%c", &calculateOption),也可以getchar()在这里使用。在这种情况下,我会这样写 calcMenu():

int calcMenu(int userNumber){
    printf("\nWhat calculation would you like to perform with your number?\n\n\
    Press A.) to check if your number is even or odd.\n\n\
    Press B.) to calculate the square of your number.\n\n\
    Press C.) to calculate the cube of your number.\n\n\
    Press D.) to exit the program.\n");

    switch(toupper(getchar())){
        case 'A':
            evenOrOdd(userNumber);
            break;
        case 'B':
            squareNum(userNumber);
            break;
        case 'C':
            cubeNum(userNumber);
            break;
        case 'D':
            system("cls"); //this is bad, really.
            printf("Thank You for using my amazing calculator.\n\n");
            getchar();
            return 0;
        default:
            printf("Please enter a valid choice: ");
            calcMenu(userNumber);
            break;
    }
}

此外, main 应该始终返回一个值。void main是不好的做法。

免责声明:代码未经测试,无论如何您都不应该复制/粘贴它。我也不知道你是否被迫使用某些东西......

于 2013-01-17T00:42:22.893 回答