钱晓雪090915JAVA设计报告.docx
《钱晓雪090915JAVA设计报告.docx》由会员分享,可在线阅读,更多相关《钱晓雪090915JAVA设计报告.docx(21页珍藏版)》请在冰点文库上搜索。
![钱晓雪090915JAVA设计报告.docx](https://file1.bingdoc.com/fileroot1/2023-5/24/0dc9de36-4847-4bd5-b8d0-e5f036eae8c9/0dc9de36-4847-4bd5-b8d0-e5f036eae8c91.gif)
钱晓雪090915JAVA设计报告
中南大学
java课程设计报告
学生姓名
钱晓雪
学号
0909120615
专业班级
物联网1201班
指导老师
郭克华
学院
信息科学与工程学院
完成时间
2013年12月
目录
一.✧系统描述…………………………………………………………-2-
二.✧功能模块结构……………………………………………………-3-
2.1划分功能模块………………………………………………………………….-3-
2.2各功能模块之间的结构图…………………………………………………….-3-
2.3各模块的功能描述…………………………………………………………….-3-
三.✧主要模块的算法说明……………………………………………-3-
四.✧运行结果…………………………………………………………-4-
4.1典型的界面…………………………………………………………………….-4-
4.2输入和输出数据……………………………………………………………….-5-
五.✧课程设计总结……………………………………………………-6-
5.1课程设计过程中遇到的问题………………………………………………….-6-
5.2解决问题的过程和体会……………………………………………………..-6-
5.3课程设计的体会和总结……………………………………………………….-7-
六.✧参考文献…………………………………………………………-8-
七.✧附录………………………………………………………………-9-
一.✧系统描述
1.设计内容:
自行下载自己最喜欢的小说1部。
存储为文本文档。
要求长篇小说,20万字以上。
任取其中10个人物,考虑他们的姓名、别名等等一系列因素。
(1)统计每个人在小说中出现的次数并排序。
(2)统计每个人在小说中出现的篇幅跨度(第一次出现距最后一次出现的篇幅)并排序。
(3)如果两人在相距较短的一段文字中出现,我们认为两人有关系,距离越短,关系越近。
自行设计统计标准,找出10个人中:
1)关系最紧密的两个人,关系最不紧密的两个人。
2)输入一个人名,列出该人和其他人关系的紧密程度排名。
看与实际是否符合?
如果不太符合,说明可能的原因。
2.课程设计的要求:
学习Java界面开发基础知识。
利用所学到的Java编程知识和编程技巧,设计一个实际的应用软件,初步认识软件设计的基本方法,提高进行工程设计的基本技能及分析、解决实际问题的能力,为后续课程和以后的工程实践打下良好的基础。
3.需求分析:
a.能统计每个人在小说中出现的次数并排序。
b.能统计每个人在小说中出现的篇幅跨度(第一次出现距最后一次出现的篇幅)并排序。
c.能输出10个人中关系最紧密的两个人,关系最不紧密的两个人。
d.能输出一个人和其他人关系的紧密程度排名
二.✧功能模块结构
2.1划分功能模块:
小说人物关系统计系统有:
按照人物出现次数排序,按照人物出现篇幅跨度排序以及一个人和其他人关系的紧密程度构成
2.2各功能模块之间的结构图:
2.3各模块的功能描述:
classRelations//这个类保存人物关系距离
classCharacter//小说人物类记录一些基本信息
classcompareCountimplementsComparator
//第一个排序接口按照出现次数排序
classcompareGapimplementsComparator
//第二个排序接口按照篇幅跨度排序
classcompareRelationimplementsComparator
//人物关系的排序接口,按照人物关系距离从小到大排序,距离越小关系越紧密
publicclassNovel
//小说类,主要保存小说文本内容,以及那10个人物,提供题目中要求的相关
功能
publicvoidcountCha()
//统计每个人物出现在小说中的位置记录下来,顺便计算篇幅跨度与次数
publicintcalRelationDistance
//计算两个人物之间的关系距离,计算方式为出现位置差的最小值
publicvoidprecompute()
//计算每对人物之间的距离,计算方法为出现位置差的最小值
publicvoidtestRealation()
//最后一个要求的功能,先计算人物关系距离,排序,然后输出关系最紧密和最
远的两个人物,然后从控制台读入人物名字,列出他和别人的关系距离排序
3.✧主要模块的算法说明
//读取小说中的十个人物名称,所选人物不存在别名的情况
publicvoidloadCharater(StringcharacterName)throwsException{
FileinputFile=newFile(characterName);
InputStreamReaderisr=newInputStreamReader(newFileInputStream(
inputFile),"UTF-8");
BufferedReaderbfr=newBufferedReader(isr);
StringcurLine=bfr.readLine();
intcount=0;
while(curLine!
=null&&curLine.length()>1){
characters.get(count).name=curLine;
cname.add(curLine);
count++;
curLine=bfr.readLine();
}
isr.close();
bfr.close();
}
//从文本中读取小说内容
publicvoidloadNovel(StringnovelName)throwsException{
FileinputFile=newFile(novelName);
InputStreamReaderisr=newInputStreamReader(newFileInputStream(
inputFile),"UTF-8");
BufferedReaderbfr=newBufferedReader(isr);
StringBufferbfBuffer=newStringBuffer();
StringcurLine=bfr.readLine();
while(curLine!
=null){
if(curLine.length()>1)
bfBuffer.append(curLine);
curLine=bfr.readLine();
}
isr.close();
bfr.close();
novelContent=bfBuffer.toString();
novelContent=novelContent.replace("","");
novelContent=novelContent.replace("\n","");
}
//统计每个人物出现在小说中的位置记录下来,顺便计算篇幅跨度与次数
publicvoidcountCha(){
intlen=characters.size();
for(inti=0;iStringcurName=characters.get(i).name;
intcurNameLen=curName.length();
intcurIndex=novelContent.indexOf(curName);
while(curIndex!
=-1){
characters.get(i).occurPlace.add(curIndex);
curIndex=novelContent.indexOf(curName,curIndex+curNameLen);
}
characters.get(i).occurCount=characters.get(i).occurPlace.size();
characters.get(i).gap=characters.get(i).occurPlace.lastElement()
-characters.get(i).occurPlace.firstElement();
}
//两个比较器,分别按照人物的出现次数和篇幅来进行排序
compareCountcmp1=newcompareCount();
compareGapcmp2=newcompareGap();
Collections.sort(characters,cmp1);
System.out.println("按照人物出现次数排序为:
");
System.out.println("人物名称\t出现次数");
for(inti=0;i<10;i++){
System.out.println(characters.get(i).name+"\t"
+characters.get(i).occurCount);
}
System.out.println("------------------------");
Collections.sort(characters,cmp2);
System.out.println("按照人物出现篇幅长度排序为:
");
System.out.println("人物名称\t篇幅长度");
for(inti=0;i<10;i++){
System.out.println(characters.get(i).name+"\t"
+characters.get(i).gap);
}
System.out.println("------------------------");
}
//计算两个人物之间的关系距离,计算方式为出现位置差的最小值
publicintcalRelationDistance(Characterc1,Characterc2){
Vectoro1=c1.occurPlace;
Vectoro2=c2.occurPlace;
intdistance=10000000;
intlen1=o1.size();
intlen2=o2.size();
for(inti=0;ifor(intj=0;jinttmp=Math.abs(o1.elementAt(i)-o2.elementAt(j));
if(tmpdistance=tmp;
}
}
returndistance;
}
//计算每对人物之间的距离,计算方法为出现位置差的最小值
publicvoidprecompute(){
for(inti=0;i<10;i++){
for(intj=i+1;j<10;j++){
Characterci=characters.get(i);
Charactercj=characters.get(j);
intdistance=calRelationDistance(ci,cj);
RelationstRelations=newRelations(ci.name,cj.name,distance);
relations.add(tRelations);
}
}
}
//输入一个名字,列出他和别人的关系和关系距离
publicvoidlistRelation(Stringname){
intlen=relations.size();
for(inti=0;iRelationscr=relations.get(i);
if(name.equals(cr.c1)){
System.out.printf("%s\t%s\t%d\n",cr.c1,cr.c2,cr.relationDistance);
}elseif(name.equals(cr.c2)){
System.out.printf("%s\t%s\t%d\n",cr.c2,cr.c1,cr.relationDistance);
}
}
}
//最后一个要求的功能,先计算人物关系距离,排序,然后输出关系最紧密和最远的两个人物,然后从控制台读入人物名字,列出他和别人的关系距离排序
publicvoidtestRealation(){
precompute();
compareRelationcmp=newcompareRelation();
Collections.sort(relations,cmp);
System.out.println("关系最紧密的一对人物为:
");
System.out.println("人物1\t人物2\t距离");
System.out.printf("%s\t%s\t%d\n",relations.get(0).c1,relations.get(0).c2,relations.get(0).relationDistance);
System.out.println("------------------------");
System.out.println("关系最不紧密的一对人物为:
");
System.out.println("人物1\t人物2\t距离");
intlen=relations.size();
len--;
System.out.printf("%s\t%s\t%d\n",relations.get(len).c1,relations.get(len).c2,relations.get(len).relationDistance);
System.out.println("------------------------");
while(true){
System.out.println("请输入十个人物中的一个,或者输入字母q退出程序");
byte[]bin=newbyte[1024];
intn=0;
try{
n=System.in.read(bin);
}catch(Exceptione){
System.out.println(e.toString());
}
Stringcurname=newString(bin,0,n-2);
if(curname.equals("q"))
break;
if(cname.indexOf(curname)==-1){
System.out.println("输入的名字不在十个人物列表中!
");
}else{
System.out.println("输入人物与其他人物的紧密度排序为");
System.out.println("人物1\t人物2\t距离");
listRelation(curname);
}
System.out.println("------------------------");
}
}
四.✧运行结果
4.1典型的界面
4.2输入和输出数据
五.✧课程设计总结
5.1课程设计过程中遇到的问题
JAVA课程设计有别于大学考试的类型,要求我们创新自己的新程序,从已有的教材模板中推陈出新,总结教材上的例题和基本结构,发散思维来设计命题程序,对我们提出了很高的要求,是我们不仅要把课本读透,还要求我们有所创造,这是一个很大的挑战。
5.2解决问题的过程和体会
当毫无头绪时,一个人的力量是微薄的,所以这就要求我们和同学一起讨论,一起研究,在激烈的争论中有所收获,也提高了我们思维的缜密度和拓展了思想的深度及广度。
扬长避短,通过讨论和对书本的进一步深究理解,以及上网查询有关注意事项并上机调试,是我们加深了对程序设计的理解与探寻,使我们在设计的过程中加强了编程逻辑,深喑耐心细致十分重要,更懂得了编程不能求快,急于求成,只能稳扎稳打,步步推进。
而我们从中所收获的,不仅如此,更为以后我们的编程学习和工作获得了一些初级经验,我明天积累下重要财富。
虽然通过自己的努力,解决了很多从前没有遇到的问题,但依旧有无数的难题摆在我面前,重重叠叠的大山阻碍着我前进的道路。
山高人为峰,我一定不会惧怕摆在前面的困难,不断努力奋斗,争取看到更多的阳光。
这次的课程设计,让我受益匪浅。
不仅为自己揭开了JAVA程序神秘的面纱,而且在实际的程序编写与调试过程中,成长了不少,实战的能力提高了很多,也让我明白了自己还有很大的提高空间。
虽然以后不再学习程序设计这门课了,但这次课程设计确实激发了我编程的兴趣,我以后一定还会努力钻研,争取往更深更透的方向发展。
万丈高楼平地起,能够编写复杂的程序都是在编写过简单的程序的基础上演变过来的能力。
目前的程序漏洞确实还是很多,但编成之后的成就感还是会油然而生,成为我向程序设计之路成功迈出的第一步,同时,对于我的JAVA的应用水平也有很大的提高,用起来会更加娴熟、得心应手。
从易到难这是一个准则,总之,这次的研究会对增长程序阅读能力、程序编写能力等起到了意想不到的作用。
在以后漫漫的研究学习道路上,我还有很远的路要走,迎接我的是又一个严峻的挑战!
5.3课程设计的体会和总结
此次JAVA课程设计,在指导教师的精心教导下,我们学会了如何用JAVA编写一个简单的应用程序。
首先要对程序的设计要求有一个比较明确的认识,然后系统分析与系统设计,最后是代码设计与调试。
程序实现上,设计了简单的查询界面,将各个功能集中出来按照程序编写原则,便于查询。
根据JAVA课程所学的概念、理论和方法,按照JAVA程序设计的基本步骤,设计出一个适当规模的程序;进一步加深对JAVA语言的理解和掌握。
理论联系实际,加深和巩固所学的理论知识,提高实践能力和计算机的综合运用能力。
我们编写程序的过程是辛苦与快乐的,程序的编写原则很重要,只要我们在编程,就必须不断改进,才能更好提高编程能力。
《JAVA语言程序设计》是目前大多数普通高等学校都开设的一门计算机基础课。
对于我这样的初学者来说特别难于接受,也容易出现一些问题,使我在学习过程中有快要放弃的感觉,但我一直相信自己可以努力克服荆棘。
我努力锻炼编程的感觉,深究具体的技术点,而这确实让我有所收获,那么作为新生努力提升自己的能力是任重而道远的。
但不管如何,我们都应该从编程中有所收获,有所进步,努力的提升自己,不要轻易放弃。
六.✧参考文献
1.JAVA语言程序设计郭克华清华大学出版社
七.✧附录
源代码
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
importjava.util.ArrayList;
importjava.util.Collections;
importjava.util.Comparator;
importjava.util.Vector;
//这个类保存人物关系距离,暂时先这么写,不是很科学。
。
反正10个人,怎么写也不会太慢
//关系紧密程度上,我默认所有人物都是有关系的,题目有些矛盾,如果按照一个阈值去定义有关系和没关系,那没关系的人其实是关系最不紧密的人。
。
那么就无法度量哪个最不相关了
//所以。
。
这里所有人的关系距离都要计算和保存
classRelations{
Stringc1;//第一个人物名字
Stringc2;//第二个人物名字
intrelationDistance;//人物关系的距离,计算方式为出现位置差的最小值
publicRelations(String_c1,String_c2,int_relationDistance){
c1=_c1;
c2=_c2;
relationDistance=_relationDistance;
}
}
//小说人物类记录一些基本信息
classCharacter{
Stringname;//人物名称
VectoroccurPlace;//出现在小说中的位置
intgap;//篇幅跨度
intoccurCount;//出现次数
publicCharacter(){
name=null;
occurPlace=newVector();
gap=-1;
occurCount=0;
}
}
//第一个排序接口