Ошибка

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
CMSon
Сообщения: 1
Зарегистрирован: 01 фев 2013, 14:16

Добрый день.
Помогите исправить ошибку: чтобы калькулятор воспринимал не только положительные, но и отрицательные числа.

Код: Выделить всё

int main()
{
    FILE *f;
    f=fopen(FNAME, "r");
    int stack[200];
    char q[200];
    int sp = 0;
    while(!feof(stdin))
    {
        if(scanf ("%s", q) != 1 )
        {
            break;
        }
        int LengthString = strlen(q);
        if (LengthString == 1)
        {
            switch(q[0])
            {
            case '\0':
                break;
            case '=':
                printf("Result = %d\n", stack[--sp]);
                break;
            case '+':
                stack[sp-2] = stack[sp-2] + stack[sp-1];
                sp--;
                break;
            case '-':
                stack[sp-2] = stack[sp-2] - stack[sp-1];
                sp--;
                break;
            case '*':
                stack[sp-2] = stack[sp-1] * stack[sp-2];
                sp--;
                break;
            case '/':
                stack[sp-2] = stack[sp-1] / stack[sp-2];
                sp--;
                break;
            default:
                stack[sp++] = atoi(q);
            }
        }
    }
    return 0;
    getch();
}
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

Если введенное выражение будет начинаться знаком минус, то в блоке case '-' будет обращение за пределы массива stack, так как переменная sp-2 даст -2. Проверяйте sp на 0. Но это не единственная ошибка у вас: допустим мы водим последовательно "2+2=", после первой двойки stack[0] примет значение 2, а sp станет равно 1, а когда будет обрабатываться '+', то, опять же, sp-2 даст -1 и снова выход за пределы массива. А если будет введен какой либо иной символ, отличный от цифры и математической операции? У вас сработает блок default и что будет тогда, справится ли с этим функция atoi()? В общем, нужно думать над алгоритмом действий, так как здесь много ошибок.
Ответить