C程序设计题,简单计算器,编写一个程序,计算表达式 date1 op date2的值,其中

C程序设计题,简单计算器,编写一个程序,计算表达式 date1 op date2的值,其中,第1张

#include <stdio.h>

void main()

{

int data1,data2

char op

scanf("%d%c%d",&data1,&op,&data2)

if(op=='+')

printf("%d+%d=%d\n",data1,data2,data1+data2)

if(op=='-')

printf("%d-%d=%d\n",data1,data2,data1-data2)

if(op=='*')

printf("%d*%d=%d\n",data1,data2,data1*data2)

if(op=='/')

printf("%d/%d=%d\n",data1,data2,data1/data2)

}

一个简单的C语言小程序就可以满足要求,需要用到switch-case语句,先上代码:

#include

int main()

{

double a, b, answer

/*两个数a、b及其计算结果answer,由于下面会有除法,可能使answer出现小数,所以定义double类型变量*/

char op

//运算符op

scanf("%lf%c%lf",&a,&op,&b)

switch(op)

{

case '+':

//加法

answer = a + b

break

case '-':

//减法

answer = a - b

break

case '*':

//乘法

answer = a * b

break

case '/':

//除法

answer = a / b

break

default:

printf(" *** 作符只接收加减乘除!\n")

//运算符只接收加减乘除

break

}

printf("%lf\n",answer)

return 0

}需要注意的地方只有除法的结果可能是小数,所以a,b和answer都需要定义成double类型变量。

下面附上switch-case语句的使用方法:

switch

(表达式){

case

值1

:

语句1

break

case

值2

:

语句2

break

...

default

:

语句n

break

}

从表达式值等于某个case语句后的值开始,它下方的所有语句都会一直运行,直到遇到一个break为止。假如任何一个case语句的值都不等于表达式的值,就运行可选标签default之下的语句。

参考资料:http://c.biancheng.net/cpp/html/39.html

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define ERROR 0

#define OK 1

#define OVERFLOW -1

#define STACK_INIT_SIZE 100

#define STACKINCREMENT 10

#define OPSETSIZE 7

char OPSET[OPSETSIZE]={'+','-','*','/','(',')','#'}

unsigned char Prior[7][7] = {

'>','>','<','<','<','>','>',

'>','>','<','<','<','>','>',

'>','>','>','>','<','>','>',

'>','>','>','>','<','>','>',

'<','<','<','<','<','=',' ',

'>','>','>','>',' ','>','>',

'<','<','<','<','<',' ','='

}

typedef int Status

template <typename T>

struct SqStack

{

T *top

T *base

int stacksize

}

template <typename T1,typename T2>

Status InitStack(T1 &S)

{

S.base=(T2 *)malloc(STACK_INIT_SIZE*sizeof(T2))

if(!S.base) exit (OVERFLOW)

S.top=S.base

S.stacksize=STACK_INIT_SIZE

return OK

}

template <typename T1,typename T2>

Status Push(T1 &S,T2 e)

{

if(S.top-S.base>=S.stacksize)

{

S.base=(T2 *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(T2))

if(!S.base) exit (OVERFLOW)

S.top=S.base+S.stacksize

S.stacksize+=STACKINCREMENT

}

*S.top++=e

return OK

}

template <typename T1,typename T2>

Status Pop(T1 &S,T2 &e)

{

if(S.top==S.base) return ERROR

e=*--S.top

return OK

}

template <typename T1,typename T2>

T2 GetTop(T1 S)

{

if(S.top==S.base)

return ERROR

else

return *(S.top-1)

}

Status In(char Test,char* TestOp) {

bool Find=false

for (int i=0i<OPSETSIZEi++) {

if (Test == TestOp[i]) Find= true

}

return Find

}

float Operate(float a,unsigned char theta, float b) {

switch(theta) {

case '+': return a+b

case '-': return a-b

case '*': return a*b

case '/': return a/b

default : return 0

}

}

int ReturnOpOrd(char op,char* TestOp) {

int i

for(i=0i<OPSETSIZEi++) {

if (op == TestOp[i]) return i

}

return 0

}

char precede(char Aop, char Bop) {

return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)]

}

float EvaluateExpression()

{

SqStack<char> OPTR

SqStack<float>OPND

char TempData[20]

float Data,a,b

char theta,c,x,Dr[2]

InitStack<SqStack<char>,char>(OPTR)

Push (OPTR, '#')

InitStack <SqStack<float>,float>(OPND)

strcpy(TempData,"\0")

c=getchar()

while (c!= '#' || GetTop<SqStack<char>,char>(OPTR)!= '#')

{

if (!In(c, OPSET))

{

Dr[0]=c

Dr[1]='\0'

strcat(TempData,Dr)

c=getchar()

if(In(c,OPSET))

{

Data=(float)atof(TempData)

Push(OPND, Data)

strcpy(TempData,"\0")

}

}

else

{

switch (precede(GetTop<SqStack<char>,char>(OPTR), c)) {

case '<':

Push(OPTR, c)

c=getchar()

break

case '=':

Pop(OPTR, x)

c=getchar()

break

case '>':

Pop(OPTR, theta)

Pop(OPND, b)

Pop(OPND, a)

Push(OPND, Operate(a, theta, b))

break

}

}

}

return GetTop<SqStack<float>,float>(OPND)

}

void main()

{

printf("请输入表达式(end #):\n")

printf("%.2f\n",EvaluateExpression())

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12086320.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存