1《JAVA程序设计课程设计》报告书学生考勤系统的设计和实现提交日期:2010年12月2目录摘要-------------------------------------------------3一、前言---------------------------------------------3二、设计分析------------------------------------------3三、实现方法------------------------------------------4四、调试问题,调试记录及解决--------------------------4五、系统的使用说明书----------------------------------5六、结论----------------------------------------------5致谢--------------------------------------------------5附录-----------------------------------------------------63学生考勤系统的设计和实现摘要:我这次的课程设计是学生考勤系统的设计和实现。具有如下功能:1、根据教师提供的excel考勤文件夹,统计学生出勤次数,缺勤次数,出勤分数(设考勤次数为N次,满勤为100分,缺勤1次扣总分的1/N),并按分数排序。2、统计结果在屏幕上显示出来,并保存到文本文件.txt之中。为了完成上述功能,我采用了java语言,用一个Student类数组专门存储学生的每个学生的出勤信息,包括姓名,出勤次数,出勤分数。具体使用了JFrame,JButton等组件。最终我成功的完成了具有以上功能的一个小系统。该系统具有了一个较为简单的界面。在这次课程设计的过程中我第一次尝试了写图形界面系统,虽然最终系统不是很完美,但我的收获也不小。在整个过程中我熟悉了文件输入输出,类的使用,接口实现等技术,并成功的应用。总之这次课程设计让我受益颇丰。关键词:课程设计;功能;系统;函数;图形界面;一、前言本次课程设计我选的是学生考勤系统的设计和实现。刚开始看到这个题我大意的认为这个题很简单,用一些文件操作就可以完成。但动笔写后才发现也不是那么简单。使得我只能小心翼翼的去写去学。总之在这次课程设计中,与其说我是在写这个系统不如说我是在学着写这个系统。二、设计分析我拿到的这个课题从名称上就可以看出来是一个统计出勤次数的系统,它的要求如下:具有如下功能:1、根据教师提供的excel考勤文件夹,统计学生出勤次数,缺勤次数,出勤分数(设考勤次数为N次,满勤为100分,缺勤1次扣总分的1/N),并按分数排序。2、统计结果在屏幕上显示出来,并保存到文本文件.txt之中。经过分析我知道这个系统其实就是要我们将提供给我们的数据文件,通过遍历搜索匹配来统计出各位同学的总共出勤次数并换算成出勤分数,具体显示出选手的姓名、出勤次数、缺勤次数、出勤分数。而我在整个系统的制作过程中要做的和能得4到的就是熟练地使用文件输入输出、学会读取数据的技巧,并用严密的思维保证统计的成功。三、实现方法这个系统我采用了java语言,用MyEclipse完成。我设计了以下类:StudentAttendStatistics//继承JFrame并实现相关功能Student//存储每位同学的信息MyCompare//实现了Arrays中的java.util.Comparator接口在StudentAttendStatistics中,主要实现的功能有对点名文件的读取、统计数据、对数据进行处理得到分数、然后按照分数排序、最后显示统计后的结果并将结果保存到txt文件中。首先对于数据的处理,对于一个信息的多元素问题我采用类数组存储来解决。并给该数组开了1000个空间。在数据的读入时,我遇到了一定的困难,看到点名文件里正常数据每一行都是三个部分,于是我采用分割一行一行的数据,并分辨该行信息是否具有完整的三部分来判断该信息是否为有效信息,并将有效数据的学生姓名赋值给name,这样就完成了数据的读入。然后是保存信息为文件,指定保存的文件格式为txt格式,在读取数据的文件夹和保存统计结果的文件夹采用的JFileChooser类的相关功能。随后是对分数的排序,排序时选用的Arrays.sort(),并实现了java.util.Comparator接口。在设计系统的时候,首先在选择界面时,我简单的使用了JFrame框架构建了一个简单的界面。在界面里简单的设计了几个标签和几个按钮,并注册监听器对按钮需要实现的功能进行设计。我还导入了java.awt.Color类,对显示面板的背景颜色以及字体颜色进行设计,是界面更加美观。四、调试问题,调试记录及解决1取出的数据有误,采用了判断消息是否有效的方式解决。2JTextArea与JScrollPane结合后bounds的设置,发现只要设置JScrollPane即可。3JFileChooser对象只能选择文件,通过网络上搜索知道了可以设置JFileChooser.FILES_AND_DIRECTORIES就可以实现同时可以选定文件夹和文件。五、系统的使用说明书51.功能该系统是针对老师提供的考勤文件存放的文件夹来进行统计。具有如下功能:1)根据教师提供的excel考勤文件夹,统计学生出勤次数,缺勤次数,出勤分数(设考勤次数为N次,满勤为100分,缺勤1次扣总分的1/N),并按分数排序。2)统计结果在屏幕上显示出来,并保存到文本文件.txt之中。2.使用方法:1.启动系统2.点第一个浏览选定考勤情况文件的文件夹.3.点第二个浏览得到考勤情况统计文件存储路径,文件名可以写.txt后缀不写的话会自动添加。4.选择过后,点统计就会在文本区域中显示结果并在制定文件路径产生结果文件。5.可以重新统计或者点退出退出系统。六、结论完成了这个课题设计,同时我感觉自己的系统设计道路才刚刚起步。前方还有更多的任务等着我去完成。系统设计对我来说还是比较陌生的,在未来的日子里我一定会一点点的进步。该系统现在时能完成老师对考勤情况统计的要求。而经过修改后就能完成更多的统计任务。相信使用得当能给我的学习生活带来便利。6附录:系统源代码classMycompareimplementsjava.util.Comparator{publicintcompare(Objecto1,Objecto2){Studenta1=(Student)o1;Studenta2=(Student)o2;returna1.scorea2.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(.));//设置当前目录7fileChooser.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;istr.length;++i){FileF=newFile(dir,str[i]);//System.out.println(F.toString());BufferedReaderbr=newBufferedReader(newFileReader(F));Stringline;while(br.ready()){//判断此流是否已准备好被读取。如8果缓冲区不为空,或者基础字符流已准备就绪,则缓冲的字符流准备就绪。line=br.readLine();//读取一个文本行。StringTokenizerrecord=newStringTokenizer(line,,);//字符串分词器if(record.countTokens()==3){//选择有效记录record.nextToken();Stringname=record.nextToken();intj;for(j=0;jstucount;++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(浏览);9jb1.setBounds(200,25,150,20);jb1.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventevent){try{intres=fileChooser.showSaveDialog(null);if(res==fileChooser.APPROVE_OPTION){Stringpath=fileChooser.getSelectedFile().getPath();