速算24

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

应用技术学院
课程设计报告课程名称 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()主函数
主函数是程序的入口,采用模块化设计,主函数不宜复杂,功能尽量在各模块中实现。

先调用发牌函数,随机生成四张牌,并显示提示输入计算中缀表达式信息,然后调用转换函数,将返回的表达式字符串作为参数调用计算函数,计算结果,然后对结果进行处理,显示结果后按任意键,询问是否继续,如果输入字符则结束程序,否则重新发牌运算.其程序流程图如下:
(2)、 change()转换函数
为了将中缀表达式转换成等价的后缀表达式,需要从左到右扫描中缀表达式,并使用栈2来存放表达式中的开括号“(”和暂时不能确定计算次序的运算符号。

中缀表达式是字符串e,后缀表达式是字符串a,由于按字符串格式读入字符串,实际是最后一个字符’\0’结尾符号的字符数组,这样处理是按照字符数组的处理方法,根据数组元素的下标访问数组元素,w为临时变量,具体算法如下:
(1)置初值 i=0;j=0;分别表示中缀和后缀表达式字符串的下标。

(2)从左向右扫描中缀表达式,逐步转换成等价的后缀表达式。

循环,当时反复执行下列语句:
分以下情况执行:
①当e[i]为数字’0’,’1’…’9’时,执行:
I.当e[i]!=’.’时,反复执行
a[j]=e[i]; /*将数字原样拷贝到数组a中*/
j++; /*e数组的下标加1*/
j++; /* a数组的下标加1*/
II a[j]=’.’; j++;
②当e[i]==’(’时,执行:
将e[i]压入堆栈
③当e[i]==’)’时,执行:
I取出栈顶元素存入w
II循环当w!=’(’时反复执行:
a[j]=w; /*将栈顶元素w存入a数组*/
j++; /*下标加1*/
取出栈顶存入w元素,并从栈顶删除该元素
④当e[i]==’+’或e[i]==’-’时,执行:
I如栈不为空,则:
读栈顶元素存入w
循环当w!=’(’时反复执行;
a[j]=w;j++; /*将栈顶元素存入表达式a中,a的下标加1*/
删除栈顶元素
如果栈为空,则跳出循环,否则读栈顶元素。

II将当前e字符元素压入堆栈
⑤当e[i]==’*’或e[i]==’/’是乘或除号时
I.如栈不为空,则:
读栈顶元素存入w
循环当w==’*’或w==’/’时反复执行;
a[j]=w; j++; /*将栈顶元素存入字符串a中,a的下标加1*/
删除栈顶元素
如果栈为空则跳出循环,否则读栈顶元素
II当前e字符元素压入堆栈
2)i++;/*e的下标加1*/
(3) 结束程序.
1) 当栈不为空时反复执行下列语句:
将栈顶元素存入数组a中 j++;
2) a[j]=’\0’;将字符串结束标志写入后缀表达式最后一个数组元素中,构成字符串
(3)、computer()计算函数
计算后缀表达式的值,使用一个栈,从左到右扫描表达式,每遇到一个操作数就送入堆栈,每遇到一个运算符号,就从栈中取出栈顶的两个操作数进行运算,然后将计算结果压入堆栈,直到最后一个运算符处理完毕,这是送到栈顶的值就是该后缀表达式的值。

由于表达式以字符形式存储,所以,在读入字符时要判断是否是数字字符0~9,如果是就利用式子k=10*k+s[I]-‘0’将其转换为十进制数字,10*K是确定其所在十进制数字的位值,将字符变为数字,数字的结果标记是“.”。

其算法描述如下:
⑴置初值。

I=0
⑵循环当时,反复执行下列语句:
分以下几种情况:
①当s[i]=’0’,’1’,…’9’:
k=0;
循环执行下列语句,直到s[i]==’.’
k=10*k+s[i]-‘0’;
i++;
push(top,k);将k压入堆栈
②当s[i]==’+’时,执行:
将栈顶元素取出存入num2中
将栈顶元素取出存入num1中
将num1与num2相加存入result中
将result压入堆栈
③当s[i]==’-’时:
将栈顶元素取出存入num2中
将栈顶元素取出存入num1中
将num1减去num2,结果存入result中
将result压入堆栈
④当s[i]==’*’时:
将栈顶元素取出存入num2中
将栈顶元素取出存入num1中
将num1与num2相乘,结果存入result中
将result压入堆栈
⑤当s[i]==’/’:
将栈顶元素取出存入num2中
将栈顶元素取出存入num1中
将num1除以num2相乘,结果存入result中
将result压入堆栈
i++;
(3)取栈顶元素的值,也就是计算的结果,返回调用函数。

计算函数流程图如下:
(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.再程序中常常作为循环结束的条件
入栈运算出栈运算
五、调试分析过程描述:
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()
{
int a=5;
printf("%d",A);
}
编译程序把a和A认为是两个不同的变量名,而显示出错信息。

⑶将字符常量与字符串常量混淆。

while(s[i]!=’\0’)
而会出现敲成while(s[i]!=”\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 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删除栈顶元素*/
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;
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 number\n"); /*提示信息*/
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 str[3],n;
randomize();
while(1)/*循环直到有牌发*/
{
kind=random(4); /*花色随机数*/
num=random(13); /*大小随机数*/
if(p[kind][num]!=-1) /*该数未取过*/
{
n=p[kind][num]; /*取相应位置的扑克牌数*/
p[kind][num]=-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;j<4;j++)
{
bar(COL+j*100-35,ROW+100-50,COL+j*100+35,ROW+1*100+50);/*画空牌*/
setcolor(BLUE);
rectangle(COL+j*100-32,ROW+100-48,COL+j*100+32,ROW+100+48); /*画矩形框*/
rand1(j); /*随机取牌*/
delay(10000); /*延时显示*/
}
}
void init(void)/*图形驱动*/
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
}
void close(void)/*图形关闭*/
{
closegraph();
}
void change(char *e,char *a) /*中缀字符串e转后缀字符串a函数*/
{
STACK2 *top=NULL; /* 定义栈顶指针*/
int i,j;char w;
i=0;
j=0;
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; /*跳出循环*/
else
w=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; /*跳出循环*/
else
w=topx2(top); /*否则读栈顶元素*/
}
}
top=push2(top,e[i]); /*将当前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;
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*/
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 overflow\n!!"); /*显示内存溢出*/
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 null\n"); /*显示栈为空信息*/
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、要对系统的功能和要求做出详细的分析,并合理分解任务。

2、把分解出来的子任务,做给一个相对独立的模块。

3、在设计一个模块之前,要简单构想一下总界面的显视情况。

4、针对构想出来的界面进行程序的编写。

最后,感谢老师对我的指导。

参考文献
《C语言程序设计案列例教程》张基温著清华出版社
《C语言程序设计方法》邓文新著哈尔滨工业大学《C语言设计》(第三版)谭浩强著清华出版社
《C语言程序设计案列例精编》中国水利水电出版社
应用技术学院课程设计评分表
课程名称:C语言课程设计
教师签名:
日期:
31。

相关文档
最新文档