Jave 小说查找器 实验报告 中南大学.docx
- 文档编号:30702600
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:34
- 大小:419.26KB
Jave 小说查找器 实验报告 中南大学.docx
《Jave 小说查找器 实验报告 中南大学.docx》由会员分享,可在线阅读,更多相关《Jave 小说查找器 实验报告 中南大学.docx(34页珍藏版)》请在冰豆网上搜索。
Jave小说查找器实验报告中南大学
Java实验报告
专业班级:
指导老师:
姓名
学号:
1课题概述
1.1设计目的……………………………........3
1.2要求……………………………………....3
2需求分析
2.1系统目标与功能.......................................3
2.2开发环境...................................................3
3概要设计
3.1系统流程图………………………….…....4
3.2模块分析与设计………………………....4
4详细设计
4.1界面及监听设计.........................................5
4.2接口设计.....................................................8
4.3人物信息存储设计.....................................9
4.4读文件方法与三大功能具体设计.............9
5运行结果……………………………………...13
6小结…………………………………………...14
7附录
7.1源代码…………………………………..14
7.2参考文献..................................................32
1课题概述
1.1设计目的
掌握Java语言与系统设计的基本思路和方法。
利用所学的基本知识和技能,解决简单的Java语言与系统设计问题。
1.2要求
学习Java界面开发基础知识。
利用所学到的Java编程知识和编程技巧,设计一个实际的应用软件,初步认识软件设计的基本方法,提高进行工程设计的基本技能及分析、解决实际问题的能力,为后续课程和以后的工程实践打下良好的基础。
2需求分析
2.1系统目标与功能
自行下载自己最喜欢的小说1部。
存储为文本文档。
要求长篇小说,20万字以上。
任取其中10个人物,考虑他们的姓名、别名等等一系列因素。
(1)统计每个人在小说中出现的次数并排序。
(2)统计每个人在小说中出现的篇幅跨度(第一次出现距最后一次出现的篇幅)并排序。
(3)如果两人在相距较短的一段文字中出现,我们认为两人有关系,距离越短,关系越近。
自行设计统计标准,找出10个人中:
1)关系最紧密的两个人,关系最不紧密的两个人。
2)输入一个人名,列出该人和其他人关系的紧密程度排名。
看与实际是否符合?
如果不太符合,说明可能的原因。
2.2开发环境
JDK1.7
EclipseSDK
Version:
3.3.1.1
Buildid:
M20071023-1652
3概要设计
3.1系统流程图
3.2模块设计与分析
首先,由于决定选择可视化界面,所以功能入口必定是在主页面中某个控件的监听器。
如果直接将三个功能的具体实现都放到监听器里,显然是不科学的。
所以我加了一个相当于接口功能的类,在监听器中实例化后,根据选项不同调用该类中的方法。
那么将实现功能的代码段都放到这个类里吗?
如果这样做,那与直接写在监听器也没多大区别。
从代码重复利用的角度考虑,将三个功能分开放到三个类中,在接口类分别实例化,相对来说就会比之前两种方法科学得多。
这样便决定了应用软件的大体架构。
另外还有一个问题,人物有10个,属性也比较多,分开定义不太方便,也容易出问题,显然,再定义一个专门放置人物属性的类是必要的
具体如下:
Person类:
该类存放人物的属性,如姓名,第一次出现位置等。
Novel类:
该类显示主页面。
ClickListener类:
监听主页面的下拉选项,与选项文字比对后,调用Methods中相应的方法。
Methods类:
相当于接口,不同方法中,实例化不同模块,再调用模块中方法,实现不同功能的封装。
CountTimes类:
统计人物出现次数的模块。
CountLength类:
统计人物篇幅跨度的模块。
CountRelation类:
统计人物关系亲密度的模块。
image文件夹:
放置应用软件中用到的图片
file文件夹:
放置带读取的文本文档
4详细设计
4.1界面及监听设计
欢迎页面,停留1000ms。
(截图尺寸已缩小)代码如下:
publicvoidshow(){
JFramejF=newJFrame();
jF.setLocation(480,100);
//设置
ImageIconImage=newImageIcon("image/show.jpg");
JLabelblackground=newJLabel(Image);
jF.setSize(Image.getIconWidth(),Image.getIconHeight());
jF.setUndecorated(true);
blackground.setBounds(0,0,Image.getIconWidth(),Image.getIconHeight());
jF.getLayeredPane().add(blackground,newInteger(Integer.MIN_VALUE));
JPanelcontentPanel=(JPanel)jF.getContentPane();
contentPanel.setOpaque(false);
jF.setVisible(true);
try{
ThreadsThread=newThread();
sThread.sleep(1000);
}catch(Exceptione){}
jF.dispose();
UI();//调主界面的方法
}
主界面截图,选择某一选项后直接执行,无需确认。
主要代码如下:
publicvoidUI(){//主界面的部分代码
JFramejFrame=newJFrame();
jFrame.setTitle("小说读取器");
jFrame.setSize(460,350);
jFrame.setLocation(200,100);
jFrame.setDefaultCloseOperation(3);
//设置布局
jFrame.setLayout(newBorderLayout());
JPanelpanelUp=newJPanel();
//下拉框
JComboBoxselect=newJComboBox();
select.addItem("");
select.addItem("统计每个人在小说中出现的次数并排序");
select.addItem("统计每个人在小说中出现的篇幅跨度并排序");
select.addItem("输入一个人名,列出与其他人的亲密关系");
//面板属性
panelUp.add(select);
panelUp.setPreferredSize(newjava.awt.Dimension(30,400));
panelUp.setLayout(newFlowLayout(FlowLayout.LEADING,50,80));
panelUp.setOpaque(false);
//添加监听
ClickListenerclickListener=newClickListener(select);
select.addActionListener(clickListener);
//窗体
jFrame.add(panelUp);
jFrame.setVisible(true);
}
在监听器的构造函数先将人物基本属性初始化。
publicClickListener(JComboBoxselect){
this.select=select;
methods.initPerson();
}
initPerson()的部分内容如下:
publicvoidinitPerson(){
Personp_1=newPerson();
p_1.name="郑薇";
.......
}
监听的内容如下,比较字符串就可以:
publicvoidactionPerformed(ActionEvente){
Stringstr=(String)select.getSelectedItem();
if(str.equals("统计每个人在小说中出现的次数并排序")){
methods.first();
}
if(str.equals("统计每个人在小说中出现的篇幅跨度并排序")){methods.second();
}
if(str.equals("输入一个人名,列出与其他人的亲密关系")){
methods.forth();
}
}
4.2接口设计
该类中有五个方法:
publicvoidfirst();//实例化统计人数的类
publicvoidsecond();//实例化统计篇幅的类
publicvoidforth();//实例化统计亲密度的类
publicvoidUI();//分页面
publicvoidinitPerson();//初始化人物
此处不放方法具体代码了。
这里还有很重要的一个元素:
(截图)
这是用来存储人物信息的链表,在java.util包中,由于在计算亲密度的时候是需要遍历的,所以提前存下来。
将它定义在Methods类里,作为参数传到三个功能模块中,以及get回来。
4.3人物信息存储设计
publicclassPerson{
Stringname;//姓名
intcount=0;//次数
intdistence=0;//篇幅跨度
intrelationDis=0;//亲密度距离
}
//需要增加人物的话,直接实例化
4.4读文件与三大功能具体设计
首先是读文件的问题,定义如下的ArrayList,每读一行add到novel中。
这时小说已经是完整的了,直接toString(),整部小说便是一个字符串。
代码如下:
Filefile=newFile("file/致青春.TXT");
//读文件
FileInputStreamins=newFileInputStream(file);
BufferedReaderbr=newBufferedReader(newFileReader("file/致青春.TXT"));
Stringdata=br.readLine();//一次读入一行
while(data!
=null){
data=br.readLine();//接着读下一行
novel.add(data);
}
StringgetNovel=novel.toString();
intlength=getNovel.length();
System.out.println("小说总字数为"+length);
文件读好了,接下来分开实现所要求的功能就可以了。
统计人物出现次数:
这个功能最简单的实现就是直接在连续三个字相等时将计数器数值增加。
核心代码如下:
for(inti=0;i if(getNovel.charAt(i)=='郑'&&getNovel.charAt(i+1)=='薇'&&getNovel.charAt(i+2)=='小'|| getNovel.charAt(i)=='郑'&&getNovel.charAt(i+1)=='玉'|| getNovel.charAt(i)=='面'&&getNovel.charAt(i+1)=='小'&&getNovel.charAt(i+2)=='非'&&getNovel.charAt(i+1)=='龙'){ personList.get(0).count++; } //其他人物以此类推...... } System.out.println("郑薇出现"+personList.get(0).count+"次"); 统计人物篇幅跨度: 后面部分的代码改过了一下,比第一个科学一点点了。 思路的话我是用两个数组去存位置,因为每个人的下标是不同的。 核心想法应该是在找到第一个后去找最后的位置,并且跳出循环,换一个人继续,这个判断必须放在最前面。 代码如下: int[]findFirst=newint[20];//存放所有人物第一次出现的位置 int[]findLast=newint[20];//存放所有人物最后出现的位置 for(intk=0;k StringgetNovel=novel.toString(); intlength=getNovel.length(); StringperName=personList.get(k).name.toString(); for(inti=0;i if(findFirst[k]! =0){//如果找到第一个了,找最后的,并跳出 findLast[k]=getNovel.lastIndexOf(personList.get(k).name); break; } if(getNovel.charAt(i)==perName.charAt(0)&&getNovel.charAt(i+1)==perName.charAt (1)){ findFirst[k]=i; } } personList.get(k).distence=findLast[k]-findFirst[k]; System.out.println(+findLast[k]+""+findFirst[k]+personList.get(k).name+"出现的篇幅距离是"+personList.get(k).distence); } 计算人物亲密度: 该功能需要选择人物,设定在子页面文本框输入(如上图),点击选择按钮确认人物。 功能要求是计算与每个人的亲密度,我的做法是首先从文本框得到名字,然后第一层循环在存储人物的ArrayList中遍历,第二层循环寻找目标人物出现的位置,第三层循环寻找其他人物出现的位置,从而累加出所有长度,这个长度就可以作为亲密度,亲密度越小,关系越亲密。 虽然这种做法从复杂度上看不太科学,但可得部分正确结果。 代码如下: for(intk=0;k StringgetNovel=novel.toString(); intlength=getNovel.length(); StringcompareToName=personList.get(k).name.toString(); for(inti=0;i if(getNovel.charAt(i)==perName.charAt(0)&&getNovel.charAt(i+1)==perName.charAt (1)){ for(intj=0;j if(getNovel.charAt(j)==compareToName.charAt(0)&&getNovel.charAt(j+1)==compareToName.charAt (1)){ if(i>j){personList.get(k).relationDis==personList.get(k).relationDis+i-j;} elsepersonList.get(k).relationDis==personList.get(k).relationDis+j-i; break; } } } } System.out.println(personList.get(k).name+"与"+perName+"的距离值为"+personList.get(k).relationDis); } 5运行结果 几个频率高的任务: 郑薇是主角;林静是郑薇的恋人;陈孝正是郑薇的男朋友,好友;阮莞是郑薇的好朋友。 主角郑薇贯穿始终,林静出现也较早 6小结 经过这次Java的编程学到了很多以前在c语言和c++中没学到的东西。 指法有了很大的提高,对Java也有了更深一步的了解。 编程中我也遇到了很多难题。 例如我在程序中遇到了出现乱码的情况。 后来我通过翻阅书籍,和同学的讨论后,最后成功的运行了程序。 这次程序设计中还有很多的不完善的地方,希望郭老师予以指出和改正。 通过这次的程序设计,我明白了无论什么事都要去做才会发现问题,才有可能去解决问题。 对知识的学习,不能潜偿辄止,要深入去学习,去了解,这样才会有所收获。 有许多东西,许多事,不是想像中的那么容易,不去实践,永远也不会有提高,尤其是Java,它重在实践,光看书,了解书本上的知识是没用的。 所以日后在学习过程中,我会更加注视实践操作,使自己更好地学好计算机这门课程。 我们还了解到其实编一个所要求的程序也不像刚开始所想象中的那么难,那么复杂,只要我们肯用心用脑,肯去花功夫钻研就会一定会有收获,其实在课程设计中运用的很多知识在课堂上老师都已经很详细讲过,但我们就是缺少了那一份灵动,所以我学到了除了要有扎实的基本功外,有一点点的变通的灵泛性还是必要的。 总之为了课程设计能够顺利通过,我们查阅了很多资料,相信以后我们一定会在Java的学习中得到更多的知识和经验! 7附录 7.1源代码 Person类: packageNovel课设; importjava.util.ArrayList; importjava.util.List; publicclassPerson{ Stringname; intcount=0; intdistence=0; intrelationDis=0; } Novel类: packageNovel课设; importjava.awt.BorderLayout; importjava.awt.FlowLayout; importjavax.swing.ImageIcon; importjavax.swing.JComboBox; importjavax.swing.JFrame; importjavax.swing.JLabel; importjavax.swing.JPanel; publicclassNovel{ publicstaticvoidmain(String[]args){ Novelnovel=newNovel(); novel.show(); } publicvoidshow(){ JFramejF=newJFrame(); jF.setLocation(480,100); //设置图片 ImageIconImage=newImageIcon("image/show.jpg"); JLabelblackground=newJLabel(Image); jF.setSize(Image.getIconWidth(),Image.getIconHeight()); jF.setUndecorated(true); blackground.setBounds(0,0,Image.getIconWidth(),Image.getIconHeight()); jF.getLayeredPane().add(blackground,newInteger(Integer.MIN_VALUE)); JPanelcontentPanel=(JPanel)jF.getContentPane(); contentPanel.setOpaque(false); jF.setVisible(true); try{ ThreadsThread=newThread(); sThread.sleep(1000); }catch(Exceptione){} jF.dispose(); UI(); } publicvoidUI(){ JFramejFrame=newJFrame(); jFrame.setTitle("小说读取器"); jFrame.setSize(460,350); jFrame.setLocation(200,100); jFrame.setDefaultCloseOperation(3); jFrame.setLayout(newBorderLayout()); JPanelpanelUp=newJPanel(); ImageIconImage1=newImageIcon("image/icon.jpg"); jFrame.setIconImage(Image1.getImage()); ImageIconImage=newImageIcon("image/main.jpg"); JLabelblackground=newJLabel(Image); blackground.setBounds(0,0,Image.getIconWidth(),Image.getIconHeight()); jFrame.getLayeredPane().add(blackground,newInteger(Integer.MIN_VALUE)); JPanelcontentPanel=(JPanel)jFrame.getContentPane(); contentPanel.setOpaque(false); JComboBoxselect=newJComboBox(); select
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Jave 小说查找器 实验报告 中南大学 小说 查找 实验 报告 中南 大学
![提示](https://static.bdocx.com/images/bang_tan.gif)