Java课程设计-奖学金评定_第1页
Java课程设计-奖学金评定_第2页
Java课程设计-奖学金评定_第3页
Java课程设计-奖学金评定_第4页
Java课程设计-奖学金评定_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章课题概述本次java课程设计的题目是以本校学生手册中奖学金的评定办法为背景,设计的一个学生奖学金评定系统。1.1课题的目的奖学金管理工作是高校学生管理工作的重要组成部分。高校为鼓励学生在校期间刻苦学习,设立了多种奖学金,同时为了做好奖学金的评审与管理工作,投入了大量的人力、物力和财力。奖学金管理工作特别是评审工作具有涉及面广、工作量大、发生时间相对集中的特点。高校的奖学金评定工作每学年都要开展,传统的评审工作主要是以手工方式进行的,存在着效率地下、容易出错等弊端。因此,实现奖学金评定管理的信息化是十分必要的。1.2课题的要求1.2.1系统的性能需求由于对系统中学生的基本信息,学习成绩等,不允许随意增加、修改和删除,因此在系统设计中主要是保证系统的可行性,并在保证可行性的前提下满足数据录入的准确性和高效性。1、准确性:为确保数据录入的准确性,系统提出了采取双工录入比较法和多次校对来确保录入数据正确性的策略。2、高效性:系统设计要能高效的完成对学生基本信息和学科成绩进行录入。3、可行性:对学生成绩的录入与管理系统要能够及时对重要的数据进行备份,当数据遭到灾难性的毁坏后能及时重建和恢复。对学生成绩和信息的录入与管理系统是通过信息的正确录入,在系统内进行分析处理输出新的信息并利用反馈信息对相关事物进行有效控制的具有一定特殊功能的人机交互系统。1.2.2系统的功能需求设计一个奖学金评定系统,该系统要能够进行信息和成绩的录入、修改、删除、查询。具体功能需求如下:1、由于大多数系统操作人员的都是非计算机专业,要求系统要有良好的人机界面;2、能对学生成绩进行准确、高效的录入、校对和分析,并支持多条件查询与修改;3、能够及时地对重要数据进行备份和恢复,方便的导出数据文件;4、数据操作方便简单,稳定性好,数据计算及成绩分析要能够自动完成。第2章概要设计2.1整个程序的模块结构及流程根据课题要求,奖学金评定系统由编辑信息、查询信息、统计信息、获奖信息四大模块组成。程序各功能模块的划分,及主要流程如图2-1所示。图2-1整个程序各功能模块间的流程2.2各个功能模块的描述2.2.1编辑信息输入学生信息并以文件Score.dat保存,具有输入新增学生基本信息,学生学科成绩,以及成绩的添加、删除和修改的功能。2.4.2查询信息可以按学号或姓名查询某学生的所有成绩,以及按学号或姓名修改指定学生的相关成绩。2.4.3统计信息(1)具有能够读取Score.dat文件并显示所有学生的所有成绩的功能;(2)具有显示输出60分以下、60~79、80~89、90分以上各分数段的学生信息的功能。2.4.4获奖信息(1)具有按各门课程的学分和分数计算所有同学的绩点,并根据绩点排名得出各等级奖学金的名单的功能;(2)具有将各等级奖学金获得者的名单写入文件Bonus.dat的功能。第3章程序功能的实现3.1主要功能模块的实现3.1.1编辑信息的实现此模块具有三个功能,能够新增学生信息,删除学生信息,修改学生信息,新增学生,通过自己的输入,把相关的数据写入指定的文件中,需要用到对流的操作,在写入文件前,需要先保存到自己定义的集合里,再把集合的数据全部写入文件进行保存,修改信息,删除信息也是如此。新增学生信息的代码实现如下:publicvoidactionPerformed(ActionEvente){ if(e.getSource()==confirm){ Stringclassno=classnotf.getText(); Stringstuid=stuidtf.getText(); Stringname=nametf.getText(); Stringclan=clantf.getText(); Stringmath=mathtf.getText(); StringEnglish=Englishtf.getText(); Stringphysics=physicstf.getText(); Stringmaxphil=maxphiltf.getText(); s=newStudent(classno,stuid,name,clan,math,English,physics, maxphil); classnotf.setText(""); stuidtf.setText(""); nametf.setText(""); clantf.setText(""); mathtf.setText(""); Englishtf.setText(""); physicstf.setText(""); maxphiltf.setText(""); list.add(s); save(); }elseif(e.getSource()==save){ this.dispose(); } }3.1.2查询信息的实现查询信息中有两大功能,一个是根据指定的学号和姓名,查询其相关的各项成绩以及及其绩点。这是自己输入的学号和姓名,与集合中的对应的数据进行对比,当发现一致时,就输出其成绩与绩点。另一个是根据自己输入的学号姓名,对其相关的成绩进行修改,如果一项成绩需要修改,就在集合中修改指定的数据,其他不改变,结束后,在把集合中的数据全部写入到文件中。查询成绩与绩点的代码实现如下:publicvoidactionPerformed(ActionEvente){ ArrayList<Student>list=InternalFrame.list; Strings=null; Stringclangrade=null; Stringmathgrade=null; StringEnglishgrade=null; Stringphysicsgrade=null; Stringmaxphilgrade=null; if(e.getSource()==confirm){ for(inti=0;i<list.size();i++){ if(jtf2.getText().equals(list.get(i).stuid) ||jtf3.getText().equals(list.get(i).name)){ s="c语言:"+list.get(i).clan+"\t高数:" +list.get(i).math+"\t大英:"+list.get(i).English +"\t大物:"+list.get(i).physics+"\t马哲:" +list.get(i).maxphil; list.get(i).calgrade(); Doubleclan1=Double.valueOf(list.get(i).clangrade); Doublemath1=Double.valueOf(list.get(i).mathgrade); DoubleEnglish1=Double.valueOf(list.get(i).Englishgrade); Doublephysics1=Double.valueOf(list.get(i).physicsgrade); Doublemaxphil1=Double.valueOf(list.get(i).maxphilgrade); clangrade=clan1.toString(); mathgrade=math1.toString(); Englishgrade=English1.toString(); physicsgrade=physics1.toString(); maxphilgrade=maxphil1.toString(); jtf4.setText("c语言:"+clangrade+"\t高数:"+mathgrade +"\t大英:"+Englishgrade+"\t大物:"+physicsgrade +"\t马哲:"+maxphilgrade); jtf4.setEditable(false); jtf4.setEditable(false); jtf1.setEditable(false); jtf1.setText(s); jtf1.setEditable(false); } } } }修改个人成绩的代码实现如下:publicvoidactionPerformed(ActionEvente){ ArrayList<Student>list=InternalFrame.list; Stringm="确定要修改该学生成绩吗?"; if(e.getSource()==confirm){ intok=JOptionPane.showConfirmDialog(this,m,"确认", JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE); if(ok==JOptionPane.YES_OPTION){ Stringclan=clantf.getText(); Stringmath=mathtf.getText(); StringEnglish=Englishtf.getText(); Stringphysics=physicstf.getText(); Stringmaxphil=maxphiltf.getText(); for(inti=0;i<list.size();i++){ if(nametf.getText().equals(list.get(i).classno) ||stuidtf.getText().equals(list.get(i).stuid)){ if(!clan.trim().equals("")){ list.get(i).clan=clan; } if(!math.trim().equals("")){ list.get(i).math=math; } if(!English.trim().equals("")){ list.get(i).English=English; } if(!physics.trim().equals("")){ list.get(i).physics=physics; } if(!maxphil.trim().equals("")){ list.get(i).maxphil=maxphil; } list.get(i).calgrade(); InternalFrame.save(); } } try{ setClosed(true); }catch(PropertyVetoExceptione1){ e1.printStackTrace(); } }else{ clantf.setText(""); mathtf.setText(""); Englishtf.setText(""); physicstf.setText(""); maxphiltf.setText(""); } } }3.1.3统计信息的实现统计信息之中具有显示所有学生成绩,以及各项科目各分数段的人的相关信息。显示所有学生的成绩时,利用集合,把集合中的各个学生的成绩输出来,同样在统计各分数段的人的相关信息也是从集合中的对象的属性中获取。显示所有学生成绩的代码实现如下:publicShowInternalFrame(Stringtitle){ super(); setTitle(title); setBounds(50,20,700,500); setResizable(true); setClosable(true); setIconifiable(true); setMaximizable(true); list=InternalFrame.list; jp=newJPanel(newGridLayout(list.size(),1,1,1)); Strings[]={"班级","学号","姓名","C语言","高数","大英","大物","马哲"}; Stringss[][]=newString[list.size()][s.length]; JTablejt; for(inti=0;i<list.size();i++){ ss[i][0]=list.get(i).classno; ss[i][1]=list.get(i).stuid; ss[i][2]=list.get(i).name; ss[i][3]=list.get(i).clan; ss[i][4]=list.get(i).math; ss[i][5]=list.get(i).physics; ss[i][6]=list.get(i).English; ss[i][7]=list.get(i).maxphil; } jt=newJTable(ss,s); jsp=newJScrollPane(jt); jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); this.add(jsp); setVisible(true);}3.1.4获奖信息的实现获奖信息中主要是得到各等奖的名单,通过比较每个学生的绩点,进行排名,根据人数的比例,计算各等奖的人数,在根据排名确定人选,这些获奖人的信息依然是在集合中得到的。(1)获奖名单的主体代码实现如下:publicAwardInternalFrame(Stringtitle){ super(); setTitle(title); setBounds(50,20,650,500); setResizable(true); setClosable(true); setIconifiable(true); setMaximizable(true); jl1=newJLabel("一等奖:"); jl2=newJLabel("二等奖:"); jl3=newJLabel("三等奖:"); jta1=newJTextArea(8,50); jta2=newJTextArea(8,50); jta3=newJTextArea(8,50); jp=newJPanel(newGridLayout(3,1,1,1)); jp1=newJPanel(); jp2=newJPanel(); jp3=newJPanel(); list=(ArrayList<Student>)InternalFrame.list.clone(); grade=newdouble[list.size()]; for(inti=0;i<list.size();i++){ list.get(i).calgrade(); grade[i]=list.get(i).allgrade; } no1num=list.size()*0.05; no2num=list.size()*0.1; no3num=list.size()*0.15; bd1=newBigDecimal(no1num).setScale(0,BigDecimal.ROUND_HALF_UP); bd2=newBigDecimal(no2num).setScale(0,BigDecimal.ROUND_HALF_UP); bd3=newBigDecimal(no3num).setScale(0,BigDecimal.ROUND_HALF_UP); bd1int=Value(); bd2int=Value(); bd3int=Value(); Arrays.sort(grade); for(inti=0;i<bd1int;i++){ gradeno1=grade[list.size()-1]; for(intj=0;j<list.size();j++){ if(gradeno1==list.get(j).allgrade){ jtagr1+=list.get(j).getinf(); list.remove(j); break; } } } for(inti=0;i<bd2int;i++){ gradeno2=grade[list.size()-1]; for(intj=0;j<list.size();j++){ if(gradeno2==list.get(j).allgrade){ jtagr2+=list.get(j).getinf(); list.remove(j); break; } } } for(inti=0;i<bd3int;i++){ gradeno3=grade[list.size()-1]; for(intj=0;j<list.size();j++){ if(gradeno3==list.get(j).allgrade){ jtagr3+=list.get(j).getinf(); list.remove(j); break; } } } jta1.setText(jtagr1); jta2.setText(jtagr2); jta3.setText(jtagr3); Filef=newFile("D:/bat/Bonus.dat"); BufferedWriterbw=null; try{ bw=newBufferedWriter(newFileWriter(f)); bw.write("一等奖:"+jtagr1); bw.newLine(); bw.write("二等奖:"+jtagr2); bw.newLine(); bw.write("三等奖:"+jtagr3); bw.flush(); bw.close(); }catch(Exceptione){ e.printStackTrace(); } jta1.setEditable(false); jta2.setEditable(false); jta3.setEditable(false); jta1.setLineWrap(true); jta2.setLineWrap(true); jta3.setLineWrap(true);第4章调试及发现问题的解决虽然在程序的编写过程中遇到了很多问题,但是通过上网查阅相关资料,与其它同学讨论,询问指导老师等方式,最终都一一解决了,程序实现及调试过程中遇到的主要问题及解决方法如下。1、如何使定义的集合保持唯一性?解决方法:对于集合需要用静态进行定义,使之成为类变量,如果是成员变量,每次实例化个对象,就会产生相应的成员变量,无法保证其的唯一性,调用其中的数据会发生异常,所以必须使之成为静态,每次要用到时,通过类点名,得到整个集合,保证唯一性。2、当修改某个学生的相关信息时,包括成绩时,在获取奖学金名单时,被修改的学生绩点没有得到改变,如何避免影响获奖名单的准确性?解决方法:在学生类中,定义一个方法,这个方法是得到其所有成绩的绩点,在修改的方法中,最后调用学生类的得到绩点的方法,保证每次修改学生成绩时,绩点也会发生相应的变化,从而保证获取名单的准确性。3、在根据绩点排名时,同时出现了两个相同的绩点,而在同一个等级的奖学金中恰好两个以上的名额,如何避免在同一个等级的奖学金的名单上输出相同的两个人?解决方法:在排名前可以先克隆一个原来装有所有数据的集合,然后对这个集合进行操作。需要对这个集合进行遍历,一旦找到在集合中对象的数据中与比较的数据一致时,立刻停止循环,得到其相关信息,保存相关的变量中,接着便移除这个集合的对象,然后继续在集合中对剩下的对象的数据进行比较,一直到达到获奖的人数,也就是每找到对象,便减小集合的大小,从而保证人不会重复,信息也不会相同。4、如何避免每次需要用到某个人的相关的信息时,都要实例化个对象?解决方法:在学生类中,定义个方法,方法是得到其班级,姓名,学号,每次需要用到其相关的信息时,可以直接通过集合中的指定的对象调用该方法,从而不需每次都去实例化对象,再获取其相关信息。第5章程序测试及分析运行程序,首先显示程序主菜单,列出的功能选项有编辑信息、查询信息、统计信息、获奖信息等。在编辑信息中执行输入信息的功能。图5-1所示,是实现输入信息的界面。图5-1输入信息图5-2所示,是删除信息的功能界面。图5-2删除信息图5-3所示,查询成绩与绩点的功能界面。图5-3查询成绩与绩点图5-4所示,修改成绩的功能界面。图5-4修改成绩统计信息中显示所有学

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论