资源描述
.
XX建筑工程学院
课 程 设 计 报 告
课程设计名称:C语言课程设计
课程设计题目:车票管理系统
院(系):理学院
专 业:信息与计算科学
班 级:信142
学 号:
姓 名:李嘉星
指导教师:李鸿强
完成日期:2015-6-17
33 / 34
目 录
前言2
第1章概要设计3
1.1题目的内容与要求3
1.2总体结构3
第2章详细设计4
主模块流程图4
车票管理系统软件详细设计4
第3章调试分析6
第4章使用说明与执行结果7
参考文献15
附录(程序清单)16
致 谢32
前言
随着计算机技术的发展,可视编程技术占有了越来越重要的作用。Visual C++6.0 是一种功能强大行之有效的可视化编程工具。因此此软件是在Visual C++6.0环境下编写的。对于我们,随着学习的深入,已经大体掌握了Visual C++6.0环境下的程序开发。为了将我们的编程能力提升到一个更高的水平,深化面向对象的编程思维和解决问题的能力,值此课程设计周期间,进行基于Visual C++6.0环境的软件开发,先以字符统计软件作为开始,对Visual C++6.0环境和面向对象程序设计进行回忆和熟悉,使得在此基础上的下一个员工培训系统软件的开发进行的更加顺利。
本文档详细叙述了基于Visual C++6.0环境下的车票管理系统的设计过程以及程序源代码。
本文档从概要设计,详细设计,参考源程序代码以及显示程序运行的截屏等方面详尽的介绍了软件开发过程。
此次车票管理系统的开发目的是使我们用面向对象的方式来思考和解决问题的能力,并且可以掌握字符数组的使用、字符指针的使用、数据库的设计和文件使用以及C语言语法。
程序在设计的过程中遇到的问题已及时更正,但由于编者的能力和水平有限,车票管理系统和文档中不免会出现一些不期待的错误,望文档读者能够理解和体谅,并欢迎提醒和纠正,在此表示感谢以及敬意。
第1章 概要设计
1.1题目的内容与要求
一车站每天有n个发车班次,每个班次都有一班次号(1、2、3…n),固定的发车时间,固定的路线(起始站、终点站),大致的行车时间,固定的额定载客量。如
班次 发车时间 起点站 终点站 行车时间 额定载量 已定票人数
1 8:00 郫县 广汉 2 45 30
2 6:30 郫县 XX 0.5 40 403 7:00 郫县 XX 0.5 40 20
4 10:00 郫县 XX 0.5 40 2
…
(一)功能要求:用c/c++设计一系统,能提供下列服务:
(1)录入班次信息(信息用文件保存),可不定时地增加班次数据
(2)浏览班次信息,可显示出所有班次当前状总。
(3)查询路线:可按班次号查询 ,可按终点站查询
(4)售票和退票功能
A:当查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,自动更新已售票人数
B:退票时,输入退票的班次,当本班车未发出时才能退票,自动更新已售票人数
(二)其它要求:
(1) 只能使用C/C++语言,源程序要有适当的注释,使程序容易阅读
(2) 至少采用文本菜单界面(如果能采用图形菜单界面更好)
(3) 学生可自动增加新功能模块(视情况可另外加分)
(4)写出课程设计报告,具体要求见相关说明文档
欢迎界面
管理员菜单
普通登录菜单
增加信息
查询信息
订票
保存信息
查询信息
删除信息
退票信息
1.2总体结构
图1-1 功能模块图
第2章 详细设计
主模块流程图
欢迎界面
管理员菜单
普通登录菜单
增加信息
查询信息
订票
保存信息
查询信息
删除信息
退票
密码验证
按车次
按终到站
按车次
按终到站
图2.1 主模块流程图
车票管理系统软件详细设计
一个名Timetable的结构体进行定义,
包括int no;//班次
int hour;//发车时间(时)
int minute;//发车时间(分)
char Starting_station[10];//始发站
char Last_station[10];//终点站
float time;//行车时间
int max_number;//最大载客数
int sold_number;//已售票数等结构体成员。
然后对调用函数进行定义。void add()增加记录,void Cipher()密码验证函数,void del()删除班次信息函数,void find(int s1,char s2[]) 查找函数,int findnum(int s1)查找班次函数,void Input()信息录入函数,void huanying ()欢迎界面,void land()登录选择界面,void menu1()管理员菜单界面,void menu2()普通菜单界面,void open()调用数据函数,void save()保存函数,void searchesmenu()查询菜单,void ticketdelete()退票函数,void ticketorder()售票函数,int timee(int i)判断时间是否超出函数,void timetable1显示车次函数该系统将这些信息均放在文件中。
最后定义main()函数,利用函数调用,实现程序的各种功能。将其放在系统文件车中。
第3章调试分析
1、 程序陷入死循环
解决办法:仔细分析程序间的关系,画程序流程图分析问题所在。利用break命令跳出循环
2、 程序出现乱码
解决办法:利用VC6.0本身的调试功能查找错误的所在,修改源程序。
3、 所学知识不能很好的完成程序
解决办法:上网查找相关资料,进入一些开源论坛寻求一定的帮助。
第4章使用说明与执行结果
图4-1
欢迎界面
图4-2
登录菜单
图4-3
管理员登录的密码机制
图4-4
密码容错机制
图4-5
管理员菜单
图4-6
图4-7
班次录入界面
图4-8
图4-9
班次增加界面
图4-10
时刻表浏览界面
图4-11
查询界面
图4-11
注销班次界面
图4-12
普通登录菜单
图4-13
图4-14
售票窗口
图4-15
图4-16
退票界面
参考文献
1、《C程序设计(第四版)》 作者:谭浩强书号:ISBN64:清华大学。
2、《C语言学习路线图》 作 者:明日科技书号:ISBN93:清华大学。
3、《C语言从入门到精通(第2版)》作者:明日科技书号:ISBN 20:清华大学。
4、《21天学通C语言(第7版) 》 作者:(美)琼斯等著,姜估译 书号:ISBN 79
:人民邮电。
5、《C Primer Plus(第五版)中文版》 作者:[美]StephenPrata 书号:ISBN28
:人民邮电。
谢鸣:百度文库 百度贴吧 百度百科 C语言之家 Linux开源俱乐部
网络资料来源:
1、.xuexi111./
2、snippets.dzone./tag/c/
3、.hotscripts./category/c-cpp/scripts-programs/ Hotscripts
4、https://.daniweb./software-development/cpp/code/_/8
附 录(程序清单)
代码
//增加记录
#include<stdio.h>
#include"news.h"
#include<stdlib.h>
#include<conio.h>
void add()
{
void open();
int get();
void save();
void menu1();
int i,j=5;
open(); // 调用按班次查询函数
system("cls"); //清屏
printf("1. 增加班次\n");
printf("2. 返回\n");
printf("请选择(1-2)\n");
scanf("%d",&i);
if(i==1)
{
system("cls"); //清屏
printf("1. 请输入要增加的班次:\n");
scanf("%d",&timetable[class_num].no);
for(i=0;i<class_num;i++)
if(timetable[class_num].no==timetable[i].no)
//比较是否相等,判断车次是否重复
{
printf("输入错误!\n");
getch(); //收集回车
break;
}
if(i==class_num)
{
get(i,j); //修改及增加班次*
class_num++; //使班次数加1
save(); //调用保存函数
}
else
menu1();
}
}
#include<stdio.h>
void Cipher()//密码验证函数
{
int m,n=123;//规定密码
void menu1(); //上级菜单的声明;容错机制
printf("请输入密码:");//输入提示
scanf("%d",&m);//密码输入
while(1){//容错机制
if(m==n)
menu1();
else
printf("密码错误请重新输入:");
scanf("%d",&m);
}}
//删除班次信息
#include<stdio.h>
#include<stdlib.h> //system("cls")的声明
#include<conio.h> //getch()的声明
#include"news.h"
void del()
{ void save();
int findnum(int s1);
int i,h=0;
int num;
char or[10];
system("cls"); //清屏
printf("1. 删除班次\n");
printf("2. 返回\n");
printf("请选择(1-2):\n");
scanf("%d",&i);
if(i==1)
{
system("cls"); //清屏
printf("请输入要删除的班次:\n");
scanf("%d",&num);
i=findnum(num); //调用班次查询函数
if(i==class_num) //全部匹配后但无匹配项
{
printf("输入错误,无此班次!\n");
getch(); //收集回车
del();
}
else
{
printf("确定?(y/n)\n");//确认机制
scanf("%s",or);
if(or[0]=='y'||or[0]=='Y')
{
for(;i<class_num-1;i++)
timetable[i]=timetable[i+1];
class_num--; //班次总数减1
save(); //调用保存函数
}
}
}
}
//查找函数
#include<stdio.h>
#include"news.h"
#include<string.h>
void find(int s1,char s2[])
{
int i,h=0,m;
if(s2[0]=='\0')
m=1; //1为无条件执行
else m=0;
printf("\n|----------|----------|----------|----------|--------|--------|--------|\n");
printf("\n| 班次 | 发车时间 | 起点站 | 终点站 |行车时间|额定载量| 已售票 |\n");
for(i=0;i<class_num;i++)
if(s1=timetable[i].no||strcmp(s2,timetable[i].Last_station)==0)
//判断字符串比较是否相等
{
printf("\n|----------|----------|----------|----------|--------|--------|--------|\n");
printf("|%10d|%5d:%-4d|%10s|%10s|%8.1f|%8d|%8d|\n",timetable[i].no,timetable[i].hour,
timetable[i].minute,timetable[i].Starting_station,timetable[i].Last_station,timetable[i].time,
timetable[i].max_number,timetable[i].sold_number);
if(m==1)
h++;
break;
}
printf("\n|----------|----------|----------|----------|--------|--------|--------|\n");
if(h==0)//不能break则执行
printf("要查找的班次不存在!\n");
}
//查找班次
#include<stdio.h>
#include"news.h"
int findnum(int s1)
{
int i;
printf("\n|----------|----------|----------|----------|--------|--------|--------|\n");
for(i=0;i<class_num;i++)
{
if(s1==timetable[i].no) //判断字符串比较是否相等,如果符合则输出车次等信息
{
printf("|----------|----------|----------|----------|--------|--------|--------|\n");
printf("|%10d|%5d:%-4d|%10s|%10s|%8.1f|%8d|%8d|",timetable[i].no,timetable[i].hour,
timetable[i].minute,timetable[i].Starting_station,timetable[i].Last_station,timetable[i].time,
timetable[i].max_number,timetable[i].sold_number);
break;
}
}
printf("\n|----------|----------|----------|----------|--------|--------|--------|\n");
return i;
}
//欢迎界面
#include <stdio.h>
void huanying (){
printf("\n\n\n\n");
printf("\t************************************************************\n");
printf("\n\n\n\n");
printf("\t\t\t\t车票管理系统\n");
printf("\n\n\n\n");
printf("\t\t\t设计人:李嘉星;X新月;田宇\n");
printf("\n\n");
printf("\t\t\t\t感谢您的使用\n\t\t\t\t按任意键继续\n");
printf("\n\n");
printf("\t************************************************************\n");
}
//信息录入界面
#include <stdio.h>
#include "news.h"
#include<stdlib.h>
#include<conio.h>
void Input(){
{
int i=0,j=5,h;
char s[5];
void save();
void add();
void get(int i,int j);
FILE *fp; //定义文件型指针变量
system("cls"); //清屏
if((fp=fopen("车票管理系统0.dat","rb"))!=NULL) //fopen打开文件
{
printf("车票信息已经存在!\n");
printf("任意输入进入添加菜单\n");
scanf("%s",s); //收集任意输入
i=1; //通过是1
add();
}
if(i==0)
{
system("cls"); //清屏
printf("请输入要录入班次总数:\n");
scanf("%d",&class_num); //指向班次指针
system("cls"); //清屏
for(i=0;i<class_num;i++)
{
system("cls"); //清屏
printf("请输入第%d个班次信息:\n",i+1);
h=-1;
for(;h!=i;) ///循环输出
{
printf("请输入班次:\n");
scanf("%d",&timetable[i].no);
for(h=0;h<i;h++)
if(timetable[h].no==timetable[i].no)
{
printf("输入错误!该班次已存在!\n");
break; //返回
}
}
get(i,j); //修改及增加班次
j=5;
}
save(); //调用保存函数
}
}
}
void get(int i,int j) // 修改及增加班次
{
for(;;)
{
printf("请输入发车时间(xx xx)");scanf("%d %d",&timetable[i].hour,&timetable[i].minute);
if(timetable[i].hour<24&&timetable[i].hour>=0&&timetable[i].minute<60&&timetable[i].minute>=0)
break;
else
{
printf("输入错误!\n");
getch(); //收集回车
}
}
printf("请输入起点站:\n");
scanf("%s",timetable[i].Starting_station);
printf("请输入终点站:\n");
scanf("%s",timetable[i].Last_station);
printf("请输入行车时间:\n");
scanf("%f",&timetable[i].time);
printf("请输入额定载量:\n");
scanf("%d",&timetable[i].max_number);
printf("请输入已售票数:\n");
scanf("%d",&timetable[i].sold_number);
}
//管理员菜单界面
#include <stdio.h>
void menu1(){
void Input();
void timetable1();
void save();
void del();
void searchesmenu();
void land();
void add();
int n;
printf("\t\t\t\t1、车次信息录入\n\t\t\t\t2、增加车次信息\n\t\t\t\t3、时刻表浏览\n\t\t\t\t4、车辆信息查询\n\t\t\t\t5、注销车次\n\t\t\t\t6、保存\n\t\t\t\t7、返回\n");
printf("\t\t\t 请输入需要运行的命令编号\n");
while(1){//死循环形成菜单
scanf("%d",&n);
switch(n){
case 1:Input();break;//车辆信息录入
case 2:add();break;//增加车次信息
case 3:timetable1();break;//浏览时刻表
case 4:searchesmenu();break;//车辆信息查询
case 5:del();break;//注销车次
case 6: save();break;//保存命令
case 7:land();break;//返回上级菜单
default: printf("非法输入\n");break;
}
}
}
//普通登录菜单
#include <stdio.h>
void menu2(){
void timetable1();
void ticketorder();
void ticketdelete();
void land();
void searchesmenu();
int n;
printf("\t\t\t\t1、时刻表浏览\n\t\t\t\t2、车辆信息查询\n\t\t\t\t3、购买车票\n\t\t\t\t4、退回车票\n\t\t\t\t5、返回\n");
printf("\t\t\t 请输入需要运行的命令编号\n");
while(1){
scanf("%d",&n);
switch(n){
case 1:timetable1();break;//时刻表浏览
case 2:searchesmenu();break;//车辆信息查询
case 3:ticketorder();break;//购买车票
case 4:ticketdelete(); break;//退回车票
case 5:land();break;//返回上级菜单
default: printf("非法输入\n");break;
}
}
}
#include<stdio.h>
void huanying ();
void land();
int main(){
char ch;
huanying();
ch=getchar( );//收集回车
land();
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include "news.h"
#include<conio.h>
void open(){
FILE *fp1,*fp2;
if((fp1=fopen("车票管理系统.dat","rb"))==NULL)
{
system("cls"); //清屏
printf("文件打开错误!\n");
getch(); //收集回车
exit(0);
}
if((fp2=fopen("车票管理系统0.dat","rb"))==NULL)
{
system("cls"); //清屏
printf("文件打开错误!\n");
getch(); //收集回车
exit(0); //退出
}
fread(&class_num,sizeof(int),1,fp2); ///读入信息
fread(timetable,sizeof(timetable[0]),class_num,fp1);/////读入信息
fclose(fp1);fclose(fp2); ///文件关闭
}
#include <stdio.h>
#include <stdlib.h>
#include "news.h"
void save() //保存函数
{
void menu1();
FILE *fp1,*fp2; //文件行指针
if((fp1=fopen("车票管理系统.dat","wb"))==NULL) //打开文件、为输出打开一个二进制文件
{
printf("文件打开错误!\n");
exit(0);
}
if((fp2=fopen("车票管理系统0.dat","wb"))==NULL) //打开文件、为输出打开一个二进制文件
{
printf("文件打开错误!\n");
exit(0);
}
fwrite(&class_num,sizeof(int),1,fp2); //写入文件信息
fwrite(timetable,sizeof(timetable[0]),class_num,fp1);
fclose(fp1);fclose(fp2); //关闭文件
printf("保存成功");
menu1();
}
//查询菜单
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
void searchesmenu(){
int i;
void find(int s1,char s2[]);
char s1=0,s2[10]={'\0'};
void open();
void land();
system("cls"); //清屏
printf("1. 按班次查询\n");
printf("2. 按终点站查询\n");
printf("3. 退出\n");
printf("请选择(1-3):\n");
scanf("%d",&i);
open(); // 调用按班次查询函数
switch(i) //菜单
{
case 1: printf("请输入要查询的班次:\n"); //s1为班次
scanf("%d",&s1);
find(s1,s2); //调用查找函数
break;
case 2: printf("请输入要查询终点站:\n"); //s2为终点站
scanf("%s",s2);
find(s1,s2); //调用查找函数
break;
case 3:land();break;//返回机制
default : printf("输入错误!\n");
break;
}
printf("按任意键继续....\n");
getch(); //收集回车
}
//退票函数
#include<stdio.h>
#include"news.h"
#include<stdlib.h>
#include<conio.h>
void ticketdelete()
{
int i;
int num;
char or;
int timee();
void open();
int findnum(int s1);
void save();
void menu2();
system("cls"); //清屏
printf("1. 退票\n");
printf("2. 返回\n");
printf("请选择(1-2)\n:");
scanf("%d",&i);
if(i==1)
{
system("cls"); //清屏
open(); // 调用按班次查询函数
printf("请输入要退票的班次:\n");
scanf("%d",&num);
i=findnum(num); //调用班次查询函数
if(num=timetable[i].no) //判断字符串比较是否相等 待比较的字符串
if(timee(i)) //判断时间是否超出函数
{
scanf("%c",&or);
if(or=='y'||or=='Y')
getch();
{
timetable[i].sold_number--; //使已售票加1
printf("退票成功!\n");
save(); //调用保存函数
getch(); //从控制台读取一个字符,但不显示在屏幕上
}
}
else
{
printf("该班车已发出,无法退票!\n");
getch(); //收集回车
}
}
}
//售票函数
#include<stdio.h>
#include"news.h"
#include<stdlib.h>
#include<conio.h>
void ticketorder()
{
int i;
int num;
void save();
int timee(int i);
void open();
void searchesmenu();
void land();
system("cls"); //清屏
printf("1. 售票\n");
printf("2. 返回\n");
printf("请选择(1-2):\n");
scanf("%d",&i);
if(i==1)
{
open(); // 调用open
printf("请输入要订票的班次(若无请输入0):\n");
scanf("%d",&num);
for(i=0;i<class_num;i++)
if(num==timetable[i].no)//比较是否相等
if(timetable[i].sold_number>timetable[i].max_number&&timee(i)==1)
//判断时间是否超出函数***并且***没超出最大客量
{
timetable[i].sold_number++; //使已售的票数+1
printf("通向%s班次为%d的票订票成功!\n",timetable[i].Starting_station,timetable[i].no);
save(); //调用保存函数
getch(); //收集回车
break;
}
else
{
printf("该班次已满或已发出!\n");
getch(); //收集回车
land();
}
}
else land();
}
#include<time.h>
#include<stdlib.h>
#include"news.h"
int timee(int i) //判断时间是否超出函数***
{
struct tm *local; //时间结构体
time_t t; //把当前时间给t
t=time(NULL); //NULL在stdio.h中定义为0
local=localtime(&t); /////获取当前系统时间
if(local->tm_hour<timetable[i].hour||local->tm_hour==timetable[i].hour&&local->tm_min<timetable[i].min
展开阅读全文