Не запускается прога из Керниган и Ритчи - C (СИ)
Формулировка задачи:
программа-калькулятор
проблема в getop.
Что это не знаю, Керниган пишет: Функция GETOP
считывает цифры подряд /возможно с десятичной точкой/ и запоминает их, пока
последовательность не прерывается.
А что за функция, она не стандартная?)
#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; }
Решение задачи: «Не запускается прога из Керниган и Ритчи»
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; }
Объяснение кода листинга программы
- Продукт компилируется на языке C.
- Функция getop() предназначена для извлечения следующего операнда или знака операции.
- В функции объявлены следующие переменные:
- i - счетчик для пробелов и табов в строке;
- c - текущий символ ввода;
- s - строка, в которой будет храниться операнд или знак операции.
- В цикле, пока первый символ равен пробелу или табуляции, ничего не происходит.
- После окончания цикла, первый символ сохраняется в переменной c, а строка дополняется до 1 символа нулевым символом.
- Если первый символ не является числом или точкой, функция возвращает этот символ.
- Если первый символ является числом, то в цикле, пока следующий символ также является числом, он добавляется в строку.
- Если в цикле встречается точка, то после неё в цикле, пока следующий символ также является числом, он добавляется в строку.
- После окончания циклов, в переменной c остается последний символ, который добавляется в конец строки.
- Если в процессе ввода была достигнута конечная граница ввода, то вводимый символ не добавляется в строку.
- Функция возвращает значение NUMBER.
- Функция ungetch() используется для возврата последнего введенного символа обратно в буфер ввода.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д