简单计算器:模拟简单运算器的工作,输入一个算式(没有空格),遇等号“=”说明输入结束,输出结果。假设计算器只能进行加、减、乘、除运算,运算数和结果都是整数,4种运算符的优先级相同,按从左到右的顺序计算。例如,输人“1+2*10-10/2=”后,输出10。试编写相应程序。
#include<stdio.h> /*整体思路:设式子为 X0 op X1 op ...Xi op ... Xn = 先把式子中的第一个数 X0 找到,则剩下的工作就是不断的找 op 和 Xi 并与之前的结果进行运算,直到=出现 */ int main(){ int ret,num; //ret为结果;设 A op B = C ,则A、C都是ret,B是num,op是sign char ch,sign; //ch存储读取的式子中的一个字符;sign为运算符 printf("input formula: "); ch = getchar(); ret = 0; /*变量用之前再赋初值。特别是对于循环使用的变量,用之前再赋初值(清零)可以避免错误*/ while(ch>='0'&&ch<='9'){ //【循环1num】找到式子的 第一个 数 ret += int(ch)-48; // 每次处理运算数的一位;‘0’对应的ASCII码是48,-48可以将数字字符的ASCII码变成对应数字 ret *= 10; // 运算数可能是多位的,所以每次提取出一个位就要让它扩大10倍,从而提取出多位的整数 ch = getchar(); } ret /= 10; //跳出【循环1num】前的一次多乘了一个10 sign = ch; //跳出【循环1num】时,ch是式子中的 第一个 运算符 while(ch!='='){ //【循环string】对式子中“=”前的字符进行处理 ch = getchar(); //【循环1num】中的ch值已经给了sign,不会造成值丢失 num = 0; //参与运算的数,赋初值0;循环使用的变量用之前再赋值 while(ch>='0'&&ch<='9'){ //【循环num】找到式子参与运算的数 num += int(ch)-48; // 每次处理运算数的一位 num *= 10; ch = getchar(); //当前【循环num】结束时ch是式子中的一个运算符 } num /= 10; if(sign=='+') //针对四个操作符对当前提取出的 A op B = C 分别计算 ret += num; else if(sign=='-') ret -= num; else if(sign=='*') ret *= num; else if(sign=='/') ret /= num; sign = ch; //运算符 /*当跳出【循环num】时,ch存储的是下一次要用的运算符,故把ch的值直接作为运算符赋给sign*/ } printf("result = %d\n",ret); return 0; }