百韵网 >>  正文

c语言 编一个简单的计算器~ 用C语言编写一个简单的计算器1

来源:www.baiyundou.net   日期:较早时间
#include<stdio.h>
#include<ctype.h>
main(){
double data1,data2; //把他们设成double就可以做浮点运算了
char op;
do{
printf("please enter the expression:");
scanf("%lf %c %lf",&data1,&op,&data2); //在他们之间加空格就可以打无限空格了

switch(op){
case'+':printf("%.2lf+%.2lf=%.2lf\n",data1,data2,data1+data2);break;
case'-':printf("%.2lf-%.2lf=%.2lf\n",data1,data2,data1-data2);break;
case'*':printf("%.2lf*%.2lf=%.2lf\n",data1,data2,data1*data2);break;
case'/':if(!data2)printf("division by zsro!\n");
else printf("%.2lf/%.2lf=%.2lf\n",data1,data2,data1/data2);break;
default:printf("Unkown operator!\n");
}

printf("Do you want to continue(Y/N or y/n)");
fflush(stdin);//这是清掉之前的回车键用的
}while(toupper(getchar())=='Y');//你的底这样好这个应该没有问题了吧。
}

把计算的过程函数放到MAIN函数外面,MAIN函数里面进行判断,也就是DO WHILE,如果用户没有输入N或n的话一直调用这个计算函数。

用C语言编写一个简单的计算器1~

#include
int main() {
double num1 = 0; //输入1
double num2 = 0; //输入2
char ch; //操作
double ret = 0; //结果 printf( "输入第一个数:" );
scanf( "%lf", &num1 );
printf( "输入第二个数:" );
scanf( "%lf", &num2 );
printf( "操作[+ - * /]:" );
getchar();
scanf( "%c", &ch ); switch( ch ) {
case '+':
ret = num1 + num2;
break;
case '-':
ret = num1 - num2;
break;
case '*':
ret = num1 * num2;
break;
case '/':
ret = num1 / num2;
break;
default:
break;
}
printf( "结果:%.2lf
", ret ); return 0;
} 写个简单易懂的,你操作计算器的步骤就是编写程序的思路呀

//简单计算器,含加减乘除、乘方运算。
#include
#include
#include // malloc()等
#include // INT_MAX等
#include // EOF(=^Z或F6),NULL
#include // atoi()
#include // eof()
#include // floor(),ceil(),abs()
#include // exit()
#include // cout,cin
// 函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
// #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行
typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
typedef int Boolean; // Boolean是布尔类型,其值是TRUE或FALSE

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

//***************************************************************************
//栈的储存结构

typedef struct{
//运算符栈
char *base;
char *top;
int stacksize;
}SqStack1;

typedef struct{
//运算数栈
float *base;
float *top;
int stacksize;
}SqStack2;

//***************************************************************************
//以下是运算符栈的基本操作函数

Status InitStack(SqStack1 &S){
//初始化一个栈
S.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(!S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}//InitStack

Status DestroyStack(SqStack1 &S){
//销毁栈S
free(S.top);
free(S.base);
return OK;
}//DestroyStack

char GetTop(SqStack1 S){
//若栈不空,则返回S的栈顶元素,并返回OK;否则返回ERROR
if(S.top==S.base)return ERROR;
return *(S.top-1);
}//Gettop

Status Push(SqStack1 &S,char e){
//插入元素e为新的栈顶元素
if(S.top-S.base>=S.stacksize){
//栈满,追加储存空间
S.base=(char *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
if(!S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}//Push

Status Pop(SqStack1 &S,char &e){
//若栈不空,则删除S的栈顶元素,用e返回其值;并返回OK;否则返回ERROR
if(S.top==S.base)return ERROR;
e=*(--S.top);
return OK;
}//Pop

//***************************************************************************
//以下是运算数栈的基本操作函数

Status InitStack(SqStack2 &S){
//初始化一个栈
S.base=(float *)malloc(STACK_INIT_SIZE*sizeof(float));
if(!S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}//InitStack

Status DestroyStack(SqStack2 &S){
//销毁栈S
free(S.top);
free(S.base);
return OK;
}//DestroyStack

float GetTop(SqStack2 S){
//若栈不空,则返回S的栈顶元素,并返回OK;否则返回ERROR
if(S.top==S.base)return ERROR;
return *(S.top-1);
}//Gettop

Status Push(SqStack2 &S,float e){
//插入元素e为新的栈顶元素
if(S.top-S.base>=S.stacksize){
//栈满,追加储存空间
S.base=(float *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(float));
if(!S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}//Push

Status Pop(SqStack2 &S,float &e){
//若栈不空,则删除S的栈顶元素,用e返回其值;并返回OK;否则返回ERROR
if(S.top==S.base)return ERROR;
e=*(--S.top);
return OK;
}//Pop

//***************************************************************************
//以下是相关的运算符判断函数

char Precede(char A,char B){
//比较运算符A, B的优先关系,A,B的范围仅限于'+','-','*','/','^','(',')','='
//返回'>','<','='
switch(A){
case '+':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '<';
case '/':return '<';
case '^':return '<';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表达式错误!
");exit(0);
}
case '-':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '<';
case '/':return '<';
case '^':return '<';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表达式错误!
");exit(0);
}
case '*':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '^':return '<';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表达式错误!
");exit(0);
}
case '/':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '^':return '<';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表达式错误!
");exit(0);
}
case '^':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '^':return '>';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表达式错误!
");exit(0);
}
case '(':switch(B){
case '+':return '<';
case '-':return '<';
case '*':return '<';
case '/':return '<';
case '^':return '<';
case '(':return '<';
case ')':return '=';
case '=':printf("表达式错误!
");exit(0);
default:printf("表达式错误!
");exit(0);
}
case ')':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '^':return '>';
case '(':printf("表达式错误!
");exit(0);
case ')':return '>';
case '=':return '>';
default:printf("表达式错误!
");exit(0);
}
case '=':switch(B){
case '+':return '<';
case '-':return '<';
case '*':return '<';
case '/':return '<';
case '^':return '<';
case '(':return '<';
case ')':printf("表达式错误!
");exit(0);
case '=':return '=';
default:printf("表达式错误!
");exit(0);
}
default:printf("表达式错误!
");exit(0);
}
}//Precede

Status InOP(char c){
//判断c是否是运算符,是则返回TRUE,否则返回FALSE
switch(c){
case '+':return TRUE;
case '-':return TRUE;
case '*':return TRUE;
case '/':return TRUE;
case '^':return TRUE;
case '(':return TRUE;
case ')':return TRUE;
case '=':return TRUE;
default:return FALSE;
}
}//InOP


//***************************************************************************

float Operate(float a,char theta,float b){
switch(theta){
case '+':return a+b;
case '-':return a-b;
case '*':return a*b;
case '/':
if(b==0){
printf("分母不能为0!
");
exit(0);
}
else return a/b;
case '^':
if(a==0&&b<=0){
printf("0的指数必须大于0!
");
exit(0);
}
else return (float)pow(a,b);
default:printf("表达式错误!
");exit(0);
}
}//Operate

Status EvaluateExpression(){
//算术表达式求值
char c,x,theta,prec;
//c是每次读取的字符,x是存放脱括号后的多余的括号,theta是运算符,prec是c的前一个字符
float a,b,result;//a、b是每次从运算数栈中取出的要进行运算的数,result存放最终结果
float cc,flag,ii,minus=1;
//cc存放由字符串转化而来的浮点数,flag用于标记是否已读取过小数点,
//ii存放小数部分需要缩小的倍数,minus用于记录该数前是否有负号
SqStack1 OPTR;
SqStack2 OPND;
InitStack(OPTR);InitStack(OPND);
Push(OPTR,'=');
prec='=';scanf("%c",&c);
while(c!='='||GetTop(OPTR)!='='){
cc=0;flag=0;ii=10;
if(c=='-'&&(prec=='='||prec=='(')){minus=-1;prec=c;scanf("%c",&c);}
//若某“-”前面是“=”(第一个符号就是“-”)或“(”,则此为负号,不是减号
else if(!InOP(c)){
while(!InOP(c)){
if(c>=48&&c<=57){
if(flag==0)cc=cc*10+c-48;//小数点之前
else if(flag==1){cc=cc+(c-48)/ii;ii*=10;}//小数点之后
else {printf("小数点错误!
");exit(0);}//小数点有错
}
else if(c=='.')flag++;//读到小数点
else {printf("表达式错误!
");exit(0);}
prec=c;scanf("%c",&c);
}
cc*=minus;minus=1;
Push(OPND,cc);
}//不是运算符则进OPND栈
else
switch(Precede(GetTop(OPTR),c)){
case '<':Push(OPTR,c);prec=c;scanf("%c",&c);break;//栈顶元素优先级低
case '=':Pop(OPTR,x);prec=c;scanf("%c",&c);break;//脱括号并接收下一字符
case '>'://退栈并将运算结果入栈
Pop(OPTR,theta);
Pop(OPND,b);Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
break;
}
}
result=GetTop(OPND);
printf("%f
",result);
//DestroyStack(OPTR);
//DestroyStack(OPND);
return OK;
}//EvaluateExpression

void main(){
printf(" **********************
");
printf(" * 欢迎使用计算器! *
");
printf(" **********************
");
printf("请输入表达式,以“=”结束:
");
printf("(支持实数间的加(+)、减(-)、乘(*)、除(/)、乘方(^)、单目减(-)运算)
");
EvaluateExpression();
exit (0);
}

相关要点总结:
(编辑:本站网友)
相关推荐
关于我们 | 客户服务 | 服务条款 | 联系我们 | 免责声明 | 网站地图
@ 百韵网