简单的四则运算计算器程序_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
简单的四则运算计算器程序
上传于||暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩22页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢用C语言实现的带括号四则运算计算器,原理简单,即模拟笔算,将每个运算符标记等级,计算时按照等级由高到低进行计算。加减运算为0级,乘除运算为1级,每进入一层括号等级加2。使用两个链表分别储存运算符与数字。主程序调用之前实现的两个模块,一个是链表,另一个是分数计算。链表代码在下一篇文章,只贴出主程序和分数计算部分。主程序,检查算式是否合法的函数未实现 1 #include &ctype.h& 2
3 #define LEVEL_NUM 20
//支持的运算级数 4
5 typedef struct 6 { 7
//存运算符的链表,data段类型为Op * 8
//存数字的链表,data段类型为Fract * 9
int oper_num[LEVEL_NUM];
//存每一级的运算符个数10 }P11 12 typedef struct13 {14
int16 }Op;
//运算符及对应的级别,加减0级,乘除1级,每进入一层括号运算符对应的级别加2sz.h
1 #include "list.h"
2 #include "fract.h"
3 #include "sz.h"
5 void calc(char equation[]);
6 void Convert(char equation[],Pack *pack);
7 int str2int(char str[],int start,int end);
8 int GetSE(char str[],int s,int flag);
9 void Compute(Pack *pack,Fract *ans); 10
12 int main(void) 13 { 14
char equation[100]; 15
while(1) 16
scanf("%s",equation); 18
calc(equation); 19
return 0; 22 } 23
24 void calc(char equation[]) 25 { 26
//检查及完善equation,该函数未实现!! 30
//转换并存入链表 32
Convert(equation,&pack); 33
//使用链表计算,并释放 35
Compute(&pack,&ans); 36
if(ans.deno==1)
//分母为1,只显示分子 38
printf("%5d/n",ans.numer); 39
printf("%5d/n-----/n%5d/n",ans.numer,ans.deno); 41 } 42
43 void Convert(char equation[],Pack *pack) 44 { 45
int i,base, 46
Fract * 49
//初始化 51
for(i=0;i&LEVEL_NUM;i++) 52
pack-&oper_num[i]=0; 53
pack-&num=CreateList(); 54
pack-&oper=CreateList(); 55
start=GetSE(equation,0,1); 57
//存级别的基,每进入一层括号基加2 58
for(i=0;equation[i];i++) 59
switch(equation[i]) 60
case '+':case '-':case '*':case '/': 62
//添加运算符 63
op=(Op *)malloc(sizeof(Op)); 64
op-&oper=equation[i]; 65
op-&level=base+ 66
( (equation[i]=='+'||equation[i]=='-')?0:1); 67
AddNode(pack-&oper,op,0);
//插入到链表头 68
pack-&oper_num[op-&level]++; 69
//添加数字 71
num=(Fract *)malloc(sizeof(Fract)); 72
num-&numer=str2int(equation,start,GetSE(equation,i-1,-1)); 73
num-&deno=1; 74
AddNode(pack-&num,num,0); 75
start=GetSE(equation,i+1,1);
//为下一个数字准备 76
case '(': 78
base+=2; 79
case ')': 81
base-=2; 82
//数字字符 84
//运算符和数字成对出现,存入最后多出的数字 88
num=(Fract *)malloc(sizeof(Fract)); 89
num-&numer=str2int(equation,start,GetSE(equation,i-1,-1)); 90
num-&deno=1; 91
AddNode(pack-&num,num,0); 92 } 93
94 //将由start和end脚标确定的字符串转换为整数 95 int str2int(char str[],int start,int end) 96 { 97
int i,s=0; 98
for(i=i&=i++) 99
s=s*10+str[i]-'0';100
return101 }102 103 104 //从s开始向前或向后找第一个数字字符的角标105 //flag为1向后,-1向前106 int GetSE(char str[],int s,int flag)107 {108
for(i=s;!isdigit(str[i]);i+=flag)110 111
return112 }113 114 void Compute(Pack *pack,Fract *ans)115 {116
//前一运算符,运算符117
//第一个数字,第二个数字
Node *pop,*op,*num,*
int120 121
//找到最高不为0的一级122
for(i=LEVEL_NUM-1;i&=0 && !pack-&oper_num[i];i--)123 124 125
for(;i&=0;i--)
//由高到低级依次计算126
for(pop=pack-&oper-&head,op=pack-&oper-&head-&next,num=pack-&num-&head-&127
pack-&oper_num[i] ;
if( ((Op*)(op-&data))-&level==i )
//找到级别为i的运算符129
pack-&oper_num[i]--;131
switch( ((Op*)(op-&data))-&oper)132
//因为储存是反向的,所以减法除法,要后一个数作为被除数、被减数134
case '+':Plus(num-&next-&data,num-&data);135
case '-':Minus(num-&next-&data,num-&data);137
case '*':Multiply(num-&next-&data,num-&data);139
case '/':Divide(num-&next-&data,num-&data);141
printf("/nCompute函数出现不可能运算符 %c/n",((Op*)(op-&data))-&oper);144
exit(0);145
//删除计算完成的运算符、数字149
pack-&num-&n--;150
pack-&oper-&n--;151
pop-&next=op-&152
nnum=num-&153
num-&next=nnum-&154
free(nnum-&data);free(op-&data);155
free(nnum);free(op);156 157
//恢复op的指向158
//没找到时继续遍历链表160
pop=op,op=op-&next,num=num-&161 162
//计算完成后,仅剩一个的数字为结果,运算符链表没内容,储存运算符级别的个数的数组各元素为0163
if(pack-&num-&n!=1 || pack-&oper-&n || pack-&oper_num[0])164
printf("Compute函数内变量异常,数字个数 %d,运算符个数 %d,0级个数 %d",166
pack-&num-&n,pack-&oper-&n,pack-&oper_num[0]);167
exit(0);168
(*ans)=*(Fract *)pack-&num-&head-&next-&170
DestroyList(pack-&num);171
DestroyList(pack-&oper);172 }sz.c分数计算部分 1 #include &stdio.h& 2 #include &stdlib.h& 3
4 typedef struct 5 { 6
//分母 8 }F 9 10 //分数的四则运算,结果存在num2中11 void Plus(Fract *num1,Fract *num2);12 void Minus(Fract *num1,Fract *num2);13 void Multiply(Fract *num1,Fract *num2);14 void Divide(Fract *num1,Fract *num2);fract.h
1 #include "fract.h"
3 static int commom_pisor(int a,int b);
//最大公约数
4 static int common_multiple(int a,int b);//最小公倍数
5 static void reduce(int *num1,int *num2);
8 void Plus(Fract *num1,Fract *num2)
int//公分母 11
if(num1-&numer==0)
//排除0值计算 13
*num1=*num2; 15
return; 16
else if(num2-&numer==0) return; 18
deno=common_multiple(num1-&deno,num2-&deno); 20
num2-&numer=deno/num1-&deno*num1-&numer+deno/num2-&deno*num2-& 21
num2-&deno= 22
25 void Minus(Fract *num1,Fract *num2) 26 { 27
num2-&numer=-num2-& 28
Plus(num1,num2); 29 } 30
31 void Multiply(Fract *num1,Fract *num2) 32 { 33
if(num1-&numer==0)return; 34
else if(num2-&numer==0) 35
num1-&numer=0; 37
return; 38
reduce(&num1-&deno,&num2-&numer); 41
reduce(&num1-&numer,&num2-&deno); 42
num2-&numer*=num1-& 44
num2-&deno*=num1-& 45
48 void Divide(Fract *num1,Fract *num2) 49 { 50
if(num2-&numer==0) 52
printf("除数不能为0/n"); 54
exit(0); 55
temp=num2-& 57
num2-&numer=num2-& 58
num2-&deno= 59
Multiply(num1,num2); 60 } 61
63 static void reduce(int *num1,int *num2)
//约分并保持原来的正负号 64 { 65
int temp,i; 66
/*i为0表示都为正,i为1表示num1为正,2表示num2为正,3表示都为负*/ 68
if(*num1&0) 69
*num1=-*num1; 71
if(*num2&0) 72
*num2=-*num2; 74
else i=2; 77
if(*num2&0) 80
*num2=-*num2; 82
else i=0; 85
temp=commom_pisor(*num1,*num2); 87
*num1/= 88
*num2/= 89
switch(i) 91
case 0:break; 93
case 1:*num2=-*num2;break; 94
case 2:*num1=-*num1;break; 95
case 3:*num1=-*num1;*num2=-*num2;break; 96
99 100 static int commom_pisor(int a,int b)101 {102
int temp,r;103
if(a&b)105
temp=a;107
while((r=a%b))112
return118 }119 120 static int common_multiple(int a,int b)121 {122
return a*b/commom_pisor(a,b);123 }fract.c&源代码 sz.7z&用C语言编一个能运算任何四则用算的程序_编程 - QQ志乐园
您的当前位置: &
用C语言编一个能运算任何四则用算的程序
来源: |人气:801 ℃|时间: 09:30:11
为了解决用户可能碰到关于"用C语言编一个能运算任何四则用算的程序"相关的问题,志乐园经过收集整理为用户提供相关的解决办法,请注意,解决办法仅供参考,不代表本网同意其意见,如有任何问题请与本网联系。"用C语言编一个能运算任何四则用算的程序"相关的详细问题如下:
例如:28* 3+67-23/2-12
就是能实现 任何 四则用算
急!!!!补充:上面的例子不对 应该是这样的例子:6-8/4+3*5@
9-6/(2+3)@
2*(3+5)/(6+4)@
请附是运行后的图片。
急!!!!!!!!!!!!!支持+-*/(),代码如下:#include &stdio.hinclude &stdlib.hinclude &ctype.h&char*double opd[1000];double *popd =#define PUSH(n) { *popd++ = }#define POP() (*--popd)#define TOP() (*(popd-1))#define EMPTY() (popd == opd)#define SIZE() (popd - opd)void fail(char* s){printf("match '%s' failed near '%c'.n", s, *--next);exit(0);}#define lbr() { if(*next++ == '(') ; else fail("("); }#define rbr() { if(*next++ == ')') ; else fail(")"); }void term();void lv1();void lv2();void cal(char);void expr(){term(); lv1();}void term(){double num = 0;if(isdigit(*next)) {do {num = num * 10 + (*next - '0');} while(isdigit(*++next));/*printf("%g", num);*/PUSH(num);} else if(*next == '(') {lbr(); expr(); rbr();} else {fail("term");}}void lv1(){while(1) {char c = *if(c == '+' || c == '-') {++lv2(); /*putchar(c);*/ ++ cal(c);} else if(*next == '*' || *next == '/') {lv2();} else {}}}void lv2(){while(1) {char c = *if(c == '*' || c == '/') {++term(); /*putchar(c);*/ ++ cal(c);} else if(isdigit(*next)) {term();} else {}}}double eval(char* s){next =expr();if(*next || opt != 0) {puts("invalid expression.");exit(0);}return TOP();}void cal(char c){double lhs, rhs,if(SIZE() & 1) {rhs = POP();lhs = POP();switch(c){case '+': r = lhs +case '-': r = lhs -case '*': r = lhs *case '/': r = lhs /}PUSH(r);--}}int main(){char* expr = "28*3+67-23/2-12";printf("%s=%gn", expr, eval( expr ) );return 0;}附图:
上面的例子不对 应该是这样的例子:6-8/4+3*5@
9-6/(2+3)@
2*(3+5)/(6+4)@
就向这样的例子等等要能运算任何四则运算
请附是运行后的图片。 急!!!!!!!!!!!!! 和数据结构有关
#include &stdio.hinclude &stdlib.hinclude &ctype.h&char*double opd[1000];double *popd =#define PUSH(n) { *popd++ = }#define POP() (*--popd)#define TOP() (*(popd-1))#define EMPTY() (popd == opd)#define SIZE() (popd - opd)void fail(char* s){printf("match '%s' failed near '%c'.n", s, *--next);exit(0);}#define lbr() { if(*next++ == '(') ; else fail("("); }#define rbr() { if(*next++ == ')') ; else fail(")"); }void term();void lv1();void lv2();void cal(char);void expr(){term(); lv1();}void term(){double num = 0;if(isdigit(*next)) {do {num = num * 10 + (*next - '0');} while(isdigit(*++next));/*printf("%g", num);*/PUSH(num);} else if(*next == '(') {lbr(); expr(); rbr();} else {fail("term");}}void lv1(){while(1) {char c = *if(c == '+' || c == '-') {++lv2(); /*putchar(c);*/ ++ cal(c);} else if(*next == '*' || *next == '/') {lv2();} else {}}}void lv2(){while(1) {char c = *if(c == '*' || c == '/') {++term(); /*putchar(c);*/ ++ cal(c);} else if(isdigit(*next)) {term();} else {}}}double eval(char* s){static char buf[100];char* p =while( *s != '@') {
if( *s != ' ' ) *p++ = *s;
++s;}next =expr();if(*next || opt != 0) {puts("invalid expression.");exit(0);}return TOP();}void cal(char c){double lhs, rhs,if(SIZE() & 1) {rhs = POP();lhs = POP();switch(c){case '+': r = lhs +case '-': r = lhs -case '*': r = lhs *case '/': r = lhs /}PUSH(r);--}}int main(){
char* expr[] = { "6-8/4+3*5@","9-6/(2+3)@","2*(3+5)/(6+4)@" };
for ( i = 0; i & 3; ++i )
printf("%s=%gn", expr[i], eval( expr[i] ) );
return 0;}运行截图:
||||点击排行如何用C语言编写让计算机随机出10道10以内的四则运算给人做一共? - 爱问知识人
(window.slotbydup=window.slotbydup || []).push({
id: '2491531',
container: s,
size: '150,90',
display: 'inlay-fix'
编写让计算机随机出10道10以内的四则运算给人做一共10分按做对的给1分统计总
您的举报已经提交成功,我们将尽快处理,谢谢!
那里有很多.
去选适合自己的比较好吧,我不知道你的水平~
大家还关注
帮忙看看我哪里错了。 题目描述:c语言编写 编写一个简单的计算器,实现两个整型数的四则运算。_百度知道