求大神看看这个程序是怎么了?编译没错,但是运行结果出错

弈剑听雨阁小生 2013-06-09 09:18:48
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.text.DecimalFormat;
import java.util.Scanner;

//课程类
class Course {
private int direct; //课程学分
private String name; //课程名
public Course(){}
public Course(String name,int direct)
{
this.name = name;
this.direct = direct;
}
public int getDirect() {
return direct;
}
public String getName() {
return name;
}

public void setDirect(int direct) {
this.direct = direct;
}
public void setName(String name) {
this.name = name;
}

}
class Student {
private String id;
private String name;
private Course[] myCous; //每个学生的课程列表---由运行时动态输入
private float[] score;
public void setAveS(String aveS) {
}
public Student() {}
public Student(String name, String id) {
this.name = name;
this.id = id;
}
public double getAveS() {
float aves = 0f;
for(int i=0; i<myCous.length; i++) {
aves += score[i];
}
aves = (aves/score.length);
return aves;
}
public String getId() {
return id;
}
public Course[] getMyCous() {
return myCous;
}
public String getName() {
return name;
}
public void setId(String id) {
this.id = id;
}
public void setMyCous(Course[] myCous) {
this.myCous = myCous;
}
public void setName(String name) {
this.name = name;
}
public float[] getScore() {
return score;
}
public void setScore(int i) {
this.score = new float[i];
}
public void setScore(float[] score) {
this.score = score;
}
}
public class test {
static Course[] cous;
final static int STUNUM = 10;
static Student[] stus;
public static void main(String[] args) throws Exception {
setInfo();
storeInfoToStuTxt();
readInfoFromTxt();
fun1();
storeInfoToStuScore();
fun2();
}
//输入相关信息
public static void setInfo() {
@SuppressWarnings("resource")
Scanner in = new Scanner(System.in);
stus = new Student[STUNUM];
System.out.println("请输入一共有多少课程: ");
int cousNum = Integer.parseInt(in.nextLine()); //课程总数
cous = new Course[cousNum];
System.out.println("请输入每门课程的名字及学分: ");
for(int i=0; i<cousNum; i++) {
String info = in.nextLine();
String[] infos = info.split(" ");
cous[i] = new Course(infos[0],Integer.parseInt(infos[1]));
}
System.out.println("请输入10名学生的姓名、学号,各科目成绩,顺序为 "+showAllCourse2()+": ");

//设置学生姓名 学号 课程成绩
for(int i=0; i<STUNUM; i++) {
String info = in.nextLine();
String[] infos = info.split(" ");
stus[i] = new Student(infos[0],infos[1]);
Course[] myC = stus[i].getMyCous();
myC = new Course[cousNum];
float[] myScore = stus[i].getScore();
myScore = new float[cousNum];
for(int j = 0;j < cousNum;j++)
{
myC[j] = new Course(cous[j].getName(),cous[j].getDirect());
myScore[j] = Float.parseFloat(infos[j+2]);
}
stus[i].setMyCous(myC);
stus[i].setScore(myScore);
}
}
//--------------------------------------------------->
//找寻课程位置
public static int matchCourse(String order) {
int where = -1; //获得命令课程的序号
for(int i=0; i<cous.length; i++) {
if(cous[i].getName().equals(order)) {
where = i;
break;
} else {
continue;
}
}
if(where==-1) {
System.out.println("没有该课程!");
System.exit(0); //退出。 ---可设置为重新输入
}
return where;
}
//排序方法fun1()
public static void fun1() {
@SuppressWarnings("resource")
Scanner in = new Scanner(System.in);
System.out.println("请输入排序课程名及排序顺序: ");
String order = in.nextLine();
String[] or = order.split(" "); //获得命令
int where = -1; //获得命令课程的序号
for(int i=0; i<cous.length; i++) {
if(cous[i].getName().equals(or[0])) {
where = i;
break;
} else {
continue;
}
}
if(where==-1) {
System.out.println("没有该课程!");
System.exit(0); //退出。 ---可设置为重新输入
}
if(or[1].equals("降")) {
for(int i=0; i<stus.length-1; i++) {
for(int j=i+1; j<stus.length; j++) {
if(stus[i].getScore()[where]<stus[j].getScore()[where]) {
Student s = new Student();
s = stus[i];
stus[i] = stus[j];
stus[j] = s;
}
}
}
}
else if(or[1].equals("升")) {
for(int i=0; i<stus.length-1; i++) {
for(int j=i+1; j<stus.length; j++) {
if(stus[i].getScore()[where]>stus[j].getScore()[where]) {
Student s = new Student();
s = stus[i];
stus[i] = stus[j];
stus[j] = s;
}
}
}
}
System.out.println("排序完成!");
}
public static void storeInfoToStuScore() throws Exception {
File file = new File("F:"+File.separator+"score.txt");
FileOutputStream fos = new FileOutputStream(file);
fos.write(("名次"+"\t"+"姓名"+"\t"+"学号"+showAllCourse()+"\t"+"平均分").getBytes());
fos.write('\r');
fos.write('\n');
DecimalFormat df = new DecimalFormat("00.0");
for(int i=0; i<stus.length; i++) {
fos.write(("第"+(i+1)+"名"+"\t"+stus[i].getName()+"\t"+stus[i].getId()+"\t"+showAllScore(i)+(df.format(stus[i].getAveS()))).getBytes());
fos.write('\r');
fos.write('\n');
}
fos.close();
System.out.println("写入成功,请查看!");
}
//读取数据 student.txt
public static void readInfoFromTxt() throws Exception {
stus = new Student[STUNUM];
FileReader fr = new FileReader("F:"+File.separator+"student.txt");
BufferedReader br = new BufferedReader(fr);
String read = null;
int cNum = 0; //课程数
String[] res = null; //一行结果
if((read=br.readLine())!=null) {
res = read.split("\t");
cNum = (res.length-2)/2;
} else {
System.out.println("文件无效!"); //获得课程数目
System.exit(0);
}
cous = new Course[cNum];
for(int i=0; i<cNum; i++) {
Course c = new Course();
cous[i] = c;
cous[i].setName(res[2*i+2]);
// //设置课程名字
}
System.out.println("总共有下列课程:");
for(int i=0; i<cNum; i++) {
System.out.println(cous[i].getName());
}
int num=0;
while((read=br.readLine())!=null) {
res = read.split("\t");
for(int j=0; j<cNum; j++) {
Student s = new Student();
stus[num] = s;
stus[num].setName(res[0]);
stus[num].setId(res[1]);
stus[num].setScore(cNum);
stus[num].getScore()[j] = Float.parseFloat(res[2*j+2]); //------>此处读取正常 写出错误!
cous[j].setDirect(Integer.parseInt(res[2*j+3]));
}
stus[num].setMyCous(cous);
num++;
}
br.close();
fr.close();
System.out.println("读取完毕");
}
//二分法查询
public static void fun2() {
@SuppressWarnings("resource")
Scanner in = new Scanner(System.in);
System.out.println("请输入需要查询成绩的科目:");
String cName = null;
cName = in.nextLine(); //读入课程名
int index = matchCourse(cName); //课程名位置,若没有则退出!
for(int i=0; i<stus.length-1; i++) {
for(int j=i+1; j<stus.length; j++) {
if(stus[i].getScore()[index]>stus[j].getScore()[index]) {
Student s = new Student();
s = stus[i];
stus[i] = stus[j];
stus[j] = s;
}
}
}
float allScore[] = new float[stus.length]; //存储需要查询的某门课所有成绩
for(int i=0; i<allScore.length; i++)
allScore[i] = stus[i].getScore()[index];
System.out.println("请输入需要查询的分数: ");
String sc = in.nextLine();
float scores = Float.parseFloat(sc);
int index2 = binarySearch(allScore, scores); // 获得该成绩人员排名
if(index2==-1)
System.out.println("没有该成绩!");
else {
System.out.println(stus[index2].getName()+"\t"+stus[index2].getId()+"\t"+stus[index2].getMyCous()[index].getName()+"\t"+
stus[index2].getScore()[index]);
}
}
//二分查找 fun2核心
public static int binarySearch(float[] srcArray,float des){
int low=0;
int high=srcArray.length-1;
while(low<=high) {
int middle=(low+high)/2;
if(des==srcArray[middle]) {
return middle;
}else if(des<srcArray[middle]) {
high=middle-1;
} else {
low=middle+1;
}
}
return -1;
}
//存储相关信息
public static void storeInfoToStuTxt() throws Exception {
File file = new File("F:"+File.separator+"student.txt");
FileOutputStream fos = new FileOutputStream(file);
fos.write(("姓名"+"\t"+"学号"+showAllCourse()).getBytes());
fos.write('\r');
fos.write('\n');
for(int i=0; i<stus.length; i++) {
fos.write((stus[i].getName()+"\t"+stus[i].getId()+"\t"+showAllScore(i)).getBytes());
fos.write('\r');
fos.write('\n');
}
fos.close();
System.out.println("写入完毕,请查看!");
}
public static String showAllScore(int num) {
String str = "";
for(int i=0; i<cous.length; i++) {
str += (stus[num].getScore()[i]+"")+"\t"+(stus[num].getMyCous()[i]).getDirect()+"\t";
}
return str;
}
//显示所有课程名称排列(后缀"学分")
public static String showAllCourse() {
String courses = "";
for(int i=0; i<cous.length; i++) {
courses += "\t"+cous[i].getName()+"\t"+"学分";
}
return courses;
}
public static String showAllCourse2() {
String courses = "";
for(int i=0; i<cous.length; i++) {
courses += cous[i].getName()+"\t";
}
return courses;
}
//显示科目及成绩列表
public static String showAllCourseByStudent(int j) {
String stuCourse = "";
for(int i=0; i<cous.length; i++) {
stuCourse += (stus[j].getMyCous())[i].getName()+"\t"+(stus[j].getScore())[i]+"\t";
}
return stuCourse;
}
//显示所有学生相关信息
public static void showInfo() {
String stuInfo = "";
for(int i=0; i<STUNUM; i++) {
stuInfo = stus[i].getName()+"\t"+stus[i].getId()+"\t"+showAllCourseByStudent(i);
System.out.println(stuInfo);
}
}
}
...全文
114 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
JavaSery 2013-06-09
  • 打赏
  • 举报
回复
什么错误呢???
「已注销」 2013-06-09
  • 打赏
  • 举报
回复
问题出在readInfoFromTxt的stus[num].getScore()[j] = Float.parseFloat(res[2*j+2]); 改成下面的形式即可
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.text.DecimalFormat;
import java.util.Scanner;

//课程类
class Course {
	private int direct; // 课程学分
	private String name; // 课程名

	public Course() {
	}

	public Course(String name, int direct) {
		this.name = name;
		this.direct = direct;
	}

	public int getDirect() {
		return direct;
	}

	public String getName() {
		return name;
	}

	public void setDirect(int direct) {
		this.direct = direct;
	}

	public void setName(String name) {
		this.name = name;
	}

}

class Student {
	private String id;
	private String name;
	private Course[] myCous; // 每个学生的课程列表---由运行时动态输入
	private float[] score;

	public void setAveS(String aveS) {
	}

	public Student() {
	}

	public Student(String name, String id) {
		this.name = name;
		this.id = id;
	}

	public double getAveS() {
		float aves = 0f;
		for (int i = 0; i < myCous.length; i++) {
			aves += score[i];
		}
		aves = (aves / score.length);
		return aves;
	}

	public String getId() {
		return id;
	}

	public Course[] getMyCous() {
		return myCous;
	}

	public String getName() {
		return name;
	}

	public void setId(String id) {
		this.id = id;
	}

	public void setMyCous(Course[] myCous) {
		this.myCous = myCous;
	}

	public void setName(String name) {
		this.name = name;
	}

	public float[] getScore() {
		return score;
	}

	public void setScore(int i) {
		this.score = new float[i];
	}

	public void setScore(float[] score) {
		this.score = score;
	}
}

public class Test {
	static Course[] cous;
	final static int STUNUM = 2;
	static Student[] stus;

	public static void main(String[] args) throws Exception {
		setInfo();
		storeInfoToStuTxt();
		readInfoFromTxt();
		fun1();
		storeInfoToStuScore();
		fun2();
	}

	// 输入相关信息
	public static void setInfo() {
		Scanner in = new Scanner(System.in);
		stus = new Student[STUNUM];
		System.out.println("请输入一共有多少课程: ");
		int cousNum = Integer.parseInt(in.nextLine()); // 课程总数
		cous = new Course[cousNum];
		System.out.println("请输入每门课程的名字及学分: ");
		for (int i = 0; i < cousNum; i++) {
			String info = in.nextLine();
			String[] infos = info.split(" ");
			cous[i] = new Course(infos[0], Integer.parseInt(infos[1]));
		}
		System.out.println("请输入10名学生的姓名、学号,各科目成绩,顺序为 " + showAllCourse2()
				+ ": ");

		// 设置学生姓名 学号 课程成绩
		for (int i = 0; i < STUNUM; i++) {
			String info = in.nextLine();
			String[] infos = info.split(" ");
			stus[i] = new Student(infos[0], infos[1]);
			Course[] myC = stus[i].getMyCous();
			myC = new Course[cousNum];
			float[] myScore = stus[i].getScore();
			myScore = new float[cousNum];
			for (int j = 0; j < cousNum; j++) {
				myC[j] = new Course(cous[j].getName(), cous[j].getDirect());
				myScore[j] = Float.parseFloat(infos[j + 2]);
			}
			stus[i].setMyCous(myC);
			stus[i].setScore(myScore);
		}
	}

	// --------------------------------------------------->
	// 找寻课程位置
	public static int matchCourse(String order) {
		int where = -1; // 获得命令课程的序号
		for (int i = 0; i < cous.length; i++) {
			if (cous[i].getName().equals(order)) {
				where = i;
				break;
			} else {
				continue;
			}
		}
		if (where == -1) {
			System.out.println("没有该课程!");
			System.exit(0); // 退出。 ---可设置为重新输入
		}
		return where;
	}

	// 排序方法fun1()
	public static void fun1() {
		Scanner in = new Scanner(System.in);
		System.out.println("请输入排序课程名及排序顺序: ");
		String order = in.nextLine();
		String[] or = order.split(" "); // 获得命令
		int where = -1; // 获得命令课程的序号
		for (int i = 0; i < cous.length; i++) {
			if (cous[i].getName().equals(or[0])) {
				where = i;
				break;
			} else {
				continue;
			}
		}
		if (where == -1) {
			System.out.println("没有该课程!");
			System.exit(0); // 退出。 ---可设置为重新输入
		}
		if (or[1].equals("降")) {
			for (int i = 0; i < stus.length - 1; i++) {
				for (int j = i + 1; j < stus.length; j++) {
					if (stus[i].getScore()[where] < stus[j].getScore()[where]) {
						Student s = new Student();
						s = stus[i];
						stus[i] = stus[j];
						stus[j] = s;
					}
				}
			}
		} else if (or[1].equals("升")) {
			for (int i = 0; i < stus.length - 1; i++) {
				for (int j = i + 1; j < stus.length; j++) {
					if (stus[i].getScore()[where] > stus[j].getScore()[where]) {
						Student s = new Student();
						s = stus[i];
						stus[i] = stus[j];
						stus[j] = s;
					}
				}
			}
		}
		System.out.println("排序完成!");
	}

	public static void storeInfoToStuScore() throws Exception {
		File file = new File("E:" + File.separator + "score.txt");
		FileOutputStream fos = new FileOutputStream(file);
		fos.write(("名次" + "\t" + "姓名" + "\t" + "学号" + showAllCourse()
						+ "\t" + "平均分").getBytes());
		fos.write('\r');
		fos.write('\n');
		DecimalFormat df = new DecimalFormat("00.0");
		for (int i = 0; i < stus.length; i++) {
			fos.write(("第" + (i + 1) + "名" + "\t" + stus[i].getName() + "\t"
					+ stus[i].getId() + "\t" + showAllScore(i) + (df
					.format(stus[i].getAveS()))).getBytes());
			fos.write('\r');
			fos.write('\n');
		}
		fos.close();
		System.out.println("写入成功,请查看!");
	}

	// 读取数据 student.txt
	public static void readInfoFromTxt() throws Exception {
		stus = new Student[STUNUM];
		FileReader fr = new FileReader("E:" + File.separator + "student.txt");
		BufferedReader br = new BufferedReader(fr);
		String read = null;
		int cNum = 0; // 课程数
		String[] res = null; // 一行结果
		if ((read = br.readLine()) != null) {
			res = read.split("\t");
			cNum = (res.length - 2) / 2;
		} else {
			System.out.println("文件无效!"); // 获得课程数目
			System.exit(0);
		}
		cous = new Course[cNum];
		for (int i = 0; i < cNum; i++) {
			Course c = new Course();
			cous[i] = c;
			cous[i].setName(res[2 * i + 2]);
			// //设置课程名字
		}
		System.out.println("总共有下列课程:");
		for (int i = 0; i < cNum; i++) {
			System.out.println(cous[i].getName());
		}
		int num = 0;
		
		while ((read = br.readLine()) != null) {
			float [] myScore = new float[cNum];
			res = read.split("\t");
			for (int j = 0; j < cNum; j++) {
				Student s = new Student();
				stus[num] = s;
				stus[num].setName(res[0]);
				stus[num].setId(res[1]);
				stus[num].setScore(cNum);
				myScore[j] = Float.parseFloat(res[2 * j + 2]);
				cous[j].setDirect(Integer.parseInt(res[2 * j + 3]));
			}
			stus[num].setMyCous(cous);
			stus[num].setScore(myScore);
			num++;
		}
		
		System.out.println(stus[0].getScore()[0]);
		
		br.close();
		fr.close();
		System.out.println("读取完毕");
	}

	// 二分法查询
	public static void fun2() {
		Scanner in = new Scanner(System.in);
		System.out.println("请输入需要查询成绩的科目:");
		String cName = null;
		cName = in.nextLine(); // 读入课程名
		int index = matchCourse(cName); // 课程名位置,若没有则退出!
		for (int i = 0; i < stus.length - 1; i++) {
			for (int j = i + 1; j < stus.length; j++) {
				if (stus[i].getScore()[index] > stus[j].getScore()[index]) {
					Student s = new Student();
					s = stus[i];
					stus[i] = stus[j];
					stus[j] = s;
				}
			}
		}
		float allScore[] = new float[stus.length]; // 存储需要查询的某门课所有成绩
		for (int i = 0; i < allScore.length; i++)
			allScore[i] = stus[i].getScore()[index];
		System.out.println("请输入需要查询的分数: ");
		String sc = in.nextLine();
		float scores = Float.parseFloat(sc);
		int index2 = binarySearch(allScore, scores); // 获得该成绩人员排名
		if (index2 == -1)
			System.out.println("没有该成绩!");
		else {
			System.out.println(stus[index2].getName() + "\t"
					+ stus[index2].getId() + "\t"
					+ stus[index2].getMyCous()[index].getName() + "\t"
					+ stus[index2].getScore()[index]);
		}
	}

	// 二分查找 fun2核心
	public static int binarySearch(float[] srcArray, float des) {
		int low = 0;
		int high = srcArray.length - 1;
		while (low <= high) {
			int middle = (low + high) / 2;
			if (des == srcArray[middle]) {
				return middle;
			} else if (des < srcArray[middle]) {
				high = middle - 1;
			} else {
				low = middle + 1;
			}
		}
		return -1;
	}

	// 存储相关信息
	public static void storeInfoToStuTxt() throws Exception {
		File file = new File("E:" + File.separator + "student.txt");
		FileOutputStream fos = new FileOutputStream(file);
		fos.write(("姓名" + "\t" + "学号" + showAllCourse()).getBytes());
		fos.write('\r');
		fos.write('\n');
		for (int i = 0; i < stus.length; i++) {
			fos.write((stus[i].getName() + "\t" + stus[i].getId() + "\t" + showAllScore(i))
							.getBytes());
			fos.write('\r');
			fos.write('\n');
		}
		fos.close();
		System.out.println("写入完毕,请查看!");
	}

	public static String showAllScore(int num) {
		String str = "";
		for (int i = 0; i < cous.length; i++) {
			str += (stus[num].getScore()[i] + "") + "\t"
					+ (stus[num].getMyCous()[i]).getDirect() + "\t";
		}
		return str;
	}

	// 显示所有课程名称排列(后缀"学分")
	public static String showAllCourse() {
		String courses = "";
		for (int i = 0; i < cous.length; i++) {
			courses += "\t" + cous[i].getName() + "\t" + "学分";
		}
		return courses;
	}

	public static String showAllCourse2() {
		String courses = "";
		for (int i = 0; i < cous.length; i++) {
			courses += cous[i].getName() + "\t";
		}
		return courses;
	}

	// 显示科目及成绩列表
	public static String showAllCourseByStudent(int j) {
		String stuCourse = "";
		for (int i = 0; i < cous.length; i++) {
			stuCourse += (stus[j].getMyCous())[i].getName() + "\t"
					+ (stus[j].getScore())[i] + "\t";
		}
		return stuCourse;
	}

	// 显示所有学生相关信息
	public static void showInfo() {
		String stuInfo = "";
		for (int i = 0; i < STUNUM; i++) {
			stuInfo = stus[i].getName() + "\t" + stus[i].getId() + "\t"
					+ showAllCourseByStudent(i);
			System.out.println(stuInfo);
		}
	}
}
  • 打赏
  • 举报
回复
哎,是输出和预期结果不一样,排序生成的score.txt里面科目一全部为0,平均分也有问题。
LCore 2013-06-09
  • 打赏
  • 举报
回复
楼主至少说明下报什么错误 编译没错的话,运行时报错了吗 抛什么异常, 或者输出和预期不一样?

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧