C语言课程设计报告34661497.docx
《C语言课程设计报告34661497.docx》由会员分享,可在线阅读,更多相关《C语言课程设计报告34661497.docx(20页珍藏版)》请在冰点文库上搜索。
![C语言课程设计报告34661497.docx](https://file1.bingdoc.com/fileroot1/2023-5/31/6be1feae-2bc2-45d3-8291-7231f8d82da7/6be1feae-2bc2-45d3-8291-7231f8d82da71.gif)
C语言课程设计报告34661497
(此文档为word格式,下载后您可任意编辑修改!
)
二○一○~二○一一学年第二学期
信息科学与工程学院
课程设计报告书
课程名称:
C语言课程设计
班级:
自动化1006
学号:
姓名:
孙逊
指导教师:
尉宇
二○一一年九月
目录
1题目及要求………………………………………………1
1.1题目内容…………………………………………3
1.2设计要求…………………………………………3
1.3设计报告及书写内容要求………………………4
2程序分设计说明…………………………………………5
2.1概要设计…………………………………………5
2.2流程图……………………………………………5
2.3详细设计…………………………………………6
3调试与测试………………………………………………8
3.1相关界面显示……………………………………8
3.2数据测试…………………………………………10
3.3问题及思考………………………………………11
3.4指导老师的建议…………………………………13
4总结………………………………………………………14
5附件:
源程序代码………………………………………15
1.题目及要求
1.1题目内容
题目一:
汽车售票系统
任务:
自学C语言中相关知识,设计出汽车售票系统。
要求如下所述:
每天“武汉火车站→天河机场”有5个班次的汽车(假设),具体的数据格式如下:
班次 发车时间 载客量 已售票数
1 06:
40 50 0
2 09:
30 40 0
3 12:
00 40 0
4 14:
30 40 0
5 16:
00 50 0
为售票员开发一个小程序,以完成每天的“火车站→植物园”的售票业务。
要求如下:
1.能够售票和退票。
以文件(myfile.txt)的形式保存当天各个车次的售退票情况。
◆售票功能
当查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,自动更新已售票人数。
◆退票功能
退票时,输入退票的班次,当本班车未发出时才能退票,自动更新已售票人数。
◆查询显示功能
可以随时显示当前售票现状(如:
班次 发车时间 载客量 已售票数 余票等信息)。
2.用户界面中的菜单至少应包括“售票”、“退票”、“显示当前售票情况”、“保存当天数据”、“退出”5项。
可适当增加其他附加功能。
1.2设计要求
◆为了保证所有的数据可以长期被使用,要求程序能将相关数据存储在外部数据文件中,具体数据格式和文件名、路径等自定;
◆根据所设计的算法,定义相应函数分别实现系统的各子功能模块,同时由主程序提供友好的用户界面,使用户可通过选择主菜单来调用课程设计中要求完成的各个功能模块,子程序执行完后可返回到主菜单,继续选择其他功能执行。
源程序要求书写规范,结构清晰。
重点函数的重点变量,重点功能部分均要求给出清晰的程序注释。
◆程序编译、链接成功后,自己设计实现程序功能的一组或多组测试数据,并严格按照此测试数据进行测试,然后分析测试结果。
如果程序不能正常运行或结果不正确,则需对程序进行单步调试,在调试过程中认真查找算法实现中存在的问题,并加以分析和
1.3设计报告及书写内容要求
课程设计和上机调试任务完成之后,每位同学必须独立书写一份课程设计报告,注意:
不得抄袭他人的报告(或给他人抄袭),一旦发现,成绩为零分。
课程设计报告的内容应包括以下五个部分:
1)需求分析:
包括设计题目、设计要求以及系统功能需求分析;
2)概要设计:
包括系统总体设计框架和系统功能模块图;
3)详细设计:
包括主要功能模块的算法设计思路以及对应的工作流程图;
4)主要源程序代码:
完整源程序清单及关键注释;
5)调试分析过程描述:
包括测试数据、测试输出结果,以及对程序调试过程中存在问题的思考;
6)课程设计小结:
包括课程设计过程中的学习体会与收获、对C语言和本课程设计的认识以及自己的建议等内容。
2.程序分析及设计说明
2.1概要设计
初看题目不难发现这是一个主函数调用三个子函数从而实现售票、退票、查询的功能,调用完毕返回主函数由此可以确定大致的框架。
设计之初,根据题目要求需要用到结构体,函数、指针文件等相关知识,事先对其进行回顾。
设计之时,应该明确:
是用结构体去存放同一班车的相关信息;用“while
(1)”实现程序的不断循环,即相关售退票函数结束可以回到主函数实现下一以为顾客的操作而不出现程序结束的现象;用switchcase实现不同的函数入口。
这样一个大致的模型就已经构建。
2.2流程图
2.3详细设计
主程序关键部位
1.由于车次的各个信息,以及系统时间变量在许多子函数有调用,所以对于各车次的结构体变量,系统时间变量要再最前面以全局变量的形式定义,以便作用域的范围满足程序需求。
2.对于主菜单下的选择1,2,3都是通过调用子函数实现,而选择0是退出程序,所以在用switch之前就应该判断输入内容是否为0,是,则直接进入退出。
当然这应该包含在while
(1){}语句内。
3.如果是选择售票或退票应先提示选择车次,并以参数的形式带入函数。
4.对于主函数和子函数中篇幅比较长而且需要多次使用的打印语句,判断语句应该在库函数的引用后进行宏定义,比如说主菜单的输出,车次信息的打印,系统时间与发车时间的比较。
5.系统时间的获取运用
“curr=time(NULL);
date=localtime(&curr);”语句
子程序关键部位
1.每个子程序都需要清屏处理system("cls");使得用户产生由主菜单点击进入选项的感觉,增强界面的友好性。
2.子程序中出现的新界面在完成相关售票,退票,查询后应该予以停留,方便用户确认信息,否者完成后一闪而过回到主菜单,并不能确认是否已经成功完成操作。
因此运用两次“getchar();”,达到屏幕停滞的效果,再按任意键返回。
3.在售票和退票的界面应该再次打出当前的各个车次信息,以便用户做出选择,并不是每个用户都知道要买什么车次的车子,这样也是为了增强了程序的友好性。
辅助函数设计
1.对于主菜单【voidmenu()】、车次信息【表头voidprintheader(),内容voidprintdata(…)】、信息保存【voidsave(…)】等内容会在程序的许多部位出现,因此单独使用函数予以实现,使得程序更加清晰。
2.由于每次输入需要检查输入信息是否合格,如果不合格应该报错,并重新输入,因此定义一个voidwrong()来输出按键错误信息。
3.调试与测试
3.1相关界面显示
主界面
售票界面
退票界面
查询界面
(注:
由于版面限制,在此只出现了部分情况的界面)
3.2数据测试
本次报告的内容为其中一次测试,测试时间13:
41,其他不一一给出,由于涉及到系统时间问题所以每天需要分时段进行测试或是修改系统时间。
(1)售票系统
车次发车时间载客量已售车票测试结果
106:
40500超过时间无法购票
209:
30400超过时间无法购票
312:
00400超过时间无法购票
414:
30403可以购票(购3票)
516:
00404可以购票(购4票)
(2)退票系统
车次发车时间载客量已售车票测试结果
106:
40500超过时间无法购票
209:
30400超过时间无法购票
312:
00400超过时间无法购票
414:
30402可以退票(退1票)
516:
00403可以退票(退1票)
(3)查询系统
正常输出
3.3问题及思考
问题一:
系统时间的获取
问题二:
发车时间的打印问题
问题三:
发车时间与系统时间的比较
问题四:
屏幕停滞问题
问题解决:
1.系统时间的获取
通过对于网上资料的查询,获得了系统时间的调用方式,先引用库函数%d|%2d|%2d|")
从而解决了比较时间和打印输出的问题。
由此通过以下语句可以实现发车时间与系统时间的比较((date->tm_)>=((q+c)->min))))即先比较hour,再比较hour相同时min的大小。
问题四:
屏幕停滞问题
由于知识的有限,对于很多功能知识了解大概,通过网上的查询,得知getchar()有停滞界面的功能。
3.4指导老师的建议与改进
指导老师在程序的调试过程中提到了,购票的连续性,也就是一位客户完成一张票的购买后可以重复购票,并给出了“封装函数”的建议。
要想达到要求也就是要把sell()函数再次拆分,并且要想重复购票还要构造循环,直至输入项为0(代码中输入为0时退出当前界面,退回主界面)。
4总结
本次C语言课程设计从暑假就开始收集资料,学习相关知识,一些上课未涉及的内容也做了些了解和掌握,直至开学的第一周陆续完成。
在实验的设计的过程中出现了许多上课、作业中没有遇到过的问题,这就是理论与实践的区别,知道知识却不能很好的运用,说明自己没有真正的掌握C语言,学习的只是皮毛,使我认识到了实践、动手编译的重要性。
以下本次C语言课程设计的几点小结:
(1)通过上网学习和参阅参考资料陆续解决了系统时间的定义及调用、菜单形式界面的形成、屏幕停滞问题等问题。
(2)在编译的过程中大大提高了编程的逻辑性,在语言清晰、简洁方面有了较好的提高。
在程序查错的过程中也学会了设置断点,分块检查,逐渐提高了判断错误的速度和准确性。
(3)通过在上课时间与老师的交流了解到了函数模块化的重要性。
把程序的总目标分成一个个模块,提高清晰度和可读性。
(4)本次试验是个自主学习的机会,通过本次试验也增强了自己的信息获取能力和自学能力。
5附件:
源程序代码
#include#defineHEADER2"\n|车次|发车时间|载客量|已售车票|"
#defineHEADER3"\n|-|-|||"
#defineFORMAT1"\n|%d|%d:
%d|%2d|%2d|"
#defineFORMAT2"\n|%d|0%d:
%d|%2d|%2d|"
#defineFORMAT3"\n|%d|%d:
0%d|%2d|%2d|"
#defineDATA(q+i)->num,(q+i)->,(q+i)->busload,(q+i)->sold
#defineEND"\n"
#defineSTOPgetchar();getchar();return;
#defineJUDGE((date->tm_)>=((q+c)->min))))
*判断即时时间已大于发车时间*
structtm*date;*定义系统时间为全局变量*
time_tcurr;
structinformation*标记为information*
{
intnum;*车次*
int;*发车时间*
intbusload;*载客量*
intsold;*已售车票*
}inf[5]={{},{},{},{},{}};*初始化结构体*
FILE*k;*定义文件指针全局变量*
voidmenu()*主菜单*
{
system("cls");*清屏*
cprintf("\n\n\n\n\公交车自动服务系统\n\n");
cprintf("**************************Menu*****************************\n\n");
cprintf("*1.购票*\n\n");
cprintf("*2.退票*\n\n");
cprintf("*3.查询*\n\n");
cprintf("*0.退出*\n\n");
cprintf("****************************************************************\n\n");
}
voidwrong()*输出按键错误信息*
{
printf("\n***********Error:
input");
getchar();
}
voidsave(structinformation*q)*保存当前信息*
{
k=fopen("file.txt","w+");*打开文件*
if(fwrite(q,sizeof(structinformation),1,k)!
=1)*记录当日数据*
printf("filewriteerror\n");*报错*
fclose(k);*关闭文件*
printf("\n==========>已成功保存当前信息!
");
}
voidprintheader()*格式化输出表头*
{
printf(HEADER1);
printf(HEADER2);
printf(HEADER3);
}
voidprintdata(structinformation*q)*格式化输出表中数据*
{
inti;
for(i=0;i<5;i++)
{
if((q+i)-><10)
printf(FORMAT3,DATA);
else
printf(FORMAT1,DATA);
}
printf(END);
}
voidsellson(intc,structinformation*q)
{
curr=time(NULL);
date=localtime(&curr);
c--;
intf=(q+c)->sold,j=(q+c)->busload;
if(f==j)*判断已售量完*
{
printf("\n==========>对不起,此票已售完\n");
STOP
}
elseif(JUDGE)
{
printf("\n==========>对不起,此班车已发车,无法售票\n");
STOP
}
else
{
intd;
printf("\n========>您选择的是第%d车",(c+1));
printf("\n\n========>确认购票请按1,取消请按0,请输入:
");
scanf("%d",&d);
while
(1)
{
if(d==1)
{
((q+c)->sold)++;*已售量加一*
printf("\n完成购票!
");
break;
}
elseif(d==0)*取消售票*
{
printf("已经取消售票");
break;
}
else
{
wrong();
}
}
STOP
}
}
voidreturnson(intc,structinformation*q)
{
c--;
if(JUDGE)*判断当时时间是否已经大于发车时间*
{
printf("\n========>对不起,此班车已发出,无法退票\n");
STOP
}
elseif((q+c)->sold==0)
{
printf("\n========>对不起,售票量为0,无法退票\n");
STOP
}
else*退票*
{
intd;
printf("\n========>您选择的是第%d车",(c+1));
printf("\n\n==========>确认退票请按1,取消请按0,请输入:
");
scanf("%d",&d);
if(d)
((q+c)->sold)--;*已售量减一*
printf("完成退票!
\n");
}
STOP
}
voidsell(structinformation*q)*售票函数*
{
intbus_num;
while
(1)
{
system("cls");
printheader();
printdata(q);
printf("\n\n");
while
(1)
{
printf("请选择车次(1~5)退出选择“0”请输入:
");
scanf("%d",&bus_num);
switch(bus_num)*子函数入口*
{
case0:
break;
case1:
sellson(1,q);break;
case2:
sellson(2,q);break;
case3:
sellson(3,q);break;
case4:
sellson(4,q);break;
case5:
sellson(5,q);break;
default:
wrong();continue;
}
if(bus_num==0)
return;
printf("若继续购票,");
}
}
}
voidreturns(structinformation*q)*退票函数*
{
curr=time(NULL);
date=localtime(&curr);*获取即时系统时间*
intbus_num;
while
(1)
{
system("cls");
printheader();
printdata(q);
printf("\n\n");
while
(1)
{
printf("\n\n请选择车次(1~5)选择“0”退出请输入:
");
scanf("%d",&bus_num);
switch(bus_num)*子函数入口*
{
case0:
break;
case1:
returnson(1,q);break;
case2:
returnson(2,q);break;
case3:
returnson(3,q);break;
case4:
returnson(4,q);break;
case5:
returnson(5,q);break;
default:
wrong();continue;
}
if(bus_num==0)
return;
printf("若继续购票,");
}
}
}
voidinquire(structinformation*q)*查询函数*
{
system("cls");
printheader();*格式化输出表头*
printdata(q);*格式化输出表中数据*
printf("\n\npressanykeytoreturntothemenu");
STOP
}
voidmain()*主菜单*
{
structinformation*p;*指针域*
intselect;
charch;*ch用来保存y,n*
p=inf;
k=fopen("E:
\\file.txt","ab+");*以追加方式打开一个二进制文件,可读可写,若此文件不存在,会创建此文件*
if(k==NULL)
{
printf("\n=====>cannotopenfile!
\n");
exit(0);
}
while
(1)
{
system("cls");
menu();
printf("请输入(0~3):
");
scanf("%d",&select);
if(select==0)*退出系统*
{
getchar();
printf("\n=====>Whethersavethemodifiedrecordtofile?
(yn):
");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
save(p);
printf("\n=====>thankyouforuseness!
");
getchar();
break;
}
switch(select)*判断并由相应的函数处理*
{
case1:
sell(p);break;*购票*
case2:
returns(p);break;*退票*
case3:
inquire(p);break;*查询*
default:
wrong();getchar();break;*按键有误,必须为数值0-3*
}
curr=time(NULL);
date=localtime(&curr);*获取即时系统时间*
if((date->tm_hour)>=16)*判断是否已经过16点*
save(p);
}
}