数算24
辽 宁 工 业 大 学
C语言程序设计 课程设计(论文)
题目: 速算 24
院(系): 软件学院
专业班级:
学 号:
学生姓名:
指导教师:
教师职称: 助 教
起止时间: 2009.12.14至2009.12.26
课程设计(报告)任务及评语
院(系):软件学院 教研室:软件教研室
学 号 学生姓名 专业班级 程序设计
(报告)速算24
题目
程序设计的任务与要求:
(1)掌握C语言编程的基础知识。
(2)较熟练地编写C语言应用程序。
(3)了解C语言的常用
函数、编程技巧、异常处理。 程
序(5)联系已学过的内容,巩固所学的理论,增强独立工作能力。 设
(6)通过设计主要使学生有一个独立编写程序的过程,对理论学习及动手能计
)力都有一个很大的提高。 报
告(7)通过本次设计,进一步培养学生热爱专业的思想,同时对本专业综合素)
质的提高起一个积极的推动作用。 任
务 课程设计过程中,要严格遵守实践环节的时间安排,听从指导教师的指导。
正确地完成上述内容,
实习日记,规范完整地撰写出课程设计报告。
指 导
教
师 评 语
及
成 绩 成绩: 指导教师签字:
2009 年 12 月 31 日
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
目 录
第1章 课程设计的目的与要求 .............................. 错误~未定义书签。1
1.1 课程设计目的 ...................................... 错误~未定义书签。1
1.2 课程设计的实验环境 ................................ 错误~未定义书签。1
1.3 课程设计的预备知识 ................................ 错误~未定义书签。1
1.4 课程设计要求 ...................................... 错误~未定义书签。1 第2章 课程设计内容 ...................................... 错误~未定义书签。2
2.1程序功能介绍 ...................................... 错误~未定义书签。2
2.2程序整体设计说明 .................................. 错误~未定义书签。2
2.2.1设计思路 .................................... 错误~未定义书签。2
2.2.2数据结构设计及用法说明 ...................... 错误~未定义书签。3
2.2.3程序结构 .................................... 错误~未定义书签。4
2.2.4各模块的功能及程序说明 ...................... 错误~未定义书签。4
2.2.5程序结果 .................................... 错误~未定义书签。5
2.3程序源代码及注释 .................................. 错误~未定义书签。6第3章 课程设计总结 ........................................................ 12 参考
.................................................................. 14
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
第1章 课程设计的目的与要求 1.1 课程设计目的
本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完《程
序设计语言(C)》课程后进行的一次全面的综合练习。本课程设计的目的和任务:
1. 巩固和加深学生对C语言课程的基本知识的理解和掌握
2. 掌握C语言编程和程序调试的基本技能
3. 利用C语言进行基本的软件设计
4. 掌握书写程序设计说明文档的能力
5. 提高运用C语言解决实际问题的能力
1.2 课程设计的实验环境
硬件要求能运行Windows 2000/XP操作系统的微机系统。C语言程序设计及相应的开
发环境。
1.3 课程设计的预备知识
熟悉C语言及C语言开发工具。
课程设计要求 1.4
1.
课程设计题目的要求
2. 写出详细设计说明
3. 编写程序代码,调试程序使其能正确运行
4. 设计完成的软件要便于操作和使用
5. 设计完成后提交课程设计报告
1
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
第2章 课程设计内容
2.1程序功能介绍
“速算24”扑克游戏是个很流行的数学运算游戏。速算24扑克游戏的规则是由系统发出4张扑克牌,用户利用扑克牌的数字及运算符号“+”,“-”,“*”,“/”,及“(”和“)”组成一个计算表达式,从键盘上输入该计算表达式,系统运行后得出计算结果,如果结果等于24,则显示“”,否则,显示“”,接着询问是否继续,按字符n后程序结束,否则系统重复上述步骤。
2.2程序整体设计说明
2.2.1设计思路
(1)点击“开始游戏”的按钮,游戏开始,系统将会从52张扑克牌:
'A','2','3','4','5','6','7','8','9','0','J','Q','K' 红心
黑桃'A','2','3','4','5','6','7','8','9','0','J','Q','K',
草花'A','2','3','4','5','6','7','8','9','0','J','Q','K',
方片'A','2','3','4','5','6','7','8','9','0','J','Q','K'
中随机发出四张牌。
(2)用户将发出的四张牌用+,-,*,/,(,)组合起来,并把组合的表达式输入到输入框里。
(3)点击确定按钮,游戏将会计算你输入的表达式是否合法,或者结果是否正确,并且给出提示。
(4)如果输入的表达式不正确,则会让用户重新输入选择是否继续;如果输入的表达式正确,则重新开始游戏。
2.2.2数据结构设计及用法说明
所用到的数据结构有:
STACK1:STACK2:Main:主函数
void rand1(int j) :随机发牌函数
void play(void) :发牌的具体过程
void close(void) : 图形关闭
2
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
void change( ): 中缀变后缀函数
2.2.3程序结构
开始
随机产生除大小王的四张牌
输入+,-,*,/,(,)将所产
生的四张牌组合起来
将组合后的式子进行计算得出结果
result
Y N
result==
24?
输出“Very good!” 输出“Wrong!”
输入是否继续Y或N
N
Ch==N?
Y
结束
2.1程序结构浏览图
2.2.4各模块的功能及程序说明
第一个模块——main()主函数:首先确定由电脑随机发牌,通过输入字符选定。选
定后调用图形初始化函数,根据提示输入相应字符串,并对其进行计算,计算完毕进行
结果处理,最后关闭图形系统,程序结束。
3
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
第二个模块——void rand1() 随机发牌函数:由系统随机发牌,循环直到有牌发,花色随机,大小随机,用条件语句if实现无重复发牌,并在左上角,右下角显示出花色,大小,牌面显示花式。
第三个模块——void play( ) 具体发牌函数:发牌的具体过程,利用循环语句for语句来实现随即取牌,延时显示画空牌的过程。
第四个模块——void init( ) 图形驱动函数。
第五个模块——void close()图形关闭:图形关闭函数Close(),调用Closegraph()关闭图形系统,程序结束。
第六个模块——void change( ) 中缀变后缀函数:利用循环语句if语句和while
语句,对输入的字符串进行标记,处理。
2.2.5程序结果
图2.2程序结果
图2.3程序结果
2.3程序源代码及注释
#define N 20
#define COL 100
4
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文) #define ROW 40
#include "stdio.h"
#include "time.h" /*系统时间函数*/
#include "graphics.h" /*图形函数*/
#include "alloc.h"/*动态地址分配函数*/
#include "stdlib.h" /*库函数*/
#include "string.h" /*字符串函数*/
#include "ctype.h" /*字符操作函数*/
char p[4][13]={
{'A','2','3','4','5','6','7','8','9','0','J','Q','K'},/*扑克牌,10用0来表示*/ {'A','2','3','4','5','6','7','8','9','0','J','Q','K'},
{'A','2','3','4','5','6','7','8','9','0','J','Q','K'},
{'A','2','3','4','5','6','7','8','9','0','J','Q','K'}};
typedef struct node {
int data;
struct node *link; }STACK1; /*栈1*/
typedef struct node2 {
char data;
struct node2 *link; }STACK2; /*栈2*/
void init(void);/*图形驱动*/
void close(void);/*图形关闭*/
void play(void);/*发牌的具体过程*/
void rand1(int j);/*随机发牌函数*/
void change(char *e,char *a); /*中缀变后缀函数*/ int computer(char *s); /*后缀表达式计算函数*/ STACK1 *initstack1(STACK1 *top); /*栈1初始化*/ STACK1 *push(STACK1 *top,int x); /*栈1入栈运算*/ STACK1 *pop(STACK1 *top); /*栈1删除栈顶元素*/
5
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文) int topx(STACK1 *top); /*栈1读栈顶元素*/
STACK1 *ptop(STACK1 *top,int *x); /*栈1读出栈顶元素值并删除栈顶元素*/
int empty(STACK1 *top); /*判栈1是否为空函数*/ STACK2 *initstack2(STACK2 *top); /*栈2初始化*/ STACK2 *push2(STACK2 *top,char x); /*栈2入栈运算*/ STACK2 *pop2(STACK2 *top); /*栈2删除栈顶元素*/ char topx2(STACK2 *top); /*栈2读栈顶元素*/ STACK2 *ptop2(STACK2 *top,char *x); /*栈2读出栈顶元素值并删除栈顶元素*/
int empty2(STACK2 *top); /*判栈2是否为空函数*/ int text1(char *s) ; /*显示文本*/
main() {
char s[N],s1[N],ch;
int i,result;
{
if(!empty2(top)) /*如栈不为空*/
{
w=topx2(top);
while(w!='(') /*当栈顶元素不是“(”时反复循环*/
{
a[j]=w;
j++; /*将栈顶元素存入表达式a中,a的下标加1*/
top=pop2(top); /*删除栈顶元素*/
if(empty2(top)) /*如果栈为空*/
break; /*跳出循环*/
else
w=topx2(top); /*否则读栈顶元素*/
}
}
top=push2(top,e); /*将当前e的字符元素压入堆栈*/
6
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
}
if(e=='*'||e=='/') /*如果字符是乘或除号时*/
{
if(!empty2(top)) /*如栈不为空*/
{
w=topx2(top); /*读栈顶元素存入w*/
while(w=='*'||w=='/')/*当栈顶元素是乘或除时反复循环*/
{
a[j]=w;
j++; /*将栈顶元素存入字符串a中,a的下标加1*/
top=pop2(top); /*删除栈顶元素*/
if(empty2(top)) /*如果栈为空*/
break; /*跳出循环*/
else
w=topx2(top); /*否则读栈顶元素*/
}
}
top=push2(top,e); /*将当前e字符元素压入堆栈*/
}
i++; /*e的下标加1*/
}
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;
7
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
while(s!='\0') /*当字符串没有结束时作以下处理*/
{
if(isdigit(s)) /*判字符是否为数字*/
{
k=0; /*k初值为0*/
do{
k=10*k+s-'0'; /*将字符连接为十进制数字*/
i++; /*i加1*/
}while(s!='.'); /*当字符不为„.?时重复循环*/
top=push(top,k); /*将生成的数字压入堆栈*/
}
if(s=='+') /*如果为'+'号*/
{
*/ top=ptop(top,&num2); /*将栈顶元素取出存入num2中
top=ptop(top,&num1); /*将栈顶元素取出存入num1中*/
result=num2+num1; /*将num1和num2相加存入result中*/
top=push(top,result); /*将result压入堆栈*/
}
if(s=='-') /*如果为'-'号*/
{
top=ptop(top,&num2); /*将栈顶元素取出存入num2中*/
top=ptop(top,&num1); /*将栈顶元素取出存入num1中*/
result=num1-num2; /*将num1减去num2结果存入result中*/
top=push(top,result); /*将result压入堆栈*/
}
if(s=='*') /*如果为'*'号*/
{
top=ptop(top,&num2); /*将栈顶元素取出存入num2中*/
top=ptop(top,&num1); /*将栈顶元素取出存入num1中*/
result=num1*num2; /*将num1与num2相乘结果存入result中*/
8
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
top=push(top,result); /*将result压入堆栈*/
}
if(s=='/') /*如果为'/'号*/
{
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; /*新结点的后继为当前栈顶指针*/
9
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
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) /*栈是否为空*/
int empty2(STACK2 *top) /*判栈是否为空*/ {
if(top==NULL) /*如果为空*/
return 1; /*返回1*/
else
return 0; /*否则返回0*/
}
int text1(char *s) {
setbkcolor(BLUE); /*设置背景颜色为蓝色*/
cleardevice(); /*清除屏幕*/
setcolor(12); /*设置文本颜色为淡红色*/
settextstyle(1, 0, 8);/*三重笔划字体, 放大8倍*/
outtextxy(120, 120, s); /*输出字符串s*/
setusercharsize(2, 1, 4, 1);/*水平放大2倍, 垂直放大4倍*/
10
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
setcolor(15); /*设置文本颜色为*白色*/
settextstyle(3, 0, 5); /*无衬字笔划, 放大5倍*/
outtextxy(220, 220, s); /*输出字符串s*/
getch(); /*键盘输入任一字符*/
return ; /*返回*/ }
11
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
第3章 课程设计总结
半学期的理论科结束了,我们迎来了新一轮的挑战,我们要运用所学的理论去实践了。
发现,提出,分析和解决实际问题,锻炼实践课程设计是培养学生综合运用所学知识,
能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握计算机开发技术是十分重要的。
回顾起此次课程设计,至今我们仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在整整两个星期的日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体,指针„„通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。 在设计中我们遇到了很多编程问题,最后在老师的指导下,我们慢慢的进入状态,我们做的是一个速算24小游戏的设计,内容包括很多。运用的函数也是比较复杂的,我们一组有三个人,我们分工合作,首先我们一起完成了结构题,然后我们一人各负责一个函数程序的设计,经过两个星期的努力,我们完成了大半个程序,但是总是有很多错误出现,有好多是些小问题,这都是我们粗心大意造成的,所以设计程序一定要仔细,不容一点的马虎。在课程设计过程中,我学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪,黑夜过去了,我们收获的是黎明。同时,也让我知道了,合作的力量,如果是孤军奋战的话,我们也不能在规定时间内完成,最终达到游纫而解。
善于总结,也是学习能力的一种体现,每次完成一个编程任务,完成一段代码,都应当有目的的跟踪该程序的应用状况,随时总结,找到自己的不足,这样所编写的程序才能逐步提高。
12
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
付出就意味着辛苦,之后却换来了收获。通过实际动手做,我们才真正领略到“艰苦奋斗”这一词的真正含义,我们想说,编程确实有些辛苦,但苦中也有乐,在这个团队的任务中,一起的工作可以让我们有说有笑,相互帮助,配合默契。对我们而言,知识上的收获重要,精神上的丰收是可喜的。挫折是一份财富,经历是一份拥有。这次实际操作必将成为我们人生旅途上一个非常美好的回忆~
同时,我们也学会了感恩,我们更加了解劳动的艰辛。我们会更加珍惜劳动成果。 同时,我也要感谢我的老师,在他的指导和帮助下,我才可以顺利完成这次课设。我明白了他的良苦用心,在这里忠心的对他说声,谢谢~
13
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
参考文献
[1] 苏小红等.,语言大学实用教.北京:电子工业出版社.2004:50-120 [2] 徐金梧等.TURBO ,实用大全.北京:机械工业出版社. 1996:34-61 [3] 苏小红等.,语言大学实用
习题与实验指导.北京:电子工业出版社2008:59-130 [4] 龚沛曾等. Visual Basic实验指导与测试.北京:高等教育出版社.2000:21-56
[5] 姜雪,王毅,刘立君.C语言程序设计实验指导.北京:清华大学出版社,2009:30-91 [6] 卢玉清.C语言程序设计教程.北京:清华大学出版社,2009:50-94 [7] 张锐军.数据结构.北京:清华大学出版社,2009:64-102
[8] 王士元. C 高级实用程序设计. 北京:清华大学出版社,1996:31-189
[9]李大友.C语言程序设计基础.北京: 清华大学出版社, 1999: 56-86 [10]黄逵中. C语言实例教程.北京:中国电力出版社,2004:256-378
14