java课程设计报告学生考勤系统的设计和实现Word文档格式.docx
《java课程设计报告学生考勤系统的设计和实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《java课程设计报告学生考勤系统的设计和实现Word文档格式.docx(9页珍藏版)》请在冰豆网上搜索。
在整个过程中我熟悉了文件输入输出,类的使用,接口实现等技术,并成功的应用。
总之这次课程设计让我受益颇丰。
关键词:
课程设计;
功能;
系统;
函数;
图形界面;
一、前言
本次课程设计我选的是学生考勤系统的设计和实现。
刚开始看到这个题我大意的认为这个题很简单,用一些文件操作就可以完成。
但动笔写后才发现也不是那么简单。
使得我只能小心翼翼的去写去学。
总之在这次课程设计中,与其说我是在写这个系统不如说我是在学着写这个系统。
二、设计分析
我拿到的这个课题从名称上就可以看出来是一个统计出勤次数的系统,它的要求如下:
具有如下功能:
1、根据教师提供的excel考勤文件夹,统计学生出勤次数,缺勤次数,出勤分数(设考勤次数为N次,满勤为100分,缺勤1次扣总分的1/N),并按分数排序。
2、统计结果在屏幕上显示出来,并保存到文本文件.txt之中。
经过分析我知道这个系统其实就是要我们将提供给我们的数据文件,通过遍历搜索匹配来统计出各位同学的总共出勤次数并换算成出勤分数,具体显示出选手的姓名、出勤次数、缺勤次数、出勤分数。
而我在整个系统的制作过程中要做的和能得到的就是熟练地使用文件输入输出、学会读取数据的技巧,并用严密的思维保证统计的成功。
三、实现方法
这个系统我采用了java语言,用MyEclipse完成。
我设计了以下类:
StudentAttendStatistics//继承JFrame并实现相关功能
Student//存储每位同学的信息
MyCompare//实现了Arrays中的java.util.Comparator接口
在StudentAttendStatistics中,主要实现的功能有对点名文件的读取、统计数据、对数据进行处理得到分数、然后按照分数排序、最后显示统计后的结果并将结果保存到txt文件中。
首先对于数据的处理,对于一个信息的多元素问题我采用类数组存储来解决。
并给该数组开了1000个空间。
在数据的读入时,我遇到了一定的困难,看到点名文件里正常数据每一行都是三个部分,于是我采用分割一行一行的数据,并分辨该行信息是否具有完整的三部分来判断该信息是否为有效信息,并将有效数据的学生姓名赋值给name,这样就完成了数据的读入。
然后是保存信息为文件,指定保存的文件格式为txt格式,在读取数据的文件夹和保存统计结果的文件夹采用的JFileChooser类的相关功能。
随后是对分数的排序,排序时选用的Arrays.sort(),并实现了java.util.Compa
rator接口。
在设计系统的时候,首先在选择界面时,我简单的使用了JFrame框架构建了一个简单的界面。
在界面里简单的设计了几个标签和几个按钮,并注册监听器对按钮需要实现的功能进行设计。
我还导入了java.awt.Color类,对显示面板的背景颜色以及字体颜色进行设计,是界面更加美观。
四、调试问题,调试记录及解决
1取出的数据有误,采用了判断消息是否有效的方式解决。
2JTextArea与JScrollPane结合后bounds的设置,发现只要设置JScrollPane即可。
3JFileChooser对象只能选择文件,通过网络上搜索知道了可以设置JFileChooser.FILES_AND_DIRECTORIES就可以实现同时可以选定文件夹和文件。
五、系统的使用说明书
1.功能
该系统是针对老师提供的考勤文件存放的文件夹来进行统计。
1)根据教师提供的excel考勤文件夹,统计学生出勤次数,缺勤次数,出勤分数(设考勤次数为N次,满勤为100分,缺勤1次扣总分的1/N),并按分数排序。
2)统计结果在屏幕上显示出来,并保存到文本文件.txt之中。
2.使用方法:
1.启动系统
2.点第一个浏览选定考勤情况文件的文件夹.
3.点第二个浏览得到考勤情况统计文件存储路径,文件名可以写.txt后缀不写的话会自动添加。
4.选择过后,点统计就会在文本区域中显示结果并在制定文件路径产生结果文件。
5.可以重新统计或者点退出退出系统。
六、结论
完成了这个课题设计,同时我感觉自己的系统设计道路才刚刚起步。
前方还有更多的任务等着我去完成。
系统设计对我来说还是比较陌生的,在未来的日子里我一定会一点点的进步。
该系统现在时能完成老师对考勤情况统计的要求。
而经过修改后就能完成更多的统计任务。
相信使用得当能给我的学习生活带来便利。
附录:
系统源代码
classMycompareimplementsjava.util.Comparator{
publicintcompare(Objecto1,Objecto2){
Studenta1=(Student)o1;
Studenta2=(Student)o2;
returna1.score<
a2.score?
1:
-1;
}
}
publicclassStudent{
StringSname;
intTime;
doublescore;
publicStudent(Stringname){
Sname=name;
Time=1;
score=100;
}
importjava.awt.Color;
importjava.awt.event.*;
importjava.io.*;
importjava.util.*;
importjavax.swing.*;
publicclassStudentAttendStatisticsextendsJFrame{
privateJTextAreajta;
privatestaticintstucount=0;
privateJFileChooserfileChooser;
privateFiledir,save;
privateStudent[]stu;
privateintN;
publicStudentAttendStatistics()throwsException{
this.setTitle("
考勤情况统计系统"
);
fileChooser=newJFileChooser();
fileChooser.setCurrentDirectory(newFile("
."
));
//设置当前目录
fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
//设置JFileChooser,以允许用户只选择文件、只选择目录,或者可选择文件和目录。
this.setBounds(400,100,500,650);
this.setLayout(null);
//设置布局
JLabeljla=newJLabel("
请输入你要统计文件所在的文件夹"
jla.setBounds(0,0,200,20);
this.add(jla);
JButtonjb=newJButton("
浏览"
jb.setBounds(200,0,150,20);
jb.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventevent){
try{
intres=fileChooser.showOpenDialog(null);
//弹出一个"
OpenFile"
文件选择器对话框。
if(res==JFileChooser.APPROVE_OPTION){//选择确认(yes、ok)后返回该值。
dir=newFile(fileChooser.getSelectedFile().getPath());
//返回选中的文件,将此抽象路径名转换为一个路径名字符串。
stu=newStudent[1000];
Stringstr[];
str=dir.list();
//返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数组。
N=str.length;
//需要统计的文件的个数
//System.out.println(N);
for(inti=0;
i<
str.length;
++i){
FileF=newFile(dir,str[i]);
//System.out.println(F.toString());
BufferedReaderbr=newBufferedReader(newFileReader(F));
Stringline;
while(br.ready()){//判断此流是否已准备好被读取。
如果缓冲区不为空,或者基础字符流已准备就绪,则缓冲的字符流准备就绪。
line=br.readLine();
//读取一个文本行。
StringTokenizerrecord=newStringTokenizer(line,"
"
//字符串分词器
if(record.countTokens()==3){//选择有效记录
record.nextToken();
Stringname=record.nextToken();
intj;
for(j=0;
j<
stucount;
++j){
if(stu[j].Sname.equals(name)){
stu[j].Time++;
break;
}
}
if(j==stucount){
stu[stucount++]=newStudent(name);
//System.out.println(name);
}
br.close();
}
}catch(Exceptione){
e.printStackTrace();
}
}
);
this.add(jb);
JLabeljla1=newJLabel("
保存路径设定"
jla1.setBounds(0,25,200,20);
this.add(jla1);
JButtonjb1=newJButton("
jb1.setBounds(200,25,150,20);
jb1.addActionListener(newActionListener(){
intres=fileChooser.showSaveDialog(null);
if(res==fileChooser.APPROVE_OPTION){
Stringpath=fileChooser.getSelectedFile().getPath();
if(path.indexOf("
.txt"
)==-1){
path+="
;
}
save=newFile(path);
});
this.add(jb1);
JButtonjb2=newJButton("
统计"
jb2.setBounds(400,0,100,20);
jb2.addActionListener(newActionListener(){
stu[i].score=((stu[i].Time)/(double)N)*100;
Arrays.sort(stu,0,stucount,newMycompare());
//Filesavepath=newFile(save,"
考勤统计情况.txt"
PrintWriterpw=newPrintWriter(newBufferedWriter(newFileWriter(save)));
//向文本输出流打印对象的格式化表示形式。
java.text.DecimalFormatdf=newjava.text.DecimalFormat("
0.00"
pw.println("
考勤统计情况:
"
for(inti=0;
//System.out.println("
\t姓名:
+stu[i].Sname+"
\t出勤次数:
+stu[i].Time+"
\t缺勤次数:
"
+(N-stu[i].Time)+"
\t出勤分数:
+df.format(stu[i].score));
jta.append("
姓名:
+df.format(stu[i].score)+"
\n"
pw.println("
pw.close();
this.add(jb2);
JButtonjb3=newJButton("
退出"
jb3.setBounds(400,25,100,20);
jb3.addActionListener(newActionListener(){
System.exit(0);
this.add(jb3);
JLabelRes=newJLabel("
考勤情况统计结果:
Res.setBounds(0,80,200,20);
this.add(Res);
jta=newJTextArea("
jta.setEditable(false);
jta.setBackground(Color.BLACK);
jta.setForeground(Color.WHITE);
this.add(jta);
JScrollPanejsp=newJScrollPane(jta);
jsp.setBounds(5,100,475,500);
this.add(jsp);
this.setVisible(true);
publicstaticvoidmain(String[]args)throwsException{
//TODOAuto-generatedmethodstub
newStudentAttendStatistics();