1. 根据提供的实验数据统计出学生的人数即文件的行数加1
2. 统计每门成绩优异的学生即成绩大于85,(由于文件随机产生的成绩有可能大于100的)
3. 统计每个学生的平均成绩,并将此成绩添加到文件的末尾一列
4. 按照学生的平时成绩对文件进行重新排序,将排好序的文件写入以自己班级为文件名的txt中在编写程序时要符合JavaDemo所给的接口进行编程,在提交程序时只有符合接口的程序才通过,即在不改动接口和主函数的情况下之间运行程序能够成功import java.util.ArrayList;
public interface GradeDispose {
/**
* 获得学生人数
* @return
*/
int getStudentCount();
/**
* 获得各科成绩优秀学生的人数
* @return
*/
ArrayList<Integer> getExcellentStudentCount();
/**
* 设置各学生的平均成绩
*/
void setAvgGrade();
/**
* 将学生按平时成绩排序
*/
void sortGrade();
}
public class Test {
GradeDispose gradeDispose;
public GradeDispose getGradeDispose() {
return gradeDispose;
} public Test(GradeDispose gradeDispose){
this.gradeDispose=gradeDispose;
}
/**
* @param args
*/
public static void main(String[] args) {
/**请新建一个实现了gradeDispose接口的类作为参数传入*/
Test t=new Test(gradeDispose);
t.getGradeDispose().getStudentCount();
t.getGradeDispose().getExcellentStudentCount();
t.getGradeDispose().setAvgGrade();
t.getGradeDispose().sortGrade(); }}
2. 统计每门成绩优异的学生即成绩大于85,(由于文件随机产生的成绩有可能大于100的)
3. 统计每个学生的平均成绩,并将此成绩添加到文件的末尾一列
4. 按照学生的平时成绩对文件进行重新排序,将排好序的文件写入以自己班级为文件名的txt中在编写程序时要符合JavaDemo所给的接口进行编程,在提交程序时只有符合接口的程序才通过,即在不改动接口和主函数的情况下之间运行程序能够成功import java.util.ArrayList;
public interface GradeDispose {
/**
* 获得学生人数
* @return
*/
int getStudentCount();
/**
* 获得各科成绩优秀学生的人数
* @return
*/
ArrayList<Integer> getExcellentStudentCount();
/**
* 设置各学生的平均成绩
*/
void setAvgGrade();
/**
* 将学生按平时成绩排序
*/
void sortGrade();
}
public class Test {
GradeDispose gradeDispose;
public GradeDispose getGradeDispose() {
return gradeDispose;
} public Test(GradeDispose gradeDispose){
this.gradeDispose=gradeDispose;
}
/**
* @param args
*/
public static void main(String[] args) {
/**请新建一个实现了gradeDispose接口的类作为参数传入*/
Test t=new Test(gradeDispose);
t.getGradeDispose().getStudentCount();
t.getGradeDispose().getExcellentStudentCount();
t.getGradeDispose().setAvgGrade();
t.getGradeDispose().sortGrade(); }}
String name;//姓名
String classnum;//班级
float grade1;//成绩1
float grade2;//成绩2
float grade3;//成绩3
float avg;//平均成绩
//一个构造函数,用来根据文件信息构造Student
Student(String name,String classnum,float grade1,float grade2,float grade3){
this.name=name;
this.classnum=classnum;
this.grade1=grade1;
this.grade2=grade2;
this.grade3=grade3;
}
//写文件时会用到
public String toString(){
return name+" "+classnum+" "+grade1+" "+ grade2+" "+grade3+" "+avg;
}}
import java.util.ArrayList;
import java.io.*;public class Grade implements GradeDispose {
public Grade() {
init();//调用init()函数,将文件中的学生信息读到内存方便以后操作
}
Student[] stu;//存放所有学生的信息
//将文件中的学生信息读到内存以数组形式存储
public void init() {
//首先创建一个存储学生信息的数组,他的大小通过getStudentCount()函数获得
stu = new Student[getStudentCount()];
int i = 0;
String str;
try {
BufferedReader br = new BufferedReader(new FileReader(
"Student.txt"));
while ((str = br.readLine()) != null) {
String temp;
String name;
String classnum;
float grade1;
float grade2;
float grade3;
//以空格为标记,把字符串分割成姓名、班级、各科成绩
int start = 0;
int end = str.indexOf(" ");
name = str.substring(start, end);
start = end + 1;
end = str.indexOf(" ", start);
classnum = str.substring(start, end);
start = end + 1;
end = str.indexOf(" ", start);
temp = str.substring(start, end);
grade1 = Float.valueOf(temp);
start = end + 1;
end = str.indexOf(" ", start);
temp = str.substring(start, end);
grade2 = Float.valueOf(temp);
start = end + 1;
temp = str.substring(start);
grade3 = Float.valueOf(temp);
//每一行学生信息构成一个学生实例,并加入到数组中
Student S = new Student(name, classnum, grade1, grade2, grade3);
stu[i] = S;
i++;
}
br.close();
} catch (IOException e) {
System.out.println("找不到文件Student.txt");
}
} public int getStudentCount() {
int count = 0;
try {
BufferedReader br = new BufferedReader(new FileReader(
"Student.txt"));
while (br.readLine() != null) {
count++;
}
} catch (IOException e) {
System.out.println("找不到文件Student.txt");
}
return count;
}
public ArrayList<Integer> getExcellentStudentCount() {
ArrayList<Integer> result = new ArrayList<Integer>();
int excellent1 = 0;
int excellent2 = 0;
int excellent3 = 0;
for (int i = 0; i < stu.length; i++) {
if (stu[i].grade1 > 85)
excellent1++;
if (stu[i].grade2 > 85)
excellent2++;
if (stu[i].grade3 > 85)
excellent3++;
}
result.add(new Integer(excellent1));
result.add(new Integer(excellent2));
result.add(new Integer(excellent3));
return result;
}
public void setAvgGrade() {
for (int i = 0; i < stu.length; i++) {
stu[i].avg = (stu[i].grade1 + stu[i].grade2 + stu[i].grade3) / 3;
}
}
public void sortGrade() {
// 冒泡排序
for (int i = 0; i < stu.length; i++) {
for (int j = 0; j < stu.length - i - 1; j++) {
if (stu[j].avg < stu[j + 1].avg) {
Student temp = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = temp;
}
}
}
// 按平均成绩写入相应的班级
for (int i = 0; i < stu.length; i++) {
try {
PrintWriter pw = new PrintWriter(new FileOutputStream(
stu[i].classnum + ".txt",true));
pw.println(stu[i].toString());
pw.close();
} catch (IOException e) {
e.printStackTrace();
} }
}}
import java.util.ArrayList;public class Test {
GradeDispose gradeDispose; public GradeDispose getGradeDispose() {
return gradeDispose;
} public Test(GradeDispose gradeDispose) {
this.gradeDispose = gradeDispose;
} /**
* @param args
*/
public static void main(String[] args) {
/** 请新建一个实现了gradeDispose接口的类作为参数传入 */
Grade gradeDispose=new Grade(); Test t = new Test(gradeDispose);
t.getGradeDispose().getStudentCount();
t.getGradeDispose().getExcellentStudentCount();
t.getGradeDispose().setAvgGrade();
t.getGradeDispose().sortGrade(); }}
再说明一下,我先设计了一个学生类,包含一下几个属性:姓名、班级、成绩1、成绩2、成绩3和平均成绩,这样在做排序,比较等操作时可以对学生类进行操作,不必麻烦的去读文件,缺点是增加了一个函数,用来把文件中的信息读到学生数组中。也许你不会赞同我的设计,希望能对楼主有所启发吧。