中易网

求C++100以内加减乘除法源代码

答案:2  悬赏:0  
解决时间 2021-03-08 02:06
我们大一生的C++大作业,老师要求编一段程序,要求:供小学生使用的100以内加减乘除运算自测程序…好麻烦啊!各位高手帮帮忙!
最佳答案
是100位还是100以内呃……
用随机函数自动生成数……
算法思路大概就是这样……毕竟我不学C 帮不了你了……
全部回答
#include #include #include #include #define max_size 256 enum bool{false,true}; typedef struct tagoperate{ double operand; char operator; }operate,*lpoperate; void postsrc(char *src,lpoperate lpoperator); int isdigit(char); int isp(char ch); int icp(char ch); int locate(char ch); int getoperand(char *s,int *len,double *oprd); double calculate(lpoperate lpoperator,double x); void srcfunproc(char *src); void _proc(char*src); static char operator[]="#(+-*/^"; static int inpriority[]={0,1,3,3,5,5,7}; static int outpriority[]={0,10,2,2,4,4,6}; int locate(char ch) { int i=0; for(i=0;operator[i]!='\0';i++) if(operator[i]==ch) return i; return -1; } int isp(char ch) { if('a'<=ch&&'z'>=ch) return 9; else return inpriority[locate(ch)]; } int icp(char ch) { if('a'<=ch&&'z'>=ch) return 8; else return outpriority[locate(ch)]; } void _proc(char*src) { char buffer[max_size]; char*p=src,*q=buffer; *q++=*p++; while('\0'!=*p) { if('-'==*p&&'('==*(p-1)) { *q++='0'; *q++='-'; p++; } else *q++=*p++; } *q='\0'; strcpy(src,buffer); } void srcfunproc(char*src) { char buffer[max_size]; char*p=src,*q=buffer; while(*p!='\0') { switch(*p) { case 's': // a for sin *q++='a'; p+=3; break; case 'c': // b for cos *q++='b'; p+=3; break; case 'e': //c for exp *q++='c'; p+=3; break; case 'l': if('n'==*(p+1)) //d for ln() *q++='d'; else *q++='e'; //e for lg() p+=2; break; case 't': //f for tan() *q++='f'; p+=3; break; default: *q++=*p++; break; } } *q='\0'; strcpy(src,buffer); } void postsrc(char*src,lpoperate lpoperator) { char *p=src,y; lpoperate lpoptr=lpoperator; char stack[max_size]; int top=-1; double operand; int offset=0; stack[++top]='#'; while('\0'!=*p) { if(isdigit(*p)) { getoperand(p,&offset,&operand); p+=offset; lpoptr->operand=operand; lpoptr->operator=0; lpoptr++; } else if('x'==*p) { (lpoptr++)->operator='x'; p++; } else if('p'==*p) { lpoptr->operand=3.14159266; p+=2; lpoptr->operator=0; lpoptr++; } else if(')'==*p) { for(y=stack[top--];y!='(';y=stack[top--]) (lpoptr++)->operator=y; p++; } else { for(y=stack[top--];isp(y)>icp(*p);y=stack[top--]) (lpoptr++)->operator=y; stack[++top]=y; stack[++top]=*p++; } } while(top!=-1) (lpoptr++)->operator=stack[top--]; } int isdigit(char ch) { if(('0'<=ch&&'9'>=ch)||'.'==ch) return true; return false; } int getoperand(char *s,int *len,double *oprd){ char *p = s,ch = *s++; double z = 0,x = 0; int bits = 0; int point = false; while( isdigit(ch) == true){ if (ch == '.'){ if (point == true) return false; point = true; } else { if (point == true){ x *= 10; x += ch - '0'; bits++; } else { z *= 10; z += ch - '0'; } } ch = *s++; } while(bits-- > 0) x /= 10; z += x; *oprd = z; *len = s - p - 1; return true; } double calculate(lpoperate lpoperator,double x) { double stack[max_size],y1,y2; int top=-1; lpoperate lpoptr=lpoperator; stack[++top]=0; while(lpoptr->operator!='#') { if(!lpoptr->operator) stack[++top]=(lpoptr++)->operand; else if('x'==lpoptr->operator) { stack[++top]=x; lpoptr++; } else switch ((lpoptr++)->operator) { case '+': y1=stack[top--]; y2=stack[top--]; stack[++top]=y1+y2; break; case '-': y1=stack[top--]; y2=stack[top--]; stack[++top]=y2-y1; break; case '*': y1=stack[top--]; y2=stack[top--]; stack[++top]=y1*y2; break; case '/': y1=stack[top--]; y2=stack[top--]; stack[++top]=y2/y1; break; case '^': y1=stack[top--]; y2=stack[top--]; stack[++top]=pow(y2,y1); break; case 'a': y1=stack[top--]; stack[++top]=sin(y1); break; case 'b': y1=stack[top--]; stack[++top]=cos(y1); break; case 'c': y1=stack[top--]; stack[++top]=exp(y1); break; case 'd': y1=stack[top--]; stack[++top]=log(y1); break; case 'e': y1=stack[top--]; stack[++top]=log10(y1); break; case 'f': y1=stack[top--]; stack[++top]=tan(y1); break; default: break; } } return stack[top]; } void main() { char src[max_size]; double d; operate postsrc[max_size]; memset(src,0,max_size); printf("公式计算器--精确到小数点后八位 作者:*gothicmoon*\n输入任意表达式开始计算,输入quit结束程序\n常量 pi=3.14159266\n"); scanf("%s",src); while(strcmp(src,"quit")) { _proc(src); srcfunproc(src); postsrc(src,postsrc); d=calculate(postsrc,3.1415926); printf("计算结果是:%f\n",d); memset(src,0,max_size); scanf("%s",src); } }
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
在幼儿园里餐具怎么消毒
学数控什么书 好
美佳居建材这个地址在什么地方,我要处理点事
算命的靠谱吗?
要带动5台电脑玩联盟的网络要多少兆
现在从河源坐大巴车直达惠州,一般在哪个车站
这个公司在阿里巴巴的信息,是不是真的?
X212/福地路(路口)在什么地方啊,我要过去处
People in different countries have differe
iPhone自带音乐播放器为什么有时专辑封面会没
武汉商业银行九通保康卡过期怎么办?
农民到城市开小面馆生意的缴税标准,有没有优
虎牙直播怎样样置顶
华源大药店济民堂店在哪里啊,我有事要去这个
用想你许诺做手藏头诗
推荐资讯
Lovely时尚小资生活馆地址有知道的么?有点事
湖北科技职业学院停车场(出入口)在什么地方啊
有什么跟Picase一样好的图片浏览器
大神些跪求歌名
斐格(Feger)到底是淘宝货还是意大利货?
我有好多心里话不知道该对谁说
问下用2个光电开关2个小继电器1个交流接出器1
常州和绍兴哪个发达?
为什么隐藏的文件夹总是隔一段时间自动显示
请问芒果的英语怎么说
凤鸣郡A区这个地址在什么地方,我要处理点事
杨幂同款彩虹白鞋是什么牌子
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?