如何用C语言编写一个科学计算器

要求含有运算符:+,-,*,/ ,^及两种优先级运算符“(”和“)”,可以计算三角函数,对数函数和指数函数。用二叉树或栈可以实现吗???请讲出具体的思路。

用栈 就可以办到了。。。这个很详细的, lz 随便输入一个表达式,中间的计算过程全部输出了,lz试两个 就知道怎么回事了。 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 4000;
typedef struct
{
char data[10];
int top;//头地址

int base;//基地址

int length;//长度

}Stack;

void init(Stack *st)//初始化栈

{
st->base=0;
st->top=0;
st->length=0;
}

int isEmpty(Stack *st)
{
int n=0,top,base;
top =st->top;
base =st->base;
if(top==base)
{
return 1;
}
return n;
}

int isFull(Stack *st)
{
int n=0,top,base;
top =st->top;
if(top>=4000)
{
return 1;
}
return n;
}

char getTop(Stack *st)// 返回top值,不改变栈的结构

{
char n;
if(isEmpty(st))
{
printf("栈为空\n");
return 0;
}
int positon= st->top-1;
n= st->data[positon];//取出数据;

return n;
}

char pop(Stack *st)// 出栈,返回

{
char n;
if(isEmpty(st))
{
printf("栈为空\n");
return 0;
}
int positon= st->top-1;
n= st->data[positon];//取出数据;

st->top--;
st->length--;
st->data[positon]='\0';//消除数据

return n;
}

void push(char n,Stack *st)//入栈

{
int positon ;
if(isFull(st))
{
printf("栈满\n");

}
else
{
positon= st->top;//获取位置

st->data[positon]=n;//存入数据

st->top++;//改变位置

}

}

void show(Stack *m1)//输出栈中的数据

{
int top,base;
top=m1->top;
base=m1->base;
while(top>base)
{
printf("%c,",m1->data[--top]);
}
printf("\n");
}

int isOperate(char temp)//是否是操作符

{
if(temp=='+'||temp=='-'||temp=='*'||temp=='/'||temp=='('||temp==')'||temp=='#')
{
return 1;
}
return 0;
}

int isValue(char temp)//是否是数值

{
if(temp>='0'&&temp<='9')//

{
return 1;
}
else
{
return 0;
}
}

int isAvail(char temp)//是否有效字符

{
if(isOperate(temp)||isValue(temp))//如果temp既不是操作符和数值的话,则它是非法的

{
return 1;
}
return 0;
}

int detect(char temp)//搜索矩阵位置

{
int i=0;
char oper[7]={'+','-','*','/','(',')','#'};
for(i=0;i<7;i++)
{
if(temp==oper[i])
{
return i;
}
}
}

char Priority(char temp,char optr)//判断优先级

{
/**//*
+ - * / ( ) #
1 2 3 4 5 6 7
+ 1 < < < < > > >
- 2 < < < < > > >
* 3 > > < < > > >
/ 4 > > < < > > >
( 5 > > > > > = 0
) 6 < < < < = 0 >
# 7 < < < < > 0 =
*/
int row ,col;
char priority[7][7]={/**//* + - * / ( ) # */
{'<','<','<','<','>','>','>'},

{'<','<','<','<','>','>','>'},

{'>','>','<','<','>','>','>'},

{'>','>','<','<','>','>','>'},

{'>','>','>','>','>','=','>'},

{'<','<','<','<','=','0','>'},

{'<','<','<','<','>','<','='},
};

row = detect(temp);//找出对应的矩阵下标;

col = detect(optr);
// printf("%d,%d",row,col);

//优先级存储在一个7x7的矩阵中,对应关系上图;

return priority[row][col];

}
char evaluate(int a,int b,char oper)
{
switch(oper)
{
case '+': return a+b+'0';
case '-': return a-b+'0';
case '*': return a*b+'0';
case '/': return a/b+'0';
default : return 0+'0';
}
}
int calculateExpress(char *express)//计算表达式

{
int result=0;
int a,b;
// char oper,result;

Stack OPTR,OPND;//OPTR存储操作符,OPND操作数值

init(&OPTR);
init(&OPND);
push('#',&OPTR);//默认第一个位'#'

////////////////////-算法-////////////////////////////

while(*express!='\0')
{
char temp;
temp= *(express);
printf("---------------------------------\n");
printf("当前的符号为%c\n",temp);
if(isAvail(temp))//是否是有效字符

{
if(isOperate(temp) )//输入的是操作符

{
char oper,result;
char optr = getTop(&OPTR);//栈中top位的操作符

printf("栈顶操作符位:%c\n",optr);
char prior = Priority(temp,optr);//判断优先级

switch(prior)
{
case '>':
push(temp,&OPTR);
printf("将符号位%c入栈\n",temp);
express++;
break;
case '<':
//int a,b;

//char oper,result;

a=pop(&OPND)-'0';//存在栈中的都是char字符

b=pop(&OPND)-'0';
oper=pop(&OPTR);

result=evaluate(b,a,oper);//出栈一个操作符,计算结果

//printf("%d",result-'0');

push(result,&OPND);//结果入OPND

printf("%d%c%d结果为:%d\n",b,oper,a,result-'0');
break;

case '=':
//消除括号

pop(&OPTR);
printf("消除括号\n");
express++;
break;

}

}
if(isValue(temp))//输入的是数值

{
push(temp,&OPND);//将数值位入栈;

express++;
printf("将数值%c压入栈\n",temp);
//show(&OPND);

}
}
else //表达式中有非法字符

{
printf("表达式中有非法字符\n");
exit(-1);//退出程序

}

}
// show(&OPND);

// show(&OPTR);

return getTop(&OPND)-'0';
}

void inputExpress(char *express)//输入表达式

{
int length=0;
printf("请输入一个表达式:");
scanf("%s",express);
int len =strlen(express);
express[len]='#';//表达式最后一位默认为'#';

express[len+1]='\0';

}

void output(char *express,int result)//输出表达式

{
int i=0;
printf("----------------------------------------\n表达式:");
while(express[i]!='#')
{
printf("%c",express[i]);
i++;
}
printf("=%d\n",result);

}

int main()
{

char express[100];//表达式

int result =0;

inputExpress(express);//输入表达式

result = calculateExpress(express);//计算表达式;

output(express,result); //输出表达式

//、、、、、、、、、、、、、测试优先级。

/**//*
char m='7' ;
m=Priority('+','*');
printf("优先级为%c",m);

int m=evaluate(5,6,'m');
printf("%d",m);
*/
return 0;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-10-05
用C语言编写一个科学计算器程序:
#include <stdio.h>
void main ()
{float a,b,e;char f;
scanf ("%c",&f);
scanf ("%f,%f",&a,&b);
switch (f){case '+': e=a+b;
printf("%f",d); break;case '-': e=a-b;
printf("%f",d); break;case '*': e = a*b;
printf("%f",d); break;case '/': e=a/b;
printf("%f",d); break;default: printf("Error!"); break;}}

科学型计算器是电子计算器的一种,可进行乘方、开方、指数、对数、三角函数、统计等方面的运算,又称函数计算器。
科学型带有所有普通的函数,所有的函数都分布在键盘上以致于你可以不用通过菜单列表来使用它们。
第2个回答  2013-06-26
递归计算表达式值,每次从最低优先级算符分割。只需要特殊处理三角函数。
第3个回答  2019-04-10
用正则表达式的话,很简单。这里给一个以VB.NET为源码的示例。
第4个回答  2013-06-26
用树和栈的搭配写你这种题目,经典的写法。很好,其实也很好理解的,具体思路531351006

用c语言设计一个简单的加减乘除计算器
1、打开visual C++ 6.0-文件-新建-文件-C++ Source File。2、输入预处理命令和主函数:#include \/*函数头:输入输出头文件*\/,void main()\/*空类型:主函数*\/。3、定义变量:int a,b,d; \/*定义变量的数据类型为整型*\/,char c;\/*定义变量的数据类型为字符型*\/。4、输入四则运算式:pri...

如何用C语言编写一个计算器程序?
1.定义头文件#include "stdafx.h"、#include <stdio.h>和#include <math.h>。2.写出主函数void main(){},在函数内添加如下代码:\/\/定义变量 int minusNumber=-10; int plusNumber=0; \/\/转换成正数 plusNumber=abs(minusNumber); \/\/输出结果 printf("转换前:%d\\n",minusNumber); printf(...

C语言计算器 功能要求: 可以输入0-9数字、小数点、正负数 可以进行加 ...
char op;double num1, num2;printf("请输入数学表达式(如:1 + 2):");scanf("%lf %c %lf", &num1, &op, &num2);switch (op){ case '+':printf("结果为:%.2lf\\n", num1 + num2);break;case '-':printf("结果为:%.2lf\\n", num1 - num2);break;case '*':print...

用c语言 编写计算器程序
1、首先我们需要在Dev C++软件中创建一个C语言项目,项目类型选择控制台程序,如下图所示 2、接下来我们在项目下面新建C语言文件,如下图所示 3、然后我们在C文件中写入计算器逻辑代码,主要是让用户输入计算方式,然后程序自动计算,如下图所示 4、接下来我们点击运行菜单,选择下拉菜单中的运行选项,如...

怎么用C语言编写一个简单计算器程序。
1、首先在打开的C语言软件窗口中,在Main函数的上方,写上阶乘函数的框架,如下图所示。2、然后定义一个变量【result】,如下图所示。3、然后输入if判断语句,就可以写下程序的关键语句,如下图所示。4、接下来就可以调用输出,如下图所示。5、最后点击运行,如下图所示,就可以运行测试。

用C语言实现一个简单的计算器,要求有面积和体积输出。
代码如下:```c include int main() { float a, b, c, d;scanf("%f %f", &a, &b); \/\/ 输入长和宽 c = a * b; \/\/ 计算面积 d = 2 * (a + b); \/\/ 计算周长 printf("面积 S=%.2f,体积 V=%.2f\\n", c, d); \/\/ 输出面积和周长 return 0;} ```...

C语言编写计算器的步骤是怎样的?
1、打开CodeBlocks,新建一个空白文件,先定义头文件和主函数,接着写程序多大的主体:2、首先定义所需要的变量,将变量定义为浮点型,定义输入函数,将刚才的x和y定义为计算的变量,将c定义为选择计算方式的变量。用switch语句,将c作为选择变量,填写计算方式的选项,最后在主函数中输入一个输出函数来...

用C语言怎么写出一个计算器?
清楚算法就可以很快写出:(1)只需输入2个变量n和sum,且sum=n+sum.(2)确定n的范围为n<=100 (3)循环体为 for(n=1;n<=100;n++)sum+=n;(4)根据C语言编辑规则写出程序 用for循环求:include<stdio.h> int main(void){ int n,sum=0;for(n=1;n<=100;n++)sum+=n;printf("1...

怎么用C语言编写计算器程序?
想要驾驭C语言,编写一个功能强大的计算器程序并不复杂。下面,让我们一起探索一个基础且实用的C语言计算器代码示例,它涵盖了加、减、乘、除四则运算,展示了基础编程逻辑的魅力:<?xml version="1.0" encoding="UTF-8"?><\/<\/<\/#include <stdio.h><\/int main() {<\/ char operator;<...

如何用C语言编一个计算器?
1. 读取字符,直到用户按下回车键。2. 对每个字符进行检查,判断它是字母、数字,还是空格或其他字符。3. 根据字符类型,对应的字符计数器增加。4. 最后输出各个类别的字符数量。三、改进后的参考代码:```c include int main() { int countDigits = 0, countLetters = 0, countSpaces = 0, ...

相似回答