-1

簡単な計算プログラムを書いていますが、使える文字列操作関数は getchar と putchar だけです。現在、入力から変数に数値を割り当てようとしていますが、変数を出力すると、それは乱数になります。たとえば、コンソールに 3 と入力すると、出力は 505110 でした。ありがとうございました。

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

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 iochar = 0;
char num1 = 0, num2 = 0, continuePrompt, 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

5 に答える 5

1

コードは正確に機能しています。実際には16進値であるASCIIで「3」を入力すると0x33、値はdec(%d)51で出力されるため、出力にaが表示されます。

ここで、入力された改行文字の使用に失敗しているためgetchar()、2回目のパスで入力をスキップし、ASCIIを渡したと想定しています'\n'。ASCIIは16進数である0xaため、10次に出力されます。

改行やスペースは印刷されないため、出力には次のように表示されます。

3 (I entered that)
5110 (the output from '3''\n')

主な問題を修正するには、改行文字を使用します。

int main(int argc, const char * argv[])  {
    int iochar, num1, num2;  
    char continuePrompt = 0, operator;
    do {
      iochar = getchar();  // Get input from user
      getchar(); //Consume new line character

値を出力するときは、ASCII値が返されるので、decが必要な場合は、文字でそれが必要な場合は問題ありません。

printf("%c", num1);

16進数で表示したい場合(0x ??)

printf("%#x", num1);

また、このような問題を見つけるのに役立つ出力の文字列よりも、新しい行やスペースなど、より役立つものを印刷します。

最後に、この条件:

while (continuePrompt != 'no');  

間違っている。それは起こり得ません。「n」と照合してください。単一の文字に「no」を含めることはできません。

于 2012-10-05T03:13:17.537 に答える
0

%cの代わりに使用%d

すなわち

printf("%c", num1);

また、変数を初期化する必要があります。

すなわち

int iochar=0, num1=0, num2=0;
char continuePrompt = 0, operator=0;
于 2012-10-05T02:55:13.290 に答える
0

と のみ使用が許可されているため、結果を提示するために使用することは許可されていないputchargetchar思います。printf実際の数値を使用するには、putchar各桁を取得して正しい ASCII 値に変換する必要があります。

幸いなことに、これは非常に簡単です。

digitRepresentationASCIIValue == singleDigitValue + '0';

ただし、これは 1 桁でのみ機能します。したがって、数値の長さを取得し、putchar各桁に使用する必要があります。これは非常に簡単です:

void putNumber(int num){
    int order = 1; // even zero has at least one digit
    int tmp = num; // even zero has at least one digit

    while(tmp /= 10)
        order *= 10; // count digits

   if(num < 0)
       putchar('-'); // sign

    while(order > 0){
        // put a single digit, see above how to calculate the ASCII value
        putchar('0' + ( ( num / order ) % 10));
        order /= 10;
    }
}

実際に値を読み取るには、まったく逆のことを行う必要があります。提供された文字がgetchar数字であるかどうかを確認し、現在の数値を変更します。

int num[2] = {0,0};
int currentNum = 0;
int iochar = getchar();

while(!isNewline(iochar) && iochar != EOF){
    if(isDigit(iochar)){
        num[currentNum] = num[currentNum] * 10 + iochar - '0';
    }
    else if(isOperator(iochar)){
        if(currentNum == 1)
            num[0] = operate(num[0],num[1],operator);
        else
            currentNum = 1;
        operator = iochar;
        num[1] = 0;
    }
    iochar = getchar();
}

isDigitisNewlineおよびisOperand演習用に残されています。3 つすべては非常に単純ですが、ASCII 値のより良いアイデアを提供します。あなたの発言operateが含まれています。switch

を使用したことに注意してくださいint num[2] = {0,0};。これにより、(に加えてcurrentNum)次のようなものを書くことができます

3 + 3 + 3 / 9

すべての演算子は左から右に評価されることに注意してください。そのため、上記の例の結果は 6.3333333 ではなく 1 になります。

演習:

ここでソリューションを公開しないでください。ただし、ASCII/文字のスキルを向上させるのに役立つはずなので、自分で公開してください。一部の演習では、ASCII テーブルが役立つ場合があります。

  1. 数字の表現がとても単純な理由を説明してください。ヒント: 数値は ASCII で定義されている場所と順序は? char の値を増やすとどうなりますか?
  2. 不足しているisDigitisNewlineおよび を実装しisOperandます。
  3. 入力のコードはコメントされていません。特に次の行にはコメントがありません。

        num[currentNum] = num[currentNum] * 10 + iochar - '0';
    

    そこでは正確に何が起こりますか?現時点で複雑すぎる場合num[currentNum]は、num1 を使用して、2 番目の値を読み取る前に値を出力してください。ヒント: 練習問題 #1 を見てください。

  4. 演算子が正しい順序 (加算の前に乗算) で評価されたとしても、結果は 6.333333 ではなく 6 になります。なぜでしょうか? 現在のプログラムで何を変更する必要がありますか?

于 2012-10-06T01:10:01.647 に答える
-3

最初に、「getchar」からの入力をキャストする必要があります。これは ascii 入力であるためです。

    iochar = atoi(getchar());

その後、整数値と比較できます。

于 2012-10-05T02:53:15.627 に答える
-3

まず、戻り値getcharischarを に昇格させintます。そのため、変数を使用しcharて格納してください。

次に、入力charをに変換するには、次のintようなものを使用します。

int num1 = iochar - '0';
于 2012-10-05T02:59:29.360 に答える