0

簡単な計算プログラムを書いていますが、有効な出力が得られません。私が得ているのは、逆さまの疑問符だけです。また、プログラムの最後に、別の計算を入力するかどうかをユーザーに尋ねるプロンプトが表示されます。ただし、計算を入力すると、プロンプトがコンソールに 2 回表示されます。なぜこれらのことが起こっているのか誰か知っていますか?最後に、入力と出力の処理には getchar と putchar しか使用できません。助けてくれてありがとう。

int addFunction( int, int);
int subtractFunction(int, int);
int multiplyFunction(int, int);
int modulusFunction(int, int);
float divideFunction(float, float);

int main(int argc, const char * argv[])
{

int num1 = 0, num2 = 0, result = 0;
char  continuePrompt,  iochar = 0, operator = 0;

do {
    iochar = getchar();
    getchar();


    if ((iochar >= 0) && (iochar <= 20000)) {
        num1 = iochar; 
    }

    if ((iochar == '+') || (iochar == '-') || (iochar == '*') || (iochar == '/') || (iochar == '%')) {
        operator = iochar; 
    }

    if ((num1 >= 0) || ((iochar >= 0) && (iochar <= 20000))){
        num2 = iochar;
    }

    switch (operator) {

        case '+':
           iochar  = addFunction(num1, num2);
            break;

        case '-':
            iochar = subtractFunction(num1, num2);
            break;

        case '*':
            iochar = multiplyFunction(num1, num2);
            break;

        case '%':
            iochar = modulusFunction(num1, num2);
            break;

        case '/':
            iochar = divideFunction(num1, num2);
            break;

    }

    putchar(iochar);



    printf("Would you like to make another calulation? (y or n)");
    scanf("%c", &continuePrompt);

} while (continuePrompt != 'n');
return 0;
}

int addFunction(int x, int y){
    return x + y;
}

int subtractFunction(int x, int y){
     return x - y;
}

int multiplyFunction(int x, int y){
    return x * y;
}

int modulusFunction(int x, int y){
    return x % y;
}

float divideFunction(float x, float y){
    return x / y;
}
4

2 に答える 2

0

この関数は、コンソールから文字getcharを取得し、文字putcharをコンソールに配置します。一般的な入出力関数ではありません。getcharあなたのコードは、整数の 10 進数表現を読み取り、整数の 10 進数表現を出力することを期待しputcharているように見えますが、そのようには機能しません。getcharとしか使えないのでputchar、入力を解析して正しく表示するには、それらを使用して独自の入力/出力メソッドを作成する必要があります。したがって、まず、整数を解析して出力する方法を理解してください。次に、整数 (除算の推定値を表示する必要がある場合は浮動小数点数) の読み取りまたは書き込みが期待されるメソッドを使用します。式のどこからでも「現在の」数値文字列を実際に取得するヘルパー メソッドがあると役立つ場合があります。

于 2012-10-06T02:11:33.117 に答える
0

いくつかの基本...

文字値 '0' は、整数値 48 を持つasciiの整数値 0 と等しくありません。各数値を 1 桁にするだけの場合は、次のようになります。

char c = getchar();
// Assuming the user only will input a number...
int number = c - '0';

getchar() だけで整数を読み取るには、次のようにします。

#include <stdio.h>
#include <math.h> // for pow

int getint()
{
    char c;
    char buffer[255]; // way larger than an integer will ever be I think...
    int numlen = 0;
    int number = 0;
    int x;
    int multfornegative = 1;

    while ((c = getchar()) != '\n') {
        buffer[numlen++] = c;
    }

    for (x = numlen - 1; x >= 0; x--) {
        c = buffer[(numlen - 1) - x];
        if (c == '-') {
            multfornegative *= -1;
        } else {
            number += (c - '0') * (int)pow(10, x);
        }
    }

    return number * multfornegative;
 }

出力については、次のようにします...

void putint(int number)
{
    char digit;
    int x;
    int start;

    if (number < 0) {
        putchar('-');
        number *= -1;
    }

    start = log(number) / log(10);

    for (x = start; x >= 0; x--) {
        digit = ((number / (int)pow(10, x)) % 10) + '0';
        putchar(digit);
    }
}

また、入力をバラバラにしてみてください。ループ内での入力方法が混乱を招き、ロジックが混乱します。

int num1;
char op;
int num2;
int ans;

do {
    num1 = getint();
    op = getchar(); getchar();
    num2 = getint();

    switch(op) {
        case '+': ans = num1 + num2; break;
        case '-': ans = num1 - num2; break;
        // And so on...
    }
    putint(ans);
while (1);

C プログラミング言語は、C の発明者自身によって書かれた、C を学ぶために読むべき素晴らしい本です。

于 2012-10-06T02:19:36.970 に答える