c随机发牌--课程设计报告Word格式.doc
《c随机发牌--课程设计报告Word格式.doc》由会员分享,可在线阅读,更多相关《c随机发牌--课程设计报告Word格式.doc(18页珍藏版)》请在冰豆网上搜索。
(1).系统功能与分析(填写你所设计的菜单及流程图) 3
(2).数据结构(程序中所使用的变量、数组、结构体) 8
(3).模块设计 9
(4)调试过程:
测试数据及结果,出现了哪些问题,如何修改的 10
三、设计结果与分析 11
(5)程序有待改进的地方及本次实习的收获和建议 13
四、程序代码 13
附录:
完整、可运行代码及注释 16
一、 设计内容及要求
1.进一步掌握和利用C语言进行程设计的能力;
2、
进一步理解和运用结构化程设计的思想和方法;
3、
初步掌握开发一个小型实用系统的基本方法;
4、
学会调试一个较长程序的基本方法;
5、
学会利用流程图或N-S图表示算法;
6、
掌握书写程设计开发文档的能力(书写课程设计报告);
二、概要设计
(1).系统功能与分析(填写你所设计的菜单及流程图)
◆系统功能综述
本文本编辑器通过菜单的选择可以实现对扑克牌的构建、洗牌和发牌的功能,并可将最初始的扑克牌的花色与面值显示出来以及发牌后的花色与面值显示出来
◆设计的主菜单
程序初始化主窗口
1低效洗牌
2低效发牌
选择执行的
操作
4高效洗牌发牌
3退出
◆N-S流程图
main()主函数
定义显示菜单的函数
定义构建扑克牌的函数
定义低效洗牌的函数
定义低效发牌的函数
定义高效洗牌、发牌的函数
定义扑克牌花色的函数
定义扑克牌面值的函数
初始化二维数组deck为0
初始化一维数组huase
初始化一维数组dianshu
调用菜单函数
当为真时
调用构建扑克牌函数
输入用户所需要的选择
根据用户的选择进行功能
根据根据
voidsuit(structpukepk[52])
判断行数,打印正确的花色
voidface(structpukepk[52])
判断列数,打印正确的面值
◆分析与设计说明
每个函数的基本功能及函数的重要变量的意义:
voidmenu()/*打印主菜单栏*/
voidmake(structpukepk[52])/*构建一副扑克并打印起初的扑克顺序*/
voidordinary_shuffle(structpukepk[52])/*进行低效洗牌*/
voidordinary_deal(structpukepk[52])/*进行低效发牌*/
voideffective(intdeck[][13],charhuase[],chardianshu[])/*进行高效洗牌、发牌*/
voidsuit(structpukepk[52])/*打印扑克的花色*/
voidface(structpukepk[52])/*打印扑克的面值*/
各函数中的重要变量的意义详见下面源程序段的解释说明部分
各函数的之间的相互关系:
(2).数据结构(程序中所使用的变量、数组、结构体)
变量
e使用户选择所需要操作的功能的按键
i定义为1-52张牌,在1-4内的随机变量
t定义为随机变量进行运算后所赋的值
tds某张牌的面值在实现洗牌功能时暂时存放的变量地址
ths某张牌的花色在实现洗牌功能时暂时存放的变量地址
temp扑克牌在实现高效洗牌、发牌时,某张牌暂时存放的变量地址
row表示行数
column表示列数
card代表52张扑克牌
jishu表示在实现高效洗牌、发牌时,发牌的牌数
数组
deck[4][13]定义为一个4x13的二维数组deck表示一副牌。
行与花色对应:
第0行代表红心、第l行代表方块、第2行代表草花、第3行代表黑心。
列代表牌的面值:
第0列到第9列对应于“A”到9,第10列到第12列对应于“J”、“Q’’和“K”。
字符串数组suit代表四种花色,字符串数组face代表13张牌的面值。
huase[4]定义扑克牌的花色:
第0行代表红心、第l行代表方块、第2行代表草花、第3
行代表黑心
dianshu[13]定义扑克牌的面值:
第0到13列分别用‘A’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,'
9'
'
10'
J'
Q'
’K'
结构体
structpuke用来定义扑克牌的花色与面值,使得扑克牌被打印时能够显示出每张牌的特征
(3).模块设计
根据功能需要:
在运行程序时调用了<
stdio.h>
<
string.h>
stdlib.h>
time.h>
这几个头文件
源文件
函数名
功能
fapai---xipai.c
voidmain()
主函数
voidmenu()
打印主菜单栏
voidmake(structpukepk[52])
构建一副扑克并打印起初的扑克顺序
voidordinary_shuffle(structpukepk[52])
进行洗牌
voidordinary_deal(structpukepk[52])
进行发牌
voideffective(intdeck[][13],charhuase[],chardianshu[])
进行高效的洗牌、发牌
打印扑克的花色
打印扑克的面值
(3)总体设计思想:
◆先定义一个扑克牌的结构体变量,成员列表中包含扑克牌的花色与面值
◆创建主菜单栏,表明此程序的主要用途及相关操作步骤
◆如果要进行此游戏则进行构建一副扑克牌并将其牌最初始的52张牌的花色与面值显示出来以达到游戏的公正性
◆1.询问是否进行洗牌操作,若选择“1”则调用voidordinary_shuffle(structpukepk[52])函数进行洗牌。
此函数是循环有限次,在每次循环时都让系统随机取一个数除52取余得变量t即范围为1-13(也就是在A-K这13个数中任取一数),并同时将52张牌的首个面值与花色付给变量tds与ths,然后利用上面的变量t在这52张牌中随机取值,将其花色与面值从第1张牌开始进行随机地替换,这样就达到了低效洗牌的功效了;
2.然后继续询问要执行哪个操作。
3.若选择“2”则调用voidordinary_deal(structpukepk[52])函数进行发牌。
进行52次循环,调用suit(pk)函数(利用switch语句显示每张牌的花色:
第1行代表红心、第2行代表方块、第3行代表草花、第4行代表黑心)与face(pk)函数(利用switch语句显示每张牌的面值:
第0列到第9列对应于“A”到9,第10列到第12列对应于“J”、“Q’’和“K”)。
这样就可以把52张牌的花色与面值显示出来,从而也就完成了发牌的功能。
的每一张牌呢?
因为数组suit已经预载人了四种花色,所以通过打印字符串suit[row]来获得花色。
同样,打印字符串face[column]可获得牌的面值。
4.接着继续询问要进行哪个操作,若选择“4”,则调用voideffective(intdeck[][13],charhuase[],chardianshu[])函数进行高效的洗牌、发牌操作。
首先,把数组deck清为0;
然后,随机地从0~3中选择一行(row),从0~12中选择一列(column)。
把数1插入到数组元素deck[row][column]中并作标记card=1,之后的每一个循环就依次累加。
表示这张牌将是从洗好的牌中发出的第一张牌。
继续这个过程,把数2、3、…、52随机地插入到数组deck中表示从洗好的牌中发出的第2、第3、…、第52张牌。
若card已经标记到13,则需换行。
在把发牌序号插入到数组deck中的过程中,一张牌被选择两次是可能的,即选中它时,deck[row][column]可能会重复。
遇到此情况,系统就会把它忽略不做任何处理,跳出本循环,继续反复地随机选择其它的row和column,直到发现没有被选中过的牌为止。
这样牌的序号1到52最终会分给数组deck中的52张牌。
这时,这副牌就算完全洗好了。
用这种方法系统调用的函数就只有一个,而且使用嵌套的for循环使系统运行得更有效率。
5.如此循环地询问操作,直至用户输入“3”退出此程序。
测试数据及结果,出现了哪些问题,如何修改的
调试过程:
◆在发牌的过程中,第一张牌缺少花色
原因:
对变量局部i进行重复定义,导致变量i值在第二次调用时出错
修改:
将局部变量i定义成全局变量
◆在使用recycle函数递归调用时,并没有多次循环,只执行一次就结束了
在此程序中,recycle函数的递归调用并没有限制条件,它会无终止地进行,导致内存空间不足,甚至死机
将recycle函数改成while函数进行多次循环
◆在执行完发牌之后,进行循环,可是第二次循环却未执行洗牌之后的工作,而进行在此循环
scanf与getch()函数在输入上有所区别。
利用getch()函数输入一个字符之后,必须再按回车键,而所按的回车键会被内存记录,使得“\n”成为变量e的一个值,从而导致多输入了一次shufflethedeck(1/0)?
:
语句。
若使用scanf函数则不会出现此问题,虽然也要再输入回车键,但并不会将“\n”赋值给e变量
将输入Y/N形式修改为1/0,并将e=getch();
修改为scanf(“%d”,&
e);
◆在使用voideffective(intdeck[][13],charhuase[],chardianshu[])进行高效洗牌、发牌操作时,发出的牌显示得很凌乱,没有规律性的分布
高效发牌时,并不是每张牌都会打印出来,因此会显得凌乱,没有规律
增加初始化了的变量jishu,在打印完扑克牌之后,判断是否已经达到发过13张牌,若已发过13张牌,则换行
三、设计结果与分析
初始化界面
输入“1”进行低效洗牌后,会继续询问用户作何操作
然后继续输入“2”后就会显示低效洗牌后的结果,并继续询问用户作何操作
然后继续输入“4”进行高效洗、发牌显示其结果,并继续询问用户作何操作
然后继续输入“3”后,就会推出DOS界面,结束此程序
(5)程序有待改进的地方及本次实习的收获和建议
待改进:
◆本程序是将扑克牌的正面(即牌面的花色与面值都显示出来),而实际生活中洗牌与发牌的过程都是背面朝上,并不能知道其牌值。
因此洗牌、发牌过程中的正反面问题有待改