课程设计四则运算.docx
- 文档编号:25627766
- 上传时间:2023-06-10
- 格式:DOCX
- 页数:34
- 大小:341.05KB
课程设计四则运算.docx
《课程设计四则运算.docx》由会员分享,可在线阅读,更多相关《课程设计四则运算.docx(34页珍藏版)》请在冰豆网上搜索。
课程设计四则运算
课程设计四则运算()
———————————————————————————————— 作者:
———————————————————————————————— 日期:
ﻩ
淮北师范大学
《数据结构设计实验报告》
题目——四则运算练习软件
班级:
09非师
设计者:
曹严严
指导老师:
张震
时间:
2011/04/13---2011/04/14
1程序设计的内容和相关的要求-----------------------------------
2程序总的功能说明----------------------------------------------
3程序的模块的说明----------------------------------------------
4程序设计的流程图----------------------------------------------
5程序的操作说明及运行结果-------------------------------------
6源程序的清单--------------------------------------------------
7心得体会------------------------------------------------------
1程序设计的内容和相关的要求
课程设计的目的:
数据结构课程设计是计算机学院重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。
●进一步巩固和复习数据结构的基础知识。
●ﻩ培养学生结构化程序、模块化程序设计的方法和能力。
●ﻩ提高学生调试程序的技巧和软件设计的能力。
●提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。
●ﻩ了解软件的编制过程。
实现的任务:
编写一个100以内的四则运算练习软件。
设计内容:
1.ﻩ随机产生两个<100的整数(运算结果也要在100内),可以选择要练习的运算+,-*,/,调用+,-,*,/四个运算函数实现运算。
2.+,-,*,/混合运算(用栈的原理实现)
设计要求:
1.ﻩ不同的功能使用不同的函数实现(模块化),对每个函数的功能和调用接口要注释清楚。
对程序其它部分也进行必要的注释。
2.ﻩ对系统进行功能模块分析、画出总流程图和各模块流程图。
3.ﻩ用户界面要求使用方便、简洁明了、美观大方、格式统一。
所有功能可以反复使用,最好使用菜单。
4.ﻩ通过命令行相应选项能直接进入某个相应菜单选项的功能模块。
5.所有程序需调试通过。
2程序总的功能说明:
本程序主要功能是进行数学算式运算练习,能够进行简单算式练习、混合算式运算,也能进行双向运算练习(自己模拟训练)。
3程序各模块的功能说明:
(1)界面显示函数:
enu();显示主菜单界面
show();显示子界面双向练习菜单
(2)执行练习的功能函数:
main_1();简单练习函数
main_2();混合运算函数
main_3();双向运算练习函数
(3)窗体和背景设置函数
调用System(“colornA”)(其中n表示从0到9任意一个数字;A表示任意取一个A,B,C,D,E,F中的一个字符)函数来实现不同窗体前景和背景色彩的设置
4程序设计的流程图:
5程序操作说明书及结果
在vc++6.0环境中运行本程序,先进行编译,然后再进行链接,在进行执行将会出现显示界面。
按照显示界面上显示的提示从键盘上输入数字,就可以实现相应的功能。
6源程序清单
#include
#include
#include<memory.h>//对内存操作的头文件
#include<stdlib.h>
#include
#include
#include<ctype.h>//#include
ctype"中c为字符型char的缩写,type 为类型。
#include<time.h>//操作时间有关的函数的头文件
#defineMAX_LEN 1024
#defineEXP_LEN 4
intright=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++;}
}
void minu()
{
inta,b,c;
a=rand()%100;/*随机产生1个100以内的整数,并赋值给a。
srand()函数是随机数发生器的初始化函数,
还缺少
#include
#include 两个头文件, intx,a;//表示初始化整数x和a srand(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++;} } void main_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; case 4: 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="+-*/"; typedef struct{ ﻩintn[100]; inttop; }stack;//定义栈的基本结构 voidinits(stack*s) { s->top=-1; }//栈的初始化 intpush(stack*s,inte)//将e入栈 { s->top++; s->n[s->top]=e; return1; } int pop(stack*s)//将栈顶元素出栈,存到e中 { ﻩinte; e=s->n[s->top]; s->top--; ﻩreturn e; } 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; int isCorrect;/* 检查生成的表达式是否合理 */ int number[EXP_LEN],bracket[EXP_LEN];/* number为随机生成的表达式的操作数,oper为运算符,bracket为括号数组(0表示没有括号,-1表示左括号,1表示右括号) */ charoper[EXP_LEN - 1]; charreply[MAX_LEN*2];/*用户答案 */ int N=5;/* 题目数量,默认为5道题*/ intGetPriority(charc)/* 获得运算符的优先级*/ { if(c == '+'|| c=='-') return1; else ﻩﻩreturn2; } intGetNum()/*将字符转换成int*/ { int r= 0; ﻩwhile(isdigit(Exp[p])) ﻩ{ ﻩr=r* 10+Exp[p]-'0'; ﻩp= p+1; } return r; } 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; } void Push(charop)/* 操作符入栈*/ { ﻩ if(op ==')')/* 优先计算括号内的表达式*/ { while(S2[T2- 1]! = '(') { ﻩﻩT2= T2-1; ﻩﻩCalc(S2[T2]); ﻩﻩ} T2=T2 -1; } else if(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; } void operate() {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() { int choise,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) { case 1: 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]={'+','-','*','/','(',')','#'};//运算符数组 char LEVEL[7][7]={'>','>','<','<','<','>','>', '>','>','<','<','<','>','>','>','>','>','>','<','>','>','>','>','>','>','<','>','>', '<','<','<','<','<','=','','>','>','>','>',' ','>','>','<','<','<','<','<','','='};//用二维数组定义运算符优先级 intIn(charc) { ﻩswitch(c) { ﻩcase'+': case'-': case'*': case'/': ﻩ ﻩcase'(': ﻩcase')': ﻩcase'#': return1; } return0; }//判断c是否在运算符数组中 charPrecede(charc1,charc2) { ﻩinti,j; for(int k=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,char c,int f2) { ﻩswitch(c) ﻩ{ ﻩcase '+': returnf1+f2; ﻩcase '-': returnf1-f2; case'*': returnf1*f2; case '/': returnf1/f2; ﻩ} ﻩreturn0; }//计算f1和f2 intEve(stack *OPTR,stack*OPND) { ﻩcharc; ﻩinti,temp; intt,x,theta; charn[20];//定义一个数组临时存储待转换字符 ﻩchar c1='#'; 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); ﻩ
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 四则运算