Простой C caclulator с использованием getchar () - второй операнд неверен - PullRequest
0 голосов
/ 13 октября 2018

Мой профессор хотел, чтобы мы создали калькулятор, который принимает два положительных операнда и один оператор.Любые пробелы, которые вводит пользователь, должны игнорироваться.

проблема с ребенком, который у меня возникает с этим кодом:

else if (symbolRead == 1 && isNumber(ch)) {

num2 += (num2 * 10) + (ch - '0');
}

, если я введу 55 + 66, я вместо этого получу 55 + 72. Это можетиметь какое-то отношение к ascii.6 - это 54 в ascii, но я вообще не вижу, как 6 + = (6 * 10) + (54 - '0') дает 72.

Вот некоторая проверка ошибок, которую я сделал

Пожалуйста, введите простое арифметическое выражение: 55 + 66

до добавления: num1 равно 0

после добавления: num1 равно 5

до добавления: num1 равно 5

после добавления: num1 равно 55

до добавления: num2 равно 0

после добавления: num2 равно 6

до добавления: num2 равно 6

после добавления: num2 равно 72

Я хочу отметить, что если я, скажем, 55 + 7, я получу правильный ответ, так что это связано с тем, как num2 добавляет следующую цифру,Я знаю, что у кода есть некоторые другие проблемы, но это относительно сделано, когда я выясняю, почему это происходит.Ваша помощь очень ценится!

#include <stdio.h>

int addition(num1, num2);
int subtraction(num1, num2);
float division(num1, num2);
int multiply(num1, num2);
int modulus(num1, num2);

//functions made to act like isdigit, ispunct, and isspace
int isNumber(int chara);
int isSymbol(char chara);
int isASpace(int chara);

int main() {

    int ch, num1 = 0, num2 = 0, goAgain = 1, result = 0;
    char symbol = 0;
    int symbolRead = 0;
    int error = 0;

    printf("Welcome to simple calculator simulator.\nPlease enter a simple arithmetic expression: ");
    do {
        while ((ch = getchar()) != EOF && ch != '\n') {
            if (isASpace(ch)) {
                continue;
            }
            else if (!isNumber(ch) && !isSymbol(ch)) {
                printf("ERRORr: %d is not a valid input", ch);
                error = 1;
            }   //error checking

            if (error == 0) {
                if (symbolRead == 0 && isNumber(ch)) {
                    num1 = (num1 * 10) + (ch - '0');
                }
                else if (symbolRead == 1 && isNumber(ch)) {
                    num2 += (num2 * 10) + (ch - '0');
                }
                else if (isSymbol(ch)) {
                    symbol = ch;
                    symbolRead++;
                }
            }
        }
        if (symbolRead > 1) {
            printf("ERROR: More than one symbol detected. Please try again using only positive integers.");
            error = 1;
        }
        if (error == 0) {
            switch (symbol) {
            case '+':
                printf("You have selected addition. Calculating your result...\n");
                result = addition(num1, num2);
                printf("%d + %d = %d", num1, num2, result);

                break;
            case '-':
                printf("You have selected subtraction. Calculating your result...\n");
                result = subtraction(num1, num2);
                printf("%d - %d = %d", num1, num2, result);
                break;
            case '/':
                printf("You have selected integer division. Calculating your result...\n");
                result = division(num1, num2);
                printf("%d / %d = %d", num1, num2, result);
                break;
            case '*':
                printf("You have selected multiplication. Calculating your result...\n");
                result = multiply(num1, num2);
                printf("%d * %d = %d", num1, num2, result);
                break;
            case '%':
                printf("You have selected modulus divison. Calculating your result...\n");
                result = modulus(num1, num2);
                printf("%d %% %d = %d", num1, num2, result);
                break;
            }

        }
        printf("\nWould you like to try another expression? 1 for yes and 0 for no: ");
        scanf("%d", &goAgain);

    } while (goAgain == 1);

    system("pause");
    return 0;
}
int isASpace(int chara) {
    if (chara == ' ' || chara == '\t')
        return 1;
    return 0;
}
int isNumber(int chara) {
    if (chara >= 48 && chara <=57)
        return 1;
    return 0;
}
int isSymbol(char chara) {
    if (chara == '*' || chara == '%' || chara == '+' || chara == '/' || chara == '-')
        return 1;
    return 0;
}
int addition(num1, num2) {
    return (num1 + num2);
}
int subtraction(num1, num2) {
    return (num1 - num2);
}
float division(num1, num2) {
    return (num1 / num2);
}
int multiply(num1, num2) {
    return (num1 * num2);
}
int modulus(num1, num2) {
    return (num1 % num2);
}

1 Ответ

0 голосов
/ 13 октября 2018

решаемая.Проблема была вызвана незначительной синтаксической ошибкой:

num2 + = (num2 * 10) + (ch - '0')

против

num2 = (num2* 10) + (ch - '0')

...