数据结构课程设计大作业.docx
- 文档编号:6013050
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:21
- 大小:46.84KB
数据结构课程设计大作业.docx
《数据结构课程设计大作业.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计大作业.docx(21页珍藏版)》请在冰豆网上搜索。
数据结构课程设计大作业
课程设计
(数据结构)
一、题目的目的和要求
1.设计目的
巩固和加深对数据结构的理解,通过上机实验、调试程序,加深对课本知识的理解,最终使学生能够熟练应用数据结构的知识写程序。
(1)通过本课程的学习,能熟练掌握几种基本数据结构的基本操作。
(2)能针对给定题目,选择相应的数据结构,分析并设计算法,进而给出问题的正确求解过程并编写代码实现。
2.设计题目要求
设计内容:
本系统应完成以下几方面的功能:
学生信息的建立:
create();
学生信息的插入:
insert();
学生信息的查询:
search();
学生信息的修改:
change();
学生信息的删除:
delete();
学生信息的输出:
print()。
设计要求:
(1)每条记录至少包含:
姓名(name)、(xuehao),(kemu),(chengji)属性。
(2)作为一个完整的系统,应具有友好的界面和较强的容错能力
(3)程序能正常运行,并写出课程设计报告
二、设计进度及完成情况
日期
内容
12.10-12.15
查阅有关文献资料,完成资料搜集和系统分析工作。
12.16-12.22
创建相关数据结构,编写代码。
12.23-12.25
调试程序,初步完成课程设计报告。
12.26-12.28
上交课程设计报告并进行课程设计答辩,要求每个同学针对自己的设计回答指导教师2-3个问题。
三、主要参考文献及资料
[1]叶核亚编著.数据结构(Java版)(第3版).北京:
电子工业出版社,2011
[2]施平安等译.JAVA程序设计教程(第5版).北京:
清华大学出版社,2007
[3]Java相关资料
四、成绩评定
设计成绩:
(教师填写)
指导老师:
(签字)
目录
第一章系统概述1
第二章系统分析1
第三章系统设计2
第四章系统实现9
第五章系统运行与测试9
第六章总结与心得12
参考文献13
第一章系统概述
在这次的课程设计中我们选择的题目是:
学生信息系统,能够添加、删除、查询联系人等。
由于自己的知识有限,程序可能不是太完美,但是我会认真对待,尽自己最大女里去完成此次任务!
!
!
第二章系统分析
学生信息系统主要用于帮助用户保存学生信息,方便用户查询联系人的相关信息。
同时应该具备添加、修改、删除等基本功能。
1.每个学生有哪些基本属性?
我定义了4个:
(name,xuehao,kemu,chengji)
2.学生信息的建立
在学生信息的建立阶段,要求能一次创建多条记录。
3.学生信息的插入
用户选择插入记录时系统需判断该记录是否已存在,如果存在则不能插入。
在此为了简化实现,约定通讯录中的name不能重复、xuehao不能重复。
4.学生信息的查询
要求用户能够根据name,xuehao进行查询,不论成功与否都应该有相应反馈信息。
为了简化实现,只做精确查询。
5.学生信息的修改
允许用户修改某一通讯记录,修改成功与否要有相应提示。
6.学生信息的删除
用户查找到某个记录时允许删除该记录。
没有找到则提示用户。
7.学生信息的输出
要求用户以xuehao顺序为序显示学生信息中的所有记录。
如果系统中无记录则应该提示用户。
第三章系统设计
学生信息系统的设计采用自顶向下的设计方法,它是一种逐步求精的设计程序的方法和过程,即对要完成的任务进行分解,先对最高层次中的问题进行定义、设计,然后把其中未解决的问题作为一个子任务放到下层中去求解,这样逐层、逐个进行定义、设计,直到所有层上的问题解决为止。
因此,为了实现完整的学生信息系统功能,首先设计学生信息系统的各个功能模块。
1.通讯录系统的整体设计
通讯录系统主要包括通讯录的建立、插入、查询、修改、删除、输出、退出系统等功能,功能模块图如下所示:
(1)功能菜单设计
为了方便用户在使用系统时进行功能选择,可以设计成如下菜单的形式提示用户选择要执行的操作。
1-学生信息的建立
2-学生信息的插入
3-学生信息的查询
4学生信息的修改
5-学生信息的删除
6-学生信息的输出
0-退出系统
请选择操作序号(0-6):
在此可以设计一个menu_select()方法供用户选择某一菜单项。
该方法设计如下:
privatestaticintmenu_select()//选择菜单序号
{
System.out.println("===============");
System.out.println("1-学生信息的建立");
System.out.println("2-学生信息的插入");
System.out.println("3-学生信息的查询");
System.out.println("4-学生信息的修改");
System.out.println("5-学生信息的删除");
System.out.println("6-学生信息的输出");
System.out.println("0-退出系统");
System.out.println("===============");
System.out.println("请选择操作序号(0-6):
");
Scannerscanner=newScanner(System.in);
inti=scanner.nextInt();
while(i<0||i>6){
System.out.println("必须输入0-6之间的数据,请重新输入");
i=scanner.nextInt();
}
returni;
}
该方法要求用户输入0到6之间的某个序号,对应选择某个菜单项,如果输入其它的数,将提示再次输入合法序号。
(2)菜单选择需能够循环执行
用户进入系统后,可能需要反复不断地调用系统的各个功能,因此需要实现菜单选择的循环执行,可以通过循环语句控制反复调用各个菜单项。
while(true)
switch(menu_select()){
case1:
{
System.out.println("开始建立学生信息......");
//调用相关操作实现通讯录的建立
System.out.println("学生信息创建完毕!
");
break;
}
case2:
{
System.out.println("学生信息的插入:
");
//调用相关操作实现通讯录的插入
break;
}
case3:
{
System.out.println("学生信息的查询:
");
//调用相关操作实现通讯录的查询
break;
}
case4:
{
System.out.println("学生信息的修改:
");
//调用相关操作实现通讯录的修改
break;
}
case5:
{
System.out.println("学生信息的删除:
");
//调用相关操作实现通讯录的删除
break;
}
case6:
{
System.out.println("学生信息的输出:
");
//调用相关操作实现通讯录的输出
break;
}
case0:
{
System.out.println("再见!
");
return;
}
}
在这里通过switch语句判断用户的菜单选项,根据相应选择实现学生信息的某个功能,只要不退出系统,可以借助while语句继续选择执行某个功能。
2.通讯录系统的各个功能设计
在通讯录系统的整体设计中我们仅仅列出了系统需要实现的功能,并没有给出具体设计,现针对其各个功能进行设计。
(1)学生信息的建立(create()方法的设计)
建立通讯录时允许逐个录入多条通讯录记录,录完一个,有相应提示询问是否继续录入。
publicvoidcreate()
{
Stringflag="y";
while(flag.equalsIgnoreCase("y")){
//在此调用insert()操作录入一条记录
System.out.println("继续输入吗?
(y/n):
");
Scannersc=newScanner(System.in);
flag=sc.next();
}
}
如何录入一条记录需要调用学生信息的插入insert()操作来完成的(insert()如何设计参看后续代码)。
(2)学生信息的插入(insert()方法的设计)
向通讯录中插入一条记录的设计如下:
首先读入一条记录的信息(包括姓名和电话号码);接下来判断记录是否已经存在(在这里要求name和xuehao都不能重复),若存在,则提示插入失败!
若不存在,则调用有序顺序表list的插入操作(至于如何设计参见后续内容)插入一条记录。
publicvoidinsert()//插入一条记录
{
Stringname,xuehao,kemu,chengji;
GuanLiXinXitbe1,tbe2;
Scannersc=newScanner(System.in);
System.out.println("请输入一条记录,name,xuehao,kemu,chengji:
");
name=sc.next();
xuehao=sc.next();
kemu=sc.next();
chengji=sc.next();
for(inti=0;i tbe1=list.get(i); if(tbe1.getName().equals(name)||tbe1.getXuehao().equals(xuehao)){ System.out.println("该记录已存在,插入失败! "); return; } } tbe2=newGuanLiXinXi(name,xuehao,kemu,chengji); list.insert(tbe2); System.out.println("插入成功! 学生信息如下: "); this.print(); }(3)学生信息的查询(search()方法的设计) 在通讯录中查找一条记录的设计如下: 根据用户的需要,我们允许用户既可以依据name查询,又可以根据xuehao查询。 查询到该记录则输出该记录并返回记录在有序顺序表list中的位置,否则返回-1。 publicintsearch()//查询一条记录 { Stringstr; GuanLiXinXitbe; System.out.println("############"); System.out.println("1-按name查询"); System.out.println("2-按xuehao查询: "); System.out.println("############"); System.out.println("请选择(1或2): "); Scannersc=newScanner(System.in); intj=sc.nextInt(); while(j<1||j>2){ System.out.println("选择的序号不正确,请再次选择(1或2): "); j=sc.nextInt(); } if(j==1){ System.out.println("请输入name: "); str=sc.next(); for(inti=0;i tbe=list.get(i); if(tbe.getName().equals(str)){ System.out.println("name"+"\t\t"+"xuehao"+"\t\t"+"kemu"+"\t\t"+"chengji"); System.out.println("-----------------------------------------------------"); System.out.println(tbe.toString()); System.out.println("-----------------------------------------------------"); returni; } } } else{ System.out.println("请输入xuehao: "); str=sc.next(); for(inti=0;i tbe=list.get(i); if(tbe.getXuehao().equals(str)){ System.out.println(tbe.toString()); returni; } } } return-1; }(4)学生信息的修改(change()方法的设计) 修改学生信息记录的设计是: 首先调用search()操作查询,如果没有查询到则不用修改,否则开始修改,修改记录时要避免出现name或xuehao重复的情况。 publicvoidchange()//修改一条记录 { intk=this.search(); if(k==-1) System.out.println("要修改的记录不存在! "); else{ Stringname,xuehao,kemu,chengji; GuanLiXinXitbe1,tbe2; Scannersc=newScanner(System.in); System.out.println("请输入新的name和xuehao....: "); name=sc.next(); xuehao=sc.next(); kemu=sc.next(); chengji=sc.next(); for(inti=0;i tbe1=list.get(i); if(tbe1.getName().equals(name)||tbe1.getXuehao().equals(xuehao)){ System.out.println("该记录已经存在,修改失败! "); return; } } tbe2=newGuanLiXinXi(name,xuehao,kemu,chengji); list.set(k,tbe2); System.out.println("修改成功! "); this.print(); } }(5)通讯录的删除(delete()方法的设计) 删除通讯录记录的设计是: 首先调用search()操作查询,如果没有查询到则不用删除,否则调用有序顺序表list的删除操作(至于如何设计参见后续内容)删除一条记录。 publicvoiddelete()//删除一条记录 { inti=this.search(); if(i==-1) System.out.println("要删除的记录不存在! "); else{ list.remove(i); System.out.println("删除成功! "); this.print(); } } (6)通讯录的输出(print()方法的设计) 通讯录的输出通过循环输出有序顺序表中的所有元素即可。 publicvoidprint()//输出通信录所有记录 { System.out.println("姓名"+"\t\t"+"电话号码"); System.out.println("---------------------------"); if(list.length()==0) System.out.println("通讯录为空! "); else for(inti=0;i System.out.println(list.get(i).toString()); System.out.println("---------------------------"); } } 3.有序顺序表list的设计(双链表中间不太会写,所以用了顺序表,希望老师理解) 从上述学生信息的各个功能模块的设计来看,我们需要借助一个数据结构来完成所有学生信息记录的存储,在此选择简单、快捷的有序顺序表来完成设计。 有序顺序表,顾名思义,要求该顺序表中的所有元素按照元素值大小有序。 这就要求向顺序表中插入元素或修改元素值时注意保持顺序表元素值的有序性,因此问题的关键是顺序表的插入操作和修改操作设计,现给出这两种操作的设计,其他操作跟普通顺序表一致,不再赘述。 (1)有序顺序表的插入(insert()方法的设计) 有序顺序表的插入元素之前需要判断容器(element数组)是否满,如果满则先扩充容量。 插入元素x时需从顺序表的尾部开始跟已有元素进行比较,边比较边后移元素,最后找到插入的位置,把元素x放置进来即可。 publicvoidinsert(Tx)//顺序表的插入操作,插入之后需要有序。 { if(x==null) return; if(this.len==element.length)//如果顺序表满,进行容量扩充。 { Object[]temp=this.element; this.element=newObject[temp.length*2]; for(intj=0;j this.element[j]=temp[j]; } intj; for(j=this.len-1;j>=0&&pareTo(this.element[j])<0;j--) this.element[j+1]=this.element[j]; this.element[j+1]=x; this.len++; } (2)有序顺序表的置值(set()方法的设计) 有序顺序表的置值操作设计是: 首先对i号位置的元素值进行修改,然后借助直接插入排序算法把顺序表中的元素重新排成升序。 publicvoidset(inti,Tx)//顺序表的置值操作,置值之后需要排序。 { if(i>=0&&i this.element[i]=x; for(intk=1;k { intj; Ttemp=(T)this.element[k]; for(j=k-1;j>=0&&pareTo(this.element[j])<0;j--) this.element[j+1]=this.element[j]; this.element[j+1]=temp; } } (3)学生成绩的平均数 publicvoidavg(){ System.out.println("avg="); } (4)把学生的成绩分为5个等级 即是: A,B,C,D,E 利用publicvoiddengji(){ /*switch(){ case1: System.out.println("A"); break; case2: System.out.println("B"); break; case3: System.out.println("C"); break; case4: System.out.println("D"); break; case5: System.out.println("E"); break; default: break; }*/ } 4.学生信息录的设计 本系统要求每条学生信息记录都有name,xuehao,kemu,chengji4个属性,因此提取所有学生信息记录的共性,设计成学生信息记录类GuanLiXinXi该类有name和xuehao,kemu,chengji4个成员变量;另外GuanLiXinXi类实例化出的学生信息记录作为有序顺序表中的元素需要比较大小,因此该类要实现Comparable接口,GuanLiXinXi类的设计如下: publicclassGuanLiXinXiimplementsjava.lang.Comparable privateStringname; privateStringxuehao; privateStringkemu; privateStringchengji; publicintcompareTo(GuanLiXinXit)//比较两个对象大小,实现Comparable接口 { returnpareTo(t.xuehao);//指定排序的自然次序,以及比较两对象相等的规则 }设计略 } 5,学生信息的输出到一个文件(此方法我不太会结合使用,仅是写出了一个框架), 利用转换流inputStreamReader把字节流转换为字符流 publicvoidinputStreamReaderTest(Stringfile){ InputStreamReaderisr=null; FileReaderfr=null; FileWriterfw=null; BufferedReaderbr=null,br2=null; BufferedWriterbw=null; Strings=null; //1.建立一个输入流,数据源来自键盘 isr=newInputStreamReader(System.in);//键盘in是一个字节流
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 作业