import java.util.*;
public class test5_18 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
System.out.println("请输入学生的人数:");
int pnum=in.nextInt();
System.out.println("请输入课程数目:");
int knum=in.nextInt();
//存储学生姓名的数组
String[] pname=new String[pnum];
//存储课程的数组
String[] kname=new String[knum];
//二维数组总共pnum个学生,每个学生有knum门课程
int[][]all=new int[pnum][knum];
//总分数组
int[] sum=new int[pnum];
//平均分数组
int[] avg=new int[pnum];
//每个学生的分数信息字符串包括总分平均分
String[] str=new String[pnum];
for(int i=0;i<knum;i++){
System.out.println("请输入第"+(i+1)+"门课程是什么:");
kname[i]=in.next();
}
for(int i=0;i<pnum;i++){
int t=0;
String str1="";
System.out.println("请输入第"+(i+1)+"个学生的姓名:");
pname[i]=in.next();
for(int j=0;j<knum;j++){
System.out.println("请输入"+pname[i]+"的"+kname[j]+"的成绩:");
all[i][j]=in.nextInt();
t+=all[i][j];
str1+=all[i][j]+"\t";
}
sum[i]=t;
avg[i]=sum[i]/knum;
str[i]=pname[i]+"\t"+str1+sum[i]+"\t"+avg[i];
}
for(int i=0;i<pname.length-1;i++){
for(int j=0;j<pname.length-1;j++){
if(sum[j]<sum[j+1]){
/*如果不对总分排序那么全部顺序就不会改变为什么
int t=sum[j+1];
sum[j+1]=sum[j];
sum[j]=t;
*/
//根据总分大小对字符串排序
String t2=str[j+1];
str[j+1]=str[j];
str[j]=t2;
}
}
}
System.out.print("学生"+"\t");
for(int i=0;i<kname.length;i++){
System.out.print(kname[i]+"\t");
}
System.out.println("总分\t平均分\t排行榜");
for(int i=0;i<pnum;i++){
System.out.println(str[i]+"\t"+(i+1));
}
}
}
是什么的全部顺序? 这个排序算法不对,可以去百度参考下冒泡排序。
因为你不对总分进行排序,每次i++的遍历的数据都是一样的。其实就相当于只遍历了一次或0次。
如果你的分数是10,9,8,7,6这样的数组的话,那么每次遍历都是10,9,8,7,6,而这样的就不会进入if交换。
即使你的数不是有序的如1,5,9,2,7,3,这串数也不会变化,那么每次交换只发生在sum[j]<sum[j+1],而在下一次遍历当中,在上次交换了的位置就又会交换,变化为原来的样子。
所以当你i为偶数时就相当于遍历了0次,而奇数时就一次。
最后你这个排序法太冗余了,不好。
你是按照总分排序的,根据总分的高低,改变代表相应学生各项成绩的字符串在数组中的位置,
如果你第一次比较,根据总分高低只改变了代表相应学生各项成绩的字符串在数组中的位置,而
不改变在总分数组中的位置,那么接下来每一次循环都是不对的,即使所有循环结束你的总分数组
也没有变
你的冒泡排序错了,正确如下:
for(int i=0;i<pname.length-1;i++){
for(int j=0;j<pname.length-1-i;j++){
if(sum[j]<sum[j+1]){
int t=sum[j+1];
sum[j+1]=sum[j];
sum[j]=t;
String t2=str[j+1];
str[j+1]=str[j];
str[j]=t2;
}
}
}
百度是个好东西,,不懂可以跟他亲近亲近,,
for(int i=0;i<pname.length-1;i++){
for(int j=0;j<pname.length-1-i;j++){
if(sum[j]<sum[j+1]){
int t=sum[j+1];
sum[j+1]=sum[j];
sum[j]=t;
因为你不对总分进行排序,每次i++的遍历的数据都是一样的。其实就相当于只遍历了一次或0次。
如果你的分数是10,9,8,7,6这样的数组的话,那么每次遍历都是10,9,8,7,6,而这样的就不会进入if交换。
即使你的数不是有序的如1,5,9,2,7,3,这串数也不会变化,那么每次交换只发生在sum[j]<sum[j+1],而在下一次遍历当中,在上次交换了的位置就又会交换,变化为原来的样子。
所以当你i为偶数时就相当于遍历了0次,而奇数时就一次。
最后你这个排序法太冗余了,不好。