程序设计报告.docx
- 文档编号:5934136
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:29
- 大小:325.56KB
程序设计报告.docx
《程序设计报告.docx》由会员分享,可在线阅读,更多相关《程序设计报告.docx(29页珍藏版)》请在冰豆网上搜索。
程序设计报告
程序设计实践训练课程设计报告
姓名:
班级:
13电信2班
学号:
*******
2013302
2013302
指导老师:
日期:
2015.12.14~2015.12.16
华南农业大学电子工程学院
摘要
在现代社会,计算机已经进入社会生活的各个领域。
计算机和互联网已经与老百姓的日常工作、学习和生活息息相关,人类社会现在又处于历史飞跃时期,由高度的工业化时代迈向计算机网络时代。
作为新世纪的大学生,我们应当站在时代发展的前列,掌握现代科学技术知识,调整自己的知识结构和能力结构,通过实践巩固自己的知识。
在这次的课程设计实践中,我们小组选择了车票管理系统这个课题。
车票的管理系统包括班次信息的录入、浏览和查询、售票和退票等功能。
随着计算机技术的发展,可视编程技术占有了越来越重要的作用。
VisualC++6.0是一种功能强大行之有效的可视化编程工具。
因此此软件是在VisualC++6.0环境下编写
的。
对于我们,随着学习的深入,已经大体掌握了VisualC++6.0环境下的程序开发。
为了将我们的编程能力提升到一个更高的水平,深化面向对象的编程思维和解决问题的能力,值此课程设计周期间,进行基于VisualC++6.0环境的软件开发,先以字符统计软件作为开始,对VisualC++6.0环境和面向对象程序设计进行回忆和熟悉,使得在此基础上的下一个员工培训系统软件的开发进行的更加顺利。
本文档详细叙述了基于VisualC++6.0环境下的车票管理系统的设计过程以及程序源代码。
程序在编写的过程运用了子程序递归调用、头文件包含等编程方法,此次车票管理系统的开发目的是使我们用面向对象的方式来思考和解决问题的能力,并且可以掌握字符数组的使用、字符指针的使用、数据库的设计和文件使用以及C语言语法。
设计程序的重要思想是模块化处理,自上而下,逐步精细;把一个复杂的问题分析为多个子问题,然后利用函数模块化把一个个小的问题解决。
关键字:
子程序、模块化、程序设计思路、结构体
2.3系统总体设计框架1
1.课程设计目的
通过课程设计,加强对结构化程序设计思想的理解,能对系统功能进行分析,并设计合理的模块化结构,进一步掌握C语言中重要的数据结构,掌握并熟练运用指针、链表、结构体、文件等数据结构,掌握软件系统设计的基本步骤,提高程序开发能力,能运用合理的控制流编写清晰高效的程序,加强程序分析能力[1]。
2课程准备阶段
2.1背景
一直以来,在人们的日常出行中,大巴以其方便实惠的优点吸引了大量的乘客乘坐。
然而,随着时代的发展,传统的效率低下,速度慢的人工售票方式已经跟不上时代的潮流。
为了方便人们的出行,开发出一款车票管理系统已经迫在眉睫。
2.2设计内容
一车站每天有n个发车班次,每个班次都有一班次号(1、2、3…n),固定的发车时间,固定的路线(起始站、终点站),大致的行车时间,固定的额定载客量。
如:
班次发车时间起点站终点站行车时间额定载量已定票人数
18:
00郫县广汉24530
26:
30郫县成都0.54040
37:
00郫县成都0.54020
410:
00郫县成都0.5402
…
程序基本要求:
(1)录入班次信息(信息用文件保存),可不定时地增加班次数据;
(2)浏览班次信息,可显示出所有班次当前状总(如果当前系统时间超过了某班次的发车时间,则显示“此班已发出”的提示信息);
(3)查询路线:
可按班次号查询,可按终点站查询;
(4)售票和退票功能:
A:
当查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,自动更新已售票人数
B:
退票时,输入退票的班次,当本班车未发出时才能退票,自动更新已售票人数;
(5)采用文本菜单界面。
2.3系统总体设计框架
程序总体的功能如下图所示:
程序包含了8个功能,除了课程设计要求的录入数据、显示数据、查询数据、增加数据、售票服务、退票服务这6个功能,我们另外加入了修改程序已经录入的数据和删除数据。
相应的的函数实现算法,在之后的篇幅中详细介绍。
3程序设计过程
根据程序设计的模块化思想,我们将程序进行功能的模块化,以下是我们的程序设计过程:
3.1主函数的设计
3.1.1主函数内部应该设计一个死循环,里面将有一个控制变量函数,由其返回值确定主函数调用哪种功能,这里我们选用switch语句,控制变量是menu_select的返回值,menu_select是菜单选择函数。
}
voidmain()
{
system("cls");
while
(1)//循环
{
/*intk;
k=mimaa();
if(k)*/
switch(menu_select())
{
case1:
newmessage();break;//录入函数
case2:
display();break;//显示
case3:
search();break;//查找函数
case4:
add();break;//增加记录
case5:
ticketorder();break;//售票函数
case6:
ticketdelete();break;//删除函数
case7:
change();break;//修改函数
case8:
deletemessage();break;//选择调用删除函数
case9:
quit();break;//退出函数
}
}
3.1.2menu_select函数有校准功能,当输入无效字符时会显示提醒语句,程序
如下:
intmenu_select()
{
chars[5];
intc,i;
//charmenu[20];
system("cls");
system("color73");//改变颜色
for(i=0;i<11;i++)
{
printf("%s",menu[i]);//输出菜单各项
}
scanf("%d",&c);
i=0;
while(c>0||c<9)
{
printf("\n");
printf("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
printf("\n请选择(1--9):
");
scanf("%s",s);
c=atoi(s);//转化为整数值
break;
}
returnc;
}
3.2录入功能函数的设计
3.2.1预约班次信息的录入
录入的多个车票信息有多个数据类型,所以我们采用结构体数组为传递变量,每个结构体包含一个车次的信息,调用的函数为newmessage函数,结构体records[N]如下:
#defineN1000
typedefstructticket
{
charnum[10];//车次
charhour[3];//发车时间
charmin[3];//起点
charfrom[10];//终点
charto[10];//目的地
floathours;//行车时间
intmax;//载客量
intnow;//已订票数
}CLASS;
CLASSrecords[N];
3.2.2newmessage函数程序如下:
voidnewmessage()
{
inti=0,j=5,h;
chars[5];
FILE*fp;
system("cls");
if((fp=fopen("车票管理系统0.txt","r"))!
=NULL)
{
printf("车票信息已经存在请选择增加功能!
\n");
printf("任意输入则返回菜单\n");
scanf("%s",s);
i=1;//通过是1
}
if(i==0)
{
system("cls");
printf("请输入要录入班次总数:
\n");
scanf("%d",&class_num);
system("cls");
for(i=0;i { system("cls"); printf("请输入第%d个班次信息\n: ",i+1); h=-1; for(;h! =i;)//先检验错误 { printf("请输入班次\n: "); scanf("%s",records[i].num); for(h=0;h if(strcmp(records[h].num,records[i].num)==0) { printf("输入错误! 该班次已经存在! \n"); break; } } get(i,j);//内部函数,存放到结构体 j=5; } save();//保存,若有错误,查看此处 } } 3.2.3newmessage函数内部还有进行子函数get的嵌套处理,它把录入的数据存放到结构体,再通过文件指针函数save对输入的数据进行文件的保存。 get函数程序如下: voidget(inti,intj) { for(;;) { printf("请输入发车时间(xx: xx)");scanf("%s%s",records[i].hour,records[i].min); if((atoi(records[i].hour)<24&&atoi(records[i].hour)>=0)&&(atoi(records[i].min)<60&&atoi(records[i].min)>=0)) break; else { printf("输入错误! \n"); getch();/////从控制台读取一个字符,但不显示在屏幕上 } } printf("请输入起点站: \n"); scanf("%s",records[i].from); printf("请输入终点站: \n"); scanf("%s",records[i].to); printf("请输入行车时间: \n"); scanf("%f",&records[i].hours); printf("请输入载客量: \n"); scanf("%d",&records[i].max); printf("请输入已售车票: \n"); scanf("%d",&records[i].now); } save函数程序如下: voidsave() { FILE*fp3,*fp4; if((fp3=fopen("1车票管理系统.txt","w"))==NULL) { printf("文件打开错误! \n"); exit(0); } if((fp4=fopen("1车票管理系统0.txt","w"))==NULL) { printf("文件打开错误! \n"); exit(0); } fwrite(&class_num,sizeof(int),1,fp4);//写出一个整形数据class_num给fp2指向的车票管理系统0.txt fwrite(records,sizeof(CLASS),class_num,fp3);//写出class_num这么多个CLASS类型的数据给fp1 fclose(fp3);fclose(fp4); } 3.3显示所有班次功能 调用的函数是display函数,在display函数里除了调用打印表头表尾函数,最主要的一个函数是load函数,它的功能是对已经录入数据的文件进行读入数据,是在完成第一步之后的下一个步骤,具体程序如下: 3.3.1load函数程序如下: voidload()//查找班次 { FILE*fp1,*fp2; if((fp1=fopen("1车票管理系统.txt","r"))==NULL) { system("cls"); printf("文件打开错误! \n"); getch(); exit(0); } if((fp2=fopen("1车票管理系统0.txt","r"))==NULL) { system("cls"); printf("文件打开错误! \n"); getch(); exit(0); } fread(&class_num,sizeof(int),1,fp2); fread(records,sizeof(CLASS),class_num,fp1); fclose(fp1);fclose(fp2); } 3.3.2display函数程序如下: voiddisplay() { inti; system("cls"); load();//会显示所有的班次 showtable1(); for(i=0;i<20;i++)//class_num { printf("\n||----------||----------||----------||----------||----------||----------||----------\n"); if(whether(i)) { printf("|%10s|%5s: %-4s|%10s|%10s|%8.1f|%8d|%8d|",records[i].num,records[i].hour,records[i].min,records[i].from,records[i].to,records[i].hours,records[i].max,records[i].now); } else printf("|%10s|已经发车%10s|%10s|%8.1f|%8d|%8d|",records[i].num,records[i].from,records[i].to,records[i].hours,records[i].max,records[i].now); } showtable2(); printf("\n按任意键继续\n"); getch(); } 3.4查询班次功能 查询班次功能search函数内部进行了子函数嵌套,嵌套的函数是find函数,它的两个形参分别代指“班次查询”和“终点站”查询,从而对结构体进行搜寻,之后返回输出。 3.4.1search函数程序如下: voidsearch() { inti; chars1[10]={'\0'},s2[10]={'\0'}; system("cls"); printf("1.按班次查询\n"); printf("2.按终点查询\n"); printf("3.退出\n"); printf("4.请选择(1~3): \n"); scanf("%d",&i); load(); switch(i) {case1: printf("请输入要查询的班次: \n"); scanf("%s",s1); find(s1,s2); break; case2: printf("请输入要查询的终点站: \n"); scanf("%s",s2); find(s1,s2); break; case3: break; default: printf("输入错误! \n"); break; } printf("按任意键继续。 。 。 \n"); getch(); } 3.4.2find函数程序如下: voidfind(chars1[],chars2[])// { inti,h=0,m; showtable1(); if(s2[0]=='\0') m=1; elsem=0; for(i=0;i { if(strcmp(s1,records[i].num)==0||strcmp(s2,records[i].to)==0) { printf("\n|----------|----------|----------|----------|----------|----------|----------|\n"); printf("|%10s|%5s: %-4s|%10s|%10s|%10.1f|%10d|%10d|",records[i].num,records[i].hour,records[i].min,records[i].from,records[i].to,records[i].hours,records[i].max,records[i].now); h+=2; if(m==1) break; } showtable2(h); } if(h==0) printf("要查找的班次不存在\n"); } 3.5增加班次功能 增加函数功能由add函数实现,嵌套了get函数和save函数进行新增的数据保存,由于get函数和save函数的代码在上面的部分已经给出,所以这里不重复展示。 3.5.1add函数程序如下 voidadd() { inti,j=5; load(); system("cls"); printf("1.增加班次\n"); printf("2.返回\n"); printf("请选择(1~2)\n"); scanf("%d",&i); if(i==1) { system("cls"); printf("1.请输入要增加的班次: \n"); scanf("%s",records[class_num].num); for(i=0;i { if(strcmp(records[class_num].num,records[i].num)==0) { printf("输入错误! \n"); getch(); break; } } if(i==class_num) { get(i,j); class_num++; save(); } } } 3.6售票功能 售票函数功能由ticketorder函数实现,其中嵌套了search函数、get函数和save函数进行新增的数据保存,由于get函数和save函数的代码在上面的部分已经给出,所以这里不重复展示。 3.6.1ticketorder函数程序如下: voidticketorder() { inti; charnum[10]; system("cls"); printf("1.售票\n"); printf("2.返回\n"); printf("请选择(1~2)\n"); scanf("%d",&i); if(i==1) { load(); search(); printf("请输入要订票的班次(若无请输入0): \n"); scanf("%s",num); for(i=0;i { if(strcmp(num,records[i].num)==0) { if((int)records[i].max>(int)records[i].now&&whether(i)==1) { records[i].now++; printf("通向%s班次为%s的票订票成功! \n",records[i].to,records[i].num); save(); getch(); break; } else { printf("该班次已满或已经出发\n"); getch(); } } } } } 3.6.2search函数程序如下: voidsearch() { inti; chars1[10]={'\0'},s2[10]={'\0'}; system("cls"); printf("1.按班次查询\n"); printf("2.按终点查询\n"); printf("3.退出\n"); printf("4.请选择(1~3): \n"); scanf("%d",&i); load(); switch(i) { case1: printf("请输入要查询的班次: \n"); scanf("%s",s1); find(s1,s2); break; case2: printf("请输入要查询的终点站: \n"); scanf("%s",s2); find(s1,s2); break; case3: break; default: printf("输入错误! \n"); break; } printf("按任意键继续。 。 。 \n"); getch(); } 3.7退票功能 退票函数功能由ticketdelete函数实现,其中嵌套了load函数、findnum函数和save函数进行新增的数据保存,由于load函数和save函数的代码在上面的部分已经给出,所以这里不重复展示。 3.7.1ticketdelete函数程序如下: voidticketdelete() { inti; charnum[10]; system("cls"); printf("1.退票\n"); printf("2.返回\n"); printf("请选择(1~2)\n"); scanf("%d",&i); if(i==1) { system("cls"); load();//调用按班次查询函数 printf("请输入要退票的班次: \n"); scanf("%s",num); i=findnum(num); if(strcmp(num,records[i].num)==0) { if(whether(i)) { printf("确定(Y/N)? "); scanf("%s",num); if(num[0]=='y'||num[0]=='Y') { rec
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 报告