当前位置: 代码迷 >> 综合 >> C 程序设计语言 4-3
  详细解决方案

C 程序设计语言 4-3

热度:6   发布时间:2024-01-20 04:23:56.0

练习 4-3 在有了基本框架后,对计算器程序进行扩充就比较简单了。在该程序中加入取模(%)运算符,并注意考虑负数的情况。

 

完全是拿书上的函数用的,只针对题目要求增加了“%”部分。以下几个代码块需要分别保存在不同的文件中,最终一起编译。

 

头文件——calc.h 

#define NUMBER '0'void push(double);
double pop(void);
int getop(char []);
int getch(void);
void ungetch(int);

main函数——main.c

#include <stdio.h>
#include <stdlib.h>
#include "calc.h"
#include <math.h>#define MAXLEN 100
#define MAXOP 100int getop(char []);
void push(double);
double pop(void);int main()
{int type;double op1, op2;char s[MAXOP];while ((type = getop(s)) != EOF){switch (type) {case NUMBER:push(atof(s));printf("push number\n");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);elseprintf("error:zero divisior\n");break;case '%':    //本题中的取模运算op2 = pop();if ((op1 = pop()) <= 0.0)    //保证后一个数非负{printf("error:mod num lower than zero\n");break;}else{if (floor(op1 + 0.5) != op1 || floor(op2 + 0.5) != op2)    //保证两个操作数均为整数,加0.5的原因见后{printf("error: not integer\n");break;}if (op2 < 0.0)    //若第一个操作数为负,将其变为正数{while (op2 < 0.0)op2 += op1;push((int)op1 % (int)op2);}elsepush((int)op1 %(int)op2);}break;case '\n':printf("\t%.8g\n", pop());break;default:printf("error: unknown command %s\n", s);break;}}return 0;
}

 floor函数中加0.5的原因是double类型中,当输入1时,有可能被保存为0.999999,故这样操作四舍五入。来自https://blog.csdn.net/qq_32623363/article/details/85335489

类似getchar()函数的扩展——getch.c

#include <stdio.h>
#define BUFSIZE 10
#include "calc.h"char buf[BUFSIZE];
int bufp = 0;int getch(void)
{return (bufp > 0) ? buf[--bufp] : getchar();
}void ungetch(int c)
{if (bufp >= BUFSIZE)printf("ungetch: too many characters\n");elsebuf[bufp++] = c;return;
}

 操作数栈函数——stack.c

#include <stdio.h>
#include "calc.h"#define MAXVAL 100int sp = 0;
double val[MAXVAL];void push(double f)
{if (sp < MAXVAL)val[sp++] = f;elseprintf("error: stack full, can't push %g\n", f);return;
}double pop(void)
{if (sp > 0)return val[--sp];else{printf("error:stack empty\n");return 0.0;}
}

从输入的字符串中获取操作数或操作符函数——getop.c

#include <stdio.h>
#include <ctype.h>
#include "calc.h"int getch(void);
void ungetch(int);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';printf("string:%s\n", s);if (c != EOF)ungetch(c);return NUMBER;
}

我使用的是mingw编译器,具体在编译的时候输入

gcc calc.h main.c getop.c getch.c stack.c -o calc

就可以生成.exe程序。