当前位置:文档之家› c语言课程设计24点

c语言课程设计24点

课程设计报告题目 24点游戏课程名称软件项目实践(二)院部名称龙蟠学院专业计算机科学与技术班级学生姓名学号课程设计地点校内实验室课程设计学时 2周(40学时)指导教师沈奇金陵科技学院教务处制成绩课程设计报告目录一、实验目的和要求 (2)二、实验仪器和设备 (2)三、实验过程 (2)四、实验结果与分析 (6)五、实验心得 (10)一、实验目的和要求1.实验目的1)了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;2)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4)训练用系统的观点和软件开发一般规范进行软件开发。

5)培养快速学习新的知识,并在项目中使用的能力。

2.实验要求设计并实现24点游戏,满足以下基本要求:①运行系统后,用户登录,输入用户名后,可以进入游戏,或查看英雄榜。

②玩家开始游戏后,系统随机产生四个1-13的数,分别代表13张牌。

提示玩家输入算式。

判断玩家输入的表达式是否合法,其中算式中的四个数字只能是程序所给的四个数字。

当玩家正确输入算式后,运用“用堆栈求解表达式”的原理,求出结果并判断是否为24,得出用户是输是赢的结果。

③如果用户赢,计算其所用时间(从输入算式开始计算,直至输入算式结束),并与英雄榜中成绩进行比较。

可以进入英雄榜的,则需更新英雄榜。

英雄榜只按成绩降序记录1-5名相关信息。

二、实验仪器和设备Microsoft WindowsXP / Windows 7Turbo C/Visual C++三、实验过程一.需求分析1.1 需求概述分析本系统共分为四个模块:普通用户登录模块,用户模块,游戏模块和更改用户模块以下是各个模块的功能简介。

(1)普通用户登录模块检测用户名是否存在,检查密码是否正确;(2)用户模块选择用户需要执行的操作(进入游戏、查看英雄榜、切换用户、退出)。

(3)游戏模块用户进行游戏,计算用户游戏时间,更新英雄榜。

(4)更改用户模块提供对用户的更改功能。

1.2模块分析24算法游戏的功能模块不多,也比较容易实现。

基本思想就是由程序先随机产生4张扑克牌,每张扑克牌对应一个整数,所以首先要有一个产生随机数模块。

接下来就是用户用程序产生的随机数来算24点了,所以要有一个输入用户去接表达式的模块。

用户输入完成后,判断输入表达式是否合法,所以要有一个判断表达式合法与否的模块。

如果表达式合法程序就开始计算表达式了,所以要有一个计算表达式的模块。

程序计算完表达式后就要判断用户输入的表达式是不是为24点了,所以还有一个判断表达式正误的模块。

这5个模块是逐步递进的,是要前一个模块的功能完成后,才能执行后一个模块,否则程序就将出错。

程序所涉及的数据结构主要为整形和字符型,整形数据结构主要是用来计算表达式的,字符型数据结构主要是用来输入表达式的。

程序所涉及的数据库结构主要有数组和栈,数组在计算表达式和产生随机数是都要用到,栈只是用来计算表达式的。

二.面向对象分析2.1 用例图(1) 用户用例图(2)系统用例图用户2.2类图2.3 流程图24点程序整体流程图:游戏算法流程图:数据有误将输入求解的算术表达式转换成后缀表达式的流程图:三.分工在此次课程设计中主要负责24点表达式的算法。

由系统给出的四个随机数字(1-13)按要求输入计算表达式,并且验证表达式结果是否为24。

同时还有将算术表达式转换为后缀表达式四.项目总结这一次编写大作业的程序又让我感受到学程序可以锻炼缜密的思维了。

因为平时练习的都是小程序,所以句段比较少,一些错误都很容易被检查出来,但是这次实训却是上百段的语句,难以检查,似乎也没有经验去怎么检查,那一刹那感觉到很急,但又不知如何是好。

在编写程序中,真的是细节决定成败,因为不管程序的语句是多是少,但是只要有一条语句或语法不正确,就不能使程序得到所需要的结果。

没能够使自己编写出来的程序等到想要的结果,意味着这是一个不理想的程序,对于本次编写来说则是失败的。

此次课程设计系统要求的功能都具备了。

还算是成功的。

四、实验结果与分析4.1.系统模块的运行界面游戏界面:(1)回答正确(2)回答错误英雄榜界面:4.2编码部分源代码:void change(char *e,char *a) /*中缀字符串e转后缀字符串a函数*/ { STACK2 *top=NULL;int i=0,j=0;char w;while(e[i] != '\0'){ if(isdigit(e[i])){ do{a[j]=e[i]; /*将数字原样拷贝到数组a中*/i++; /*e数组的下标加1*/j++; /*a数组的下标加1*/}while(e[i]!='.'); /*直到字符为数字结束符"."为止*/a[j]='.';j++; /*将数字结束符"."拷贝到a数组依然保持结束标记*/ }if(e[i]=='(') /*如果字符是"("时*/top=push2(top,e[i]); /*将其压入堆栈*/if(e[i]==')') /*如果字符是")"时*/{ top=ptop2(top,&w); /*取出栈顶元素,并从栈顶删除该元素*/ while(w!='(') /*如果字符不是"("时反复循环*/{ a[j]=w; /*将栈顶元素存入a数组*/j++; /*下标加1*/top=ptop2(top,&w) ; /*取出栈顶元素,并从栈顶删除该元素*/}}if(e[i]=='+'||e[i]=='-') /*如果字符是加或减号时*/{if(!empty2(top)) /*如栈不为空*/{ w=topx2(top);while(w!='(') /*当栈顶元素不是"("时反复循环*/{ a[j]=w;j++; /*将栈顶元素存入表达式a中,a的下标加1*/top=pop2(top); /*删除栈顶元素*/if(empty2(top)) /*如果栈为空*/break; /*跳出循环*/elsew=topx2(top); /*否则读栈顶元素*/}}top=push2(top,e[i]); /*将当前e的字符元素压入堆栈*/}if(e[i]=='*'||e[i]=='/') /*如果字符是乘或除号时*/{ if(!empty2(top)) /*如栈不为空*/{ w=topx2(top); /*读栈顶元素存入w*/while(w=='*'||w=='/')/*当栈顶元素是乘或除时反复循环*/{ a[j]=w;j++; /*将栈顶元素存入字符串a中,a的下标加1*/top=pop2(top); /*删除栈顶元素*/if(empty2(top)) /*如果栈为空*/break; /*跳出循环*/elsew=topx2(top); /*否则读栈顶元素*/}}top=push2(top,e[i]); /*将当前e字符元素压入堆栈*/}i++;}while(!empty2(top)) /*当不为空时反复循环*/top=ptop2(top,&a[j++]); /*将栈顶元素存入数组a中*/ a[j]='\0'; /*将字符串结束标记写入最后一个数组元素中构成字符串*/ }int computer(char *s) /* 计算函数*/{STACK1 *top=NULL;int i,k,num1,num2,result;i=0;while(s[i]!='\0') /*当字符串没有结束时作以下处理*/{ if(isdigit(s[i])) /*判字符是否为数字*/{ k=0; /*k初值为0*/do{ k=10*k+s[i]-'0'; /*将字符连接为十进制数字*/i++; /*i加1*/}while(s[i]!='.'); /*当字符不为‘.'时重复循环*/top=push(top,k); /*将生成的数字压入堆栈*/}if(s[i]=='+') /*如果为'+'号*/{top=ptop(top,&num2); /*将栈顶元素取出存入num2中*/top=ptop(top,&num1); /*将栈顶元素取出存入num1中*/result=num2+num1; /*将num1和num2相加存入result中*/top=push(top,result); /*将result压入堆栈*/}if(s[i]=='-') /*如果为'-'号*/{top=ptop(top,&num2); /*将栈顶元素取出存入num2中*/top=ptop(top,&num1); /*将栈顶元素取出存入num1中*/result=num1-num2; /*将num1减去num2结果存入result中*/top=push(top,result); /*将result压入堆栈*/}if(s[i]=='*') /*如果为'*'号*/{ top=ptop(top,&num2); /*将栈顶元素取出存入num2中*/top=ptop(top,&num1); /*将栈顶元素取出存入num1中*/result=num1*num2; /*将num1与num2相乘结果存入result中*/top=push(top,result); /*将result压入堆栈*/}if(s[i]=='/') /*如果为'/'号*/{top=ptop(top,&num2); /*将栈顶元素取出存入num2中*/top=ptop(top,&num1); /*将栈顶元素取出存入num1中*/result=num1/num2; /*将num1除num2结果存入result中*/top=push(top,result); /*将result压入堆栈*/}i++; /*i加1*/}top=ptop(top,&result); /*最后栈顶元素的值为计算的结果*/return result; /*返回结果*/}STACK1 *initstack1(STACK1 *top) /*初始化*/{ top=NULL; /*栈顶指针置为空*/return top; /*返回栈顶指针*/}STACK1 *push(STACK1 *top,int x) /*入栈函数*/{ STACK1 *p; /*临时指针类型为STACK1*/p=(STACK1 *)malloc(sizeof(STACK1)); /*申请STACK1大小的空间*/ if(p==NULL) /*如果p为空*/{printf("memory is overflow\n!!"); /*显示内存溢出*/exit(0); /*退出*/}p->data=x; /*保存值x到新空间*/p->link=top; /*新结点的后继为当前栈顶指针*/top=p; /*新的栈顶指针为新插入的结点*/return top; /*返回栈顶指针*/}STACK1 *pop(STACK1 *top) /*出栈*/{ STACK1 *q; /*定义临时变量*/q=top; /*保存当前栈顶指针*/top=top->link; /*栈顶指针后移*/free(q); /*释放q*/return top; /*返回栈顶指针*/}int topx(STACK1 *top) /*读栈顶元素*/{ if(top==NULL) /*栈是否为空*/{printf("Stack is null\n"); /*显示栈为空信息*/return 0; /*返回整数0*/}return top->data; /*返回栈顶元素*/}STACK1 *ptop(STACK1 *top,int *x) /*取栈顶元素,并删除栈顶元素*/{ *x=topx(top); /*读栈顶元素*/top=pop(top); /*删除栈顶元素*/return top; /*返回栈顶指针*/}int empty(STACK1 *top) /*判栈是否为空*/{ if(top==NULL) /*如果为空*/return 1; /*返回1*/elsereturn 0; /*否则返回0*/}STACK2 *initstack2(STACK2 *top) /*初始化*/{ top=NULL; /*栈顶指针置为空*/return top; /*返回栈顶指针*/}4.3功能逻辑设计登录a)判断用户名是否存在:判断用户名是否存在。

相关主题