专业课程设计四则运算_第1页
专业课程设计四则运算_第2页
专业课程设计四则运算_第3页
专业课程设计四则运算_第4页
专业课程设计四则运算_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

淮北师范大学《数据结构设计试验汇报》题目——四则运算练习软件班级:09非师设计者:曹严严指导老师:张震时间:/04/13---/目录1程序设计内容和相关要求-----------------------------------2程序总功效说明----------------------------------------------3程序模块说明----------------------------------------------4程序设计步骤图----------------------------------------------5程序操作说明及运行结果-------------------------------------6源程序清单--------------------------------------------------7心得体会------------------------------------------------------1程序设计内容和相关要求课程设计目标:数据结构课程设计是计算机学院关键教学步骤,它为学生提供了一个既动手又动脑,将书本上理论知识和实际有机结合起来,独立分析和处理实际问题机会。 深入巩固和复习数据结构基础知识。 培养学生结构化程序、模块化程序设计方法和能力。 提升学生调试程序技巧和软件设计能力。 提升学生分析问题、处理问题和综合利用C语言进行程序设计能力。 了解软件编制过程。实现任务:编写一个100以内四则运算练习软件。设计内容:1. 随机产生两个<100整数(运算结果也要在100内),能够选择要练习运算+,-*,/,调用+,-,*,/四个运算函数实现运算。2. +,-,*,/混合运算(用栈原理实现)设计要求:1. 不一样功效使用不一样函数实现(模块化),对每个函数功效和调用接口要注释清楚。对程序其它部分也进行必需注释。2. 对系统进行功效模块分析、画出总步骤图和各模块步骤图。3. 用户界面要求使用方便、简练明了、美观大方、格式统一。全部功效能够反复使用,最好使用菜单。4. 经过命令行对应选项能直接进入某个对应菜单选项功效模块。5. 全部程序需调试经过。2程序总功效说明:本程序关键功效是进行数学算式运算练习,能够进行简单算式练习、混合算式运算,也能进行双向运算练习(自己模拟训练)。3程序各模块功效说明:界面显示函数:enu();显示主菜单界面show();显示子界面双向练习菜单实施练习功效函数:main_1();简单练习函数main_2();混合运算函数main_3();双向运算练习函数(3)窗体和背景设置函数调用System(“colornA”)(其中n表示从0到9任意一个数字;A表示任意取一个A,B,C,D,E,F中一个字符)函数来实现不一样学体前景和背景色彩设置4程序设计步骤图:四则运算界面四则运算界面单向运算双向运算混合运算简单运算加乘减除简单练习运算简单练习运算加减乘除输入数字:输入输入输入输入退出退出11111222223333345程序操作说明书及结果在vc++6.0环境中运行本程序,优异行编译,然后再进行链接,在进行实施将会出现显示界面。根据显示界面上显示提醒从键盘上输入数字,就能够实现对应功效。6源程序清单#include<stdio.h>#include<windows.h>#include<memory.h>//对内存操作头文件#include<stdlib.h>#include<malloc.h>#include<string.h>#include<ctype.h>//#include<ctype.h>是在调用字符函数时,在源文件中包含头文件。ctype"中c为字符型char缩写,type为类型。#include<time.h>//操作时间相关函数头文件#defineMAX_LEN1024#defineEXP_LEN4intright=0,wrong=0;intv;voidadd(){inta,b,c;a=rand()%100;//rand()函数,生成范围1-1000;b=100-a;b=rand()%b;printf("请回复:%d+%d=",a,b);scanf("%d",&c);if(a+b!=c){printf("回复错误\n");wrong++;}else{printf("回复正确\n");right++;}}voidminu(){inta,b,c;a=rand()%100;/*随机产生1个100以内整数,并赋值给a。srand()函数是随机数发生器初始化函数,还缺乏#include<stdlib.h>#include<time.h>两个头文件,intx,a;//表示初始化整数x和asrand(time(0));//表示随机数产生初始化a=(int)(rand()%100);//表示调用rand()函数产生100以内整数并赋值给a*/b=rand()%a;printf("请回复:%d-%d=",a,b);scanf("%d",&c);if(a-b!=c){printf("回复错误\n");wrong++;}else{printf("回复正确\n");right++;}}voidmul(){inta,b,c;a=rand()%11;b=(rand()%100)/(a+1);printf("请回复:%d*%d=",a,b);scanf("%d",&c);if(a*b!=c){printf("回复错误\n");wrong++;}else{printf("回复正确\n");right++;}}voiddi(){inta,b,c;a=rand()%100;b=rand()%100+1;printf("请回复:%d/%d=",a,b);scanf("%d",&c);if(a/b!=c){printf("回复错误\n");wrong++;}else{printf("回复正确\n");right++;}}voidmain_1(){system("pause");system("cls");intchoise,con=0;system("color2A");printf("\n\n\t\t简单四则运算程序\n");system("pause");system("cls");while(1){printf("\n\n\t\t请选择:\n加(输入1)\n减(输入2)\n乘(输入3)\n除(输入4)\n");if(con==0)scanf("%d",&choise);switch(choise){case1:add();break;case2:minu();break;case3:mul();break;case4:di();break; }printf("请问您想继续进行这个运算还是重新选择其它运算还是退出?\n继续(输入1),重新(输入2),退出(输入3)");scanf("%d",&con);if(con==1)con=1;if(con==2)con=0;if(con==3)break;}system("pause");}constchar*OPERATOR="+-*/";typedefstruct{ intn[100]; inttop;}stack;//定义栈基础结构voidinits(stack*s){ s->top=-1;}//栈初始化intpush(stack*s,inte)//将e入栈{ s->top++;s->n[s->top]=e;return1;}intpop(stack*s)//将栈顶元素出栈,存到e中{ inte; e=s->n[s->top]; s->top--; returne;}intGetTop(stack*s)//取栈顶元素{ inte; e=s->n[s->top]; returne; }charS2[MAX_LEN],Exp[MAX_LEN*2];/*S1保留数字或运算结果,S2保留操作符,Exp为输入表示式*T1为栈S1顶指针,T2为栈S2顶指针,p为扫描Exp位置*/intS1[MAX_LEN],T1,T2,p;intisCorrect;/*检验生成表示式是否合理*/intnumber[EXP_LEN],bracket[EXP_LEN];/*number为随机生成表示式操作数,oper为运算符,bracket为括号数组(0表示没有括号,-1表示左括号,1表示右括号)*/charoper[EXP_LEN-1];charreply[MAX_LEN*2];/*用户答案*/intN=5;/*题目数量,默认为5道题*/intGetPriority(charc)/*取得运算符优先级*/{ if(c=='+'||c=='-') return 1; else return2;}intGetNum()/*将字符转换成int*/{intr=0; while(isdigit(Exp[p])) { r=r*10+Exp[p]-'0'; p=p+1; }returnr;}voidCalc(charop)/*从栈顶取出两个数字,进行op对应操作*/{inta=S1[T1-2];intb=S1[T1-1];if(op=='+') a+=b;elseif(op=='-') { a-=b; if(a<0) /*假如中间结果出现负数,认为不正当*/ isCorrect=0; }elseif(op=='*') a*=b;else { if(b==0||a%b!=0)/*假如中间结果出现无法整除或除数为0,认为不正当*/ isCorrect=0; if(b!=0) a/=b; } S1[T1-2]=a;/*将计算结果压入S1操作数栈中,并更新栈顶指针*/T1=T1-1;}voidPush(charop)/*操作符入栈*/{ if(op==')')/*优先计算括号内表示式*/{while(S2[T2-1]!='(') { T2=T2-1; Calc(S2[T2]); }T2=T2-1;}elseif(op=='(')/*左括号直接入栈*/ { S2[T2]=op; T2=T2+1; }else{ while(T2>0&&S2[T2-1]!='('&&GetPriority(S2[T2-1])>=GetPriority(op))/*先计算优先级高表示式*/ { T2=T2-1; Calc(S2[T2]); } S2[T2]=op; /*将op压入S2操作符栈中,并更新栈顶指针*/ T2=T2+1;}}intProcessExp()/*计算表示式值*/{T1=T2=p=0; /*清空栈,将扫描指针复位*/while(Exp[p]!='\0') { if(isdigit(Exp[p])) /*假如是数值,入S1栈*/ { S1[T1]=GetNum(); T1=T1+1; --p; }else/*反之是运算符,入S2栈*/ { Push(Exp[p]); } p=p+1; } while(T2>0)/*取出S2中剩下操作符,进行运算*/ { T2=T2-1; Calc(S2[T2]); }returnS1[0];}intGenerateExp()/*生成正当表示式(中间结果没有负数,分数和小数等)*/{ inti,j,k,w,ret,digit[16];while(true) /*一直循环直到随机到一个正当表示式*/ { isCorrect=1; for(i=0;i<EXP_LEN;i++) /*随机操作数*/ number[i]=rand()%30+1; for(i=0;i<EXP_LEN-1;i++)/*随机操作符*/ oper[i]=OPERATOR[rand()%4]; j=-1; memset(bracket,0,sizeof(bracket)); /*随机括号位置*/ while(true) { i=j+1; if(EXP_LEN-1-i<=0) break; j=rand()%(EXP_LEN-1-i)+i; bracket[j]=-1; i=j+1; j=rand()%(EXP_LEN-i)+i; bracket[j]=1; } memset(Exp,0,sizeof(Exp));/*结构生成表示式*/ j=0; for(i=0;i<EXP_LEN;i++) { if(bracket[i]==-1) { Exp[j]='('; j=j+1; } k=0; while(number[i]>0) { digit[k]=number[i]%10; number[i]/=10; k++; } for(w=k-1;w>=0;w--) { Exp[j]=digit[w]+'0'; j=j+1; } if(bracket[i]==1) { Exp[j]=')'; j=j+1; } Exp[j]=oper[i]; j++; } ret=ProcessExp();/*计算表示式结果*/ if(isCorrect) /*假如正当,退出*/ break; } returnret;}voidoperate(){intj,k,i,ans=0,rep=0,correctNum=0;charc;printf("请输入您要做题数量:"); scanf("%d",&k); for(i=1;i<=k;i++) { ans=GenerateExp(); if(ans<101&&ans>-1) { { {printf("%s=\n",Exp); printf("答案:");} while((c=getchar())=='\n'||c=='') /*忽略用户无意输入空格和回车*/ ; ungetc(c,stdin);/*将最终正当字符放回输入缓冲区*/ gets(reply);/*读取用户答案*/ rep=0;} {for(j=0;reply[j];j++) /*将用户答案转化为数字*/ { if(!isdigit(reply[j])) break; rep=rep*10+reply[j]-'0'; } if(reply[j]) /*若发觉用户输入中有字母,退出*/ return; if(reply[j]||rep!=ans) /*和标准答案不一致*/ { printf("很抱歉,回复错误!\n");wrong++; } elseif(rep==ans)/*回复正确*/ { printf("恭喜您,回复正确!\n");right++; } } } elsei--; }}voidmain_2(){intchoise,con=0;system("cls");printf("\n\n\t\t混合运算练习界面\n");system("pause");system("cls");while(1){printf("\n\n\t\t请选择:\n继续(输入1)\n退出(输入2)\n");if(con==0)scanf("%d",&choise);switch(choise){case1:operate();break;case2:;break;}printf("请问您想继续进行这个运算还是重新选择其它运算还是退出程序?\n继续(输入1),重头再来(输入2)\n,退出(输入3)\n");scanf("%d",&con);if(con==1)con=1;if(con==2)con=0;if(con==3)break;}system("pause");}charOP[7]={'+','-','*','/','(',')','#'};//运算符数组charLEVEL[7][7]={'>','>','<','<','<','>','>','>','>','<','<','<','>','>','>','>','>','>','<','>','>','>','>','>','>','<','>','>','<','<','<','<','<','=','','>','>','>','>','','>','>','<','<','<','<','<','','='};//用二维数组定义运算符优先级intIn(charc){ switch(c) { case'+': case'-': case'*': case'/': case'(': case')': case'#':return1; } return0;}//判定c是否在运算符数组中charPrecede(charc1,charc2){ inti,j; for(intk=0;k<7;k++) if(c1==OP[k]){i=k;break;}//判定c1为何种运算符 for(k=0;k<7;k++) if(c2==OP[k]){j=k;break;}//判定c2为何种运算符 returnLEVEL[i][j];}//判定两个运算符优先级intoparate(intf1,charc,intf2){ switch(c) { case'+':returnf1+f2; case'-':returnf1-f2; case'*':returnf1*f2; case'/':returnf1/f2; } return0;}//计算f1和f2intEve(stack*OPTR,stack*OPND){ charc; inti,temp; intt,x,theta; charn[20];//定义一个数组临时存放待转换字符 charc1='#'; push(OPTR,(int)c1); c=getchar(); intl,r; i=0; while(c!='='||(int)GetTop(OPTR)!=(int)('#')) { if(c=='=') { c=c-26; }//将'='转换为'#'进行处理 if(theta=='/'&&r==0) { while(c!='\n') { c=getchar(); } printf("Error!\n"); break; }//除数为0处理 if(!In(c)) { n[i]=c; i++; c=getchar();//假如获取是不是运算符,则暂存于一个数组中,继续获取下一字符 continue; } if(In(c)) { if(n[0]!='\0') { i=0; t=(int)atof(n);//将数组中字符串转换为float型数据 push(OPND,t); memset(n,'\0',strlen(n));//清空数组,待下次获取v } temp=(int)GetTop(OPTR); switch(Precede((char)temp,c)) { case'<': push(OPTR,(int)c); c=getchar(); break; case'=': x=pop(OPTR); c=getchar(); break; case'>': theta=pop(OPTR); r=pop(OPND); l=pop(OPND); if(theta=='/'&&r==0) { v=1; break; } push(OPND,oparate(l,(char)((int)theta),r)); if(c=='#') { c=c+26; }//将'#'还原为'='处理 break; } } } return(int)GetTop(OPND);}voidshow(){ printf("\2\2\2\2\2\2\n"); printf("双向运算练习\n"); printf("\2\2\2\2\2\2\n"); printf("四则运算(包含+、-、×、/和括号简单算术表示式)\n\n\n"); printf("若输入负数,请按(0-**)形式输入\n\n\n"); printf("请按以下方法输入:\n"); printf("输入:\n"); printf("x+y=(Enter)\n"); printf("\n\n\n");}voidresult(){intm,n;stack*OPTR; stack*OPND; OPTR=(stack*)malloc(sizeof(stack)); OPND=(stack*)malloc(sizeof(stack));//动态分配存放空间 inits(OPTR); inits(OPND);//初始化栈结构 printf("输入算式:\n"); m=Eve(OPTR,OPND);//计算数据 printf("输入计算数值:\n"); scanf("%d",&n); if(n==m){printf("right\n");right++;} else{printf("wrong\n");wrong++;} if(v!=1) { getchar(); printf("正确答案:%d",m); printf("\n"); }//除数不为0正常输出 else { v=0; printf("除数不能为0\n"); }//除数为0犯错判定处理*/}voidcircle(){intchoise,con=0;system("pause");system("cls");while(1){printf("\n\n\t\t请选择:\n进入运算式(输入1)\n退出(输入2)\n");if(con==0)scanf("%d",&choise);switch(choise){case1:result();break;case2:break; }printf("请问您想继续进行这个运算还是重新选择其它运算还是退出程序?\n继续(输入1),重新(输入2),退出(输入3)");scanf("%d",&con);if(con==1)con=1;if(con==2)con=0;if(con==3)break;}}//当接收到y时循环输入voidmain_3(){system("pause");system("cls"); system("color3B"); show();circle(); printf("ThanksForUsing\n");system("pause");}voidmenu()//主菜单{ printf("********************************************************************************"); printf("^_^_^_^_^_^_^_^_^_^_^_^^_^欢迎你们来学习四则运算^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_"); printf(""); printf("1.简单练习运算"); printf("2.混合练习运算"); printf("3.双向运算练习"); printf(""); printf("快选择你要学习内容吧!"); printf(""); printf("^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_"); printf("********************************************************************************");}voidmain(){intchoise,con=0;system("color3A"); menu();system("pause");system("cls");while(1){printf("\n\n\t\t\t\t请选择:\n简单练习运算(输入1)\n\n混合练习运算(输入2)\n\n双向运算练习(输入3)");if(con==0)scanf("%d",

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论