(最新版)数据结构实验报告答案
- 格式:doc
- 大小:264.00 KB
- 文档页数:96
《数据结构与算法分析》
课程设计内容体系主要内容
《数据结构课程设计》课程,可使学生深化理解书本知识,致力于用学过的理论知识和上机取得的实践经验,解决具体、复杂的实际问题,培养软件工作者所需的动手能力、独立解决问题的能力。
该课程设计侧重软件设计的综合训练,包括问题分析、总体结构设计、用户界面设计、程序设计基本技能和技巧、多人合作,以至一整套软件工作规范的训练和科学作风的培养。
一、课程设计要求
学生必须仔细阅读《数据结构与算法分析》课程设计方案,认真主动完成课程设计的要求。
有问题及时主动通过各种方式与教师联系沟通。
学生要发挥自主学习的能力,充分利用时间,安排好课程设计的时间计划,并在课程设计过程中不断检测自己的计划完成情况,及时的向教师汇报。
课程设计按照教学要求需要两周时间完成,两周中每天(按每周5天)至少要上3-4小时的机来调试C语言设计的程序,总共至少要上机调试程序30小时。
二、数据结构课程设计的具体内容
本次课程设计完成如下模块(共9个模块,学生可以在其中至少挑选6个功能块完成,但有**号的模块是必须要选择的)
(1)运动会分数统计**
任务:参加运动会有n个学校,学校编号为1……n。
比赛分成m个男子项目,和w个女子项目。
项目编号为男子1……m,女子m+1……m+w。
不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。
(m<=20,n<=20)功能要求:
可以输入各个项目的前三名或前五名的成绩;
●能统计各学校总分;
●可以按学校编号、学校总分、男女团体总分排序输出;
●可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前
三或前五名的学校。
规定:输入数据形式和范围:20以内的整数(如果做得更好可以输入学校的名称,运动项目的名称)
输出形式:有中文提示,各学校分数为整形
界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。
(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构;
测试数据:要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。
进行程序测试,以保证程序的稳定。
测试数据及测试结果请在上交的资料中写明;
(2)订票系统
任务:通过此系统可以实现如下功能:
录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)
查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);可以输入起飞抵达城市,查询飞机航班情况;
订票:可以订票(订票情况可以存在一个数据文件中,结构自己设定),如果该航班已经无票,可以提供相关可选择航班;
退票:可退票,退票后修改相关数据文件;客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。
修改航班信息:当航班信息改变可以修改航班数据文件
要求:根据以上功能说明,设计航班信息,订票信息的存储结构,设计程序完成功能;
(3)文章编辑**
功能:输入一页文字,程序可以统计出文字、数字、空格的个数。
静态存储一页文章,每行最多不超过80个字符,共N行;
要求:(1)分别统计出其中英文字母数和空格数及整篇文章总字数;(2)统计某一字符串在文章中出现的次数,并输出该次数;(3)删除某一子串,并将后面的字符前移。
(4)存储结构使用线性表,分别用几个子函数实现相应的功能;
输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号。
输出形式:(1)分行输出用户输入的各行字符;(2)分4行输出"全部字母数"、"数字个数"、"空格个数"、"文章总字数"(3)输出删除某一字符串后的文章;
(4)约瑟夫环(Joseph)
任务:编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。
一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。
报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。
设计一个程序来求出出列顺序。
要求:利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。
测试数据:m的初值为20,n=7 ,7个人的密码依次为3,1,7,2,4,7,4,首先m=6,则正确的输出是什么?
输入数据:建立输入处理输入数据,输入m的初值,n ,输入每个人的密码,建立单循环链表。
输出形式:建立一个输出函数,将正确的输出序列
(5)猴子选大王**
任务:一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1-m 的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
输入数据:输入m,n m,n 为整数,n<m
输出形式:中文提示按照m个猴子,数n 个数的方法,输出为大王的猴子是几号,建立一个函数来实现此功能
(6)建立二叉树,层序、先序遍历(用递归或非递归的方法都可以)**
任务:要求能够输入树的各个结点,并能够输出用不同方法遍历的遍历序列;分别建立建立二叉树存储结构的的输入函数、输出层序遍历序列的函数、输出先序遍历序列的函数;
(7)赫夫曼树的建立
任务:建立建立最优二叉树函数
要求:可以建立函数输入二叉树,并输出其赫夫曼树
在上交资料中请写明:存储结构、基本算法(可以使用程序流程图)、输入输出、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;
(8)纸牌游戏**
任务:编号为1-52张牌,正面向上,从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;然后…从第4张开始,以4为基数,是4的倍数的牌翻一次,直到最后一张牌;...再依次5的倍数的牌翻一次,6的,7的直到以52为基数的翻过,输出:这时正面向上的牌有哪些?
(9)图的建立及输出
任务:建立图的存储结构(图的类型可以是有向图、无向图、有向网、无向网,学生可以任选两种类型),能够输入图的顶点和边的信息,并存储到相应存储结构中,而后输出图的邻接矩阵。
要求:给出图的深度优先和广度优先遍历算法,并给出遍历过程的动态演示效果
三、上交相关内容要求
上交的成果的内容必须由以下四个部分组成,缺一不可
1.上交源程序:学生按照课程设计的具体要求所开发的所有源程序(应该放到一个文件夹中);
2.上交程序的说明文件:(保存在.txt中)在说明文档中应该写明上交程序所在的目录,上交程序的主程序文件名,如果需要安装,要有程序的安装使用说明;
3.课程设计报告:(保存在word 文档中,文件名要求按照"姓名-学号-课程设计报告"起名,如文件名为"张三-001-课程设计报告".doc )按照课程设计的具体要求建立的功能模块,每个模块要求按照如下几个内容认真完成;
其中包括:
●需求分析:在该部分中叙述,每个模块的功能要求
●概要设计:在此说明每个部分的算法设计说明(可以是描述算法的流程
图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出
该存储结构的定义。
●详细设计:各个算法实现的源程序,对每个题目要有相应的源程序(可
以是一组源程序,每个功能模块采用不同的函数实现)源程序要按照写
程序的规则来编写。
要结构清晰,重点函数的重点变量,重点功能部分
要加上清晰的程序注释。
●调试分析:测试数据,测试输出的结果,时间复杂度分析,和每个模块
设计和调试时存在问题的思考(问题是哪些?问题如何解决?),算法
的改进设想。
4. 课设总结:(保存在word 文档中)总结可以包括: 课程设计过程的收获、遇到问题、遇到问题解决问题过程的思考、程序调试能力的思考、对数据结构这门课程的思考、在课程设计过程中对《数据结构》课程的认识等内容
《数据结构与算法分析》
――课程内容体系主要内容
《数据结构与算法分析》课程实践内容体系主要内容
课程实验参考教材:
●魏开平等编著. 数据结构辅导与实验. 清华大学出版社,2006年第1版●瞿有甜,《数据结构与算法分析》实验指导书,2004.9
实验1 猴子选大王
任务:一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m 个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
输入数据:输入m,n m,n 为整数,n<m
输出形式:中文提示按照m个猴子,数n 个数的方法,输出为大王的猴子是几号,建立一个函数来实现此功能。
实验内容:
源程序:
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node * next;
}ListNode;
typedef ListNode * LinkList;
/*建立单循环链表函数*/
LinkList InitRing(int n,LinkList R)
{
ListNode *p,*q;
int i;
R=q=(ListNode *)malloc(sizeof(ListNode)); for(i=1;i<n;i++){
p=(ListNode *)malloc(sizeof(ListNode));
q->data=i;
q->next=p;q=p;
}
p->data=n;
p->next=R;
R=p;
return R;
}
/*选择函数*/
LinkList DeleteDeath(int n,int k,LinkList R) {
int i,j;
ListNode *p,*q;
p=R;
for(i=1;i<=n/2;i++)
{
for(j=1;j<=k-1;j++)
p=p->next;
q=p->next;
p->next=q->next;
printf("%4d",q->data);
if(i%10==0)printf("\n");
free(q);
}
R=p;
return R;
}
/*输出函数*/
void OutRing(int n,LinkList R) {
int i;
ListNode *p;
p=R;
for(i=1;i<=n/2;i++,p=p->next) {
printf("%4d",p->data);
if(i%10==0) printf("\n");
}
printf("\n");
printf("猴大王的号码:\n");
printf("4%d",p->next);
}
/*主函数*/
void main()
{
LinkList R;
int n,k;
LinkList InitRing(int n,LinkList R ); printf("猴子的总数N:");
scanf("%d",&n);
printf("报到要被淘汰数字K:"); scanf("%d",&k);
printf("被淘汰的猴子:\n");
R=InitRing(n,R);
R=DeleteDeath(n,k,R);
printf("\n");
OutRing(n,R);
}
实验结果:
实验2 订票系统
任务:通过此系统可以实现如下功能:
录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)
查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);可以输入起飞抵达城市,查询飞机航班情况;
订票:可以订票(订票情况可以存在一个数据文件中,结构自己设定),如果该航班已经无票,可以提供相关可选择航班;
退票:可退票,退票后修改相关数据文件;客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。
修改航班信息:当航班信息改变可以修改航班数据文件
要求:根据以上功能说明,设计航班信息,订票信息的存储结构,设计程序完成功能;
实验内容:
源程序:
#include <stdio.h>
#include <stdlib.h>
#include<conio.h>
#include <io.h>
#include <math.h>
#include <string.h>
#include <ctype.h>
#define TRUE 1
#define FALSE 0
typedef int BOOL;
#define NEW(type, size) (type*)malloc(sizeof(type) * size)
typedef struct _date { /* 日期 */
int m_year;
int m_month;
int m_day;
} DATE;
typedef struct _time { /* 时间 */
int m_hour;
int m_min;
} TIME;
typedef struct _flight { /* 航班数据 */
int m_fltno; /* 航班号,若此成员为-1,则表示此航班未使用 */
char m_szFrom[30]; /* 起飞港 */
char m_szPass[30]; /* 途经港 */
char m_szTo[30]; /* 到达港 */
TIME m_start; /* 起飞时间 */
TIME m_arrive; /* 到达时间 */
TIME m_fly; /* 飞行固定时间 */
int m_people; /* 乘客限额 */
} FLIGHT, *PFLIGHT;
typedef struct _passengernode { /* 乘客数据 */
char m_szName[20]; /* 姓名 */
char m_szCorp[30]; /* 单位 */
char m_szNumber[19]; /* 身份证号,考虑到字母的情况,故使用字符串 */
DATE m_Date; /* 订票日期 */
int m_fltno; /* 航班号 */
int m_seatno; /* 座位号 */
} PASSENGER, *PPASSENGER;
typedef struct _psgnode { /* 乘客结点 */
PASSENGER m_psg;
struct _psgnode *next;
} NODE, *PNODE;
/* 清空键盘缓冲区 */
void ClearBuffer(void);
/* 读取航班数据 */
void ReadFlight(FLIGHT fltlist[]);
/* 读取乘客数据 */
void ReadPassenger(PNODE psglist);
/* 添加航班 */
BOOL AddFlight(FLIGHT fltlist[], PFLIGHT fltdata);
/* 删除航班 */
void DelFlight(FLIGHT fltlist[], int index);
/* 添加乘客 */
void AddPassenger(PNODE psglist, PPASSENGER psgdata); /* 删除乘客 */
BOOL DelPassenger(PNODE psglist, int index);
/* 清空乘客链表 */
void ClearPsgList(PNODE psglist);
/* 取得乘客总数 */
unsigned int GetPsgCount(PNODE psglist);
BOOL datecmp(DATE* date1, DATE* date2);
void Book(FLIGHT fltlist[], PNODE psglist);
void query(FLIGHT fltlist[], PNODE psglist);
void fltnumber(FLIGHT fltlist[]);
void psgname (PNODE psglist);
void fromto (FLIGHT fltlist[]);
void fltdat(FLIGHT fltlist[], PNODE psglist);
/* 保存航班数据 */
void SaveFlight(FLIGHT fltlist[]);
/* 保存乘客数据 */
void SavePassenger(PNODE psglist);
/* 退出 */
void Quit(FLIGHT fltlist[], PNODE psglist);
BOOL datecmp(DATE* date1, DATE* date2)
{
return (date1->m_year == date2->m_year &&
date1->m_month == date2->m_month
&& date1->m_day == date2->m_day);
}
BOOL timecmp(TIME* time1, TIME* time2)
{
return (time1->m_hour == time2->m_hour && time1->m_min == time2->m_min);
}
void ClearBuffer(void)
{
getchar();
}
void ReadFlight(FLIGHT fltlist[])
{
FILE *fp;
if ((fp = fopen("flight.dat", "rb")) != NULL) fread(fltlist, sizeof(FLIGHT), 40, fp);
else
{
int i;
for (i = 0; i < 40; i++)
fltlist[i].m_fltno = -1;
}
fclose(fp);
}
void ReadPassenger(PNODE psglist)
{
FILE *fp;
if ((fp = fopen("psg.dat", "rb")) == NULL)
psglist->next = NULL;
else
{
int i, n;
fread(&n, sizeof(int), 1, fp);
for (i = 0; i < n; i++)
{
PASSENGER psg;
fread(&psg, sizeof(PASSENGER), 1, fp);
AddPassenger(psglist, &psg);
}
}
}
BOOL AddFlight(FLIGHT fltlist[], PFLIGHT fltdata) {
int i;
BOOL bResult = FALSE;
for (i = 0; i < 40; i++)
{
if (fltlist[i].m_fltno == -1)
{
memcpy(&fltlist[i], fltdata, sizeof(FLIGHT)); bResult = TRUE;
break;
}
}
return bResult;
}
void DelFlight(FLIGHT fltlist[], int index)
{
fltlist[index].m_fltno = -1;
}
void AddPassenger(PNODE psglist, PPASSENGER psgdata) {
PNODE p, q;
for (p = psglist; p->next != NULL; p = p->next)
;
q = NEW(NODE, 1);
memcpy(&q->m_psg, psgdata, sizeof(PASSENGER));
q->next = NULL;
p->next = q;
}
BOOL DelPassenger(PNODE psglist, int index)
{
int i = 0;
PNODE p, q;
for (p = psglist->next; p->next != NULL; p = p->next) i++;
if (p != NULL && i == index - 1)
{
q = p->next;
p->next = q->next;
free(q);
return TRUE;
}
else
return FALSE;
}
void ClearPsgList(PNODE psglist)
{
PNODE p = psglist->next, q;
while (p != NULL && p->next != NULL)
{
q = p;
p = p->next;
free(q);
}
}
unsigned int GetPsgCount(PNODE psglist)
{
PNODE p;
unsigned int s = 0;
for (p = psglist->next; p != NULL; p = p->next) s++;
return s;
}
void Book(FLIGHT fltlist[], PNODE psglist)
{
char c = 'y';
BOOL b;
while (c == 'y' || c == 'Y')
{
int i;
PASSENGER psg;
printf("请输入航班号:");
scanf("%d", &psg.m_fltno);
while (psg.m_fltno >= 10000 || psg.m_fltno < 0) {
printf("请重新输入:");
scanf("%d", &psg.m_fltno);
}
for(i = 0; i < 40; i++)
{
if(fltlist[i].m_fltno == psg.m_fltno)
{
PNODE p;
BOOL *q;
int j;
printf("请输入订票日期:(yyyy,mm,dd)");
scanf("%d,%d,%d", &psg.m_Date.m_year,
&psg.m_Date.m_month,
&psg.m_Date.m_day);
q = NEW(int, fltlist[i].m_people);
for (j = 0; j < fltlist[i].m_people; j++)
q[j] = FALSE;
for (p = psglist->next; p != NULL; p = p->next)
{
if(datecmp(&p->m_psg.m_Date, &psg.m_Date) &&
psg.m_fltno == p->m_psg.m_fltno)
q[p->m_psg.m_seatno - 1] = TRUE;
}
printf("以下座位尚未有人订:");
for (j=0; j < fltlist[i].m_people; j++)
{
if (!q[j])
printf("%d ", j + 1);
}
printf("\n请输入订票座位号:");
scanf("%d", &psg.m_seatno);
b = FALSE;
do
{
int k;
if (psg.m_seatno > 0 && psg.m_seatno <= fltlist[i].m_people + 1)
{
if (!q[psg.m_seatno - 1])
{
b = TRUE;
break;
}
else
printf("这个座位有人了!");
else
printf("数据非法!");
scanf("%d", &psg.m_seatno);
} while (!b);
printf("请输入乘客姓名:") ;
scanf("%s", psg.m_szName);
printf("请输入乘客单位:");
scanf("%s", psg.m_szCorp);
printf("请输入乘客身份证号:"); scanf("%s", psg.m_szNumber);
AddPassenger(psglist, &psg);
printf("您的订票已成功。
");
free(q);
}
}
c = getchar();
}
}
void query(FLIGHT fltlist[], PNODE psglist) {
for (;;)
char c;
system("cls");
printf("航班查询\n");
printf("~~~~~~~~\n");
printf("1.按航班号查询\n");
printf("2.按姓名查询乘客\n");
printf("3.按起飞、到达港查询\n"); printf("4.按日期查询航班情况\n"); printf("5.返回\n");
printf("\n请选择1-5:");
c = getchar();
switch (c)
{
case '1':
fltnumber(fltlist);
break;
case '2':
psgname(psglist);
break;
case '3':
fromto(fltlist);
break;
case '4':
fltdat(fltlist, psglist); break;
case '5':
break;
default:
continue;
}
if (c == '5')
break;
}
}
void fltnumber(FLIGHT fltlist[]) {
char c = 'y';
while (c == 'y' || c == 'Y')
{
BOOL b = FALSE;
int fltno, i;
printf("可以查询的航班号:"); for (i = 0; i < 40; i++)
{
if (fltlist[i].m_fltno != -1)
{
b = TRUE;
printf("%d ", fltlist[i].m_fltno);
}
}
if (!b)
{
printf("无\n按任意键返回。
");
getch();
return;
}
printf("\n请输入要查询的航班号:");
scanf("%d", &fltno);
for(i = 0; i < 40; i++)
{
if (fltlist[i].m_fltno == fltno)
{
printf("%s--%s--%s\n", fltlist[i].m_szFrom, fltlist[i].m_szPass,
fltlist[i].m_szTo);
printf("起飞时间:%2d:%02d 到达时间:%2d:%02d 飞行固定时间:%2d:%02d\n",
fltlist[i].m_start.m_hour,
fltlist[i].m_start.m_min,
fltlist[i].m_arrive.m_hour,
fltlist[i].m_arrive.m_min,
fltlist[i].m_fly.m_hour, fltlist[i].m_fly.m_min);
printf("乘客限额:%d\n", fltlist[i].m_people);
break;
}
}
printf("继续查询吗?(y/n)");
ClearBuffer();
c = getchar();
}
}
void psgname(PNODE psglist)
{
char c = 'y';
while (c == 'y' || c == 'Y')
{
char name[20];
BOOL b = FALSE;
printf("请输入乘客姓名:");
scanf("%s",name);
for (p = psglist->next; p != NULL; p = p->next)
{
if(strcmp(p->m_psg.m_szName, name) == 0)
{
b = TRUE;
printf("姓名:%s 单位:%s 身份证号:%s\n",
p->m_psg.m_szName,
p->m_psg.m_szCorp, p->m_psg.m_szNumber);
printf("订票日期:%d-%d-%d ", p->m_psg.m_Date.m_year, p->m_psg.m_Date.m_month, p->m_psg.m_Date.m_day);
printf("航班号:%d 座位号:%d", p->m_psg.m_fltno,
p->m_psg.m_seatno); break;
}
}
if (!b)
{
printf("查无此人,按任意键退出");
getch();
}
printf("是否继续查询?(y/n)");
ClearBuffer();
c = getchar();
}
}
void fromto (FLIGHT fltlist[])
{
char c = 'y';
while (c == 'y' || c == 'Y')
{
BOOL b = FALSE;
char from[30], to[30];
int i;
printf("请输入起飞港:");
scanf("%s", from);
printf("请输入到达港:");
scanf("%s", to);
for(i = 0; i < 40; i++)
{
if(strcmp(fltlist[i].m_szFrom,from)==0)
{
if(strcmp(fltlist[i].m_szTo,to)==0)
{
b=TRUE;
break;
}
}
}
if(b)
{
printf("%s--%s--%s\n",fltlist[i].m_szFrom,fltlist[i].m_szP ass,fltlist[i].m_szTo);
printf("起飞时间:%2d:%02d 到达时间:%2d:%02d 飞行固定时
间:%2d:%02d\n",fltlist[i].m_start.m_hour,fltlist[i].m_sta rt.m_min,fltlist[i].m_arrive.m_hour,fltlist[i].m_arrive.m_ min,fltlist[i].m_fly.m_hour,fltlist[i].m_fly.m_min);
printf("乘客限额:%d",fltlist[i].m_people);
}
else
printf("无此飞机");
getch();
printf("是否继续查询?");
ClearBuffer();
c = getchar();
}
}
void fltdat(FLIGHT fltlist[], PNODE psglist)
{
int people[40], i;
DATE date;
PNODE p;
for (i = 0; i < 40; i++)
people[i] = 0;
printf("请输入您要查询的日期(yyyy,mm,dd):");
scanf("%d,%d,%d", &date.m_year, &date.m_month, &date.m_day);
for (p = psglist->next; p != NULL; p=p->next) {
if (datecmp(&date, &p->m_psg.m_Date))
{
for(i=0;i<40;i++)
{
if(fltlist[i].m_fltno==p->m_psg.m_fltno)
people[i]++;
}
}
}
for (i = 0; i < 40; i++)
{
if (people[i] > 0)
{
printf("%d %s--%s--%s 人数:%d",
fltlist[i].m_fltno, fltlist[i].m_szFrom,
fltlist[i].m_szPass, fltlist[i].m_szTo, people[i]);
}
}
getch();
}
void Add(FLIGHT fltlist[])
{
char c = 'y';
while (c == 'y' || c == 'Y')
{
FLIGHT flt;
BOOL b;
printf("请输入航班号(1 - 10000):");
scanf("%d", &flt.m_fltno);
printf("请输入起飞港:");
scanf("%s", flt.m_szFrom);
printf("请输入途经港:");
scanf("%s", flt.m_szPass);
printf("请输入到达港:");
scanf("%s", flt.m_szTo);
printf("请输入起飞时间(hh:mm):");
scanf("%d:%d", &flt.m_start.m_hour,
&flt.m_start.m_min);
printf("请输入到达时间(hh:mm):");
scanf("%d:%d", &flt.m_arrive.m_hour, &flt.m_arrive.m_min);
printf("请输入飞行固定时间(hh:mm):");
scanf("%d:%d", &flt.m_fly.m_hour,
&flt.m_fly.m_min);
printf("请输入乘客限额:");
scanf("%d", &flt.m_people);
ClearBuffer();
if (AddFlight(fltlist, &flt))
printf("添加成功,");
else
printf("添加失败,");
printf("继续添加航班吗(Y/N)?");
c = getchar();
}
}
void Del(FLIGHT fltlist[])
{
BOOL b = FALSE;
int i, fltno;
char c = 'y';
while (c == 'y' || c == 'Y')
{
printf("可以取消的航班号:");
for (i = 0; i < 40; i++)
{
if (fltlist[i].m_fltno != -1) {
b = TRUE;
printf("%d ", fltlist[i].m_fltno);
}
}
if (!b)
{
printf("无\n按任意键返回。
");
getch();
return;
}
printf("\n请输入要取消的航班号:"); scanf("%d", &fltno);
for (i = 0; i < 40; i++)
{
if (fltlist[i].m_fltno == fltno) {
DelFlight(fltlist, i);
break;
}
}
printf("继续删除吗(y/n)?");
ClearBuffer();
c = getchar();
}
}
void Query(FLIGHT fltlist[])
{
char c = 'y';
while (c == 'y' || c == 'Y')
{
BOOL b = FALSE;
int i, fltno;
printf("可以查询的航班号:");
for (i = 0; i < 40; i++)
{
if (fltlist[i].m_fltno != -1) {
b = TRUE;
printf("%d ", fltlist[i].m_fltno); }
}
if (!b)
{
printf("无\n按任意键返回。
"); getch();
return;
}
printf("\n请输入要查询的航班号:");
scanf("%d", &fltno);
for (i = 0; i < 40; i++)
{
if (fltlist[i].m_fltno == fltno)
{
printf("%s--%s--%s 乘客限额:%d\n",
fltlist[i].m_szFrom,
fltlist[i].m_szPass, fltlist[i].m_szTo,
fltlist[i].m_people);
printf("起飞时间:%2d:%02d 到达时间:%2d:%02d 飞行固定时间:%2d:%02d\n",
fltlist[i].m_start.m_hour,
fltlist[i].m_start.m_min,
fltlist[i].m_arrive.m_hour,
fltlist[i].m_arrive.m_min,
fltlist[i].m_fly.m_hour,
fltlist[i].m_arrive.m_min);
break;
}
}
printf("继续查询吗(y/n)?");
ClearBuffer();
c = getchar();
}
}
void OneDay(FLIGHT fltlist[], PNODE psglist)
{
char c = 'y';
while (c == 'y' || c == 'Y')
{
DATE date;
int people[40], i;
PNODE p;
for (i = 0; i < 40; i++)
people[i] = 0;
printf("请输入您要管理的日期(yyyy,mm,dd):");
scanf("%d,%d,%d", &date.m_year, &date.m_month, &date.m_day);
for (p = psglist->next; p != NULL; p = p->next) {
if (datecmp(&p->m_psg.m_Date, &date))
{
for (i = 0; i < 40; i++)
{
if (fltlist[i].m_fltno == p->m_psg.m_fltno)
people[i]++;
}
}
}
for (i = 0; i < 40; i++)
{
if (fltlist[i].m_fltno != -1)
{
printf("%d %s--%s--%s 人数:%d\n", fltlist[i].m_fltno, fltlist[i].m_szFrom, fltlist[i].m_szPass,
fltlist[i].m_szTo,
people[i]);
}
}
printf("继续管理吗?(y/n)");
ClearBuffer();
c = getchar();
}
}
void MultiDay(FLIGHT fltlist[], PNODE psglist)
{
char c = 'y';
while (c == 'y' || c == 'Y')
{
DATE date[7];
int n, i, j;
int people[40][7];
PNODE p;
printf("请输入要查询的天数(1-7):");
do
{
scanf("%d", &n);
if (n > 7 || n < 1)
printf("输入非法,请重新输入:");
} while (n > 7 || n < 1);
for (i = 0; i < n; i++)
{
printf("请输入第%d个日期(yyyy,mm,dd):", i);
scanf("%d,%d,%d", &date[i].m_year,
&date[i].m_month, &date[i].m_day);
}
for (i = 0; i < 40; i++)
for (j = 0; j < 7; j++)
people[i][j] = 0;
for (p = psglist->next; p != NULL; p = p->next) {
for (j = 0; j < n; j++)
{
if (datecmp(&date[j], &p->m_psg.m_Date))
{
for (i = 0; i < 40; i++)
{
if (fltlist[i].m_fltno == p->m_psg.m_fltno) people[i][j]++;
}
}
}
}
for (i = 0; i < 40; i++)
{
if (fltlist[i].m_fltno != -1)
{
printf("%d %s--%s--%s ", fltlist[i].m_fltno, fltlist[i].m_szFrom,
fltlist[i].m_szPass, fltlist[i].m_szTo);
for (j = 0; j < n; j++)
printf("%d ", people[i][j]);
printf("\n");
}
}
printf("继续查询吗?(y/n)");
ClearBuffer();
c = getchar();
}
}
void Manage(FLIGHT fltlist[], PNODE psglist)
{
for (;;)
{
char c;
system("cls");
printf("航班管理\n");
printf("~~~~~~~~\n");
printf("1.查询航班基本情况\n");
printf("2.对某天航班飞行情况管理\n"); printf("3.近期航班飞行情况管理\n"); printf("4.取消航班\n");
printf("5.新增航班\n");
printf("6.返回\n");
printf("\n请选择1-6:");
c = getchar();
switch (c)
{
case '1':
Query(fltlist);
break;
case '2':
OneDay(fltlist, psglist);
break;
case '3':
MultiDay(fltlist, psglist);
break;
case '4':
Del(fltlist);
break;
case '5':
Add(fltlist);
break;
case '6':
break;
default:
continue;
}
if (c == '6')
break;
}
}
void SaveFlight(FLIGHT fltlist[])
{
FILE *fp;
if ((fp = fopen("flight.dat", "wb")) == NULL)
{
printf("不能打开flight.dat文件,航班数据无法保存。
\n");
fclose(fp);
return;
}
fwrite(&fltlist[0], sizeof(FLIGHT), 40, fp);
fclose(fp);
printf("航班数据已保存至flight.dat文件。
\n");
}
void SavePassenger(PNODE psglist)
{
FILE *fp;
PNODE p;
int n = GetPsgCount(psglist);
unlink("psg.dat");
if (n == 0)
return;
if ((fp = fopen("psg.dat", "wb")) == NULL)
{
printf("不能打开psg.dat文件,乘客数据无法保存。
\n"); fclose(fp);
return;
}
fwrite(&n, sizeof(int), 1, fp);
for (p = psglist->next; p != NULL; p = p->next)
fwrite(&p->m_psg, sizeof(PASSENGER), 1, fp);
fclose(fp);
printf("乘客数据已保存至psg.dat文件。
\n");
}
void Quit(FLIGHT fltlist[], PNODE psglist) {
SaveFlight(fltlist);
SavePassenger(psglist);
}
void main(void)
{
FLIGHT fltlist[40];
NODE psglist;
ReadFlight(fltlist);
ReadPassenger(&psglist);
for (;;)
{
char c;
system("cls");
printf("飞机订票系统\n");
printf("~~~~~~~~~~~~\n");
printf("---主菜单---\n");
printf("1.订票\n");
printf("2.退票\n");
printf("3.航班管理\n");
printf("4.查询\n");
printf("5.退出\n");
printf("\n请选择1-5:");
c = getchar();
switch (c)
{
case '1':
Book(fltlist, &psglist);
break;
case '2':
/*c_ticket(fltlist, &psglist);*/ break;
case '3':
Manage(fltlist, &psglist); break;
case '4':
query(fltlist, &psglist); break;
case '5':
Quit(fltlist, &psglist);
break;
default:。