Не запускается прога из Керниган и Ритчи - C (СИ)

Узнай цену своей работы

Формулировка задачи:

программа-калькулятор
#include <conio.h>
#include <math.h>
#include <stdio.h>
 
#define MAXOP   20  /* MAX SIZE OF OPERAND, OPERГЂTOR */
#define NUMBER '0'  /* SIGNAL THAT NUMBER FOUND */
#define TOOBIG '9'
 
main()  /* REVERSE POLISH DESK CALCULATOR */
   {
   
    int tupe;
    char s[MAXOP];
    double op2,atof(),pop(),push();
 
    while ((tupe=getop(s,MAXOP)) != EOF);
      switch(tupe) {
      case NUMBER:
           push(atof(s));
           break;
      case '+':
           push(pop()+pop());
           break;
      case '*':
           push(pop()*pop());
           break;
      case '-':
           op2=pop();
           push(pop()-op2);
           break;
      case '/':
           op2=pop();
           if (op2 != 0.0)
   push(pop()/op2);
           else
              printf("ZERO DIVISOR POPPED");
           break;
      case '=':
           printf("%f",push(pop()));
           break;
      case 'C':
           clear();
           break;
      case TOOBIG:
           printf("%.20s ... IS TOO LONG",s);
           break;
           }
           getch();
}
   #define MAXVAL 100 /* MAXIMUM DEPTH OF VAL STACK */

   int sp = 0;        /* STACK POINTER */
   double val[MAXVAL]; /*VALUE STACK */
   double push(f)    /* PUSH F ONTO VALUE STACK */
   double f;
   {
    if (sp < MAXVAL)
            return(val[sp++] =f);
    else    {
            printf("ERROR: STACK FULL");
            clear();
            return(0);
}
}
 
   double pop()   /* POP TOP VALUE FROM STEACK */
   {
    if (sp > 0)
            return(val[--sp]);
    else    {
            printf( "ERROR: STACK EMPTY");
            clear();
            return(0);
}
}
 
  clear()       /* CLEAR STACK */
   {
     sp=0;
}
проблема в getop. Что это не знаю, Керниган пишет: Функция GETOP считывает цифры подряд /возможно с десятичной точкой/ и запоминает их, пока последовательность не прерывается. А что за функция, она не стандартная?)

Решение задачи: «Не запускается прога из Керниган и Ритчи»

textual
Листинг программы
/* getop: извлекает следующий операнд или знак операции */
int getop(char s[]) {
  int i, c;
  while ((s[0] = c = getch()) == ' ' || c == '\t')
      ;
  s[1] = '\0';
  if (!isdigit(c) && c != '.') return c; /* Не число */
  i = 0;
  if (isdigit(c)) /* Накопление целой части */
    while (isdigit(s[++i] = c = getch()))
      ;
  if (c == '.') /* Накопление дробной части */
    while (isdigit(s[++i] = c = getch()))
      ;
  s[i] = '\0';
  if (c != EOF) ungetch(c);
  return NUMBER;
}

Объяснение кода листинга программы

  1. Продукт компилируется на языке C.
  2. Функция getop() предназначена для извлечения следующего операнда или знака операции.
  3. В функции объявлены следующие переменные:
    • i - счетчик для пробелов и табов в строке;
    • c - текущий символ ввода;
    • s - строка, в которой будет храниться операнд или знак операции.
  4. В цикле, пока первый символ равен пробелу или табуляции, ничего не происходит.
  5. После окончания цикла, первый символ сохраняется в переменной c, а строка дополняется до 1 символа нулевым символом.
  6. Если первый символ не является числом или точкой, функция возвращает этот символ.
  7. Если первый символ является числом, то в цикле, пока следующий символ также является числом, он добавляется в строку.
  8. Если в цикле встречается точка, то после неё в цикле, пока следующий символ также является числом, он добавляется в строку.
  9. После окончания циклов, в переменной c остается последний символ, который добавляется в конец строки.
  10. Если в процессе ввода была достигнута конечная граница ввода, то вводимый символ не добавляется в строку.
  11. Функция возвращает значение NUMBER.
  12. Функция ungetch() используется для возврата последнего введенного символа обратно в буфер ввода.

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


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

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

9   голосов , оценка 4.222 из 5
Похожие ответы