C语言程序设计课程设计-速算24.doc_第1页
C语言程序设计课程设计-速算24.doc_第2页
C语言程序设计课程设计-速算24.doc_第3页
C语言程序设计课程设计-速算24.doc_第4页
C语言程序设计课程设计-速算24.doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

应用技术学院课 程 设 计 报 告课程名称 C语言课程设计 课题名称 速算24 专 业 电气工程及其自动化 班 级 0783 学 号 200713010311 姓 名 吴汀槐 指导教师 王颖 2008年3月21日湖南工程学院课 程 设 计 任 务 书课程名称 C语言课程设计 课 题 运动会分数统计系统 专业班级 电气工程及其自动化 学生姓名 吴汀槐 学 号 200713010311 指导老师 王 颖 审 批 任务书下达日期:2008 年3月16日任务完成日期:2008年3月20日目录正文4一、课题的主要功能4二、课题的设计目的4三、课题的功能模块的划分:4四、主要功能的实现7五、调试分析过程描述:14附件16/* 源程序*/16总结29参考文献30应用技术学院课程设计评分表31正文一、课题的主要功能速算24扑克牌是一种扑克牌智力数学游戏,游戏方式简单易学,能健脑益智,是一项极为有益的活动。不难看出,能极大限度地调动眼、脑、手、口、耳多种感官的协调活动,对于培养我们快捷的心算能力和反应能力很有帮助。 速算24扑克牌游戏的规则是由系统发出4张牌,用户利用扑克牌的数字及运算符号“+”、“-”、“*”、“/”及括号“(”和“)”组成一个计算表达式,从键盘输入该计算表达式,系统运行后得出计算结果,如果结果等于24,则显示“very good ”,“wrong!”,接着询问是否继续,按字符n后程序结束,够则系统重复上述步骤。本程序所使用的方法是从键盘输入中缀表达式,然后将中缀表达式转换为后缀表达式.利用后缀表达式求值。 二、课题的设计目的通过本程序可以掌握C程序的字符串处理、数学运算,又可以掌握堆栈的概念。堆战的运算以及栈的应用算术表达式的编译方法。三、课题的功能模块的划分:(1)main()主函数 主函数是程序的入口,采用模块化设计,主函数不宜复杂,功能尽量在各模块中实现。(2) init()图象初始化使用到图形系统编程,应首先调用初始化函数来初始话图形系统。(3) play()和randl()发牌函数发牌函数先用函数画出牌的背景区域,然后调用函数画矩形作为牌的边框线,调用函数,生成两个随机数,根据这两个数取扑克牌数组中的元素,一旦牌取过后,将数组元素置为-1,以后不能在取,根据花色和大小将其按照字符形式显示到屏幕上。(4) change()转换函数将中缀表达式转换为等价的后缀表达式。1)置初值2)从左到右扫描中缀表达式,逐步转换成等价的后缀表达式3)结束处理(5)computer() 计算函数计算后缀表达式的值,使用栈扫描表达式,然后将计算结果压入堆栈,直到表达式最后一个运算符号处理完毕,送入栈顶的值才是后缀表达式的值。(6)堆栈运算 1)栈的初始话initstack(),将栈顶指针置为空,返回栈顶指针2)入栈运算push(),栈1的类型为整型,栈2为字符型3)出栈运算pop(),进行指针变动4)读栈顶元素topx(),栈保持不变5)ptop()取出栈顶元素,然后删除6)判断栈是否为空empty()(7) text()文本输出函数 在图形方式下显示字符串,由调用函数传递,实际再主函数中调用两次,一次是当结果等于 24时显示“very good”,用text(“very good”),一次是结果不等于24时,显示“wrong!”信息,用text(“wrong!”)。图形关闭close() 调用图形关闭函数,关闭图形系统。四、主要功能的实现: main()主函数主函数是程序的入口,采用模块化设计,主函数不宜复杂,功能尽量在各模块中实现。先调用发牌函数,随机生成四张牌,并显示提示输入计算中缀表达式信息,然后调用转换函数,将返回的表达式字符串作为参数调用计算函数,计算结果,然后对结果进行处理,显示结果后按任意键,询问是否继续,如果输入字符则结束程序,否则重新发牌运算.其程序流程图如下:结束发四张牌调用change函数将中缀变后缀表达s输入表达式字符串sl调用compute函数计算表达式的值返回结果resultResult=24调用text输出“wrong!”真假是否继续假开始调用text输出“very good”(2)、 change()转换函数 为了将中缀表达式转换成等价的后缀表达式,需要从左到右扫描中缀表达式,并使用栈2来存放表达式中的开括号“(”和暂时不能确定计算次序的运算符号。中缀表达式是字符串e,后缀表达式是字符串a,由于按字符串格式读入字符串,实际是最后一个字符0结尾符号的字符数组,这样处理是按照字符数组的处理方法,根据数组元素的下标访问数组元素,w为临时变量,具体算法如下:(1)置初值 i=0;j=0;分别表示中缀和后缀表达式字符串的下标。(2)从左向右扫描中缀表达式,逐步转换成等价的后缀表达式。 循环,当时反复执行下列语句:分以下情况执行:当ei为数字0,19时,执行: I.当ei!=.时,反复执行aj=ei; /*将数字原样拷贝到数组a中*/j+; /*e数组的下标加1*/j+; /* a数组的下标加1*/II aj=.; j+;当ei=(时,执行: 将ei压入堆栈当ei=)时,执行: I取出栈顶元素存入w II循环当w!=(时反复执行: aj=w; /*将栈顶元素w存入a数组*/ j+; /*下标加1*/ 取出栈顶存入w元素,并从栈顶删除该元素 当ei=+或ei=-时,执行:I如栈不为空,则:读栈顶元素存入w循环当w!=(时反复执行;aj=w;j+; /*将栈顶元素存入表达式a中,a的下标加1*/删除栈顶元素如果栈为空,则跳出循环,否则读栈顶元素。II将当前e字符元素压入堆栈 当ei=* 或ei=/ 是乘或除号时 I.如栈不为空,则: 读栈顶元素存入w 循环当w=*或w=/时反复执行; aj=w; j+; /*将栈顶元素存入字符串a中,a的下标加1*/删除栈顶元素如果栈为空则跳出循环,否则读栈顶元素II当前e字符元素压入堆栈2)i+;/*e的下标加1*/(3) 结束程序. 1) 当栈不为空时反复执行下列语句:将栈顶元素存入数组a中 j+;2) aj=0;将字符串结束标志写入后缀表达式最后一个数组元素中,构成字符串真假真假假真真假假真真假真假假真假真真假i+返回结果后缀表达式aj=读栈顶元素;j+w!=(ei为*或/aj!=.;j+w!=(aj=eii+;j+si为数字09w!=(aj!=w;j+w=读栈顶元素ei入栈ei入栈w!=*或/w=栈顶元素w=栈顶元素w=读栈顶元素w=读栈顶元素aj!=w;j+;出栈aj!=w;j+;出栈栈是否为空栈是否为空栈是否为空栈是否为空w!=(ei等于+或-ei!=)w=栈顶元素ei!=(ei!入栈ei!=/0i=0;j=0开始(3)、computer()计算函数 计算后缀表达式的值,使用一个栈,从左到右扫描表达式,每遇到一个操作数就送入堆栈,每遇到一个运算符号,就从栈中取出栈顶的两个操作数进行运算,然后将计算结果压入堆栈,直到最后一个运算符处理完毕,这是送到栈顶的值就是该后缀表达式的值。由于表达式以字符形式存储,所以,在读入字符时要判断是否是数字字符09,如果是就利用式子k=10*k+sI-0将其转换为十进制数字,10*K是确定其所在十进制数字的位值,将字符变为数字,数字的结果标记是“.”。其算法描述如下:置初值。 I=0 循环当时,反复执行下列语句:分以下几种情况:当si=0,1,9:k=0;循环执行下列语句,直到si=.k=10*k+si-0;i+; push(top,k);将k压入堆栈当si=+时,执行:将栈顶元素取出存入num2中将栈顶元素取出存入num1中将num1与num2相加存入result中将result压入堆栈 当si=-时:将栈顶元素取出存入num2中将栈顶元素取出存入num1中将num1减去num2,结果存入result中将result压入堆栈当si=*时:将栈顶元素取出存入num2中将栈顶元素取出存入num1中将num1与num2相乘,结果存入result中将result压入堆栈 当si=/:将栈顶元素取出存入num2中将栈顶元素取出存入num1中将num1除以num2相乘,结果存入result中将result压入堆栈i+;(3)取栈顶元素的值,也就是计算的结果,返回调用函数。计算函数流程图如下:k=0开 始i=0si!=/osi=/si=*si=-si=+si为数字09num2=读栈顶元素,出栈num2=读栈顶元素,出栈num2=读栈顶元素,出栈num2=读栈顶元素,出栈num1=读栈顶元素,出栈num1=读栈顶元素,出栈num1=读栈顶元素,出栈num1=读栈顶元素,出栈result=num1+num2result=num1+num2result=num1+num2result=num1+num2result入栈result入栈result入栈result入栈si!=.k=10*k+ai-0i=i+1数值k入栈i+结果出栈返回结果(4)堆栈运算根据栈的基本运算与链栈的特点设计了以下几种栈运算:栈的初始化,将栈顶指针为空,返回栈顶指针。入栈运算,向栈中一个值为的表目,栈1的类型为整型,栈2的类型为字符型。操作如图所示,首先申请空间p,如果申请不到,则说明内存溢出,结束程序,否则,将X保存到新的空间中执行p到data=x,进行指针变动,即p-next=top,新的top=p。出栈运算pop(),从栈中删除一个元素,即栈顶元素,操作如图所示,进行指针变动q=top,将当前栈顶指针保存到变量q中,栈顶指针后移到下一个结点top=top-link,释放q空间free(q),返回新的栈顶指针return top。读栈顶元素topx(),仅仅是读出栈顶元素的值,栈保持不变。ptop()取出栈顶元素,然后从栈中删除栈顶元素,算法是先调用读栈顶元素函数top(),再调用删除栈顶元素函数pop()。判断是否为空,如栈为空,返回值1,否则返回值0.再程序中常常作为循环结束的条件x、777777x、777777toptoptoptop入栈运算 出栈运算五、调试分析过程描述: 1测试数据 扑克牌有四个花色,每个花色有13张牌,要定义一个字符型二维数组表示扑克牌,牌面值用字符表示,花色通过它的行下标体现,四行代表四个花色。 在表达式的转换和计算过程中,均要用到一个数据结构堆栈。同时二个过程中,所要保存的数据类型不同,设计二个堆栈:STACK1和STACK2。 在程序当中,计算表达式的值用到的堆栈设为栈1,栈中存放的数据是整数,表达式转换用到的堆栈设为栈2,栈中存放懂得数据是字符,由于堆栈中存放的数据多少不能确定,所以选用链栈。 typedef struct node int data; /* 整型数据*/ struct node *link;STACK1; /*栈1*/typedef struct node2 char data; /*字符型*/ struct node2 *link;STACK2;/*栈2*/2测试输出结果当结果等于 24时显示“very good”,用text(“very good”),当结果不等于24时,显示“wrong!”信息,用text(“wrong!”)。3程序调试过程中存在的问题调试(debugging)是指去掉程序中的错误(通常被称为bugs)的过程。一个错误可能非常简单,例如拼错一个单词或者漏掉一个分号;也可能比较复杂,例如使用一个指向并不存在的地址的指针。无论错误的复杂程度如何,它的作用是让程序员能够观察程序的运行情况、程序的当前运行行号、变量的值,等等,把握正确的调试方法都能使程序员受益匪浅。 如牌数2、3、8、6,输入运算表达式3.*(8.-2.)+6.,程序先将其转换为后缀表达式3.8.2.-*6.+,然后计算出表达式的值,如果不加区分字符.,后缀表达式为382-*6+,是不能确定运算数的。所以为便于区分数字,每个整数数字设一个结尾字符.。书写标识符时,忽略了大小写字母的区别main() inta=5; printf(%d,A); 编译程序把a和A认为是两个不同的变量名,而显示出错信息。将字符常量与字符串常量混淆。 while(si!=0)而会出现敲成while(si!=”0”)C规定以作字符串结束标志,它是由系统自动加上的,所 以字符串a实际上包含两个字符:a和,而把它赋给一个字符变量是不行的,而显示出错信息。 .忘记加分号. 或是输入变量时忘记加地址运算符&。 分号是C语句中不可缺少的一部分,语句末尾必须有分号. 输入变量时忘记加地址运算符&。附件/* 源程序*/#define N 20#define COL 100#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 p413=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删除栈顶元素*/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 sN,s1N,ch; int i,result; int gdriver, gmode; clrscr(); /*清屏*/ init(); /*初始化函数*/ while(1) setbkcolor(BLACK); /*设置背景颜色*/ cleardevice();/*清屏*/ play(); /*发牌*/ gotoxy(1,15); /*移动光标*/ printf(-Note-n); printf( Please enter express accroding to above four numbern); /*提示信息*/ printf( Format as follows:2.*(5.+7.)n);/*提示输入字符串格式*/ printf( -n); scanf(%s%c,s1,&ch); /*输入字符串压回车键*/ change(s1,s); /*调用change函数将中缀表达式s1转换为后缀表达式s*/ result=computer(s); /*计算后缀表达式的值,返回结果result */ if(result=24) /*如果结果等于24*/ text1(very good); /*调用函数text1显示字符串very good*/ else text1(wrong!);/*否则函数text1显示字符串wrong!*/ printf(Continue (y/n)?n); /*提示信息,是否继续*/ scanf(%c,&ch); /*输入一字符*/ if(ch=n|ch=N) /*如果该字符等于n或N*/ break; /*跳出循环,程序结束*/ /*否则,开始下一轮循环*/ close(); return; /*返回*/void rand1(int j)/*随机发牌函数*/ int kind,num; char str3,n; randomize(); while(1)/*循环直到有牌发*/ kind=random(4); /*花色随机数*/ num=random(13); /*大小随机数*/ if(pkindnum!=-1) /*该数未取过*/ n=pkindnum; /*取相应位置的扑克牌数*/ pkindnum=-1; /*牌发好以后相应位置的元素置-1*/ break; switch(kind)/*花式的判断*/ case 0:setcolor(RED);sprintf(str,%c,3);break; /*红桃*/ case 1:setcolor(BLACK);sprintf(str,%c,3);break; /*黑桃*/ case 2:setcolor(RED);sprintf(str,%c,4);break; /*方片*/ case 3:setcolor(BLACK);sprintf(str,%c,5);break; /*草花*/ settextstyle(0,0,2); outtextxy(COL+j*100-30,ROW+100-46,str);/*显示左上角花色*/ outtextxy(COL+j*100+16,ROW+100+32,str); /*显示右下角花色*/ if(n!=0)/*输出其他牌*/ settextstyle(0,0,3); sprintf(str,%c,n); outtextxy(COL+j*100-5,ROW+100-5,str);/*显示牌的大小*/ else/*输出10的时候*/ sprintf(str,%d,10); outtextxy(COL+j*100-6,ROW+100-5,str); void play(void)/*发牌的具体过程*/ int j; for(j=0;jdata=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 nulln); /*显示栈为空信息*/ 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*/ else return 0; /*否则返回0*/STACK2 *initstack2(STACK2 *top) /*初始化*/ top=NULL; /*栈顶指针置为空*/ return top; /*返回栈顶指针*/STACK2 *push2(STACK2 *top,char x) /*入栈函数*/ STACK2 *p; /*临时指针类型为STACK2*/ p=(STACK2 *)malloc(sizeof(STACK2); /*申请STACK2大小的空间*/ if(p=NULL) /*如果p为空*/ printf(memory is overflown!); /*显示内存溢出*/ exit(0); /*退出*/ p-data=x; /*保存值x到新空间*/ p-link=top; /*新结点的后继为当前栈顶指针*/ top=p; /*新的栈顶指针为新插入的结点*/ return top; /*返回栈顶指针*/STACK2 *pop2(STACK2 *top) /*出栈*/ STACK2 *q; /*定义临时变量*/ q=top; /*保存当前栈顶指针*/ top=top-link; /*栈顶指针后移*/ free(q); /*释放q*/ return top; /*返回栈顶指针*/char topx2(STACK2 *top) /*读栈顶元素*/ if(top=NULL) /*栈是否为空*/ printf(Stack is nulln); /*显示栈为空信息*/ return ; /*返回空字符*/ return top-data; /*返回栈顶元素*/STACK2 *ptop2(STACK2 *top,char *x) /*取栈顶元素,并删除栈顶元素*/ *x=topx2(top); /*读栈顶元素*/ top=pop2(top); /*删除栈顶元素*/ return top; /*返回栈顶指针*/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倍*/ setcolor(15); /*设置文本颜色为白*/ settextstyle(3, 0, 5); /*无衬字笔划, 放大5倍*/ outtextxy(220, 220, s); /*输出字符串s*/ getch(); /*键盘输入任一字符*/ return ; /*返回*/总结我的题目是速算24,对于我们这些新手来说,这是很大的考验,我一千次一万次的问自己,怎么才能找到课堂所学与实际应用的最佳结合点?怎么才能让自己的程序在篇幅上简单,在使用价值上丰富?怎样让自己的计划更具有序性,而不会百忙无一用?机会是老师,学校,以及无数代教育工作者给的,而能力是自己的,耐性是需要的。经过自己的琢磨,还查阅了很多书籍,才做到了心中有数,才了解了C语言课程设计的真正用意培养自学能力,养成程序编辑的好习惯。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论