所用软件: JCreator Pro V4.5 参考资料: java API 实际用时:16-18小时 主要练习: 对文本文件的读写 java.io 正则表达式 String等 实现功能: 根据以下题目拓展而来 题目:有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,将原有的数据和计算出的平均分数存放在磁盘文件 "stud "中。 拓展1:文件名由用户输入 拓展2:学生数量不限 拓展3:可以对文件多次写入不影响以前的数据 拓展4:不单单计算当前输入的几个人的平均成绩,而是计算整个文件中所有学生的数据 拓展5:等待您的发现。。。 缺陷1:所有异常均未做处理 缺陷2:对文件读写的某些操作与程序耦合过密,可以单独成类以便调用 缺陷3:对学科数量未添加拓展 缺陷4:等待您的发现。。。 大量注释方便大家查看,希望各位有什么意见尽量提,大家共同进步 代码300多行,分段贴吧 Java code /** * @(#)studentAchievement.java * * * @author e_forrest * @version 1.00 2010/11/30 */ import java.io.*; import java.util.*; class Student{ private long id;//学号 private String name;//姓名 private int mathScore,engScore,musicScore;//数学,英语,音乐成绩 //构造函数 public Student(long id,String name,int mathScore,int engScore,int musicScore){ this.id=id; this.name=name; this.mathScore=mathScore; this.engScore=engScore; this.musicScore=musicScore; } //以下是自动生成的bean 获取和修改属性的方法 public void setId(long id) { this.id = id; } public void setName(String name) { this.name = name; } public void setMathScore(int mathScore) { this.mathScore = mathScore; } public void setEngScore(int engScore) { this.engScore = engScore; } public void setMusicScore(int musicScore) { this.musicScore = musicScore; } public long getId() { return (this.id); } public String getName() { return (this.name); } public int getMathScore() { return (this.mathScore); } public int getEngScore() { return (this.engScore); } public int getMusicScore() { return (this.musicScore); } //计算学生某门成绩平均数的函数 public int aveMath(Student[] stuArray){//数学平均成绩 int sum=0; for(Student stu: stuArray){ sum+=stu.mathScore; } return sum/stuArray.length; } public int aveEng(Student[] stuArray){//英语平均成绩 int sum=0; for(Student stu: stuArray){ sum+=stu.engScore; } return sum/stuArray.length; } public int aveMusic(Student[] stuArray){//音乐平均成绩 int sum=0; for(Student stu: stuArray){ sum+=stu.musicScore; } return sum/stuArray.length; } //重写toString()方法,格式化输出 public String toString() { String sep = System.getProperty("line.separator");//获取当前系统的换行符 StringBuffer buffer = new StringBuffer(); buffer.append(sep); buffer.append("id = "); buffer.append(id); buffer.append(sep); buffer.append("name = "); buffer.append(name); buffer.append(sep); buffer.append("mathScore = "); buffer.append(mathScore); buffer.append(sep); buffer.append("engScore = "); buffer.append(engScore); buffer.append(sep); buffer.append("musicScore = "); buffer.append(musicScore); buffer.append(sep); return buffer.toString(); } } //程序入口类 public class StudentAchievement{ private PrintWriter pw;//写入文件的输出流 private BufferedReader br;//读取用户输入的信息 public StudentAchievement() throws Exception{ } //写入文件头(如果文件存在,则什么也不做,如果文件不存在,则创建它,并写入文件头) public void writeHeadInfoToFile(File file) throws Exception{ if(!file.exists()){ pw=new PrintWriter(new BufferedWriter(new FileWriter(file,true)));//创建一条通往某个文件的输出流 pw.append("学生编号 "); pw.append("学生姓名 "); pw.append("数学成绩 "); pw.append("英语成绩 "); pw.append("音乐成绩 "); pw.append("/n"); pw.flush();//清空缓冲 pw.close();//关闭 } } //请用户输入一个学生的信息,并处理// public String[] pleaseInput()throws IOException{ System.out.println("请按/"学生编号 学生姓名 数学成绩 英语成绩 音乐成绩/" 的格式输入学生信息,各项信息之间请以空格分隔"); br=new BufferedReader(new InputStreamReader(System.in));//从命令行输入用户信息 String stuInfo=br.readLine().trim();//读取一行信息 //br.close(); return stuInfo.split("//s+");//用空白符将数据分开 } //将一个学生的信息存入Studernt数据中 public Student saveToStudent(String[] stuInfo){ Long id=Long.parseLong(stuInfo[0]); String name=stuInfo[1]; int mathScore=Integer.parseInt(stuInfo[2]); int engScore=Integer.parseInt(stuInfo[3]); int musicScore=Integer.parseInt(stuInfo[4]); return new Student(id,name,mathScore,engScore,musicScore); } //询问是否输入完毕,若输入y,继续输入,若输入其他字符,结束 public boolean isInputOver()throws Exception{ System.out.println("请问是否输入完毕?按任意键并回车结束录入,如需继续录入请输入 y 并回车"); br=new BufferedReader(new InputStreamReader(System.in));//从命令行输入用户信息 String flag = br.readLine().trim();//去掉用户不小心输入的空格 //br.close(); if(flag.equals("y")||flag.equals("Y")){ return false; }else return true; } //这一部分很重要,当我写完调试的时候,就是这里出现了问题,我没有判断是不是第一次输入信息 //写入一个学生的信息写入文件 public void writeStuToFile(Student stu,File file)throws Exception{ pw=new PrintWriter(new BufferedWriter(new FileWriter(file,true)));//创建一条通往某个文件的输出流,并且追加在文件末尾 LinkedList<String> allDate=this.readFile(file);//读入所有的数据 if(allDate.size()==1){//判断是不是第一次输入 appendToFileEnd(pw,stu); }else{ //判断最后一行是否为平均数 if(this.isAveLine(file)){//如果是,清除最后一行后才能追加 pw=new PrintWriter(new BufferedWriter(new FileWriter(file)));//没true重写 allDate.removeLast();//删除最后一行 for(String s:allDate){//将剩下的数据重新写进去 pw.append(s); pw.append("/n"); } appendToFileEnd(pw,stu);//最后追新的数据 }else{//如果不是直接追加到文件底部 appendToFileEnd(pw,stu); } } } //将学生信息直接追加到文件底部,此方法供writeStuToFile()调用 public void appendToFileEnd(PrintWriter pw,Student stu){ pw.append(String.valueOf(stu.getId())); pw.append(" "); pw.append(stu.getName()); pw.append(" "); pw.append(String.valueOf(stu.getMathScore())); pw.append(" "); pw.append(String.valueOf(stu.getEngScore())); pw.append(" "); pw.append(String.valueOf(stu.getMusicScore())); pw.append("/n"); pw.flush();//清空缓冲 pw.close();//关闭 } //将三门课平均数写入文件 public void writeAveToFile(File file,int[] aveArray)throws Exception{ LinkedList<String> allDate=this.readFile(file);//读入所有的数据 if(this.isAveLine(file)){//如果最后一行是平均数,那就要读入全部数据,把最后一行删掉,再加上新的数据 System.out.println("我执行了"); pw=new PrintWriter(new BufferedWriter(new FileWriter(file)));//没true重写 allDate.removeLast();//删除最后一行 allDate.add(" "+aveArray[0]+" "+aveArray[1]+" "+aveArray[2]); for(String s:allDate){ System.out.println(s); pw.append(s+"/n"); } pw.close(); }else{//如果不是,直接追加就可以了 pw=new PrintWriter(new BufferedWriter(new FileWriter(file,true)));//true追加 pw.append(" "+aveArray[0]+" "+aveArray[1]+" "+aveArray[2]+"/n"); pw.close(); } } //返回一个得出三个课平均数的数组,传给writeAveToFile()第二个参数 public int[] aveArray(File file)throws Exception{ LinkedList<String> ld=readFile(file);//读取file文本所有信息 if(this.isAveLine(file)){//如果最后一行是平均数,移除第一行和最后一行的数据 ld.removeFirst(); ld.removeLast(); return new int[]{ aveMath(ld),aveEng(ld),aveMusic(ld), }; }else{//如果最后一行不是平均数,只移除第一行的数据 ld.removeFirst(); return new int[]{ aveMath(ld),aveEng(ld),aveMusic(ld), }; } } //分别计算三个学科成绩平均数 public int aveMath(LinkedList<String> list){ int sum=0;//单科成绩之和 String[][] stuInfo=new String[list.size()][5];//创建一个存放各项数据的二位数组 for(int i=0;i<list.size();i++){ for(int j=0;j<5;j++) stuInfo[i][j]=(list.get(i).split("//s+"))[j];//这样都可以。靓了。。。 sum+=Integer.parseInt(stuInfo[i][2]);//第三列的是数学成绩 } return sum/list.size(); } public int aveEng(LinkedList<String> list){ int sum=0;//单科成绩之和 String[][] stuInfo=new String[list.size()][5];//创建一个存放各项数据的二位数组 for(int i=0;i<list.size();i++){ for(int j=0;j<5;j++) stuInfo[i][j]=(list.get(i).split("//s+"))[j];//这样都可以。靓了。。。 sum+=Integer.parseInt(stuInfo[i][3]);//第四列的是英语成绩 } return sum/list.size(); } public int aveMusic(LinkedList<String> list){ int sum=0;//单科成绩之和 String[][] stuInfo=new String[list.size()][5];//创建一个存放各项数据的二位数组 for(int i=0;i<list.size();i++){ for(int j=0;j<5;j++) stuInfo[i][j]=(list.get(i).split("//s+"))[j];//这样都可以。靓了。。。 sum+=Integer.parseInt(stuInfo[i][4]);//第五列的是音乐成绩 } return sum/list.size(); } //查看当前文件的最后一行是否为平均数,仅供aveStu()和writeAveToFile()两个方法调用 public boolean isAveLine(File file)throws Exception{ LinkedList<String> ld=readFile(file);//读取file文本所有信息 String[] stuInfo=ld.getLast().trim().split("//s+");//用空格符解析数据 if(Long.parseLong(stuInfo[0])>100){//如果第一个数是学号,那么肯定>100,而成绩则肯定<100 return false; }else return true; } //读取file文本所有信息,放入一个容器内,供上面几个函数使用 public LinkedList<String> readFile(File file) throws Exception{ br=new BufferedReader(new FileReader(file));//输入流读取文件 LinkedList<String> ld=new LinkedList<String>(); String s=""; do{ s=br.readLine(); if(s==null) break;//必须的,要不然会存入一个null ld.add(s); //System.out.println(s);//测试读入的数据 }while(s!=null); //br.close(); return ld; } //请用户自定义文件名 public String selfSetFileName()throws Exception{ System.out.println("请输入您想操作文件名,如果该文件不存在,我们将为您创建一个"); br=new BufferedReader(new InputStreamReader(System.in)); return br.readLine().trim(); } //程序测试 public static void main(String[] args) throws Exception{ StudentAchievement test=new StudentAchievement(); File file=new File(test.selfSetFileName());//请用户输入操做哪个文件 test.writeHeadInfoToFile(file);//写入文件头,如果文件存在则,不写 do{ test.writeStuToFile(test.saveToStudent(test.pleaseInput()),file);//输入信息 }while(!(test.isInputOver())); test.writeAveToFile(file,test.aveArray(file));//计算平均数 test.br.close(); } } 帖子讨论地址 http://topic.csdn.net/u/20101130/21/52d34654-c6c3-442d-88d7-a5bc23a9331b.html?861483557