Java课程设计--奖学金评定系统.docx
第1章课题概述11.1 课题的目的11.2 课题的要求11.2.1信息输入输出的要求11. 2.2程序实现的功能要求1第2章概要设计32.1程序的界面设计32.2存储学生容器的选择32. 3输入数据合法性的检测及初步处理42. 4各个功能实现的描述42. 4.1添加学生41.1.1 4.2查询学生42.4.3 修改学生信息42.4.4 删除学生52. 4.5显示所有学生成绩单52. 4.6显示各分数段的学生信息52. 4.7输出获得奖学金学生名单并写入文件中5第3章程序功能的实现63. 1主界面的实现63.2各个功能界面的实现73.2.1添加学生界面的实现73.2.2查询学生界面的实现83.2.3修改学生信息界面的实现93.2.4删除学生信息界面的实现103.2.5学生成绩单界面的实现113.2.6各分数段学生信息界面的实现123.2.7奖学金学生名单界面的实现13第4章调试及发现问题的解决16第5章程序测试及分析185.1主界面的测试界面185.2学生信息编辑菜单185.2.1添加学生基本信息185.2.2查询学生基本信息195.2.3修改学生基本信息205.2.4删除学生215.3.学生成绩信息225.3.1学生成绩单225.3.2各分数段学生信息235.4奖学金获得者245.4.1奖学金获得者245.4帮助25第6章总结26参考文献27第1章课题概述本次课程设计的题目是以本校学生手册中奖学金的评定办法为背景,设计一个学生奖学金评定系统。1.1 课题的目的奖学金评定是每个学校每学年都必不可少的教学工作。一般情况下学校学生人数相对较多,这样奖学金评定任务就变得苦难。通过编写奖学金评定系统这一程序,极大化的缩小了学校的教学任务。将每位学生的个人信息一一输入该系统,通过系统中实现的功能计算出获得奖学金的同学。因此,采用己学的JaVa知识,通过编写计算机程序的方式来实现这些功能,无疑具有较大的实际意义。1.2 课题的要求1.2.1 信息输入输出的要求(1)程序运行后应首先输出一个主菜单,并将所有的学生信息编辑、学生成绩单、各分数段学生信息、奖学金学生名单等功能罗列在主菜单上供用户进行选择,以便进行相应的操作。(2)学生信息通过键盘输入到程序中,并且编辑学生信息的各项操作之后可以更新已存入学生数据。(3)用户每次更新输入数据并选择功能菜单后,应能立即输出运算的结果。(4)运行结果的输出应整齐、清晰,以便用户能够验证程序的正确性。(5)将最终要求的学生成绩单和获得奖学金学生信息分别写入到不同的文件中1.2.2 程序实现的功能要求(1)用集合来存储输入到系统的学生信息。一个学号对应一个学生,一次使用集合HashMap来进行存储。(2)学生信息的编辑操作中的学生的添加、修改、删除、查询可直接操作集合进行处理;学生成绩单、各分数段学生信息、获得奖学金学生名单也是操作集合进行输出显示。(3)添加学生时必须输入完整的信息:学号、姓名、班级、五门科目成绩,从而进行下续操作。(4)根据每位学生的成绩根据本校学生手册规定,计算出每位同学成绩绩点,并依据绩点大小对学生进行排序后输出学生成绩单。(5)根据得出的学生成绩单,根据本校的学生手册规定计算出获得奖学金的人数,并输出显示,最后将该名单通过流写入到文件中。第2章概要设计2.1程序的界面设计根据课题要求,整个程序按功能可划分为学生信息编辑、学生成绩单、各分数段学生信息、奖学金同学名单四个主要模块。除上述主要功能模块之外,为更好地提供程序的人机交互能力,程序还应提供退出程序、窗口最大最小化。程序各功能模块的划分及主要结构如图2-1所示。(开始)显示主界面/学生猛息/学藕绩/奖及获相编辑?/信亨?/?yI助添加学生奖学金获得者图2-1这个程序功能流程2.2存储学生容器的选择我们知道在现实学校中,每个同学都具有独一无二的学号与之对应,找到学号便找到相对应的学生,根据这个特点选择集合HashMap来存储输入系统的学生。无论什么时候想要使用学生信息,找到学生的学号便可查找到该学生。为了更加的简化程序和其他功能更简便的拿到学生信息,将学生学号再用集合ArrayList存储,这样在A门'ayList拿到学生学号,便可在HaShMaP快速找到对应的学生。每个学生都具有班级、学号、姓名、各科成绩、成绩总绩点等属性,在集合中通过学生总绩点的大小将集合中的元素进行排列,以便输出学生成绩单、奖学金名单。集合HashMap和集合ArrayList存储信息的具体形式如下图所示。学号:151617姓名:张三李四王五马七赵四李东2.3输入数据合法性的检测及初步处理每位同学都具有班级、学号、姓名五门课程的成绩,所以在输入学生信息是必须符合现实实际的情况来填写。班级、学号、姓名的属性为字符串,且长度控制在O12,而每门课的成绩应为double类型的数据,在输入信息室的他们的取值范围为0IO0当输入学生信息后进行动作处理时,当在类的监听机制中发现输入的信息不符合规定的要求,程序会立即跳出提示性窗口,提示用户输入的信息不符合要求,提醒用户重新输入正确规范的信息。2.4各个功能实现的描述2.4.1添加学生点击学生信息编辑菜单选择添加学生,在跳出的添加界面填写想要学生信息,点击“添加”按钮。如果用户所要添加的学生已经存在,此时该程序会跳出提示性窗口提示用户学生已存在,不用再次添加;如果添加的学生不存在,该程序也会跳出提示性窗口,提示用户该学生信息是否添加进程序。2.4.2查询学生点击学生信息编辑菜单选择查询学生信息,用户在跳出的查询界面输入想要查询学生额学号,然后点击按钮“查询”。如果该程序中存在用户所要查询的学生,此时该界面中会将该学号对应的学生信息显示出来;如果不存在该学生,程序会跳出提示性窗口,提示用户所要查询的学生不存在于本程序中。2.4.3修改学生信息点击学生信息编辑菜单选择修改学生信息,再挑出的修改信息界面输入想要修改的学生学号,点击按钮“开始修改”。如果该学号对应学生不存在,程序会跳出提示性窗口提示用户该学生不存在该程序中;如果该学号存在点击按钮后程序会将该学生信息显示在出来,用户将想要修改的信息修改完成之后,点击按钮“录入修改”。该程序会再次跳出提示性窗口,提示用户是否确定修改该学生信息。2.4.4删除学生点击学生信息编辑菜单选择删除学生,用户在跳出的查询界面输入想要删除学生学号,然后点击按钮“删除”。如果该程序中存在用户所要删除的学生,此时该程序会跳出提示性窗口,提示用户是否确定删除该学生;如果不存在该学生,程序也会跳出提示性窗口,提示用户所要查询的学生不存在于本程序中。2.4.5显示所有学生成绩单点击学生成绩信息菜单选择本学期学生成绩单,将会主窗口的面板中以表格的形式显示出添加到程序中的所有学生信息,而且该表格具有垂直下滚动条,不会出现输入该程序中的学生太过,不能完全显示出来2.4.6显示各分数段的学生信息点击学生成绩信息菜单选择本学期学生成绩单,将会主窗口的面板中以表格的形式显示出添加到程序中的所有学生信息,而且该表格具有垂直下滚动条,不会出现输入该程序中的学生太过而不能完全显示出来2.4.7输出获得奖学金学生名单并写入文件中点击学生奖学金获得者菜单后选择奖学金获得的学生,将在主窗口的面板中以表格的形式显示出各等级奖学金学生的信息。规定一等奖学金的比例为5%,二等奖学金的比例为10%,三等奖学金的比例为15%,按比例算出的人数若出现带小数的情况,则按四舍五入处理。通过计算程序中的人数来间接计算奖学金人数,并输出在表格中。第3章程序功能的实现3.1 主界面的实现窗口中央显示“奖学金评定系统”,开门见山直接指出该程序为奖学金评定系统。主界面中的有功能菜单供用户选择,然后根据用户选择的菜单项,调出相应的功能界面,输出该项功能的结果。主界面采用卡片式布局方式,所以各个功能界面的结果都显示主界面中央面板中,想那事如何由用户选择。主界面的布局设计的代码实现如下:informationForm=newHashMap<String,StudentX);建立集合menuBar=newJMenuBarO;add=newJMenUlIem("添加学生基本信息”);modify=newJMenUIlen1("修改学生基本信息”);search=newJMenUItem("查询学生基本信息“);delete=newJMenuIlem("删除学生基本信息”);informationMenu=newJMenu("学生信息编辑”);informationMenu.add(add);informationMenu.add(search);informationMenu.add(modify);informationMenu.add(delete);menuBar.add(informationMenu);ScoreMenu=newJMenu("学生成绩信息”);chengjidan=newJMenUlIem(本学期学生成绩单”);fenshuduan=newJYenUIten1(“各分数段学生信息”);ScoreMenu.add(chengjidan);scoreMenu.add(fenshuduan);ScholarMenu=newJMenu("奖学金获得者”);menuBar.add(scoreMenu);jiangxuejin-newJMenuItem(“奖学金获得的学生”);ScholarMenu.add(jiangxuejin);menuBar.add(schoIarMenu);heIpMenu=newJMenU("帮助”);menuBar.add(heIpMenu);SetJMenuBar(menuBar);label=newJLabel("欢迎使用学生奖学金评定系统",JLabel.CENTER);IabeLSetFont(newFont("TimesRoman”,Font.BOLD,34);label.SetForeground(Color.RED);add.addActionListener(this);modify.addActionListener(this);search.addActionListener(this);delete.addActionListener(this);chengjidan.addActionListener(this);fenshuduan.addActionListener(this);jiangxuejin.addActionListener(this);card=newCardLayout();pCenter=newJPanel();pCenter.SetLayout(card);file=newFile("D:Source.dat);informationAdd=newAdd(file);informationModify=newModify(file);informatiOnSearch=newSearch(this,file);InformationDelete=newDelete(file);PCenter.add("欢迎与界面“,label);PCenter.add("添加界面",informationAdd);PCenter.add("修改界面",informationModify);PCenter.add("删除界面",informationDelete);SetTitle("上海电机学院-奖学金评定系统”);add(pCenter,BorderLayout.CENTER);SetDefaultcioseOperation(JFrame.EXTT_ON_CLOSE);SetBounds(400,120,550,480);setVisible(true);3.2 各个功能界面的实现3.2.1添加学生界面的实现添加学生界面实现的代码如下:if(banji.getText().IengthO>0&&xuehao.getText().IengthO>0&&xingming.getText().IengthO>0&&java.getText().length()>0&&gaoshu.getText().IengthO>0&&daying.getText().IengthO>0&&wuli.getText().length()>0&&mazhe.getText().IengthO>0)Stringm=基本信息将被添加!;intok=JOptionPane.ShowConfirmDialog(this,m,“确认”,JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.INFORMATION_MESSAGE);if(ok=JOptionPane.YES_OPTION)Stringclasses=banji.getText();StringStuNumber=xuehao.getText();Stringname=xingming.getText();Stringjava语言=java.getText();Stringmath=gaoshu.getText();Stringenglish=daying.getText();Stringphysic=wuli.getText();Stringmarks=mazhe.getText();Stringsex=null;if(man.isSelected()sex=man.getText();)elsesex=woman.getText();)student=newStudent();student.setClass(classes);student.SetNumber(stuNumber);student.SetName(name);student.SetJaVa(java语言);student.setMath(math);student.setEnglish(english);student.SetPhysic(physic);student.setMarks(marks);student.setSex(sex);student.SetGiPointSuml(student.giPointSum(Double.parseDouble(student,getJava(),Double.parseDouble(student.getMath(),Double.parseDouble(student.getEnglish(),Double.parseDouble(student.getPhysic(),Double.parseDouble(student.getMarks();3.2.2查询学生界面的实现查询学生信息的代码实现如下:if(informationForm.ContainsKey(number)/如果该学号对应的StUdent基本信息存在Studentstu=infOrmationForm.get(number);返回指定键所映射的值对象xingming.setText(stu.getName();banji.setText(stu.getClasses();java.setText(stu.getJava();gaoshu.setText(stu.getMath();daying.setText(stu.getEnglish();wuli.setText(stu.getPhysic();mazhe.setText(stu.getMarksO);if(StU.getSex().3。一卜("男")man.SetSelected(true);)elsewoman.SetSelected(true);)else否则当初警告对话框Stringwarning="该学生不存在!”;JOptionPane.ShowMessageDialog(this,warning,“警告”,JOptionPane.WARN!NGJIESSAGE);)3.2.3修改学生信息界面的实现修改学生信息界面实现的代码如下:if(infOrmationForm.ContainsKey(number)Stringquestion="您想修改他(她)的信息吗?“;JOptionPane.ShowMessageDialog(this,question,警告“,JOptionPane.QUESTIONJ<ESSGE);Stringm=该生基本信息将被修改;intok=JOptionPane.ShowConfirmDialog(this,m,确定“,JOptionPane.YES_NOOPTION,JoPlionPane.INFORMATION_MESSAGE);if(ok=JOptionPane.YESOPTION)Stringclasses=banji.getTextO;Stringname=xingming.getTextO;Stringjava语言=java.getTextO;Stringmath=gaoshu.getText();Stringenglish=daying.getTextO;Stringphysic=wuli.getText();Stringmarks=mazhe.getTextO;Stringsex=null;if(man.isSelected()sex=man.getText();)elsesex=woman.getText();)student=newStudent();student.setClass(classes);student.SetNumber(number);student.setName(name);student.setSex(sex);student.SetJaVa(java语言);student.setMath(math);student.setEnglish(english);student.SetPhysic(physic);student.setMarks(marks);student.SetGiPointSuml(student,giPointSum(Double.parseDouble(javai11言),Double.parseDouble(math)fDouble.parseDouble(english),Double.parseDouble(physic),Double.parseDouble(marks);try(outOne=newFiIeOutputStream(file);outTwo=newObjectOutputStream(outOne);informationForm.put(number,student);/将修改后的StUdent信息存入到散列表中outTwo.writeObject(informationForm);outTwo.close();outOne.close();banji.setText(nul1);xuehao.setText(null);xingming.setText(null);java.setText(null);gaoshu.setText(null);daying.setText(null);wuli.setText(null);mazhe.setText(nul1);catch(Exceptionee)System,out.println(ee);)elseif(ok=JOptionPane.NO_OPTTON)Iuruxiugai.SetEnabled(true);)3.2.4删除学生信息界面的实现删除界面的实现的主要代码如下:if(informationForm.ContainsKey(number)Studentstu=(Student)informationForm.get(number);xingming.setText(stu.getName();banji.setText(stu.getClasses();java.setText(stu.getJava();gaoshu.setText(stu.getMath();daying.setText(stu.getEnglish();wuli.setText(stu.getPhysicO);mazhe.setText(stu.getMarksO);if(StU.getSex().equals("男")wan.SetSelected(true);elsewoman.SetSelected(true);)Stringquestion=您想删除他(她)的信息吗?";JOptionPane.ShowMessageDialog(this,question,"警告",JOptionPane.QUESTlOxMESSAGE);Stringm="该生基本信息将被删除";intok=JOptionPane.ShowConfirmDialog(this,m,“确定”,JOptionPane.YES_NO_OPTION,JOptionPane.TNFORMATION_MESSAGE);if(ok=JOptionPane.YES_OPTION)informationForm.remove(number);3.2.5学生成绩单界面的实现学生成绩界面实现的主要代码如下:StuList=newArrayLiskStudentX);Set<String>set=informationForm.keySet();Iterator<String>it=set.iteratorO;while(it.hasNextO)Studentstu=informationForm.get(it.nextO);stuList.add(stu);)StringCOlunmName=“序号"班级",学号",姓名","Java","高数,大英”,物理,"马哲绩点”,;Stringrow=newStringEstuList.size()colunmName.length;intmin=0;for(inti=0;i<stuList.size()-1;i+)min=i;for(intj=i+1;j<stuList.size();j+)if(Double.parseDouble(stuList.get(j).giPointSuml)<Double.parseDouble(stuList.get(min).giPointSuml)min=j;)if(min!=i)Studenttmp=stuList.get(min);stuList.set(min,stuList.get(i);stuList.set(i,tmp);for(inti=0;i<stuList.size();i+)Studentstu=stuList.get(i);rowi0=i+l+”"rowi1=stu.getClasses();rowi2=stu.getNumberO;rowi3=stu.getName();rowi4=stu.getJava();rowi5=stu.getMath();rowi6=stu.getEnglish();rowi7=stu.getPhysic();rowi8=stu.getMarks();rowi9=stu.giPointSuml;)table=newJTabIe(row,colunmName);JScrollPanejsp=newJScrol!Pane(table);add(jsp);3.2.6各分数段学生信息界面的实现各分数段学生信息界面实现的主要代码如下:for(inti=0;i<stuList.size();i+)Studentstu=stuList.get(i);rowi0=rowi1=stu.getClassesO;rowi2=stu.getNumber();rowi3=stu.getNameO;rowi4=stu.getJava();rowi5=stu.getMathO;rowi6=stu.getEnglish();rowi7=stu.getPhysic();rowi8=stu.getMarksO;doubled=(Double.parseDouble(stu.getJavaO)+Double.parseDouble(stu.getMath()+Double.parseDouble(stu.getEnglish()+Double.parseDouble(stu.getPhysicO)+Double.parseDouble(stu.getMarks()5;rowi9="+d;table=newJTabIe(row,colunmName);JScrollPanejsp=newJScrol!Pane(table);add(jsp);)3.2.7奖学金学生名单界面的实现奖学金学生名单界面实现的主要代码如下:StuList=newArrayList<Student>();Set<String>set=InformationForm.keySet();Iterator<String>it=set.iteratorO;while(it.hasNextO)Studentstu=(Student)informationForm.get(it.nextO);stuList.add(stu);stuList=sort(stuList);row=getRow();table=newJTable(row,colunmName);JScrollPanejsp=newJScrolIPane(table);add(jsp,BorderLayout.CENTER);publicStringgetRow()inta=(int)(Math,round(double)stuList.sizeO*5/100);intb=(int)(Math,round(double)stuList.sizeO*10/100);intc=(int)(Math,round(double)stuList.size()*15/100);System,out.println(a);System,out.println(b);System,out.println(c);System,out.println(stuList);ScholarNum=a+b+c;row=newStringscholarNumcolunmName.length;inti,j;Filef=newFile(,D:Bonus.datz,);for(i=stuList.sizeO-1,j=O;i>=stuList.size()-a;i-,j+)Studentstu=(Student)stuList.get(i);rowj0=1+j+rowj1=stu.getClasses();rowj2=stu.getNumber();rowj3=stu.getName();rowj4=stu.giPointSuml;rowjH5=一等奖;try(infOrmationForm.put(stu.getNumbcr(),stu);out0ne=newFiIeOutputStream(f);outTWo=newObjectOutputStream(out0ne);outTWo.WriteObject(informationForm);outOne.close();outTWo.closeO;catch(Exceptionee)System,out.println(ee);)for(;i>=stuList.size()-a-b;i-,j+)Studentstu=(Student)stuList.get(i);rowj0=1+j+”"rowj1=stu.getClassesO;rowj2=stu.getNumber();rowj3=stu.getName();rowj4=stu.giPointSuml;rowj5="二等奖;try(outOne=newFiIeOutputStream(f);outTWo=newObjectOutputStream(outOne);informationForm.put(stu.getNumber(),stu);outTWo.writebject(informationForm);outOne.closeO;outTWo.closeO;catch(Exceptionee)System,out.println(ee);)for(;i>=stuList.sizeO-a-b-c;i-,j+)Studentstu=(Student)stuList.get(i);rowj0=1+j+""rowj1=stu.getClassesO;rowj2=stu.getNumberO;rowj3=stu.getNameO;rowj4=stu.giPointSuml;rowj5="三等奖”;try(outOne=newFiIeOutputStream(f);outTWo=newObjectOutputStream(outOne);informationForm.put(stu.getNumber(),stu);outTWo.writebject(informationForm);outOne.closeO;outTWo.closeO;catch(Exceptionee)System,out.println(ee);)returnrow;)第4章调试及发现问题的解决在开始编写程序的过程中遇到很多问题,如采用怎样的界面布局方式?数据如何存储?数据如何从文件读到程序中又如何从程序中写到文件里面去?各个功能时该如何实现?但是通过询问班级里成绩较好的同学、到图书馆查找书籍、网上提问问题等方式下,通过这些途径最终遇到的问题都一一解决了。下面接受啊程序实现及调试过程中遇到的主要问题和解决方法如下。程序如何存储用户输入的学生信息?解决方案:因为每个学生都有自己独一无二的学号,即一个学号对应一个一个学生,根据这个我们使用集合HaShMaP来存储学生,集合HaShMaP的键值对分别存储学生的学号、姓名,同时每个学生作为一个对象来存储。将每个学生的班级、姓名、学号、以及五门课的考试成绩等属性封装成一个学生对象来使用和存储。在学生信息查询、修改、删除、学生成绩单等各个功能都是通过遍历集合,逐个拿到存储在集合中的学生对象,学生对象通过调用学生类中描述的方法来获取显示学会生的基本信息,完成各项功能。2、该系统采用哪种布局使得程序正常运行?解决方案:该程序需要使用GUl来完成,但是GUl也是本学期刚学,自己还不能把学习知识的灵活运用,只知道布局方式用流式布局、边界式布局、卡片式布局等,于是自己查阅有关JaVa的书籍,通过分析书上给出的例题和已实现的程序,觉得卡片式布局很方便和简单,于是自己便借鉴给出的例题来完成本系统的设计。通过卡片式布局只需在主窗口的中心面板中对菜单分别监听,用户点击不同菜单便这主窗口显示出来。3、程序运行的过程中,需要及时将输入到系统的学生信息保存到文件中,当需要使用学生对象时,再将学生信息从文件中读入到程序中进行使用,那么学生信息如何写到文件中又如何写入到程序中继续使用呢?解决方案:本学期我们已经学习了如何实现文件的读入写出,而且该程序要求实现文件的读入写出恰好用IO这章的知识点。但是到底使用哪一种流呢?是选择节点流还是选择处理流呢?在节流、处理流中又该选择哪一种呢?一开始自己还是比较矛盾不知道如何选择,但是既然自己前面使用的是集合HaShMap,而且存储的内容是学生对象,通过遍历结合将学生信息写入到文件中,到需要显示成绩单、奖学金名单是再将文件中的信息读入到集合HaShMaP中,再是通遍历集合来获取学生信息。但是,在将程序中的信息写入到指定文件和将文件信息读入到程序中分别使用序列化和反序列化的知识。序列化是是指将集合中的每个学生对象作为一个对象直接写入到指定文件中,而反序列化则是相反。所以,在我编写的程序中使用节点流FileInputSream、FileOutputStrea和处理流ObjectInputStreamObjectOutputStream来实现该程序中的要求。第5章程序测试及分析5.1主界面的测试界面运行程序,首先显示程序主菜单,列出学生信息编辑、学生成绩信息、奖学金获得者、帮助。如下图5-1所示上海电机学院-奖学金评定系统学生信息编辑学生成绩信息奖学金获得者帮助欢迎使用学生奖学金评定系统图5-1系统主界面5.2学生信息编辑菜单5.2.1添加学生基本信息选择学生信息编辑菜单中的添加学生,在跳出的面板中填写用户准备添加到程序中学生信息,在所有的信息填写完全之后,点击添加按钮。如下图所示图5-2添加学生5.2.2查询学生基本信息在学生信息编辑菜单下选择查询学生信息,用户在跳出来的新窗口中输入要查询的学生的学号,点击按钮查询即可。如下图所示。图上海电机学院-奖学金评定系统学生信息编辑学生成绩信息奖学金获得者帮助学金:-1ffiSia对话框输入要查间的学号:26查询班级:软件1412姓名:张三性别:男O女添加重置5-3查询学生信息523修改学生基本信息