四则运算练习软件(附源程序)_第1页
四则运算练习软件(附源程序)_第2页
四则运算练习软件(附源程序)_第3页
四则运算练习软件(附源程序)_第4页
四则运算练习软件(附源程序)_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、淮北师范大学 数据结构设计实验报告题目四则运算练习软件班级: 设计者: 指导老师: 时间: 2011/04/13-2011/04/14 目录1程序设计的内容和相关的要求-2程序总的功能说明-3程序的模块的说明-4程序设计的流程图-5程序的操作说明及运行结果-6源程序的清单-7心得体会-1程序设计的内容和相关的要求课程设计的目的:数据结构课程设计是计算机学院重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。l进一步巩固和复习数据结构的基础知识。l培养学生结构化程序、模块化程序设计的方法和能力。l提高学生调试程序的技巧和软件设计的

2、能力。l提高学生分析问题、解决问题以及综合利用c语言进行程序设计的能力。l了解软件的编制过程。实现的任务:编写一个100以内的四则运算练习软件。设计内容:1.随机产生两个100的整数(运算结果也要在100内),可以选择要练习的运算,/,调用,/四个运算函数实现运算。2.,/混合运算(用栈的原理实现)设计要求:1.不同的功能使用不同的函数实现(模块化),对每个函数的功能和调用接口要注释清楚。对程序其它部分也进行必要的注释。2.对系统进行功能模块分析、画出总流程图和各模块流程图。3.用户界面要求使用方便、简洁明了、美观大方、格式统一。所有功能可以反复使用,最好使用菜单。4.通过命令行相应选项能直接

3、进入某个相应菜单选项的功能模块。5.所有程序需调试通过。2程序总的功能说明:本程序主要功能是进行数学算式运算练习,能够进行简单算式练习、混合算式运算,也能进行双向运算练习(自己模拟训练)。3程序各模块的功能说明:(1) 界面显示函数:enu();显示主菜单界面show();显示子界面双向练习菜单(2) 执行练习的功能函数:main_1();简单练习函数main_2();混合运算函数main_3();双向运算练习函数(3)窗体和背景设置函数 调用system(“color na”)(其中n表示从0到9任意一个数字;a表示任意取一个a,b,c,d,e,f中的一个字符)函数来实现不同窗体前景和背景色

4、彩的设置 4程序设计的流程图 : 四则运算界面单向运算双向运算混合运算简单运算加乘减除简单的练习运算加减乘除输入数字:输入输入输入输入退出退出11111222223333345程序操作说明书及结果在vc+6.0环境中运行本程序,先进行编译,然后再进行链接,在进行执行将会出现显示界面。按照显示界面上显示的提示从键盘上输入数字,就可以实现相应的功能。6源程序清单#include #include#include /对内存操作的头文件#include #include #include #include /#include 是在调用字符函数时,在源文件中包含的头文件。ctype中c为字符型char的

5、缩写,type 为类型。#include/操作时间有关的函数的头文件#define max_len 1024#define exp_len 4int right=0,wrong=0;int v;void add() int a,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+; void minu() int a,b,c; a=rand

6、()%100;/*随机产生1个100以内的整数,并赋值给a。srand()函数是随机数发生器的初始化函数,还缺少#include #include 两个头文件,int x,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+; void mul() int a,

7、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+; void di() int a,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+; void main_1() s

8、ystem(pause); system(cls); int choise,con=0; system(color 2a); printf(nntt简单四则运算程序n); system(pause); system(cls); while(1) printf(nntt请选择:n加(输入1)n减(输入2)n乘(输入3)n除(输入4)n); if(con=0)scanf(%d,&choise); switch(choise) case 1:add();break; case 2:minu();break; case 3:mul();break; case 4:di();break; printf(

9、请问您想继续进行这个运算还是重新选择其他运算还是退出?n继续(输入1),重新(输入2),退出(输入3); scanf(%d,&con); if(con=1)con=1; if(con=2)con=0; if(con=3)break; system(pause);const char* operator = +-*/;typedef structint n100;int top;stack;/定义栈的基本结构void inits(stack *s)s-top=-1;/栈的初始化int push(stack *s,int e)/将e入栈 s-top+; s-ns-top=e; return 1;

10、int pop(stack *s)/将栈顶元素出栈,存到e中 int e;e=s-ns-top; s-top-; return e;int gettop(stack *s)/取栈顶元素int e;e=s-ns-top;return e;char s2max_len, expmax_len * 2;/* s1保存数字或运算结果, s2保存操作符, exp为输入的表达式 * t1为栈s1的顶指针, t2为栈s2的顶指针, p为扫描exp的位置 */int s1max_len, t1, t2, p;int iscorrect;/* 检查生成的表达式是否合理 */int numberexp_len,

11、bracketexp_len;/* number为随机生成的表达式的操作数, oper为运算符, bracket为括号数组(0表示没有括号,-1表示左括号,1表示右括号) */char operexp_len - 1;char replymax_len * 2;/* 用户答案 */int n = 5;/* 题目数量,默认为5道题 */int getpriority(char c)/* 获得运算符的优先级 */if(c = + | c = -)return1;elsereturn 2;int getnum()/* 将字符转换成int */ int r = 0;while(isdigit(expp

12、)r = r * 10 + expp - 0; p = p + 1; return r;void calc(char op)/* 从栈顶取出两个数字, 进行 op 对应的操作 */ int a = s1t1 - 2;int b = s1t1 - 1; if(op = +)a += b; else if(op = -)a -= b;if(a 0 & s2t2 - 1 != ( & getpriority(s2t2-1) = getpriority(op)/* 先计算优先级高的表达式 */t2 = t2 - 1;calc(s2t2); s2t2 = op;/* 将op压入s2操作符栈中,并更新栈顶

13、指针 */t2 = t2 + 1; int processexp()/* 计算表达式的值 */ t1 = t2 = p = 0;/* 清空栈,将扫描指针复位 */ while(expp != 0)if(isdigit(expp) /* 如果是数值,入s1栈 */s1t1 = getnum();t1 = t1 + 1;-p; else /* 反之是运算符,入s2栈 */push(expp);p = p + 1;while(t2 0)/* 取出s2中剩余操作符,进行运算 */t2 = t2 - 1;calc(s2t2); return s10;int generateexp()/* 生成合法的表达

14、式(中间结果没有负数,分数和小数等) */int i, j, k, w, ret, digit16; while(true)/* 一直循环直到随机到一个合法的表达式 */iscorrect = 1;for(i = 0; i exp_len; i+)/* 随机操作数 */numberi = rand() % 30+ 1;for(i = 0; i exp_len - 1; i+)/* 随机操作符 */operi = operatorrand() % 4;j = -1;memset(bracket, 0, sizeof(bracket);/* 随机括号的位置 */while(true)i = j +

15、 1;if(exp_len - 1 - i = 0)break;j = rand() % (exp_len - 1 - i) + i;bracketj = -1;i = j + 1;j = rand() % (exp_len - i) + i;bracketj = 1;memset(exp, 0, sizeof(exp);/* 构造生成的表达式 */j = 0;for(i = 0; i 0)digitk = numberi % 10;numberi /= 10;k+;for(w = k - 1; w = 0; w-)expj = digitw + 0;j = j + 1;if(bracketi

16、 = 1)expj = );j = j + 1;expj = operi;j+;ret = processexp();/* 计算表达式的结果 */if(iscorrect)/* 如果合法,退出 */break;return ret;void operate()int j,k,i, ans = 0, rep = 0, correctnum = 0;char c;printf(请输入您要做题的数量:);scanf(%d,&k);for(i=1;i=k;i+)ans = generateexp();if(ans-1)printf(%s=n, exp); printf(答案: ); while(c =

17、 getchar() = n | c = )/* 忽略用户无意输入的空格和回车 */;ungetc(c, stdin);/* 将最后的合法字符放回输入缓冲区 */gets(reply);/* 读取用户答案 */rep = 0;for(j = 0; replyj; j+)/* 将用户的答案转化为数字 */if(!isdigit(replyj)break;rep = rep * 10 + replyj - 0;if(replyj)/* 若发现用户输入中有字母,退出 */return;if(replyj | rep != ans)/* 与标准答案不一致 */printf(很抱歉,回答错误!n);wr

18、ong+;else if(rep = ans) /* 回答正确 */printf(恭喜您,回答正确!n);right+;else i-;void main_2() int choise,con=0; system(cls); printf(nntt混合运算练习界面n); system(pause); system(cls); while(1) printf(nntt请选择:n继续(输入1)n退出(输入2)n); if(con=0)scanf(%d,&choise); switch(choise) case 1:operate();break; case 2:;break; printf(请问您

19、想继续进行这个运算还是重新选择其他运算还是退出程序?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);char op7=+,-,*,/,(,),#;/运算符数组char level77=, , ,=;/用二维数组定义运算符优先级int in(char c)switch(c)case +:case -:case *:case /:case (:case ):case #:return 1;return 0;/判断c是否在运算符数组

20、中char precede(char c1,char c2)int i,j;for(int k=0;k7;k+)if(c1=opk)i=k;break;/判断c1为何种运算符for(k=0;k7;k+)if(c2=opk)j=k;break;/判断c2为何种运算符return levelij;/判断两个运算符的优先级int oparate(int f1,char c,int f2)switch(c)case +: return f1+f2;case -: return f1-f2;case *: return f1*f2;case /: return f1/f2;return 0;/计算f1和

21、f2int eve(stack *optr,stack *opnd)char c;int i,temp;int t,x,theta;char n20;/定义一个数组临时存储待转换字符char c1=#;push(optr,(int)c1);c=getchar();int l,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)ni=c;i+;c=getchar(

22、);/如果获取的是不是运算符,则暂存于一个数组中,继续获取下一字符continue;if(in(c)if(n0!=0)i=0;t=(int)atof(n);/将数组中的字符串转换为float型数据push(opnd,t);memset(n,0,strlen(n);/清空数组,待下次获取vtemp=(int)gettop(optr); switch(precede(char)temp,c)case :theta=pop(optr);r=pop(opnd); l=pop(opnd);if(theta=/&r=0)v=1;break;push(opnd,oparate(l,(char)(int)th

23、eta),r);if(c=#)c=c+26;/将#还原为=处理break;return (int)gettop(opnd);void show()printf(222 222n);printf( 双向运算练习 n);printf(222 222n);printf(四则运算(包含、/和括号简单算术表达式)nnn);printf(若输入负数,请按(0-*)的形式输入nnn);printf(请按以下方式输入:n);printf(输入:n);printf(x+y=(enter)n);printf(nnn);void result() int m,n; stack *optr;stack *opnd;o

24、ptr=(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(rightn);right+;else printf(wrongn);wrong+;if(v!=1)getchar();printf(正确答案:%d,m); printf(n);/除数不为0正常输出elsev=0;

25、printf(除数不能为0n);/除数为0出错判断处理*/void circle() int choise,con=0; system(pause); system(cls); while(1) printf(nntt请选择:n进入运算式(输入1)n退出(输入2)n); if(con=0)scanf(%d,&choise); switch(choise) case 1:result();break; case 2: break; printf(请问您想继续进行这个运算还是重新选择其他运算还是退出程序?n继续(输入1),重新(输入2),退出(输入3); scanf(%d,&con); if(con=1)con=1; if(con=2)con=0; if(con=3)break; /当接受到y时循环输入void main_3() system(pause); system(cls);system(color 3b);show(); circle();printf(thanks for usingn);system(pause);void menu()/主菜单printf(*);printf(_ _ 欢迎你们来学习四则运算_);printf( );printf( 1.简单练习运算

温馨提示

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

评论

0/150

提交评论