① 用c语言 (c++) 编写计算器程序
我们平时进行数学运算都是用计算器完成的,那么如何用C语言编写一个计算器呢?下面我给大家分享一下。
工具/材料
Dev C++
- 01
首先我们需要在Dev C++软件中创建一个C语言项目,项目类型选择控制台程序,如下图所示
- 02
接下来我们在项目下面新建C语言文件,如下图所示
- 03
然后我们在C文件中写入计算器逻辑代码,主要是让用户输入计算方式,然后程序自动计算,如下图所示
- 04
接下来我们点击运行菜单,选择下拉菜单中的运行选项,如下图所示
- 05
最后在弹出的界面中我们输入要计算的公式,程序就会自动计算,如下图所示
② 用简单c语言编写计算器
#include"stdio.h"
/*预处理命令*/
void
main()
/*主函数*/
{
double
a,b;
/*双精度实型变量说明*/
char
c,d;
/*变量说明*/
do
/*循环体*/
{
printf("input
a
(-*/)b\n");
/*输入提示*/
scanf("%lf%c%lf",&a,&c,&b);
/*输入算术表达式*/
if(c=='
')
/*判断
*/
printf("=%0.2f",a
b);
/*输出a
b的值*/
else
if(c=='-')
/*判断-*/
printf("=%0.2f",a-b);
/*输出a-b的值*/
else
if(c=='*')
/*判断**/
printf("=%0.2f",a*b);
/*输出a*b的值*/
else
if(c=='/')
/*判断/*/
printf("=%0.3f",a/b);
/*输出a/b*/
else
/*不满足以上条件*/
printf("error");
/*输出错误*/
printf("\n\ninput\n");
/*输入\n*/
scanf("%c",&d);
/*输入符号给d*/
}
/*循环体结束*/
while(d=='\n');
/*循环条件语句*/
}
③ c语言编写计算器程序
C语言编写计算器
我们可以用printf和scanf函数输出结果和获取用户的输入。需要<stdio.h>头文件。scanf函数在读取数据的时候不需要再一行上输入每个数据,只要数据和数据之间留出空白就可以了。先声明两个变量number1和number2,operation变量用来存储运算符。用scanf函数获取这两个数字和运算符。分别用%lf %c %lf
④ 如何用C语言写一个简易计算器
#include<stdio.h>
int main()
{
double num1;
double num2;
double result;
char ch;
printf("Please enter express to caculate, 'q' to exit(eg. 1+3):");
while(scanf("%lf%c%lf",&num1,&ch,&num2) == 3)
{
switch(ch)
{
case '+':
{
result = num1 + num2;
break;
}
case '-':
{
result = num1 - num2;
break;
}
case '/':
{
if(num2 == 0)
printf("Error:div/0\n");
else
result = num1 / num2;
break;
}
case '*':
{
result = num1 * num2;
break;
}
}
printf("%g%c%g=%g\n",num1,ch,num2,result);
printf("Please enter express to caculate, 'q' to exit(eg. 1+3):");
}
return 0;
}
⑤ 怎样用c语言编一个简单的计算器最简单的
//简单计算器,含加减乘除、乘方运算。
#include<string.h>
#include<ctype.h>
#include<malloc.h> // malloc()等
#include<limits.h> // INT_MAX等
#include<stdio.h> // EOF(=^Z或F6),NULL
#include<stdlib.h> // atoi()
#include<io.h> // eof()
#include<math.h> // floor(),ceil(),abs()
#include<process.h> // exit()
#include<iostream.h> // 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("表达式错误!\n");exit(0);
}
case '-':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '<';
case '/':return '<';
case '^':return '<';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表达式错误!\n");exit(0);
}
case '*':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '^':return '<';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表达式错误!\n");exit(0);
}
case '/':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '^':return '<';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表达式错误!\n");exit(0);
}
case '^':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '^':return '>';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表达式错误!\n");exit(0);
}
case '(':switch(B){
case '+':return '<';
case '-':return '<';
case '*':return '<';
case '/':return '<';
case '^':return '<';
case '(':return '<';
case ')':return '=';
case '=':printf("表达式错误!\n");exit(0);
default:printf("表达式错误!\n");exit(0);
}
case ')':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '^':return '>';
case '(':printf("表达式错误!\n");exit(0);
case ')':return '>';
case '=':return '>';
default:printf("表达式错误!\n");exit(0);
}
case '=':switch(B){
case '+':return '<';
case '-':return '<';
case '*':return '<';
case '/':return '<';
case '^':return '<';
case '(':return '<';
case ')':printf("表达式错误!\n");exit(0);
case '=':return '=';
default:printf("表达式错误!\n");exit(0);
}
default:printf("表达式错误!\n");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!\n");
exit(0);
}
else return a/b;
case '^':
if(a==0&&b<=0){
printf("0的指数必须大于0!\n");
exit(0);
}
else return (float)pow(a,b);
default:printf("表达式错误!\n");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("小数点错误!\n");exit(0);}//小数点有错
}
else if(c=='.')flag++;//读到小数点
else {printf("表达式错误!\n");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\n",result);
//DestroyStack(OPTR);
//DestroyStack(OPND);
return OK;
}//EvaluateExpression
void main(){
printf(" **********************\n");
printf(" * 欢迎使用计算器! *\n");
printf(" **********************\n");
printf("请输入表达式,以“=”结束:\n");
printf("(支持实数间的加(+)、减(-)、乘(*)、除(/)、乘方(^)、单目减(-)运算)\n");
EvaluateExpression();
exit (0);
}
⑥ c语言中 简单计算器代码的编写 (注意! 是简单的计算器代码编写!)
-以前无聊的时候写的,感觉还不错。
说明:编译打开程序之后,输入的是算式,就是你要求的那样。支持的运算有 加减乘除,平方根,求余,对数,阶乘(只能计算整数阶乘,小数会四舍五入再计算),按位与或非,三角函数等。详见代码中的sign字符宴辩串数组里面的命令。
例如输入:1.5*3.14159-10^3+cos(12*6-15)*10
----------caodd_2010-------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define PAI 3.141592654
//str 内容,大于0 为运算符号,小于0为数字。str中没有0(除了末尾)。
//prtx内容,为str对应元素的优先级
//num内容为str对应的数字的存储区
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
const char sign[][5]= {".","+","-","*","/","^","sqrt","%","log","!","(",")","acos","asin","atan","acot","cos","sin","tan","cot","ln","lg","--","&","|","~","xor","B","H","cd","exit",""};
const char prt[]= { 0, 1, 1, 2, 2, 4, 3, 2, 3, 5, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 3, 3, 3, 3, 5, 5, 5, 1, 0}; //优先级
//只有薯亮左目预算符优先级才可为5
char counter(char mode,double * a,double * b)//返回-1代表左边数祥宽的值被改变 +1代表右边的值被改变 0代表都被改变
{
double ax;
int i;
//printf("\nmode=%d,*a=%g,*b=%g",mode,*a,*b);
switch(mode)
{
case 1://+
*b+=*a;
return 0;
case 2://-
*b=*a-*b;
return 0;
case 3://*
*b*=*a;
return 0;
case 4:// /
*b=*a/(*b);
return 0;
case 5://^
*b=pow(*a,*b);
return 0;
case 6:// sqrt
*b=sqrt(*b);
return 1;
case 7://%
*b=fmod(*a,*b);
return 0;
case 8://log
*b=log(*b)/log(*a);
return 0;
case 9://!
ax=1;
i=(int)(*a+0.5);
while(i)
{
ax*=i;
i--;
}
*a=ax;
return -1;
case 12://acos
*b=acos(*b)*180/PAI;
return 1;
case 13://asin
*b=asin(*b)*180/PAI;
return 1;
case 14://atan
*b=atan(*b)*180/PAI;
return 1;
case 15://acot
*b=atan(1/(*b))*180/PAI;
return 1;
case 16://cos
*b=cos(*b*PAI/180);
return 1;
case 17://sin
*b=sin(*b*PAI/180);
return 1;
case 18://tan
*b=tan(*b*PAI/180);
return 1;
case 19://cot
*b=1/tan(*b*PAI/180);
return 1;
case 20://ln
*b=log(*b);
return 1;
case 21://lg
*b=log10(*b);
return 1;
case 22://--负数
*b=-*b;
return 1;
case 23://& 按位与
*b=(int)(*a+0.5)&(int)(*b+0.5);
return 0;
case 24://|按位或
*b=(int)(*a+0.5)|(int)(*b+0.5);
return 0;
case 25://~按位取反
*b=~(int)(*b+0.5);
return 1;
case 26://xor按位异或
*b=(int)(*a+0.5)^(int)(*b+0.5);
return 0;
case 27://B二进制
return -1;
case 28://H十六进制
return -1;
case 29://cd
return -1;
case 30://exit
exit(0);
}
return 0;
}
double master(char *str)
{
double num[64]= {0}; //存储数字
double *pa,*pb;
double zero=0;
char prtx[128]="",*t;//prtx存储运算优先级
char sp[128]="";//sp数组存储根据prtx得来的运算顺序。
char i,k,l,len,n,allc=1,mark=0;//allc为运算符数量,n为数字的数量,len为字符串长度。
//找出运算符 因为acos 和cos 会有重复的部分,所以找到a之后要把后面的c置为其它不重复字符,比如','。
while(sign[allc][0]!=0)
{
if((t=strstr(str,sign[allc]))!=NULL)
{
if(*t=='a')
{
*(t+1)=',';
}
*t=allc;
}
else
{
allc++;
}
}
//找出数字,赋值给num
for(i=0,n=0; 1; i++)
{
if(str[i]>='0'&&str[i]<='9'||str[i]=='.')
{
num[n++]=atof(str+i);
str[i]=-n;
while((str[++i]>='0'&&str[i]<='9')||str[i]=='.')
{
;
}
}
else if(str[i]==0)
{
break;
}
}
//puts("num:");for(i=0; i<20; i++){printf("[%d:%g] ",i,num[i]);}
//删除多余的字符
for(i=0,len=0; str[i]!=0; i++)
{
if(str[i]<=allc)
{
str[len++]=str[i];
}
}
//关于负号的问题
for(i=0; i<len; i++)
{
if(str[i]==10&&str[i+1]==2)
{
str[++i]=22;
}
}
str[len]=0;
//puts("\nstr:");for(i=0; i<len; i++){printf("[%d:%2d] ",i,str[i]);}
//构建优先级,数字与括号则优先级为0 ,其他符号优先级参照prt表并与mark加成
for(i=0; i<len; i++)
{
if(str[i]<0)
{
prtx[i]=0;
}
else if(str[i]==10) //每进一层括号mark+4 , mark为char型,所以最多可以有30或31层括号
{
prtx[i]=0;
mark+=4;
}
else if(str[i]==11)//每出一层括号mark-4
{
prtx[i]=0;
mark-=4;
}
else
{
prtx[i]=prt[str[i]]+mark;//优先级加成,prt数组里面的每种符号的默认优先级加上括号优先级
}
}
//puts("\nprtx:");for(i=0; i<len; i++){printf("[%d:%2d] ",i,prtx[i]);}
//存放运算顺序
k=0;
l=0;
do
{
mark=1;
for(i=0; i<len; i++)
{
if(str[i]>0)
{
if(mark<prtx[i])
{
mark=prtx[i];
k=l;
sp[k++]=i;
}
else if(mark==prtx[i])
{
sp[k++]=i;
}
}
}
for(i=l; i<k; i++)
{
prtx[sp[i]]=0;
}
l=k;
}
while(mark!=1);
sp[k]=-1; //sp数组结束标志,遇到-1则结束
//puts("\nsp :");for(i=0; sp[i]>0; i++){printf("[%d:%2d] ",i,sp[i]);}
//运算开始
for(i=0; sp[i]>=0; i++)
{
//printf("\nprtx[%d]=%d",i,prtx[i]);
//k为向运算符前面查找最近的数字
for(k=sp[i]-1; k>0; k--)
{
if(str[k]<0)
{
break;
}
}
if(str[k]>-1)
{
pa=&zero;
}
else
{
pa=&num[-str[k]-1];
}
//l为向运算符后面查找最近的数字
for(l=sp[i]+1; l<len; l++)
{
if(str[l]<0)
{
break;
}
}
if(str[l]>-1)
{
pb=&zero;
}
else
{
pb=&num[-str[l]-1];
}
//返回值为0说明左右两个数字均参与了运算
if(counter(str[sp[i]],pa,pb)==0)
{
num[-str[k]-1]=0;//将参数运算的两个数字之一清零(我选取的是每次清除运算符左面的数)
str[k]=0;//同样将其从表达式中清除
}
}
for(i=0; i<n; i++)
{
if(num[i]>1e-20||num[i]<-1e-20)
{
return num[i];
}
}
return 0;
}
int main(/*int argc, char *argv[]*/)
{
char str[128];
double m;
while(1)
{
printf("请输入算式(输入exit退出):\n计算器>");
fgets(str,sizeof(str),stdin);
m=master(str);
printf("计算结果为:%f (%g)\n\n",m,m);
}
return 0;
}
⑦ C语言初学:求计算器程序编码。
/*程序我已经运行过。可以用的。希望对你有所帮助*/
#include
"stdio.h"
main()
{
float
i,k;
char
c;/*定义的运算符*/
printf("please
input
i+(-/*k)\n");/*自己输入等式咐正*/
scanf("%f%c%f",&i,&c,&k);
switch(c)
{
case
'*'衡帆悔
:printf("%,3f\n",i*k);break;/*保留三位有效数字*/
case
'/'
:printf("%.3f\n",i/轿拿k);break;
case
'+'
:printf("%.3f\n",(i+k));break;
case
'-'
:printf("%.3f\n",(i-k));break;
default
:printf("input
eirror\n");
}
}
⑧ 如何用C程序编写一个计算器
1
首先,得从网上下载并安装c++,然后从桌面找到并打开它。
⑨ 用C语言编写一个简单的计算器1
#include<stdio.h>
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\n", ret ); return 0;
} 写个简单易懂的,你操作计算器的步骤就是编写程序的思路呀