c语言简单的计算器,满意的给高分

只计算“+”还有“-” 要求可以计算多个数 中间有空格

如 : 输入 1234 + 55 - 78(中间有空格)
输出 1221
有多组数据

  +    55 之间如果有空格实现起来很复杂,需要用到字符串,再转换为数字再去运算,如果运算符与后面的数字没有空格、与前面的数字用空格、tab符或回车分开的话,实现起来就容易的多!


  程序如下:

  ---------------------------------------

#include<stdio.h>

void main()

{

 int s=0,x;

 printf("请输入算式:");

 do

 {

  scanf("%d",&x);

  s+=x;

 }while(x!=-1);

 printf("\n=%d\n",++s);

}

————————————————————————————

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-02-05

#include<stdio.h>

int main()

{

int sum,i=0,flag=1,j;

char a[50];

    int b[50];

printf("putin the question:\n");

scanf("%d",&b[0]);

sum=b[0];

while(1)

{

scanf("%c",&a[i]);

        if(a[i]=='\n')

        break;

scanf("%d",&b[i+1]);

    if(a[i]=='+')

sum=sum+b[i+1];

    if(a[i]=='-')

sum=sum-b[i+1];

    i++;

}

printf("result is :%d\n",sum);

    return 0;

}

(注意输入是不要加空格,本人觉的没必要结果:

)

第2个回答  2013-02-05
#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对应的数字的存储区
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("Input the statement(Input exit to exit):\nCalculator>");
fgets(str, sizeof(str), stdin);
m = master(str);
printf("result is :%f (%g)\n\n" ,m ,m);
}
return 0;
}
第3个回答  2013-02-05
抱歉,您输出的答案是错误的,结果应该是1211
/*此计算器包括括号,加减乘除的优先级别运算*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<dos.h>
float calc_BETA_1_1(char *s)
{
char fh[80*80],tempstr[100000];
float di[80*80],r=0,temp;
int n=0,i,k;
FILE *f;
{
int l;
l=strlen(s);
if(s[l-1]!='=') s[l]='=';
}
strcpy(tempstr,s);

SCAN:
{
//syntax ERR scan
{
int i,cn=0;

for(i=0;s[i];i++)
if(s[i]=='(') cn++;
else if(s[i]==')') cn--;

if(cn!=0) {printf("Syntax ERROR!");system("color 4e");system("pause");exit(0);}

}

{
int start=-1,end,i;

for(i=0;s[i];i++)
if(s[i]=='(') start =i;

if(start==-1) goto NORMAL;

for(i=start;s[i];i++)
if(s[i]==')') {end=i;break;}

{
char leftstr[80*80]="\0",rightstr[80*80]="\0",midstr[80*80]="\0";
int i,j;
float midresult;
//LEFT STR
for(i=0;i<start;i++)
leftstr[i]=s[i];
leftstr[i]=0;
//MID STR
j=0;
for(i=start+1;i<=end-1;i++)
midstr[j++]=s[i];
midstr[j]=0;
//RIGHT STR
j=0;
for(i=end+1;s[i];i++)
rightstr[j++]=s[i];
rightstr[j]=0;
midresult=calc_BETA_1_1(midstr);
sprintf(s,"%s%f%s",leftstr,midresult,rightstr);
goto SCAN;
}
}
}
//--------------------------------------------------------------------------------------------------------------------
NORMAL:
f=fopen("a.tmp","w");
fputs(s,f);
fclose(f);
f=fopen("a.tmp","r");
//ÊäÈëÄ£¿éµÄ´¦Àí
do
{
fscanf(f,"%f",&di[n]);
fscanf(f,"%c",&fh[n]);
n++;
}
while(fh[n-1]!='=');
fclose(f);
unlink("a.tmp");
//--------------------------------------------------------------------------------------------------------------------

for(i=0;i<n;i++)
{
if(fh[i]=='*')
{ temp=di[i];di[i]=0;
for(k=i+1;k<n;k++)
if(di[k]!=0){di[k]=temp*di[k];break;}
}
else if(fh[i]=='/')
{ temp=di[i];di[i]=0;
for(k=i+1;k<n;k++)
if(di[k]!=0){di[k]=temp/di[k];break;}
}
}
for(i=0;i<n;i++)
if(fh[i]=='-')
for(k=i+1;k<n;k++)
if(di[k]!=0) {di[k]*=(-1);break;}
for(i=0;i<n;i++)
r+=di[i];
//--------------------------------------------------------------------------------------------------------------------
strcpy(s,tempstr);
return r;
}
void delend0(char *s)
{
int i;
i=strlen(s)-1;
while(s[i]=='0') s[i--]=0;
i=strlen(s)-1;
if(s[i]=='.') s[i]=0;
}
void main()
{
char str[100000]="\0";
float result;
system("title LK_STUDIO CALC");
system("color 0a");
gets(str);
result=calc_BETA_1_1(str);
sprintf(str,"%s%f",str,result);
delend0(str);
system("CLS");
puts(str);
system("pause");
}
第4个回答  2013-02-05
可求多项运算。
要用上一项计算的结果进行运算,则可以这样 比如:
1+2+3
=6.000000
=+3 //这一步就是把上一步的结果进行运算。
=9.000000

望采纳。

#include "stdio.h"
#include "stdlib.h"
#include "ctype.h"
#define BUFFER_LEN 15
main()
{
char buffer[BUFFER_LEN];
char *p=buffer;
char temp[BUFFER_LEN];
double cacl[BUFFER_LEN];
char opera[BUFFER_LEN-1];
int i,j,k;
double result=0;

while(strcmp(gets(buffer),"quit"))
{
j=0,k=0;
if(isdigit(*p))
{
for(i=0;*(p+i);++i)
{
if(isdigit(*(p+i))||*(p+i)=='.')
{
temp[k++]=*(p+i); continue;
}
if((*(p+i)!=' ')&&(!isdigit(*(p+i)))&&(*(p+i)!='.'))
{
temp[k]='\0';
cacl[j]=atof(temp);
opera[j++]=*(p+i);
k=0;
}
}
temp[k]='\0'; cacl[j]=atof(temp);
}
if(*p=='=')
{
j=0;k=0;
cacl[0]=result;
for(i=1;*(p+i);++i)
{
if(*(p+i)!=' '&&!isdigit(*(p+i))&&(*(p+i)!='.'))
{
opera[j++]=*(p+i);
continue;
}
if(isdigit(*(p+i))||*(p+i)=='.')
{
temp[k++]=*(p+i);
}
}
temp[k]='\0';
cacl[1]=atof(temp);
}

result=cacl[0]*1.0;
for(i=0;i<j;++i)
{
switch(opera[i])
{
case '+':
result+=cacl[i+1]*1.0;
break;
case '-':
result-=cacl[i+1]*1.0;
break;
case '*':
result*=cacl[i+1]*1.0;
break;
case '/':
if(cacl[i+1]==0)
{
printf("Invaild character.");
goto A;
}
else
{
result/=cacl[i+1]*1.0;
}
break;
case '%':
if(cacl[i+1]==0)
{
printf("Invaild character.");
goto A;
}
else
{
result=(long)result%(long)cacl[i+1];
}
break;
case '^':
for(k=0;k<cacl[i+1]-1;++k)
{
result*=result*1.0;
}
break;
}

}
printf("=%lf",result);
A: printf("\n");
}
}追问

能不能照我题目描述的那样写一个程序呗 不要这么多功能 还有题目要求可以多行输入 以输入-1时为结束

第5个回答  2013-02-06

这些网上都有现成的了。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网