发布网友 发布时间:2022-05-09 13:40
共4个回答
热心网友 时间:2024-01-31 05:57
确实有些复杂,这也难怪我们都用数据库,用java实现查询,统计等就比较复杂了。整了一半天终于弄出来了。上代码
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Random;
public class LowScore {
Student[] mStuArray;
Random ran;
int[][] lowestStudent;
public LowScore(){
mStuArray=new Student[20];
//测试用,随机产生分数
ran=new Random();
for(int i=0;i<mStuArray.length;i++){
//初始化学生信息
mStuArray[i]=new Student("学生"+(i+1));
//当然楼主可以自己在这里设置学生的实际分数
//为了方便我就随机设置一些分数
setRandomScore(mStuArray[i]);//设置每个学生的分数
}
//可以看一下第一个学生的分数,当然你也可以查看所有学生的成绩
mStuArray[0].displayScore();
//用于存放每一个月的成绩最低的三名学生
lowestStudent=new int[12][3];
for(int i=0;i<12;i++){
//初始化每一月分数最低的三个学生的数组坐标
int[] temascIndex=getLowScoreAsc(i);
for(int j=3;j<mStuArray.length;j++){
float temScore=mStuArray[j].getScoreByMonth(i);
if(temScore>=mStuArray[temascIndex[2]].getScoreByMonth(i)){
continue;
}
freshMinScore(temascIndex,j,i);
}
//temascIndex,每个月分数最低的三位学生
lowestStudent[i]=temascIndex;
}
//用Hashtable表存放续三个月都是后三名的学生名单
Hashtable<Integer,Integer> hashStu=new Hashtable<Integer,Integer>();
//如果连续三个月都是后三名的学生,则输出姓名
for(int i=0;i<lowestStudent.length-2;i++){
//查看后三名的学生是否连续三次都是最后3名
for(int j=0;j<lowestStudent[i].length;j++){
if(hashStu.containsKey(lowestStudent[i][j])){
//如果hash中已经有他的名单,就不要重复写进去了
continue;
}
if(isThreeLow(i,lowestStudent[i][j])){
//如果上榜就放进哈希名单表
hashStu.put(lowestStudent[i][j], i);//value表示滴(i+1)个月开始
}
}
}
//现在hashStu中的名单就是至少连续出现3个月,成绩在后三名的学生名单
Enumeration<Integer> en = hashStu.keys();
//输出学生名单
System.out.println("\n\n一下学生连续3个月上榜倒数第三名");
while(en.hasMoreElements()){
Object key_num = en.nextElement();
String studentName=mStuArray[(Integer)key_num].getName();
int startMonth=hashStu.get(key_num);
System.out.println("学生姓名: " + studentName);
System.out.println("第"+(startMonth+1)+"月开始,以及后面几个月的成绩:");
int studentId=(Integer)key_num;
for(int i=startMonth;i<12;i++){
if(isHaveStudent(i,studentId)){
System.out.println("\n第"+(i+1)+"月:"+mStuArray[studentId].getScoreByMonth(i));
System.out.println("这个月所有学生的成绩:");
showScoreByMonth(i);
System.out.println("第"+(i+1)+"月最后三名学生以及分数:");
showMonthLowScore(i);
}else{
break;
}
}
System.out.println("\n*** *** ** *** *** *** *** *** ** ***\n");
}
}
public static void main(String[] args){
new LowScore();
}
protected void showMonthLowScore(int pMonth){
for(int i=0;i<lowestStudent[pMonth].length;i++){
Student tem=mStuArray[lowestStudent[pMonth][i]];
System.out.print(tem.getName()+":"+tem.getScoreByMonth(pMonth)+" ");
}
System.out.println();
}
protected boolean isHaveStudent(int pMonth,int pStuId){
for(int j=0;j<lowestStudent[pMonth].length;j++){
if(pStuId==lowestStudent[pMonth][j]){
return true;
}
}
return false;
}
private boolean isThreeLow(int pMonth,int pStuId){
//连续出现在后三名的次数
int monthCount=1;
for(int month=pMonth+1;month<pMonth+3&&month<12;month++){
boolean contain=false;
for(int j=0;j<lowestStudent[month].length;j++){
if(pStuId==lowestStudent[month][j]){
contain=true;
break;
}
}
if(contain){
monthCount++;
}else{
//如果后面了两个月没有连续出现,则不能选择
break;
}
}
if(monthCount==3){//连续出现3次,上榜啦
return true;
}
//否则就没上榜哦
return false;
}
protected void showScoreByMonth(int pMonth){
for(int i=0;i<mStuArray.length;i++){
if(i%5==4){
System.out.println(mStuArray[i].getScoreByMonth(pMonth));
continue;
}
System.out.print(mStuArray[i].getScoreByMonth(pMonth)+", ");
}
}
private void freshMinScore(int[] temascIndex,int pNew,int pMonth){
int tem=0;
boolean start=false;
for(int i=0;i<temascIndex.length;i++){
if(start){
tem=temascIndex[i];
temascIndex[i]=tem;
continue;
}
if(mStuArray[temascIndex[i]].getScoreByMonth(pMonth)>=mStuArray[pNew].getScoreByMonth(pMonth)){
tem=temascIndex[i];
temascIndex[i]=pNew;
start=true;
}
}
}
protected int[] getLowScoreAsc(int pMonth){
int[] result={0,1,2};
//做排序,是的学生result[0]的分数小于result[1]小于result[2]
for(int i=0;i<result.length;i++){//传说中的冒泡排序
float temScore=mStuArray[result[i]].getScoreByMonth(pMonth);
int index=i;
for(int j=i+1;j<result.length;j++){
if(mStuArray[result[j]].getScoreByMonth(pMonth)<temScore){
index=j;
temScore=mStuArray[result[j]].getScoreByMonth(pMonth);
}
}
//说明mStuArray的下表为result[i]的学生当月成绩不是他后面中最小的
if(index!=i){//交换位置
int tem=result[index];
result[index]=result[i];
result[i]=tem;
}
}
//排序后保证mStuArray[result[i]].getScoreByMonth(pMonth)
/**
* mStuArray[result[0]].getScoreByMonth(pMonth)<=mStuArray[result[1]].getScoreByMonth(pMonth)
* mStuArray[result[1]].getScoreByMonth(pMonth)<=mStuArray[result[2]].getScoreByMonth(pMonth)
*/
return result;
}
public void orderTest(){
int[] testArray={5,8,3,5,9};
for(int i=0;i<testArray.length;i++){//传说中的冒泡排序
int temScore=testArray[i];
int index=i;
for(int j=i+1;j<testArray.length;j++){
if(testArray[j]<temScore){
index=j;
temScore=testArray[j];
}
}
//说明mStuArray的下表为testArray[i]的学生当月成绩不是他后面中最小的
if(index!=i){//交换位置
int tem=testArray[index];
testArray[index]=testArray[i];
testArray[i]=tem;
}
}
for(int i=0;i<testArray.length;i++){//ok
System.out.println(testArray[i]);
}
}
protected void setRandomScore(Student pStu){
for(int i=0;i<pStu.getScore().length;i++){
pStu.setScoreByMonth(i, 20+ran.nextInt(80));
}
}
}
class Student{
private float[] score;
private String name;
public Student(){
score=new float[12];
}
public Student(String sName){
score=new float[12];
this.name=sName;
}
public float[] getScore(){
return score;
}
public float getScoreByMonth(int pMonth){
if(pMonth<0||pMonth>=score.length){
return -1;
}
return score[pMonth];
}
public void setScoreByMonth(int pMonth,float pScore){
if(pMonth<0||pMonth>=score.length){
return;
}
score[pMonth]=pScore;
}
public void displayScore(){
System.out.println("****** "+name+"的成绩 *******");
for(int i=0;i<score.length;i++){
System.out.print((i+1)+"月:"+score[i]+" ");
if(i%3==2){
System.out.println();
}
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
当然啦,可以看到,我把楼主的student类做了一点改变,把12个月的成绩放在一个数组score中,而且还给学生加了一个名字属性。
可以看看我运行的结果截图,希望楼主满意,望采纳O(∩_∩)O~!
热心网友 时间:2024-01-31 05:57
因为是要连续的三个月先将12个月考试最后三名超过三次的学生存入一个集合中 然后再循环判断这些学生的成绩是否是连续三个月的热心网友 时间:2024-01-31 05:58
用Map就方便存储每个月每个学生的名字和对应的成绩了。热心网友 时间:2024-01-31 05:58
额, 有难度。