java课程设计报告-学生考勤系统的设计和实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《JAVA程序设计课程设计》报告书学生考勤系统的设计和实现
提交日期:2010年12月
目录
摘要-------------------------------------------------3
一、前言---------------------------------------------3
二、设计分析------------------------------------------3
三、实现方法------------------------------------------4
四、调试问题,调试记录及解决--------------------------4
五、系统的使用说明书----------------------------------5
六、结论----------------------------------------------5 致谢--------------------------------------------------5附录-----------------------------------------------------6
学生考勤系统的设计和实现
摘要:
我这次的课程设计是学生考勤系统的设计和实现。
具有如下功能:
1、根据教师提供的excel考勤文件夹,统计学生出勤次数,缺勤次数,出勤分数(设考勤次数为N次,满勤为100分,缺勤1次扣总分的1/N),并按分数排序。
2、统计结果在屏幕上显示出来,并保存到文本文件.txt之中。
为了完成上述功能,我采用了java语言,用一个Student类数组专门存储学生的每个学生的出勤信息,包括姓名,出勤次数,出勤分数。
具体使用了JFrame,JButton等组件。
最终我成功的完成了具有以上功能的一个小系统。
该系统具有了一个较为简单的界面。
在这次课程设计的过程中我第一次尝试了写图形界面系统,虽然最终系统不是很完美,但我的收获也不小。
在整个过程中我熟悉了文件输入输出,类的使用,接口实现等技术,并成功的应用。
总之这次课程设计让我受益颇丰。
关键词:课程设计;功能;系统;函数;图形界面;
一、前言
本次课程设计我选的是学生考勤系统的设计和实现。
刚开始看到这个题我大意的认为这个题很简单,用一些文件操作就可以完成。
但动笔写后才发现也不是那么简单。
使得我只能小心翼翼的去写去学。
总之在这次课程设计中,与其说我是在写这个系统不如说我是在学着写这个系统。
二、设计分析
我拿到的这个课题从名称上就可以看出来是一个统计出勤次数的系统,它的要求如下:
具有如下功能:
1、根据教师提供的excel考勤文件夹,统计学生出勤次数,缺勤次数,出勤分数(设考勤次数为N次,满勤为100分,缺勤1次扣总分的1/N),并按分数排序。
2、统计结果在屏幕上显示出来,并保存到文本文件.txt之中。
经过分析我知道这个系统其实就是要我们将提供给我们的数据文件,通过遍历搜索匹配来统计出各位同学的总共出勤次数并换算成出勤分数,具体显示出选手的姓名、出勤次数、缺勤次数、出勤分数。
而我在整个系统的制作过程中要做的和能得
到的就是熟练地使用文件输入输出、学会读取数据的技巧,并用严密的思维保证统计的成功。
三、实现方法
这个系统我采用了java语言,用MyEclipse完成。
我设计了以下类:
StudentAttendStatistics //继承JFrame 并实现相关功能
Student //存储每位同学的信息
MyCompare //实现了Arrays中的parator接口
在StudentAttendStatistics中,主要实现的功能有对点名文件的读取、统计数据、对数据进行处理得到分数、然后按照分数排序、最后显示统计后的结果并将结果保存到txt文件中。
首先对于数据的处理,对于一个信息的多元素问题我采用类数组存储来解决。
并给该数组开了1000个空间。
在数据的读入时,我遇到了一定的困难,看到点名文件里正常数据每一行都是三个部分,于是我采用分割一行一行的数据,并分辨该行信息是否具有完整的三部分来判断该信息是否为有效信息,并将有效数据的学生姓名赋值给name,这样就完成了数据的读入。
然后是保存信息为文件,指定保存的文件格式为txt 格式,在读取数据的文件夹和保存统计结果的文件夹采用的JFileChooser类的相关功能。
随后是对分数的排序,排序时选用的Arrays.sort(),并实现了pa rator接口。
在设计系统的时候,首先在选择界面时,我简单的使用了JFrame框架构建了一个简单的界面。
在界面里简单的设计了几个标签和几个按钮,并注册监听器对按钮需要实现的功能进行设计。
我还导入了java.awt.Color类,对显示面板的背景颜色以及字体颜色进行设计,是界面更加美观。
四、调试问题,调试记录及解决
1 取出的数据有误,采用了判断消息是否有效的方式解决。
2 JTextArea 与 JScrollPane 结合后bounds的设置,发现只要设置JScrollPane 即可。
3 JFileChooser对象只能选择文件,通过网络上搜索知道了可以设置JFileChooser.FILES_AND_DIRECTORIES 就可以实现同时可以选定文件夹和文件。
五、系统的使用说明书
1.功能
该系统是针对老师提供的考勤文件存放的文件夹来进行统计。
具有如下功能:
1)根据教师提供的excel考勤文件夹,统计学生出勤次数,缺勤次数,出勤分数(设考勤次数为N次,满勤为100分,缺勤1次扣总分的1/N),并按分数排序。
2)统计结果在屏幕上显示出来,并保存到文本文件.txt之中。
2.使用方法:
1.启动系统
2.点第一个浏览选定考勤情况文件的文件夹.
3.点第二个浏览得到考勤情况统计文件存储路径,文件名可以写.txt后缀不写的话会自动添加。
4.选择过后,点统计就会在文本区域中显示结果并在制定文件路径产生结果文件。
5.可以重新统计或者点退出退出系统。
六、结论
完成了这个课题设计,同时我感觉自己的系统设计道路才刚刚起步。
前方还有更多的任务等着我去完成。
系统设计对我来说还是比较陌生的,在未来的日子里我一定会一点点的进步。
该系统现在时能完成老师对考勤情况统计的要求。
而经过修改后就能完成更多的统计任务。
相信使用得当能给我的学习生活带来便利。
附录:系统源代码
class Mycompare implements parator {
public int compare(Object o1, Object o2) {
Student a1 = (Student) o1;
Student a2 = (Student) o2;
return a1.score<a2.score?1:-1;
}
}
public class Student{
String Sname;
int Time;
double score;
public Student(String name){
Sname=name;
Time=1;
score=100;
}
}
import java.awt.Color;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
public class StudentAttendStatistics extends JFrame{
private JTextArea jta;
private static int stucount=0;
private JFileChooser fileChooser;
private File dir,save;
private Student []stu;
private int N;
public StudentAttendStatistics() throws Exception{
this.setTitle("考勤情况统计系统");
fileChooser=new JFileChooser();
fileChooser.setCurrentDirectory(new File("."));//设置当前目录
fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES );
//设置 JFileChooser,以允许用户只选择文件、只选择目录,或者可选择文件和目录。
this.setBounds(400,100,500 ,650);
this.setLayout(null);//设置布局
JLabel jla=new JLabel("请输入你要统计文件所在的文件夹");
jla.setBounds(0, 0, 200, 20);
this.add(jla);
JButton jb=new JButton("浏览");
jb.setBounds(200,0,150,20);
jb.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
try{
int res=fileChooser.showOpenDialog(null);//弹出一个"Open File" 文件选择器对话框。
if (res == JFileChooser.APPROVE_OPTION){//选择确认(yes、ok)后返回该值。
dir=new
File(fileChooser.getSelectedFile().getPath());//返回选中的文件,将此抽象路
径名转换为一个路径名字符串。
stu=new Student[1000];
String str[];
str=dir.list();//返回由此抽象路径名所表示的目录中的文
件和目录的名称所组成字符串数组。
N=str.length;//需要统计的文件的个数
//System.out.println(N);
for(int i=0;i<str.length;++i){
File F=new File(dir,str[i]);
//System.out.println(F.toString());
BufferedReader br=new BufferedReader(new FileReader(F));
String line;
while(br.ready()){//判断此流是否已准备好被读取。
如
果缓冲区不为空,或者基础字符流已准备就绪,则缓冲的字符流准备就绪。
line=br.readLine();//读取一个文本行。
StringTokenizer record=new
StringTokenizer(line,",");//字符串分词器
if (record.countTokens()==3) {//选择有效记录
record.nextToken();
String name=record.nextToken();
int j;
for(j=0;j<stucount;++j){
if (stu[j].Sname.equals(name)){
stu[j].Time++;
break;
}
}
if (j==stucount){
stu[stucount++]=new Student(name);
}
//System.out.println(name);
}
}
br.close();
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
);
this.add(jb);
JLabel jla1=new JLabel("保存路径设定");
jla1.setBounds(0,25,200,20);
this.add(jla1);
JButton jb1=new JButton("浏览");
jb1.setBounds(200,25,150,20);
jb1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
try{
int res=fileChooser.showSaveDialog(null);
if (res==fileChooser.APPROVE_OPTION){
String
path=fileChooser.getSelectedFile().getPath();
if (path.indexOf(".txt")==-1){
path+=".txt";
}
save=new File(path);
}
}catch(Exception e){
e.printStackTrace();
}
}
});
this.add(jb1);
JButton jb2=new JButton("统计");
jb2.setBounds(400,0,100,20);
jb2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
try{
for(int i=0;i<stucount;++i){
stu[i].score=((stu[i].Time)/(double)N)*100;
}
Arrays.sort(stu,0,stucount,new Mycompare());
//File savepath=new File(save,"考勤统计情况.txt");
PrintWriter pw=new PrintWriter(new BufferedWriter(new FileWriter(save)));//向文本输出流打印对象的格式化表示形式。
java.text.DecimalFormat df=new
java.text.DecimalFormat("0.00");
pw.println("考勤统计情况:");
for(int i=0;i<stucount;++i){
//System.out.println("\t姓名:"+stu[i].Sname+"\t出勤次数:"+stu[i].Time+"\t缺勤次数: "+(N-stu[i].Time)+"\t出勤分
数:"+df.format(stu[i].score));
jta.append("姓名:"+stu[i].Sname+"\t出勤次数:
"+stu[i].Time+"\t缺勤次数: "+(N-stu[i].Time)+"\t出勤分
数:"+df.format(stu[i].score)+"\n");
pw.println("姓名:"+stu[i].Sname+"\t出勤次数:
"+stu[i].Time+"\t缺勤次数: "+(N-stu[i].Time)+"\t出勤分
数:"+df.format(stu[i].score));
}
pw.close();
}catch(Exception e){
e.printStackTrace();
}
}
});
this.add(jb2);
JButton jb3=new JButton("退出");
jb3.setBounds(400,25,100,20);
jb3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
System.exit(0);
}
}
);
this.add(jb3);
JLabel Res=new JLabel("考勤情况统计结果:");
Res.setBounds(0,80,200,20);
this.add(Res);
jta=new JTextArea("");
jta.setEditable(false);
jta.setBackground(Color.BLACK);
jta.setForeground(Color.WHITE);
this.add(jta);
JScrollPane jsp=new JScrollPane(jta);
jsp.setBounds(5,100,475,500);
this.add(jsp);
this.setVisible(true);
}
public static void main(String[] args) throws Exception{ // TODO Auto-generated method stub
new StudentAttendStatistics();
}
}
11。