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())
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)