Простой калькулятор с четырьмя действиями: найти ошибку в коде - C (СИ)
Формулировка задачи:
/* Простой калькулятор с четырмя действиями. */ #include <stdio.h> #include <stdlib.h> #define MAX 100 int *p; /* указатель на область свободной памяти */ int *tos; /* указатель на вершину стека */ int *bos; /* указатель на дно стека */ void push(int i); int pop(void); int main(void) { int a, b; char s[80]; p = (int *) malloc(MAX*sizeof(int)); /* получить память для стека */ if(!p) { printf("Ошибка при выделении памяти\n"); exit(1); } tos = p; bos = p + MAX-1; printf("Калькулятор с четырьмя действиями\n"); printf("Нажмите 'q' для выхода\n"); do { printf(": "); gets(s); switch(*s) { case '+': a = pop(); b = pop(); printf("%d\n", a+b); push(a+b); break; case '-': a = pop(); b = pop(); printf("%d\n", b-a); push(b-a); break; case '*': a = pop(); b = pop(); printf("%d\n", b*a); push(b*a); break; case '/': a = pop(); b = pop(); if(a==0) { printf("Деление на 0.\n"); break; } printf("%d\n", b/a); push(b/a); break; case '.': /* показать содержимое вершины стека */ a = pop(); push(a); printf("Текущее значение на вершине стека: %d\n", a); break; default: push(atoi(s)); } } while(*s != 'q'); return 0; } /* Занесение элемента в стек. */ void push(int i) { if(p > bos) { printf("Стек полон\n"); return; } *p = i; p++; } /* Получение верхнего элемента из стека. */ int pop(void) { p--; if(p < tos) { printf("Стек пуст\n"); return 0; } return *p; }
Решение задачи: «Простой калькулятор с четырьмя действиями: найти ошибку в коде»
textual
Листинг программы
/* Простой калькулятор с четырмя действиями. */ #include <stdio.h> #include <stdlib.h> #define MAX_DEPTH (128) #define MAX_INPUT_LEN (128) static int* pMem; /* указатель на область свободной памяти */ static int* pToS; /* указатель на вершину стека */ static int* pBoS; /* указатель на дно стека */ /* Занесение элемента в стек. */ static void push(int Item) { if (pMem > pBoS) { printf("Стек полон\n"); return; } *pMem = Item; ++pMem; } /* Получение верхнего элемента из стека. */ static int pop() { --pMem; if (pMem < pToS) { printf("Стек пуст\n"); return 0; } return *pMem; } int main(int argc,char** argv) { char pszInput[MAX_INPUT_LEN + 1]; int Op1 = 0; int Op2 = 0; pMem = (int*)malloc(MAX_DEPTH * sizeof(int)); /* получить память для стека */ if (!pMem) { printf("Ошибка при выделении памяти\n"); exit(1); } pToS = pMem; pBoS = pMem + (MAX_DEPTH - 1); printf("Калькулятор с четырьмя действиями\n"); printf("Нажмите 'q' для выхода\n"); do { printf(": "); gets(pszInput); switch (*pszInput) { case '+': { Op1 = pop(); Op2 = pop(); printf("%d\n",Op1 + Op2); push(Op1 + Op2); break; } case '-': { Op1 = pop(); Op2 = pop(); printf("%d\n",Op2 - Op1); push(Op2 - Op1); break; } case '*': { Op1 = pop(); Op2 = pop(); printf("%d\n",Op1 * Op2); push(Op1 * Op2); break; } case '/': { Op1 = pop(); Op2 = pop(); if (!Op1) { printf("Деление на 0.\n"); break; } printf("%d\n",Op2 / Op1); push(Op2 / Op1); break; } case '.': { /* показать содержимое вершины стека */ Op1 = pop(); push(Op1); printf("Текущее значение на вершине стека: %d\n",Op1); break; } default: { push(atoi(pszInput)); } } } while (*pszInput != 'q'); free(pMem); return 0; }
Объяснение кода листинга программы
Калькулятор с четырьмя действиями на языке C:
- Объявлены переменные:
- pMem - указатель на область свободной памяти
- pToS - указатель на вершину стека
- pBoS - указатель на дно стека
- Op1, Op2 - операнды операций
- pszInput - строка для ввода
- Выделена память под стек с помощью malloc. Если память не может быть выделена, программа выводит сообщение об ошибке и завершает работу.
- В основном цикле программы, который выполняется до тех пор, пока пользователь не введет 'q', происходит следующее:
- Считывается ввод пользователя
- В зависимости от введенного символа, выполняется соответствующая операция: сложение, вычитание, умножение, деление или просмотр стека
- Результат операции выводится на экран
- Если введенный символ является операцией, два последних значения стека используются как операнды
- Если введенный символ является числом, он преобразуется в целое число и добавляется в стек
- После окончания работы программы, освобождается выделенная память с помощью free.
- В случае ошибки, программа выводит сообщение и завершает работу с кодом 1. В противном случае, программа завершает работу с кодом 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д