1

3 つの計算を実行する単純な電卓を作成するために、C でクラスの割り当てがあります。まだすべての関数を完了していませんが、calcMenu 関数に問題があります。関数が呼び出されると、プログラムはすべての if else ステートメントを実行し、私には不明ですが、エラー チェックである else ステートメントのみを実行します。関数が再度実行されることは意図されていますが、今回はすべての if else ステートメントを実行するわけではなく、ユーザーが選択できるようになっています。本当にばかげたことをしたことはわかっていますが、この 1 時間は頭を悩ませていました。誰かが私に同情している場合は、私を正しい方向に向けてください. 私はすべてのシステムコールがいくらかイライラすることを知っていますが、これは基本的なクラスであり、私たちのインストラクターはそれらを使用するように私たちに言いました.

前もって感謝します、

マイク

#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は入力から 1 文字を読み取りますが、Enterキーは入力バッファーに残したままにして、次回呼び出したときに読み取られるようにしますscanf

scanfそれを解決するための非常に簡単なトリックがあります:フォーマット文字列の . の前後にスペースを置き"%c"ます。これにより、scanf空白がスキップされます。

scanf("%c ", &calculateOption);

デバッガーを使用してコードをステップ実行すると、それcalculateOptionが改行文字であることが簡単にわかります。

于 2013-01-17T00:34:20.313 に答える
1

まず第一に、これらのすべての printf ステートメントを 1 つの関数に凝縮して、余分な呼び出しを節約できます。

次に、おそらく関数をインデントする必要があります。一見しただけでは、関数の始まりと終わりがわかりません。

system("pause")第三に、を使用しないでくださいgetchar()

第 4 に、これはオプションです。これらの 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 に答える