用c语言做一个简单的计算器。要求能做四则运算就够了,越简单越好。刚学了半年的C语言

如题所述

#include <stdio.h>
#include <malloc.h>
#include<string.h>
struct int_char
{
short biaozhi;/*标志是否运算数和运算符,0运算数1运算符*/
long suzhi;/*存储运算数*/
char yunsuanhu;/*存储运算符*/
struct int_char *next;
};
int main(void)
{
int zhifujianche(char *pstring);
struct int_char *jieshuanshi(char *string);
void yunsuan(struct int_char *suansi);
char sr[100]={0};
struct int_char *p;
int jcsr,off=1;
printf("***The positive integer four mixed operation***\n");
do
{
printf("Please enter the formula:");
gets(sr);
jcsr=zhifujianche(sr);/*检测输入是否合法*/
if(jcsr==0)break;
if(jcsr==2)
{
printf("除数不能为0\n");
continue;
}
if(jcsr==1)
{
printf("非法的算式\n");
continue;
}
}
while(1);
p=jieshuanshi(sr);/*将字符串转换成链表*/
if(p==0)
{
printf("未输入算式");/*如果链表为空就表示在没有输入任何字符的情况下按下了回车*/
return(0);
}
yunsuan(p); /*运算并输出解题步骤*/
return(0);
}
int zhifujianche(char *pstring)/*字符串输入合法性检测函数*/
{
char suozhizuanfan(char zhifu); /*用于确定当前字符是否数字*/
int i,kuohao1=0,kuohao2=0;/*kuohao1,huohao2,用于检测括号的对称性*/
for(i=0;pstring[i]!='\0';i++)
{
/*算式的开头只能出现数字,'(' 结尾只能出现数字,')'*/
if(i==0&&pstring[i]!=suozhizuanfan(pstring[i])&&pstring[i]!='(')
{return(1);break;}
if(pstring[i+1]=='\0'&&pstring[i]!=suozhizuanfan(pstring[i])&&pstring[i]!=')')
if(i==0&&(pstring[i+1]==')'||pstring[i+2]==')'||pstring[i+3]==')'))
{return(1);break;}
if(pstring[i+1]=='\0'&&(pstring[i-1]=='('||pstring[i-2]=='('||pstring[i-3]=='('))
{return(1);break;}
/*检测运算符出现位置的合法性*/
if(i!=0&&pstring[i+1]!='\0')/*判断字符是否在字符串的第一位和倒数第二位!*/
{
if(pstring[i]=='+'||pstring[i]=='-'||pstring[i]=='*'||pstring[i]=='/')
{
if(pstring[i-1]!=')'&&pstring[i-1]!=suozhizuanfan(pstring[i-1]))
{return(1);break;}
if(pstring[i+1]!='('&&pstring[i+1]!=suozhizuanfan(pstring[i+1]))
{return(1);break;}
}
if(pstring[i]=='(')
{
if(pstring[i-1]!='('&&pstring[i-1]!='+'&&pstring[i-1]!='-'&&pstring[i-1]!='*'&&pstring[i-1]!='/')
{return(1);break;}
if(pstring[i+1]!='('&&pstring[i+1]!=suozhizuanfan(pstring[i+1]))

{return(1);break;}
}
if(pstring[i]==')'&&pstring[i+1]!='\0')
{
if(pstring[i-1]!=')'&&pstring[i-1]!=suozhizuanfan(pstring[i-1]))
{return(1);break;}
if(pstring[i+1]!=')'&&pstring[i+1]!='+'&&pstring[i+1]!='-'&&pstring[i+1]!='*'&&pstring[i+1]!='/')
{return(1);break;}
}
}

/*算式中不应出现除数字,加减乘除,()以外的其他字符*/
switch(pstring[i])
{
case '1' :break;
case '2' :break;
case '3' :break;
case '4' :break;
case '5' :break;
case '6' :break;
case '7' :break;
case '8' :break;
case '9' :break;
case '0' :break;
case '+' :break;
case '-' :break;
case '*' :break;
case '/' :{if(pstring[i+1]=='0')return(2);break;}
case '(' :kuohao1++;break;/*检测括号的对称性假设:如果'('和')'数量相同则视为括号对称这里对'('和')'进行统计在循环结束时对其对比.......*/
case ')' :kuohao2++;break;
default :return(-1);
}
}
if(kuohao1!=kuohao2)/*对比括号是否对称*/
return(1);
return(0);
}
char suozhizuanfan(char zhifu)/*检查zhifu是否数字*/
{
switch(zhifu)
{
case'1':{return('1');break;}
case'2':{return('2');break;}
case'3':{return('3');break;}
case'4':{return('4');break;}

case'5':{return('5');break;}
case'6':{return('6');break;}
case'7':{return('7');break;}
case'8':{return('8');break;}
case'9':{return('9');break;}
case'0':{return('0');break;}
default :return(-1);
}
}
struct int_char *jieshuanshi(char *string)/*这个函数将字符串转换成一个含算式的链表它用到了suozhizuanfan,suozhizuanfan1,yunsuanfutiqu三个函数,和struct int_char结构体*/
{
char suozhizuanfan(char zhifu);
int suozhizuanfan1(char zhifu);
char yunsuanfutiqu(char yunsuanfu);
long yunsuansu=0;
int i,j,x,y,jisuqi,weisuqi;/*jisuqi用于转换后的整数在yunsuansu数组中存储的位置,weisuqi用于数字转换位数的标志*/
int n=0;/*n 位链表长度,为0时表示建立第一节点,非0时表示建立的不是第一节点*/
struct int_char *head=0;
struct int_char *p1,*p2;
if(strlen(string)==0)return(0);
for(i=0,jisuqi=0;string[i]!='\0';i++,jisuqi++)/*遍历字符串*/
{
if(string[i]==suozhizuanfan(string[i]))/*检查串中的最高位数字*/
{
x=i;/*定位最高数字在串中的位置*/
for(j=i;string[j]==suozhizuanfan(string[j]);j++);/*检查个位数字的位置*/
y=j-1;/*定位个位数字在串中的位置*/
i=j-1;/*将遍历字符串的计数器定位在最后被检查的字符的位置*/
for(weisuqi=1,yunsuansu=0;y>=x;y--,weisuqi*=10)/*数字转换*/
yunsuansu+=suozhizuanfan1(string[y])*weisuqi;
if(n==0)/*建立表头及将运算数接入链表*/
{
p1=p2=head=(struct int_char *)malloc(sizeof(struct int_char));
n++;
p1->biaozhi=0;
p1->suzhi=yunsuansu;
p1->yunsuanhu=0;
p1->next=0;
}
else/*将运算数接入链表*/
{
p1=(struct int_char *)malloc(sizeof(struct int_char));
n++;
p2->next=p1;
p2=p2->next;
p1->biaozhi=0;
p1->suzhi=yunsuansu;
p1->yunsuanhu=0;

p1->next=0;
}
}
if(string[i]==yunsuanfutiqu(string[i]))/*检测是否运算符*/
{
if(n==0)/*建立表头及将运算符接入链表*/
{
p1=p2=head=(struct int_char *)malloc(sizeof(struct int_char));
n++;
p1->biaozhi=1;
p1->suzhi=0;
p1->yunsuanhu=string[i];
p1->next=0;
}
else/*将运算符接入链表*/
{
p1=(struct int_char *)malloc(sizeof(struct int_char));
n++;
p2->next=p1;
p2=p2->next;
p1->biaozhi=1;
p1->suzhi=0;
p1->yunsuanhu=string[i];
p1->next=0;
}
}

}
return (head);
}

char yunsuanfutiqu(char yunsuanfu)/*检测yunsuanfu是否运算符*/
{
switch(yunsuanfu)
{
case '(':{return('(');break;}
case ')':{return(')');break;}
case '+':{return('+');break;}
case '-':{return('-');break;}
case '*':{return('*');break;}
case '/':{return('/');break;}
default:return(0);
}
}
void yunsuan(struct int_char *suansi)/*运算函数有两个子函数jjcc用于进行右括号的运算但括号没只有一个运算符时消除括号*/
{ /*wkjjcc用于进行无括号的运算,jjcc,wkjjcc只进行单步运算*/
void jjcc(struct int_char *up,struct int_char *np);
void wkjjcc(struct int_char *up,struct int_char *np);
struct int_char *p1,*p2;/*p1,当前节点p2,上一个节点。*/
struct int_char *up,*nP;/*up(的位置,np)的位置*/
short off;
p1=suansi;
if(p1->next==0)/*如果连表中只有一个节点*/
{
printf("=%d\n",p1->suzhi);/*就输出这个接点并结束*/
return;
}
for(;p1!=0;p1=p1->next)
if(p1->biaozhi&&p1->yunsuanhu==')')/*找到')'的位置*/
{
nP=p1;
for(p2=suansi;p2!=nP;p2=p2->next)/*找到'('的位置*/
if(p2->biaozhi&&p2->yunsuanhu=='(')
up=p2;

jjcc(up,nP);
printf("=");
for(p2=suansi;p2!=0;p2=p2->next)/*输出步骤*/
if(p2->biaozhi)
printf("%c",p2->yunsuanhu);
else
printf("%d",p2->suzhi);
printf("\n");
p1=suansi;
}

for(off=1;off;)
{
for(p1=suansi;p1->next;p1=p1->next);
up=suansi;
nP=p1;
if(up==nP)
off=0;
else
{
wkjjcc(up,nP);
printf("=");
for(p2=suansi;p2!=0;p2=p2->next)/*输出步骤*/
if(p2->biaozhi)
printf("%c",p2->yunsuanhu);
else
printf("%d",p2->suzhi);
printf("\n");
}
}
}
void jjcc(struct int_char *up,struct int_char *np)
{
struct int_char *p1,*p2,*p3;/*p1被运算数的位置p2运算符的位置p3运算数的位置*/
short off=1;
int i;
for(p2=up;p2!=np;p2=p2->next)
{
if(p2->biaozhi&&(p2->yunsuanhu=='*'||p2->yunsuanhu=='/'))
if(p2->yunsuanhu=='*')
{
p3=p2->next;
p1->suzhi=p1->suzhi*p3->suzhi;
p1->next=p3->next;
free(p2);
free(p3);
off=0;
break;
}
else
{
p3=p2->next;
p1->suzhi=p1->suzhi/p3->suzhi;
p1->next=p3->next;
free(p2);
free(p3);
off=0;
break;
}
p1=p2;
}
for(p2=up;off&&p2!=np;p1=p2,p2=p2->next)
{
if(p2->biaozhi&&(p2->yunsuanhu=='+'||p2->yunsuanhu=='-'))
if(p2->yunsuanhu=='+')

{
p3=p2->next;
p1->suzhi=p1->suzhi+p3->suzhi;
p1->next=p3->next;
free(p2);
free(p3);
break;
}
else
{
p3=p2->next;
p1->suzhi=p1->suzhi-p3->suzhi;
p1->next=p3->next;
free(p2);
free(p3);
break;
}
}
for(i=1,p3=up;p3!=np;i++,p3=p3->next);
if(i<5)
{
p2=up->next;
p3=p2->next;
up->biaozhi=0;
up->yunsuanhu=0;
up->suzhi=p2->suzhi;
up->next=p3->next;
free(p2);
free(p3);
}
}
int suozhizuanfan1(char zhifu)
{
switch(zhifu)
{
case'1':{return(1);break;}
case'2':{return(2);break;}
case'3':{return(3);break;}
case'4':{return(4);break;}
case'5':{return(5);break;}
case'6':{return(6);break;}
case'7':{return(7);break;}
case'8':{return(8);break;}
case'9':{return(9);break;}
case'0':{return(0);break;}
}
}
void wkjjcc(struct int_char *up,struct int_char *np)
{
struct int_char *p1,*p2,*p3;/*p1被运算数的位置p2运算符的位置p3运算数的位置*/
short off=1;
for(p2=up;p2!=np;p2=p2->next)
{
if(p2->biaozhi&&(p2->yunsuanhu=='*'||p2->yunsuanhu=='/'))
if(p2->yunsuanhu=='*')
{
p3=p2->next;
p1->suzhi=p1->suzhi*p3->suzhi;
p1->next=p3->next;
free(p2);
free(p3);
off=0;
break;
}
else
{
p3=p2->next;
p1->suzhi=p1->suzhi/p3->suzhi;
p1->next=p3->next;
free(p2);
free(p3);
off=0;
break;
}
p1=p2;
}
for(p2=up;off&&p2!=np;p1=p2,p2=p2->next)
{
if(p2->biaozhi&&(p2->yunsuanhu=='+'||p2->yunsuanhu=='-'))
if(p2->yunsuanhu=='+')
{
p3=p2->next;
p1->suzhi=p1->suzhi+p3->suzhi;
p1->next=p3->next;
free(p2);
free(p3);
break;
}
else
{
p3=p2->next;
p1->suzhi=p1->suzhi-p3->suzhi;
p1->next=p3->next;
free(p2);
free(p3);
break;
}
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-20
望采纳~~

#include"stdio.h"
void main()
{ float a,b;
char c,x;
while(1)
{
printf("输入表达式: a+(-,*,/)b\n");
scanf("%f%c%f",&a,&c,&b);
switch(c)//选择分支,C传进来
{
case '+': printf('=',a+b);break;//c等于 +
case '-': printf('=',a-b);break;//c等于 -
case '*': printf('=',a*b);break;//c等于 *
case '/': printf('=',a/b);break;//c等于 /
default: printf("输入错误!\n");break;//c不等于其中一个,这五个break;一定要的,每次做一次就break一次,不然就出错
}
printf("\n输入Q退出,任意键继续!");
scanf("%c",&x);
if(x=='q'||x=='Q')
break;
else
continue;
}
return;
}追问

我试用了下你的程序,可是得不到结果啊

追答

会么、、?s编译器的问题吧~~~~

本回答被网友采纳
第2个回答  2011-06-23
#include"stdio.h"

int main()
{
double left, right; /* 运算数*/
double result; /* 结果 */
char oper; /* 操作符*/
char flag; /* 标记,用来存储输入的字符,判断用户是否要退出*/

printf("欢迎使用!\n");

flag = 'a'; /*可以赋给flag除‘q’外任意数值*/
while( flag != 'q' )
{
printf("输入表达式(如a+b,仅支持加减乘除!):");
scanf("%lf%c%lf", &left, &oper, &right );
switch(oper)
{
case '+':
result = left + right;
printf( "%lf%c%lf=%f\n", left, oper, right, result );
break;
case '-':
result = left - right;
printf( "%lf%c%lf=%f\n", left, oper, right, result );
break;
case '*':
result = left * right;
printf( "%lf%c%lf=%f\n", left, oper, right, result );
break;
case '/':
result = left / right;
printf( "%lf%c%lf=%f\n", left, oper, right, result );
break;
default:
printf("输入错误!\n");
break;
}

printf("输入Q退出,其他任意键继续!");
scanf( "%c", &flag );
if ( flag == 'q' || flag == 'Q' )
break;
}

return 0;
}
第3个回答  2011-06-20
这个太简单了 自己搞吧。
相似回答