火车车次检索与排序_课程设计报告要求
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计名称火车车次检索与排序实验室完成日期
火车车次检索与排序
一、目的与要求
1. 掌握查找及排序的逻辑特点及存储实现;
2. 根据选题,按规范化流程完成课程设计报告:
⑴.提供需求分析或问题描述。
(15 分)
⑵.列出概要设计。
(包括:抽象数据类型的描述;程序结构图或功能模块图) (20 分)
⑶.给出详细设计。
(包括:①存储结构的描述;②算法的详细设计,对复杂算法,最好画出其N-S 流程图;③函数的调用关系图) (30 分)
⑷.进行调试分析 (注:调试时遇到的问题及解决方法,程序的输出结果及对结果的分析) 。
(15 分)
⑸ . 整理设计总结。
(设计心得体会,以及其他总结信息等) (10 分)
⑹.附有程序清单(注:代码可具有适当注释,用来说明程序的功能、结构) 。
(10 分)
二、设计步骤
1、排序就是将一个数据元素 (或记录) 的任意序列,重新排列成一个按关键字有序的序列。
排序
分为增排序,减排序,稳定排序和不稳定排序。
在排序中,若数据表中的所有记录的排列过程都是在内存中进行的,称为内部排序。
由于待排序的记录数量太多,在排序过程中不能同时把全部记录放在内存中,需要不断的通过内存和外存进行交换数据来完成整个排序的过程称为外部排序。
内部排序方法分为:插入排序,交换排序,选择排序,归并排序,基数排序。
查找分为静态查找表和动态查找表,静态查找表包括顺序查找、折半查找、和分块查找,动态查找表包括:二叉排序树查找
2、(1)建立火车车次的存储结构,输入车次信息,实现车次检索与排序功能。
定义顺序表存放车次信息,包
括车次号,发车日期,出发时间,到达时间,价格,类型等。
用文件函数将车次信息保存在“train.txt”文件中,用冒泡排序方法进行排序,用折半查找进行查找。
(2)车次信息的结构体定义:
typedef struct
{
char num[10];//车次号
char startsa[10];//始发站
char endsa[10];//终点站
char date[10];//
char startti[10];//发车时间
char endti[10];//到达时间
char type[10];//
char price[10];//价格
}Fight;
功能模块图:
主函数模块输入模块保存数据至文件中
排序模块输出车次信息模块查询模块
3、存储结构描述:
typedef struct
{
Fight elem[N];
int length;
}Table;
建立顺序表 Fight 数组每个存储位置都存有车次信息。
系统子程序及功能设计:
void Printf(Table &F,int n); //输入函数
void Save(Table &F,int n)//将文件中的数据放入顺序表中
void Read(Table &F,int n) //将数据保存在文件中
void numsort(Table &F)// 根据车次号进行排序
void numsearch(Table &F,char key[10])// 根据车次号查询
void startsasort(Table &F)// 根据始发站排序
void startsasearch(Table &F,char key[10])// 始发站查找
void endsasort(Table &F)// 终点站排序
void endsasearch(Table &F,char key[10])// 终点站查找
void starttisort(Table &F)// 发车时间排序
void starttisearch(Table &F,char key[10])// 发车时间查询
void endtisort(Table &F)// 到达时间排序
void endtisearch(Table &F,char key[10])// 到达时间查找
void Out(Table F)// 输出所有列车信息
void Paixu(Table F)// 进行排序选择
void Search(Table F)// 进行查询选择
主函数 N-S 流程图:
开始
输入列车个
数
Printf(F,n);
Read(F,n);
Out(F);
否
While
(1)
是
1、排序
2、
查询
否
Way=
=1?
是
Paixu(F);
否
Way
==2?
是
Search(F);
请重新
输入
结束
根据车次号排序 N-S 流程图:
开始
否
i=1;i<=
F.lengt
h;
是
I++
否j=1;j<=
F.lengt
h-i;
是
J++
strcmp(F.el
em[j].num,F
.elem[j+1].
num)==1
F.elem[0]=F.elem[j];
F.elem[j]=F.elem[j+1];
F.elem[j+1]=F.elem[0];
结束
运行结果截图:
输入 3 个列车个数,分别输入了三个列车的车次信息
输出了所有列车信息选择按车次号排序
按车次号查询列车信息
三、设计总结
此程序用了顺序表存储方式,冒泡排序方法和折半查找方法,将列车信息合理化输出,也用了菜单函数方便用户进行选择,整体来说此程序的关键在于结构体的定义和查询方法排序方法,深刻理解了折半查找的关键,熟练运用了查询与排序。
四、代码清单
#include<stdio.h>
#include<string.h>
#define N 20
typedef struct
{
char num[10];//车次号
char startsa[10];// 始发站
char endsa[10];//终点站
char date[10];//
char startti[10];// 发车时间
char endti[10];//到达时间
char type[10];//
char price[10];//价格
}Fight;
typedef struct
{
Fight elem[N];
int length;
}Table;
void Printf(Table &F,int n)
{
int i;
printf("请输入数据");
for(i=1;i<=n;i++)
{
printf("第%d 个\n",i);
printf("车次号为:");
scanf("%s",&F.elem[i].num);
printf("始发站为: ");
scanf("%s",&F.elem[i].startsa);
printf("终点站为: ");
scanf("%s",&F.elem[i].endsa);
printf("日期为:");
scanf("%s",&F.elem[i].date);
printf("出发时间为:");
scanf("%s",&F.elem[i].startti);
printf("到达时间为:");
scanf("%s",&F.elem[i].endti);
printf("类型为:");
scanf("%s",&F.elem[i].type);
printf("价格为:");
scanf("%s",&F.elem[i].price);
}
}
void Save(Table &F,int n)// 将文件中的数据放入顺序表中
{
int i;
n=0;
FILE *fp;
if((fp=fopen("train.txt","rb"))==NULL)
{
printf("文件中没有数据,请输入信息 !\n");
}
while((fp=fopen("train.txt","rb"))!=NULL)
{
fscanf(fp,"%s%s%s%s%s%s%s%s",F.elem[i].num,F.elem[i].startsa,F.elem[i].endsa, F.elem[i].date,F.elem[i].startti,F.elem[i].endti,F.elem[i].type,F.elem[i].price);
n++;
}
F.length=n;
fclose(fp);
}
void Read(Table &F,int n) // 将数据保存在文件中
{
int i;
FILE *fp;
fp =fopen("train.txt","wb");
for(i=1;i<=n;i++)
{
fprintf(fp,"%s%s%s%s%s%s%s%s",F.elem[i].num,
F.elem[i].startsa,F.elem[i].endsa,F.elem[i].date,F.elem[i].startti,
F.elem[i].endti,F.elem[i].type,F.elem[i].price);
}
F.length=n;
fclose(fp);
}
void numsort(Table &F)// 车次号排序
{
//冒泡排序
int i,j;
for(i=1;i<=F.length;i++)
{
for(j=1;j<=F.length-i;j++)
{
if(strcmp(F.elem[j].num,F.elem[j+1].num)==1)
{
F.elem[0]=F.elem[j];
F.elem[j]=F.elem[j+1];
F.elem[j+1]=F.elem[0];
}
}
}
}
void numsearch(Table &F,char key[10])// 根据车次号查询
{
numsort(F);
//折半查找
int mid,low,high;
low=1; high=F.length;
while(low<=high)
{
mid=(low+high)/2;
if(strcmp(key,F.elem[mid].num)==0)
{
printf("%s %s %s %s %s %s %s %s\n",F.elem[mid].num,
F.elem[mid].startsa,F.elem[mid].endsa,F.elem[mid].date,F.elem[mid].startti, F.elem[mid].endti,F.elem[mid].type,F.elem[mid].price);
break;
}
else if(strcmp(key,F.elem[mid].num)==-1)
{
high=mid-1;
}
else
low=mid+1;
}
}
void startsasort(Table &F)// 根据始发站排序
{
//冒泡排序
int i,j;
for(i=1;i<=F.length;i++){
for(j=1;j<=F.length-i;j++)
{
if(strcmp(F.elem[j].startsa,F.elem[j+1].startsa)==1)
{
F.elem[0]=F.elem[j];
F.elem[j]=F.elem[j+1];
F.elem[j+1]=F.elem[0];
}
}
}
}
void startsasearch(Table &F,char key[10])// 始发站查找
{
startsasort(F);
//折半查找
int mid,low,high;
low=1; high=F.length;
while(low<=high)
{
mid=(low+high)/2;
if(strcmp(key,F.elem[mid].startsa)==0)
{
printf("%s %s %s %s %s %s %s %s\n",F.elem[mid].num,
F.elem[mid].startsa,F.elem[mid].endsa,F.elem[mid].date,
F.elem[mid].startti,F.elem[mid].endti,F.elem[mid].type,F.elem[mid].price);
break;
}
else if(strcmp(key,F.elem[mid].startsa)==-1)
{
high=mid-1;
}
else
low=mid+1;
}
}
void endsasort(Table &F)// 终点站排序
{
//冒泡排序
int i,j;
for(i=1;i<=F.length;i++)
{
for(j=1;j<=F.length-i;j++)
{
if(strcmp(F.elem[j].endsa,F.elem[j+1].endsa)==1)
{
F.elem[0]=F.elem[j];
F.elem[j]=F.elem[j+1];
F.elem[j+1]=F.elem[0];
}
}
}
}
void endsasearch(Table &F,char key[10])// 终点站查找
{
endsasort(F);
//折半查找
int mid,low,high;
low=1; high=F.length;
while(low<=high)
{
mid=(low+high)/2;
if(strcmp(key,F.elem[mid].endsa)==0)
{
printf("%s %s %s %s %s %s %s %s\n",F.elem[mid].num,F.elem[mid].startsa,
F.elem[mid].endsa,F.elem[mid].date,F.elem[mid].startti,F.elem[mid].endti,
F.elem[mid].type,F.elem[mid].price);
break;
}
else if(strcmp(key,F.elem[mid].endsa)==-1){
high=mid-1;
}
else
low=mid+1;
}
}
void starttisort(Table &F)// 发车时间排序
{
//冒泡排序
int i,j;
for(i=1;i<=F.length;i++)
{
for(j=1;j<=F.length-i;j++)
{
if(strcmp(F.elem[j].startti,F.elem[j+1].startti)==1)
{
F.elem[0]=F.elem[j];
F.elem[j]=F.elem[j+1];
F.elem[j+1]=F.elem[0];
}
}
}
}
void starttisearch(Table &F,char key[10])// 发车时间查询
{
starttisort(F);
//折半查找
int mid,low,high;
low=1; high=F.length;
while(low<=high)
{
mid=(low+high)/2;
if(strcmp(key,F.elem[mid].startti)==0)
{
printf("%s %s %s %s %s %s %s %s\n",F.elem[mid].num,F.elem[mid].startsa,
F.elem[mid].endsa,F.elem[mid].date,F.elem[mid].startti,F.elem[mid].endti,F.elem[mid].type ,F.elem[mid].price);
break;
}
else if(strcmp(key,F.elem[mid].startti)==-1){
high=mid-1;
}
else
low=mid+1;
}
}
void endtisort(Table &F)// 到达时间排序
{
//冒泡排序
int i,j;
for(i=1;i<=F.length;i++)
{
for(j=1;j<=F.length-i;j++)
{
if(strcmp(F.elem[j].endti,F.elem[j+1].endti)==1)
{
F.elem[0]=F.elem[j];
F.elem[j]=F.elem[j+1];
F.elem[j+1]=F.elem[0];
}
}
}
}
void endtisearch(Table &F,char key[10])// 到达时间查找
{
endtisort(F);
//折半查找
int mid,low,high;
low=1; high=F.length;
while(low<=high)
{
mid=(low+high)/2;
if(strcmp(key,F.elem[mid].endti)==0)
{
printf("%s %s %s %s %s %s %s %s\n",F.elem[mid].num,F.elem[mid].startsa,
F.elem[mid].endsa,F.elem[mid].date,F.elem[mid].startti,F.elem[mid].endti,F.elem[mid].type,
F.elem[mid].price);
break;
}
else if(strcmp(key,F.elem[mid].endti)==-1){
high=mid-1;
}
else
low=mid+1;
}
}
void Out(Table F)// 输出所有列车信息
{
int i;
printf("车次号\t 始发站\t 终点站\t 日期\t 出发时间\t 到达时间\t 类型\t 价格\n");
for(i=1;i<=F.length;i++)
{
printf("\n");
printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",F.elem[i].num,F.elem[i].startsa,
F.elem[i].endsa,F.elem[i].date,F.elem[i].startti,F.elem[i].endti,F.elem[i].type,F.elem[i].price);
}
}
void Paixu(Table F)
{
int x;
printf("1.车次号排序\n");
printf("2.始发站排序\n");
printf("3.终点站排序(冒泡排序)\n");
printf("4.发车时间排序\n");
printf("5.到达时间排序\n");
scanf("%d",&x);
switch(x)
{
case 1:numsort(F);Out(F);break;
case 2:startsasort(F);Out(F);break;
case 3:endsasort(F);Out(F);break;
case 4:starttisort(F);Out(F);break;
case 5:endtisort(F);Out(F);break;
}
}
void Search(Table F)
{
int x;
char n[10];
printf("1.车次号查询(折半查找)\n");
printf("2.起点站查询\n");
printf("3.到达站查询\n");
printf("4. 出发时间查询\n");
printf("5.到达时间查询\n");
scanf("%d",&x);
switch(x)
{
case 1:
printf("输入车次号: ");
scanf("%s",n);
numsearch(F,n);
break;
case 2:
printf("输入起点站: ");
scanf("%s",n);
startsasearch(F,n);
break;
case 3:
printf("输入到达站: ");
scanf("%s",n);
endsasearch(F,n);
break;
case 4:
printf("输入出发时间站: ");
scanf("%s",n);
starttisearch(F,n);
break;
case 5:
printf("输入到达时间站: ");
scanf("%s",n);
endtisearch(F,n);
break;
}
}
int main()
{
int n;
int way;
Table F;
Save(F,n);
printf("输入列车个数: ");
scanf("%d",&n);
Printf(F,n);
Read(F,n);
Out(F);
while(1)
{
printf("1.排序2.查询");
printf("\n 请选择");
scanf("%d",&way);
switch(way)
{
case 1:Paixu(F);break;
case 2:Search(F);break;
default:printf("请重新输入");
}
}
return 0;
}。