您的位置:首页 > 其它

递归下降法-趣味的算式计算器

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) 把字符退回到输入流中,可以理解成一个计数器
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  程序 include cannot