C语言作业要求及设计说明书(初学者)
理财培训-无尽的平安夜
程序设计说明书
姓名:简正聪
班级:轮机136
学号:2
2015-12-27
广州航海学院 简正聪
AHA-C语言程序设计大作业要求
一、作业目的
1、 掌握用C语言进行程序设计的基本方法。
2、
熟练掌握window控制台应用程序的编写。
3、
初步完成一个应用程序的设计、编码、调试,了解程序设计过程,锻炼实际应用能力。
二、作业内容
猜数字游戏:
计算机随机生成没有重复的n个数,用户从键盘输入猜测的数。每猜一次,电脑
给出提
示信息。如果用户输入的数跟计算机生成的数,数值和位置都完全相等,则胜出。
基本功能要求:
1. 随机生成没有重复的4个数。(每个数字在0-9范围内)。
2. 用户从键盘输入4个不重复的数,程序能对用户输入的数与随机生成的数进行匹配,并
给
出提示信息:“有 x个数数值和位置都相同!有 y个数数值相同,但位置不同。”
3.
控制用户的尝试次数为10次。
4.
计算、输出并保存用户的得分,计分规则:总分是100分,每失败一次扣10分。
5. 有操作菜单
,能根据不同选择运行不同功能:1:开始游戏!2:查看上次成绩!3:输
出帮助信息!0:退出程序
!
扩展功能要求:
1.
对用户输入的数字进行检查,如果用户输入重复的数,给出提示,要求重新输入。
2.
能对游戏进行设置:在操作菜单中增加相应的选项:“4:系统设置”。
(1)
修改要猜的数字的个数n,根据修改后的n值,计算机可随机生成n个数,用户
进行n个数的猜测游戏。
(2) 修改可以尝试的次数。
3. 若游戏胜出且成绩在前五名,可输入并记录对应的用户
姓名,并添加到积分榜中。操作
菜单中相应选项改为“2:积分榜!”,用于把积分榜中保存的前五名成
绩及用户姓名显
示出来。
4. 能对积分榜的成绩进行排序和输出。
提示:(1)生成一个0~9的随机数,使用rand函数:
#include
#include
#include
int
main()
{ int a;
srand(time(0));
生成一个种子。整个程序只写一次即可。
1
广州航海学院
简正聪
}
a=rand()%10;
生成一个随机数。
printf(
return 0;
(2)保证生成的n个数不重复:
可用数组记录生成的数,每生成一个数,要与之前已经生成的进行比较,如果有相同的
重新生成,直到不相同。
三、作业要求
1、 每位同学独立完成。
2、
开发平台:VC++ 6.0,建立Win32 Console Application。
3、
提交时间:第17周周二之前(12月29日)提交。
4、
提交内容:打印版的程序设计说明书和电子版的程序代码。
5、 提交具体要求:
(一)
程序代码要求:程序要求能够正常运行,并至少能实现基本功能要求。完成扩
展功能要求将得到较高的分
数。
(二) 程序设计说明书要求:(不少于3000字)
(1)
正文最好分章节,正文为5号宋体。
(2) 内容:
1)
概述:开发环境,各种功能的完成情况(已经实现了哪些功能,哪些功
能未实现,或有什么运行错误)。
2) 程序概要设计:程序流程是什么(可画出流程图),有哪些函数,各实
现什么功能等。
3) 程序详细设计:关键代码分析(要写详细),在设计中的疑难问题解决。
4)
使用情况:展示各种的功能运行情况(必须有截图说明)
5)
总结:分析程序的优点和不足,遇到的困难及解决的问题,总结自己的
收获。
6)
参考目录。
6、 评分标准:
程序60%,程序设计说明书40%。
凡是发现拷
贝、抄袭的(无论抄与被抄者)、程序基本功能未
能实现的、说明书不能体现设计过程的均无法通过此课
程!
2
广州航海学院 简正聪
程序设计说明书
第一章概述..............
.........................
3
1.1
开发环境
.............................. .
3
1.2 各种功能完成情
.......................
3
1.3 存在的运行错误
...................
3
第二章程序概要设计...............................
5
2.1
整体流程
...............................
5
2.2 整体程序流程图
.........................
6
2.3
各个模块
................................
7
2.4函数的使用及其实现的功能
...............
11
第
三章程序详细设计.................................
12 3.1关键代码分析
...............................
12
3.2设计过程中的疑难
..........................18
第四章使用情况..................................
....
20
第五章 总结........................
...................
27
3
广州航海学院 简正聪
第六章参考资料................
......................
27
第一章
概述
1. 开发环境:啊哈C2.0
2.
各种功能完成情况:
1)、游戏操作菜单。
2)、基本的游戏功能:用户从键盘输入4个不
重复的数,程序能对用户输入的数与随机
生成的数进行匹配,并给出提示信息:“有
x个数数值和位置都相同!有 y个数数值相
同,但位置不同。
3)、积分榜功能:记录前五名玩家分数和姓名,按分数从高到低输入。
4)、帮助信息功能:给出用户猜数字的游戏规则和游戏中相关提示的含义。
5)、系统修改功能:能玩家能自行修改要猜的游戏数字个数和尝试次数。
6)、退出程序功能:玩家在主菜单中退出程序。
7)、输入数字检查:如果用户输入重复的数,给出提示,要求重新输入。
8)、返回功能:完成游戏或者完成设置后,玩家按任意键返回主菜单。
9)、错误提示功能:在选择菜单时按其他键则提示选择错误,要求重新选择。
10)清除排行榜功能。
3. 存在的运行错误:
游戏开始,如果用户在输入数字时误操作输入了字母符号或者其他字符则程序就陷入死
循环。
4
广州航海学院 简正聪
第二章
程序概要设计
1、整体流程
① 程序显示主菜单。
② 提示玩家输入选择,并输入。
1) 游戏主体。
2) 查看积分榜。
3) 帮助信息。
4)
系统设置。
0) 退出程序。
③
判断玩家的输入,进入相应的模块,其它选择则提示选择错误并返回②
④ 判断变量q是否等1。
1) 等于1,结束程序。
2) 不等于,返回①。
5
广州航海学院 简正聪
2、整体程序流程图:
6
广州航海学院
简正聪
功能主菜单
输入选择
提示输入错误
判读输入
1
开
始
游
戏
查
2
看
积
分
榜
帮
3
助
信
息
系
4
统
设
置
退
出
程
序
5
其
它
输
入
3、各个模块
1) 主游戏模块
7
no
q是否等于1
yes
结束程序
广州航海学院
简正聪
①
产生随机数:系统随机产生0-9的不重复的四个数,作为游戏的原始数字供玩
家进行猜数字游戏。
② 玩家输入4个数
③ 判读玩家输入的数字是否有重复,
是:重新输入,否:继续输入。
④ 判读输入的4个数与原始数比较,提示玩家数值和位置全
对的数字个数,和只
有数值但位置不对的数字个数。
⑤ 判读数字是否全对,
是:提示胜利,判断分数是否能进排行榜并记录进入排行榜玩家的得分与姓名,
分数与姓名排序。
否:继续运行。
⑥ 输入次数加1。
⑦
判断输入次数是否等于10。
是:提示失败,退出输入,按任意键返回菜单。
否:返回②继续输入。
8
广州航海学院 简正聪
流程图:
9
广州航海学院 简正聪
1
产生随机数a[i]
玩家输入b[i]
提示重新输入
b[i]= = b[j] ?
(输入是否有重复)
No
b[i]与a[i]
提示
Yes
No
n=10 ?
Yes
b[i] = =
a[i] ?
Yes
g[i] > g[5] ?
判断分数
Yes
Win
记录
分数
和姓名
并排序
No
游戏次数n 加1
No
Win
输入id
lose
任意键
q!=1 ?
No
主菜单
2)积分榜模块
10
广州航海学院 简正聪
调用主游戏模块中记录的分数和玩家姓名,打印出排行榜,按任意键返回主菜单。
3)帮助信息模块
直接打印出帮助信息,输入任意键返回主菜单。
4)系统设置模块
① 进入子菜单。
② 输入选择,1,2,3。
③ 判断玩家的选择,进入相应的模块,。
1. 修改要猜的数字的个数n。
2.
修改可以尝试的次数。
3. 恢复默认值。
4. 清除排行榜
0.
其它,提示选择错误,返回②。
⑤ 输入修改的数值。
⑥ 变量w等于1。
⑦
判断w是否等于1
是:返回主菜单。
否:返回主菜单。
11
广州航海学院 简正聪
系统设置流程图:
子菜单
玩家输入
提示错误
执行输入
1
2
3
4 0
其它
修改数值 修改数值
w=1 w=1
w!==1
Ye
No
任意键
主菜单
5)退出程序模块
玩家在主菜单选择0,q=1,检测判断,q=1,程序运行结束,退出关闭。
12
广州航海学院 简正聪
4、函数的使用及其实现的功能
1) while 函数:利用whie函数进入死循环,进
行一系列的操作,当条件满足时跳出
while,主要用来实现菜单的返回效果。
2)
for函数:用来产生多个原始数和给玩家输入多个数字,分数的比较等。
3)
scanf函数:用来输入0-9的数。
4)
getch:字符输入不带回显,用来实现菜单的选择。
5)
strcpy函数:用来实现玩家姓名排行榜的排序。
6) rand():产生随机数。
7) srand((unsigned)time(NULL)):利用系统时钟设定种子,给ran
d()函数产生不同
的种子,以用来产生多个随机数。
8)
fflush(stdin):清除scanf输入时留下的回车缓存。
13
广州航海学院 简正聪
第三章
程序详细设计
1、关键代码分析:
一 主体游戏部分:
1.原始随机数的产生
srand((unsigned)time(NULL));时间种子
for(i=0;i
a[i]=rand()%10;每次产生0-9范围内任意的一个数随机数并存到数组a中
限制重复数,,每生成一个数,要与之前已经生成的进行比较,如果有相同的
重新生成,直到不相同
for(j=0;j {
if(a[j]==a[i])
{
i=-1;出现重复数,令i=0。
a[i]=rand()%10;重新产生随机数
}
}
}
2.用户输入数字
for(i=0;i
scanf(
判断输入是否有重复
for(j=0;j{
if(b[j]==b[i])检测输入的数字是否有重复,原理同1。
{
printf(输入的数字有重复,请重新输入:n
i=-1;
break;
}
}
14
广州航海学院 简正聪
}
3.
判断部分
判断
cnt1=cnt2=0;
判断输入的b[i]是否与原始数a[i]相等,即判断数值和位置都相同的数
for(i=0;i
if(b[i]==a[i])
{
cnt1++;
}
判断数值相同但位置不同的数
for(j=0;j
if(i!=j &&
b[i]==a[j])
{
cnt2++;
break;
}
}
}
4. 胜利模块和排序
if(cnt1==t)胜利条件
{
printf(恭喜你!猜对了!n
printf(你的得分为:%dnn得分
s=100-10*n;计算得分
g[x]=s;数组记录得分
if(g[x]>g[5])判断分数是否进入前5名
{
print
f(恭喜你进入前五名,请输入你的名称(能力有限,仅仅支持英文名,按回车
确认):n
fflush(stdin);清除scnaf留下的回车缓存 方法2在scanf后面加getch
gets(m[x]);数组记录玩家的姓名
}
x++;游戏胜利次数
分数和玩家姓名排序
for(i=0;i
for(j=i+1;j
广州航海学院
简正聪
}
{
if(g[j]>g[i])
{
temp=g[i];g[i]=g[j];g[j]=temp;
strcpy(temp2,m[i]); 姓名跟着g[i]交换
strcpy(m[i],m[j]);
strcpy(m[j],temp2);
}
}
二 排行榜模块
调用在主游戏模块以排序好分数数组和分名字数组直接打印显示
for(i=0;i<5;i++)
{
输出分数
printf(%d名的成绩为:%03d
printf(玩家:
puts(m[i]);输出玩家名字
printf(
}
printf(
三 帮助模块
Printf函数,直接输出帮助信息。
四 系统设置模块
while(4)子菜单循环
{
if(ch=='4')
{
system(
打印子菜单
printf(n①修改要猜的数字的个数(默认为4)
nn
printf(10)nn
printf(nnn
while(4)子菜单循环
{
printf(请选择你需要的操作:
ch3=getch();
16
广州航海学院 简正聪
if(ch3=='1'||ch3==
'2'||ch3=='3’||ch4==’4’||ch3==’5’)
{
if(ch3=='1')选择1
{
system(
printf(请输入要修改的猜的数字的个数:n
while(5)限制修改的次数只能为1~10
{
scanf(
if(t1>10)
{printf(输入错误,请输入1~10之间的数n
else
{break;}
}
t=t1;更新次数主游戏模块要猜数字的个数
printf(已修改,请按任意键返回主菜单...
w=1;返回主菜单条件
break;跳出子菜单循环
}
if(ch3=='2')选择2
{
system(
printf(请输入要修改的尝试次数:n
scanf(
h
=h1;更新主游戏模块中的尝试次数
w=1;返回主菜单条件
printf(已修改,请按任意键返回主菜单...
break;跳出子菜单循环
}
if(ch3=='3')
system(
t=4;h=10;恢复
w=1;返回主菜单条件
printf(已恢复默认,请按任意键返回主菜单...
break;跳出子菜单循环
}
if(ch3=='4')
{
system(
for(i=0;i<100;i++)
{
g[i]=0;清除记录
strcpy(m[i],p[i]);清除姓名
17
{
广州航海学院 简正聪
}
w=1;返回主菜单条件
printf(已清除,请按任意键返回主菜单...
break;跳出子菜单循环
}
if(ch3=='5') 选择返回主菜单
{
break;
}
}
else
printf(菜单选择错误,请重新选择:n
}
主菜单返回模块
if(w==1)
{
ch2=getch();
}
w=0;条件复位
system(
break;跳出菜单选择循环while2
主菜单返回模块end
}
五主程序跳出模块
if(q==1)判断标志位q是否等于1,跳出二层while2循环,一层循环检测q==1,
{ 结束程序。
break;跳出while1
}
六主菜单循环模块
while(1)
{
printf(显示菜单,详情看源程序。
while(2)主菜单选择循环
{
if(ch=='1'||ch=='2'||ch=='3'||ch=='4'||ch=='0')
{
18
广州航海学院
简正聪
system(
if(ch=='1')游戏主体
{
1.主游戏模块
}
if(ch=='2')
{
2.积分榜模块
}
if(ch=='3')
{
3.帮助信息模
}
if(ch=='4')
{
4.系统设置模
}
if(ch=='0')
{
0.退出模块
}
}
else
printf(菜单选择错误,请重新选择:n
}while2
if(q==1)
{
break;跳出while1
}
}while1
七任意键返回模块
while主菜单或子菜单循环,详情见源程序。
{
„ 代表任意模块
„
„
printf(请按任意键返回主菜单...
ch2=getch(); 输入任意字符
system(
19
广州航海学院 简正聪
break;跳出菜单选择循环
}
2、设计过程中的疑难:
疑难一:
限制重复数的设计,开始时都陷入类似以下代码的错误思路中:
错误思路代码 :
①for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
while((i!=j) && (a[i]==a[j]))
{
a[j]=rand()%10;
}
}
}
②for(i=0;i<4;i++)
{
a[i]=rand()%10;
for(j=0;j<4;j++)限制重复数
{
if(a[j]==a[i])
a[i]=rand()%10;
}
}
错误原因:
出现重复数,与之前的数对比,没有使i置回来,a[i]=rand()%10
产生随机数
就进入下次i++,这样a[i]=rand()%10产生随机还是会产生与之前的数相同
的数。
解决方法:
产生下个随机数时,进入判断,若为重复数
使i置回i-1(i=-1),再产生随
机数再进入判断,直到没有随机数为止。
疑难二:
记录玩家姓名时用gets函数,程序没有显示要输入字符直接显示下个语句。
原因:
gets函数会首先读取缓存区的内容,而前面的scanf函数在输入
完毕后回车确
认会在缓存区留下回车字符,当运行到下面的gets函数时自动输入了回车,接着就运行下一个语句。
解决方法:
20
广州航海学院 简正聪
在前面的scanf函数后面
家getch();吸收回车键,或者在后面的gets函数前加
fflush(stdin)函数清除
scanf输入时留下的回车缓存。 (查百度得出的解决方法)
疑难三:
排行榜姓名的记录、
解决方法:
分数用数组g[i]记录,选
择排序,玩家姓名m[i]跟着跟着g[i]用strcpy函数选择排
序。
21
广州航海学院 简正聪
第四章
使用情况
各种的功能运行情况展示:
游戏初始画面:
游戏系统判断算法测试:
22
广州航海学院 简正聪
23
广州航海学院 简正聪
提示重复数:
24
广州航海学院 简正聪
如果连续四次输入错误将出现如下结果,并出现提示:
排行榜记录功能展示:
25
广州航海学院 简正聪
系统功能展示:
26
广州航海学院 简正聪
子菜单:
输入修改:
错误提示:
27
广州航海学院 简正聪
修改成功:
帮助信息:
28
广州航海学院 简正聪
退出程序:
29
广州航海学院 简正聪
第五章
总结
程序缺点:
程序还不够简练,没有用到一些高级的函数,比
如函数的调用,还有排行榜模块可以用
结构体定义一个函数来记录玩家的分数和姓名。定义的变量过多,
编写时易混淆。
优点:
主体结构明确,各个模块分工明确,程序语句排版清晰明确,容易读懂。
遇到的困难及解决的问题:
编写过程中遇到问题,可以说是数不胜数,比如像前面的所说的的
限制重复数,排行榜
的排序问题,此外还有主游戏的判断部分等等。虽然遇到的困很多,但是经过不断的
思考和
总结,遇到的问题都基本上解决了。
收获:
猜数字游戏的看似简
单,却需要能对C语言知识进行应用。尤其是循环语句和数组要进
行大量的应用。
首先,这次
的大作业让我把以前学习到的知识得到巩固和进一步的提高认识,对已有知
识有了更进一步的理解和认识
,再次,我在课程设计中碰到了很多的问题,通过自己钻研,
逐个击破。当然,通过这次的大作业,我也
发现了自身的很多不足之处。
此外,当自己能把所学的知识转换为有用的东西时,心中却不知何时有
了一种莫名的动
力,在电脑前面一坐就是好几个小时。这一次的大作业,不仅使我巩固了以前所学过的知
识,
更使我获得了很多在书本上所没有学到过的知识。通过这次课程设计使我的逻辑能力得到了
提高,正如书本封面写这乔布斯的那句话,“每个人都应该学会如何编程,因为它教会你如
何思考”。
最后,好的学习方法在学习中很多时候都起着至关重要的作用!尤其是在这次游戏设计
过程中,
深深地体会到,善于总结是学习过程中不可缺少的重要的一个环节。每次完成一个
编程任务,完成一段代
码,都应当有目的的跟踪该程序的调试和运行状况,随时总结,找到
自己的错误与不足之处,这样所编写
的程序才能逐步提高。
第六章
参考资料
1.《啊哈C!》
2.《c语言经典编程282例》
30