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

Python015

如何用C语言编写一个科学计算器,第1张

用栈 就可以办到了。。。这个很详细的, 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=0i<7i++)

{

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

}

下面是使用 C 语言设计简易科学计算器的示例代码:

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

int main()

{

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 '*':

printf("结果为:%.2lf\n", num1 * num2)

break

case '/':

if (num2 == 0)

{

printf("除数不能为 0!\n")

}

else

{

printf("结果为:%.2lf\n", num1 / num2)

}

break

case '^':

printf("结果为:%.2lf\n", pow(num1, num2))

break

case 's':

printf("结果为:%.2lf\n", sin(num1))

break

case 'c':

printf("结果为:%.2lf\n", cos(num1))

break

case 't':

printf("结果为:%.2lf\n", tan(num1))

break

case 'l':

printf("结果为:%.2lf\n", log(num1))

break

case 'e':

printf("结果为:%.2lf\n", exp(num1))

break

default:

printf("无效的运算符!\n")

break

}

return 0

}