递归下降法-趣味的算式计算器
2015-02-13 09:46
106 查看
#include <stdio.h> #include <stdlib.h> char token; //全局变量,用于存放需要处理的数字或者符号 int low(); int mid(); int high(); void match(const char expectedtoken) //匹配函数 expectedtoken的意思是计算匹配,如果满足说明算式正常 { if(token == expectedtoken) token = getchar(); //如果匹配成功则读取下一个字符 else { printf("cannot match\n"); //如果匹配不成功就提示并退出程序 getchar(); exit(1); } } int low(void) //进行加减运算的函数 { int result = mid();// 这里为的是读取第一个数字 而不是为了其他什么 while((token == '+') || (token == '-')) //进入加减的循环 if(token == '+') { match('+'); result += mid(); } else if(token == '-') { match('-'); result -= mid(); } return result; } int mid() //乘除运算 { int div; int result = high();//直接返回数字 或者计算括号里面的 //再次进入乘除循环 while((token == '*') || (token == '/')) if(token == '*') { match('*'); result *= high(); } else if(token == '/') { match('/'); div = high(); //取得除数 if(div == 0) { printf("被除数为0没有意义成将退出!\n"); getchar(); exit(1); } result /= div; } return result; } int high() { int result; if(token == '(') { match('('); result = low(); match(')'); } else if(token >= '0' && token <= '9') { ungetc(token,stdin); scanf("%d",&result); token = getchar(); } else { printf("high 出现未识别的字符 程序将退出!\n"); system("pause"); exit(1); } return result; } int main() { token = getchar(); int result = low(); printf("This answer is:%d",result); getchar(); return 0; }递归下降法-从最复杂的部分开始,逐步细化,直到表达式可以计算为止。
这种递归算法的思想用于分析和解决复杂的问题非常有效
1.exit(int) 所在头文件为stdlib 参数0 为正常返回 其他数字为异常返回 供其他程序调用
2.C语言允许 全局函数 未声明就可以调用 而在C++里面 全局函数被调用时 在前面可以不用声明 若是在后面必须声明 否则编译器会报错
3.getchar() 函数读取时,如果读取的目标是数字。则只会读取数组部分,非数字部分依旧保留在键盘输入的缓冲区内,可以等待下次读取。
4.不知道是语法变了还是怎么回事,break在程序里面是个累赘。break对if语句无效,并且break对离得最近的一个while或者for switch语句有效。
5.双引号和单引号的区别
含义不同:单引号中的字符实际上代表一个整数。对应是其ASCII字符的值 s的含义和数字115一样
而用双引号引起的字符串,代表的一个指向无名数组起始地址的指针
大小不同:单引号里面的字符大小就是一个字节
而双引号引起字符串大小是字符的总大小+1,因为用双引号引起的字符串会在字符串末尾添加一个二进制为0的字符'\0'来表示结束。
函数吸收:
exit(int) stdlib.h 参数设置0为正常退出 设置为其他数字为异常退出。参数会传递给操作系统,UNIX,Linux,MS DOS供其他程序调用。
int getchar(void) stdio.h 相当于getc(stdin)从标准输出力读取下一个字符,返回读取字符的ASCII码。
int scanf(const char* format,....) 标准输入设备,一般输键盘中读内容通用的子程序,可以说明的格式多个字符。scanf读取数字是遇到非数字字符,不会读取,字符继续保留在缓冲区内等待下一次读取。
int ungetc(int c,FILE *stream) 把字符退回到输入流中,可以理解成一个计数器
相关文章推荐
- 递归下降法-趣味的算式计算器
- 递归下降语法分析程序设计
- 1231实验四 递归下降语法分析程序设计
- 1216递归下降语法分析程序
- 实验四递归下降语法分析程序设计
- 编译原理实验2-递归下降分析法
- 递归下降分析
- 20170219C++项目班02_02递归下降算法/解析器/Scanner实现
- 【读书笔记】-【编程语言的实现模式】-【LL(1)递归下降的语法解析器】
- 编译原理—递归下降分析
- Java递归(趣味例子)
- 递归下降语法分析实验
- 编译原理 实验3 递归下降语法分析程序设计
- 阅读《自制编程语言》之递归下降
- 1216 递归下降分析法
- 1217 实验四 递归下降语法分析程序设计
- 1217 实验四 递归下降语法分析程序设计
- 实验四递归下降语法分析程序设计
- 递归下降分析法
- 从一个小巧的计算器,体会递归下降的方法