Простой калькулятор с четырьмя действиями: найти ошибку в коде - 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.