用c或c++编写一个具有计算器功能的程序,要求一次性输入一行要求算式,输入“=”输出结果,有什么好的思路

如题所述

可以用2叉树写。

定义运算式结构体类型,比如:

typedef struct yunsuan
{
    //如果是单一运算,比如1+2,那么num1=1;num2=2;
    int num1; //左儿子运算符为0的时候直接取该值
    int num2; //右儿子运算符为0的时候直接取该值,为NULL说明只有一个数值运算
    struct yunsuan *father;//父亲:如果上层还有运算式,指向上层
    struct yunsuan *brother;//兄弟:如果同级还有其他运算式,指向该运算式结构
    //如果是复合运算,为其创建左儿子,右儿子,指向儿子,并让儿子指向父亲
    struct yunsuan *left;//左儿子
    struct yunsuan *right;//右儿子
    char fh;//运算符号
}YS;

根据优先级解析多运算符的式子,比如2^2+(√4-1)。

从运算顺序最低的运算符号开始先找到'+',创建树顶点结构体,fh='+';father=NULL;brother=NULL;left=(2^2)的结构体;right=(√4-1)的结构体;

(2^2)的结构体:fh='^';num1=2;num2=2;father=最顶端的结构体;brother=(√4-1)的结构体;left=新建节点fh置0;right=新建节点fh置0;

(√4-1)的结构体:fh='-';num2=1;father=最顶端的结构体;brother=(2^2)的结构体;left=√4的结构体;right=新建节点fh置0;

√4的结构体:fh='√';num1=4;father=(√4-1)的结构体;brother=NULL;left=新建节点fh置0;right=NULL;

依次类推,以上只是说明树形结构建立。

你解析字符串,从运算顺序最后的字符开始拆分并创建树的最顶层节点,然后依次往下建立树。

最后可以用递归函数或循环,遍历树各节点进行运算。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-02-11
捕获每次输入的字符,是等号就进行运算,不是就继续捕获,然后调用一些字符串操作的函数对捕获到的字符串进行分析处理,分离出两个操作数和操作符,最后进行算术运算,得出结果显示在最后,换行,进行下一轮的捕获
第2个回答  2019-02-11
#include<stdio.h>
void main() { int x,y,z; char c; //输入算式比如5+7,程序会输出5+7=12
  scanf("%d%c%d",&x,&c,&y);
  switch ( c ) {
    case '+': z=x+y; break;
    case '-': z=x-y; break;
    case '*': z=x*y; break;
    case '/': if ( y!=0 ) z=x/y; else z=0; break;
    default : z=0; break;
  }
  printf("%d%c%d=%d\n",x,c,y,z);
}

本回答被网友采纳
第3个回答  2019-02-18
//这个例子只能进行整数的四则混合运算(不能包含括号)
#include<stdio.h>

int jisuan(int num1,char op1,int num2)
{
switch(op1)
{
case '*':
return num1*num2;
case '/':
return num1/num2;
case '+':
return num1+num2;
case '-':
return num1-num2;
}
}

int process(int num1,char op1,int num2)
{
int r,num3;
char op2;

if('\n'!=(op2=getchar()) && '='!=op2)
{
scanf("%d",&num3);
if('+'==op2 || '-'==op2)
{
num1=jisuan(num1,op1,num2);
r=process(num1,op2,num3);
}
else if('*'==op2 || '/'==op2)
{
if('/'==op1)
{
num1=jisuan(num1,op1,num2);
r=process(num1,op2,num3);
}
else
{
num2=jisuan(num2,op2,num3);
r=process(num1,op1,num2);
}
}
}
else
{
r=jisuan(num1,op1,num2);
}
return r;
}

int main()
{
int num1,num2;
char op;

printf("请输入一个表达式:");
scanf("%d%c%d",&num1,&op,&num2);
printf("%d\n",process(num1,op,num2));
return 0;
}
第4个回答  2019-02-11
这是作为编译原理的语法解析练习题,在博客园搜一下vczh的手写分析器文章有示例代码