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

  1. Объявлены переменные:
    • pMem - указатель на область свободной памяти
    • pToS - указатель на вершину стека
    • pBoS - указатель на дно стека
    • Op1, Op2 - операнды операций
    • pszInput - строка для ввода
  2. Выделена память под стек с помощью malloc. Если память не может быть выделена, программа выводит сообщение об ошибке и завершает работу.
  3. В основном цикле программы, который выполняется до тех пор, пока пользователь не введет 'q', происходит следующее:
    • Считывается ввод пользователя
    • В зависимости от введенного символа, выполняется соответствующая операция: сложение, вычитание, умножение, деление или просмотр стека
    • Результат операции выводится на экран
    • Если введенный символ является операцией, два последних значения стека используются как операнды
    • Если введенный символ является числом, он преобразуется в целое число и добавляется в стек
  4. После окончания работы программы, освобождается выделенная память с помощью free.
  5. В случае ошибки, программа выводит сообщение и завершает работу с кодом 1. В противном случае, программа завершает работу с кодом 0.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.3 из 5