中南大学Java实验报告.docx
《中南大学Java实验报告.docx》由会员分享,可在线阅读,更多相关《中南大学Java实验报告.docx(13页珍藏版)》请在冰豆网上搜索。
中南大学Java实验报告
中南大学
JavaSE课程设计实验报告
设计题目:
对小说的人物关系文本分析
学院:
信息科学与工程学院
班级:
信息安全1201班
学号:
0909121615
姓名:
代巍
指导老师:
郭克华
一、实验目的
1、学习Java界面开发基础知识。
利用所学到的Java编程知识和编程技巧,设计一个实际的应用软件,初步认识软件设计的基本方法,提高进行工程设计的基本技能及分析、解决实际问题的能力,为后续课程和以后的工程实践打下良好的基础。
2、掌握JAVA语言常用类包及其常用方法和JAVA语言基本语法,掌握面向对象程序设计基本要素(封装、继承、多态),解决简单的Java语言与系统设计问题。
3、掌握基于AWT的图形用户界面设计
(1)常用标准控件的使用,如标签、按钮、菜单、文本框、单选按钮、滚动条等。
(2)事件处理机制
4、掌握布局、对话框的使用,掌握事件异常的处理方法
二、实验内容
自行下载自己最喜欢的小说1部。
存储为文本文档。
要求长篇小说,20万字以上。
任取其中10个人物,考虑他们的姓名、别名等等一系列因素。
(1)统计每个人在小说中出现的次数并排序。
(2)统计每个人在小说中出现的篇幅跨度(第一次出现距最后一次出现的篇幅)并排序。
(3)如果两人在相距较短的一段文字中出现,我们认为两人有关系,距离越短,关系越近。
自行设计统计标准,找出10个人中:
1)关系最紧密的两个人,关系最不紧密的两个人。
2)输入一个人名,列出该人和其他人关系的紧密程度排名。
看与实际是否符合?
如果不太符合,说明可能的原因。
三、实验思想
程序中用到了FileInputStream函数,实现了能够读取文本文件中的文字的功能,
程序中用到了setBackground等函数,形成了一个比较不错的windows的窗体外观,除此之外还用到了:
JFrame类中的JPanel,JLabel,Jbutton,…用了大量类库中的函数实现了很多功能。
程序灵活运用了数组的存储和比较功能,实现了将文本中的有效信息转换为字符串并进行比较计数等操作。
1、首先定义了一个读取字符流对象,用来读取文本文件文件中的文字;
2、定义集合类对象来存储读取的字符;
3、当遇到所需的时便存放在临时字符串中,遍历整个文本文件,记录传入名字出现的位置,存在数组。
4、将数组中的其加入集合统计次数,并构造分析函数,分析人物关系;
5、设计图形界面,添加按钮,面板等元素。
实现人物关系分析结果的输出。
四、程序代码及注释
importjava.io.*;//提供系统输入和输出。
importjava.sql.*;//建立连接
importjava.awt.*;//用于创建用户界面和绘制图形图像的所有类
importjava.awt.event.*;//用于操作事件的实现
importjavax.swing.*;
importjava.util.*;
publicclassMyFileextendsJFrameimplementsActionListener{
JLabeljl=newJLabel("文字分析人物关系统计",JLabel.CENTER);//设置标签
JLabelJLName=newJLabel("姓名:
");
JTextFieldJTName=newJTextField();
ButtonGroupBG=newButtonGroup();//设置按钮
JButtonJBSet=newJButton("查询");
JButtonJBNext=newJButton("重置");
JButtonJBExit=newJButton("退出");
JFrameframe=newJFrame();
JTextAreajtextarea=newJTextArea();
publicMyFile()
{
this.setTitle("查询界面");
this.setLayout(null);
jl.setForeground(Color.blue);//设置标签的前景颜色
jl.setBounds(50,30,200,100);//标签的大小,位置
this.add(jl);
JBSet.setBounds(50,200,90,20);
this.add(JBSet);
JBSet.addActionListener(this);
this.add(JBNext);
JBNext.addActionListener(this);
JBExit.setBounds(150,200,90,20);
this.add(JBExit);
JBExit.addActionListener(this);
this.setBounds(10,10,300,300);//设置窗口大小
this.setVisible(true);
jtextarea.setEditable(false);
jtextarea.setLineWrap(true);
frame.add(jtextarea);
frame.setSize(520,660);
frame.setResizable(false);
frame.setLocation(200,100);
frame.setVisible(false);
addWindowListener(newWindowAdapter()
{
publicvoidwindowClosing(WindowEvente)
{
System.exit(0);
}
});//通过内部类重写关闭窗体的方法
}
inttrs1(Strings){//传入一个人物的名字,返回一个数字
if(s.equals("刘备"))return0;
if(s.equals("张飞"))return1;
if(s.equals("关羽"))return2;
if(s.equals("赵云"))return3;
if(s.equals("曹操"))return4;
if(s.equals("孙权"))return5;
if(s.equals("周瑜"))return6;
if(s.equals("黄盖"))return7;
if(s.equals("黄忠"))return8;
if(s.equals("荀彧"))return9;
elsereturn-1;
}
//遍历整个文本文件,记录传入名字出现的位置,存在数组arry中
voidfun(Strings,Stringstr,chara,charb,charc,chard,intarry[][]){
inti,j=0;
try{for(i=0;iif(s.charAt(i)==a&&s.charAt(i+1)==b||s.charAt(i)==c&&s.charAt(i+1)==d){
j++;
arry[trs1(str)][j]=i;
}
}}catch(Exceptionex){}
arry[trs1(str)][0]=j;
}
//传入一个数字,返回该数字对应的人物名字
Stringtrs(inti){
Stringstr1="刘备";
Stringstr2="张飞";
Stringstr3="关羽";
Stringstr4="赵云";
Stringstr5="曹操";
Stringstr6="孙权";
Stringstr7="周瑜";
Stringstr8="黄盖";
Stringstr9="黄忠";
Stringstr10="荀彧";
if(i==0)returnstr1;
if(i==1)returnstr2;
if(i==2)returnstr3;
if(i==3)returnstr4;
if(i==4)returnstr5;
if(i==5)returnstr6;
if(i==6)returnstr7;
if(i==7)returnstr8;
if(i==8)returnstr9;
if(i==9)returnstr10;
elsereturnstr3;
}
//统计每两个人之间的关系,存入arry1数组中
voidrela(intarry[][],intarry1[][]){
inti;intk;
for(intp=0;p<10;p++)
for(intq=0;q<10;q++)
for(i=1;i<=arry[p][0];i++)
for(k=1;k<=arry[q][0];k++){
if(Math.abs((arry[p][i]-arry[q][k]))<=100){
arry1[p][q]++;
}
}
for(i=0;i<10;i++)arry1[i][i]=0;
}
voidcompare(intarry[][],intarry1[][]){
inta,b,i,k;
intl=0;
intc=0;
intm=0;
intn=0;
a=arry1[0][1];
b=arry1[0][1];
for(i=0;i<10;i++)
{
jtextarea.append(trs(i)+"出现的次数为"+arry[i][0]);
jtextarea.append("\n");
}
for(i=0;i<10;i++)
for(k=0;k<10;k++){
if(i==k)continue;
if(arry1[i][k]>=a)
{a=arry1[i][k];l=i;c=k;}
if(arry1[i][k]<=b)
{b=arry1[i][k];m=i;n=k;}
}
jtextarea.append("周瑜和孙权的关系为:
"+arry1[trs1("周瑜")][trs1("孙权")]);
jtextarea.append("\n");
jtextarea.append(trs(l)+"和"+trs(c)+"的关系最近");
jtextarea.append("\n");
jtextarea.append(trs(m)+"和"+trs(n)+"的关系最远");
jtextarea.append("\n");
}
publicvoidpianfu(intarry[][]){
inti;
try{Stringstr=JTName.getText();
i=arry[trs1(str)][arry[trs1(str)][0]]-arry[trs1(str)][1];
jtextarea.append(str+"出现的篇幅为(字节):
"+i);}catch(Exceptionex){}
}
voidshow(intarry1[][]){
inti;intj;intx;
intm=0;
Stringsname=JTName.getText();
x=arry1[trs1(sname)][0];
jtextarea.append("与"+sname+"关系由近到远的关系为:
");
for(i=0;i<9;i++){
for(j=0;j<10;j++){
if(j==trs1(sname))continue;
if(arry1[trs1(sname)][j]>=x){
x=arry1[trs1(sname)][j];m=j;
jtextarea.append("");
}
}
jtextarea.append(trs(m));
arry1[trs1(sname)][m]=-1;
x=0;
}
jtextarea.append("\n");
}
publicvoidactionPerformed(ActionEvente)
{
if(e.getSource()==JBExit)
{
setVisible(false);
}
if(e.getSource()==JBSet)
{
frame.setVisible(true);
frame.setTitle("结果统计");
jtextarea.append("统计表只有以下简单功能:
"+"\n");
jtextarea.append("1:
统计每个人在小说中出现的次数并排序"+"\n");
jtextarea.append("2:
统计每个人在小说中出现的篇幅跨度"+"\n");
jtextarea.append("3:
如果两个人在相距较短的一段文字中出现,则说明他们有关系,距离越近关系越密切。
统计标准自行设计。
"+"\n");
jtextarea.append("4:
找出关系最密切的两个人和关系最不密切的两个人。
"+"\n");
jtextarea.append("5:
输入一个人名,列出该人和其他人的关系紧密程度排名。
"+"\n");
jtextarea.append("\n");
jtextarea.append("\n");
jtextarea.append("\n");
inta;
intb;
int[][]arry=newint[10][10000];
int[][]arry1=newint[10][10];
try{Filefile=newFile("三国演义全集.txt");
FileInputStreamfis=newFileInputStream(file);
byte[]data=newbyte[(int)file.length()];
fis.read(data);
fis.close();
Stringmsg=newString(newString(data));
fun(msg,"刘备",'刘','备','玄','德',arry);
fun(msg,"张飞",'张','飞','翼','德',arry);
fun(msg,"关羽",'关','羽','云','长',arry);
fun(msg,"赵云",'赵','云','子','龙',arry);
fun(msg,"曹操",'曹','操','孟','德',arry);
fun(msg,"孙权",'孙','权','仲','谋',arry);
fun(msg,"周瑜",'周','瑜','公','瑾',arry);
fun(msg,"黄盖",'黄','盖','公','覆',arry);
fun(msg,"黄忠",'黄','忠','汉','升',arry);
fun(msg,"荀彧",'荀','彧','文','若',arry);}catch(Exceptionex){}
a=arry1[0][1];
b=arry1[0][1];
rela(arry,arry1);
compare(arry,arry1);
show(arry1);
pianfu(arry);
}
}
publicstaticvoidmain(String[]args)throwsException{
newMyFile();//实例化一个对象
}
}
五、实验结果
六、实验总结
此次实验让我重新复习了文件和文件输出流、字符流,以及集合类,把老师课堂上讲的理论与实践结合起来,通过实验找到了自己不足之处,对类的方法更有许多不理解,在以后的学习中一定要把知识整理好,综合起来,这样在运用的时候才能得心应手。
通过这门课程的学习,我了解到了java语言的强大功能,作为计算机专业的学生,我对编程很感兴趣,对于java语言,之前还是比较陌生。
通过这次设计,我发现了java语言独特的魅力,第一,代码可用性高,类可以随意调用,这使的编程序省了不少力,第二,代码的可读性好,只要会英语,代码基本能看懂。
第三,不限硬件,几乎兼容所有的计算机,因为它在java虚拟机上运行。
总的来说java是一种趋势,它掀起了一场跨平台的编程革命,还是很不错的。