数据结构课内大作业.docx
《数据结构课内大作业.docx》由会员分享,可在线阅读,更多相关《数据结构课内大作业.docx(13页珍藏版)》请在冰豆网上搜索。
数据结构课内大作业
数据结构课内大作业
《数据结构与算法》课程的课内大作业,可使学生深化理解书本知识,致力于用学过的理论知识和上机取得的实践经验,解决具体、复杂的实际问题,培养软件工作者所需的动手能力、独立解决问题的能力。
该课程设计侧重软件设计的综合训练,包括问题分析、总体结构设计、用户界面设计、程序设计基本技能和技巧、多人合作,以至一整套软件工作规范的训练和科学作风的培养。
一、课程大作业要求
学生必须仔细阅读《数据结构与算法分析》课内大作业设计方案,认真主动完成课程设计的要求。
有问题及时主动通过各种方式与教师联系沟通。
学生要发挥自主学习的能力,充分利用课外时间,安排好时间和计划,并在完成课程大作业过程中不断检测自己的计划完成情况。
课内大作业需要同学们在12月9日前完成,并提交相应的报告,对于完成确实有问题的同学,请及时和教师沟通。
二、数据结构课程课内大作业的具体内容
本次课内大作业完成如下模块(共4个题目,每个学生至少挑选1个题目完成,其中尾号为1,2的同学完成第1题,尾号为3,4的同学完成第2题,尾号为5,6的同学完成第3题,尾号为7,8的同学完成第4题,尾号为9,0的同学完成第5题,如果对于分配有任何意见,请email联系教师并说明情况)
(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)学生信息管理的数据检索
任务:
通过该程序实现如下功能
●建立学生信息管理的数据文件stud.dat;文件中至少包含15个学生的信息;每个学生至少包括:
学号、姓名、年龄等5项内容(另2项自定),当再次运行程序时从该文件中读取数据;
●可以添加(插入、追加)学生信息;
●可以修改某个学生的某项信息。
●为该数据信息建立一个索引:
每个学生信息记录在索引中有一个索引项,其包含该学生的学号、记录的位置(即记录在文件中的序号);索引文件采用平衡二叉(AVL)树。
程序应能根据输入的学号通过索引进行查找;并且,你所建立的索引需要保存到文件中,以便重复使用。
要求:
根据以上功能说明,设计学生信息建立程序,学生信息索引系统,设计程序完成功能;
(4)文章编辑
任务:
通过该程序实现如下功能:
功能:
输入一页文字,程序可以统计出文字、数字、空格的个数。
静态存储一页文章,每行最多不超过80个字符,共N行;
相关要求:
●分别统计出其中英文字母数和空格数及整篇文章总字数;
●统计某一字符串在文章中出现的次数,并输出该次数;
●删除某一子串,并将后面的字符前移。
●存储结构使用线性表,分别用几个子函数实现相应的功能;
输入数据的形式和范围:
可以输入大写、小写的英文字母、任何数字及标点符号。
输出形式:
●分行输出用户输入的各行字符;
●分4行输出"全部字母数"、"数字个数"、"空格个数"、"文章总字数"输出删除某一字符串后的文章;
要求:
根据以上功能说明和输入/输出要求,设计程序完成相关的文字编辑功能和相应的输入输出功能。
(5)校园导游程序
任务:
用无向网表示你所在学校的校园建筑平面图,图中顶点表示主要景点,存放景点的编号、名称、简介等信息,图中的边表示景点间的通路,存放路径长度等信息。
要求实现以下功能:
●查询各建筑的相关信息;
●查询图中任意两个建筑间的最短路径;
●查询图中任意两个建筑间的所有路径。
要求:
根据以上功能说明,设计校园建筑平面图的建立、查询,任意两个建筑间的最短路径查询等功能,并设计程序完成功能。
三、报告格式
1.问题描述:
包括目标、任务、条件和约束的描述。
2.设计:
⑴数据结构设计和核心算法设计描述;
⑵各个程序模块必须要有相应的注释;
⑶主要程序模块的输入、处理(算法框架描述)和输出描述;
⑷主要程序之间的调用与被调用关系等。
3.测试:
测试范例,测试结果,测试结果的分析与讨论,测试过程中遇到的主要问题及所采用的解决措施.
4.使用说明和报告小结:
⑴使用说明主要描述如何使用你的程序以及使用时的主要事项;
⑵在小结中说明程序的改进思想、经验和体会,并回答教师布置的讨论题。
5.各个函数功能说,运行示例的结果。
6.将以上各项文字材料及程序清单等装订成册,形成一个完整的实验报告。
附录:
关于文件操作
C语言的文件操作主要有三个步骤:
Ø打开文件
打开文件使用函数fopen(“文件名”,”方式”);
其中,”文件名”可以是字符串变量表示,它告诉系统要打开的文件的文件名,一般应为文件全名;“方式”为打开该文件欲进行什么操作,如“读”/r,或者“写”/w等。
该函数执行后返回所打开文件缓冲区指针。
所以,一般需要:
先定义一个文件类型的指针,如:
FILE*fp;
然后,fp=fopen(“D:
\mydata.dat”,”w”);
若打开不成功,则指针值为NULL。
Ø文件读写
读/写文件主要有如下几组函数:
●fprintf(fp,”格式描述串”,<输出列表>),写数据到文件
●fscanf(fp,”格式描述串”,<变量列表>),从文件读数据
●fwrite(”数据缓冲区地址”,”记录字节数”,”记录数”,fp),写记录数据到文件(二进制)
●fread(”数据缓冲区地址”,”记录字节数”,”记录数”,fp),从二进制文件中读数据
●fputc()和fgetc(),读/写数据为字符类型。
当把文件中的数据读到内存后,可以对其中的数据进行所需要的操作(如通过赋值语句等对先观数据进行修改等)。
这阶段看作是对文件数据进行实质性操作的阶段。
Ø关闭文件
关闭文件用函数:
close(fp);
其中,fp为你所要关闭的文件指针,当一个程序中对多个文件进行操作时,特别注意不要关闭不希望关闭的文件。
此外,数据存储到文件中时,数据的存储格式也有不同,即通常所说的“文本文件”和“二进制文件”。
Ø文件读写示例:
例一.将0-14这15个整数存入文件file.dat
#include
#definemax15
/*以文本方式存储15个整数*/
voidsave_dat()
{FILE*fp;
inti;
if((fp=fopen("d:
\\file.dat","w"))==NULL)
{printf("cannotopenfile\n");
/*打开D盘根目录下的文件file.dat,注意:
因为\是C的转义字符,所以需要再加一个\。
*/
return;
}
for(i=0;ifprintf(fp,"%d",i);
printf("Datahavebeensavedtoafile\n");
fclose(fp);
}
main()
{
save_dat();
}
当用记事本打开数据文件file.dat,可以看到0-14这15个数以字符(文本)格式存储在文件中,并且,这15个数据是紧挨着存储的。
当再用fscanf(“%d”,&i)从该文件中读取这些数据时、将不能正确读取、故需要注意数据存储格式。
可以修改fprintf()为:
for(i=0;ifprintf(fp,"%6d",i);
这样,每个整数占6位宽度,存储时各数据之间就留有空格,再用fscanf(“%d”,&i)读取时,每个空格将成为数据的分界符;但是,如果将fscanf(“%d”,&i)修改为
fscanf(“%d,”,&i)/*多一个逗号*/
那么,在读取数据时,将按格式描述串中约定的逗号作各个数据之间的分隔符,此时,需要将存储文件是的fprintf()对应地修改为:
for(i=0;ifprintf(fp,"%d,",i);
用该语句存储数据的结果(从记事本打开看),可以看到每个数据之间也存储了逗号(最后一个数据之后也有逗号)。
当然,这15个整数也可以以二进制格式存储到文件中,如下程序即是:
#include
#definemax15
/*用二进制方式存储0-14*/
voidsave_dat()
{FILE*fp;
inti;
if((fp=fopen("d:
\\file.dat","wb"))==NULL)
{printf("cannotopenfile\n");
return;
}
for(i=0;ifwrite(&i,sizeof(int),1,fp);
printf("Datahavebeensavedtoafile\n");
fclose(fp);
}
main()
{
save_dat();
}
运行该程序并用记事本打开文件file.dat,所看到的数据就不再是ASCII码格式,而是以整数的内码(二进制补码)存储的了。
因此,也只能采用对应的语句(fread)读取数据。
例二.存储记录(结构体)数据
以下程序是定义了学生信息结构体,然后输入4个学生信息、存入文件d:
\stud1.dat
#include
#definesize4
/*建立学生信息-结构体-数据文件*/
structstud_type
{charname[10];
intnum,age;
charaddr[15];
}stud[size];
voidsave_dat()
{FILE*fp;
inti;
if((fp=fopen("d:
\\stud1.dat","wb"))==NULL)
{printf("cannotopenfile\n");
return;
}
for(i=0;iif(fwrite(&stud[i],sizeof(structstud_type),1,fp)!
=1)
printf("filewriteerror!
\n");
printf("Datahavebeensavedtoafile\n");
fclose(fp);
}
main()
{inti;
printf("PleaseentertheStudentInformation:
\n");
for(i=0;iscanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr);
save_dat();
}
用记事本打开数据文件stud1.dat,看到学生信息中的姓名、地址这两个字符串数据是按SACII码存储的,但学号和年龄(数值)却是按内码存储的。
对应的读取该数据文件中数据的程序如下:
#include
#definesize4
/*从记录数据文件中读取学生信息数据*/
structstud_type
{charname[10];
intnum,age;
charaddr[15];
}stud[size];
main()
{inti;
FILE*fp;
fp=fopen("d:
\\stud1.dat","rb");
if(fp==NULL){printf("fileopenerror!
\n");return;}
for(i=0;i{fread(&stud[i],sizeof(structstud_type),1,fp);
printf("%-10s%4d%4d%-15s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
}
fclose(fp);
}
可以验证,存入的数据被正确地读取、显示。
当然,也可以将结构体(记录)采用文本格式存储到文件中,看入下程序:
#include
#definesize4
/*建立学生信息-结构体-数据文件,用文本格式存储*/
structstud_type
{charname[10];
intnum,age;
charaddr[15];
}stud[size];
voidsave_dat()
{FILE*fp;
inti;
if((fp=fopen("d:
\\stud3.dat","w"))==NULL)
{printf("cannotopenfile\n");
return;
}
for(i=0;ifprintf(fp,"%-10s%5d%3d%-15s",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
printf("Datahavebeensavedtoafile\n");
fclose(fp);
}
main()
{inti;
printf("PleaseentertheStudentInformation:
\n");
for(i=0;iscanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr);
save_dat();
}
用记事本打开文件stud3.dat,可以看到,记录(结构体)中的数值数据也以SACII码存储的(注意比较数据文件stud1.dat和stud3.dat在记事本中的显示区别)。
更多的知识和示例,可以参考C程序设计教程。
Ø其他相关知识
1)用户程序的文件读写,实际上是在文件缓冲区中进行,系统自动为文件的读写设置一个文件指针,每从文件中读、写一个数据单位(如文本文件则以字节为单位、如果是记录文件则以结构体大小为单位),指针自动移动一个数据单位。
所以,C还提供了函数rewind()、fseek()和ftell(),主要用来定位指针。
当用户程序对文件进行写操作时,数据并非立即写入磁盘文件,而是暂存于缓冲区中,当缓冲区满或执行关闭文件操作时,系统才将缓冲区中的数据写入文件。
这就说明程序在文件操作结束使用关闭文件语句关闭的重要性。
2)对于非流式文件(如文本文件、缓冲文件系统),如果要修改文件中某些数据(并写入文件),通常采用复制的方法(复制完成后再将原文件删除并将复制的文件改名),因为,这类文件是顺序文件。
3)部分目录操作函数参考
cddir(char*path)dir.h
改变当前目录(缺省目录)到path指定的路径。
Path参数为路径名的字符串(所以用指针类型)。
findfirst(char*filename,structffblk*fblk,intattrib)
在头文件dir.hdos.h
其中:
filename为文件全名(带路径)、可以使用通配符查找一类文件;structffblk为C定义的文件控制块的结构体,用户实参名为fblk,在打开文件时由系统自动建立该结构体并返回其位置(指针),用户可以访问其成员fblk.ff_name(所查到的文件名)等;attrib是告诉系统要查的文件的属性(如归档、只读、系统、目录等),C提供的参数常量有:
FA_RDONLY只读
FA_HIDDEN隐藏
FA_SYSTEM系统
FA_LABEL磁盘卷标
FA_DIREC目录
FA_ARCH归档
当查找成功返回0,否则返回-1等。
该函数在指定的路径下查找指定的文件,如果找到第一个则返回0,ffblk.ff_name返回文件名。
findnext(structffblk*fblk)dir.h
该函数与findfirst()配合使用,当要查找一类文件的下一个文件时使用这个函数继续查找。
mkdir(char*pathname)dir.h
创建pathname指定的(子)目录。
rmdir(char*pathname)dir.h
删除pathname指定的目录。