此系列文章收录大量Java经典代码题(也可以算是leetcode刷题指南),剩余文章指路Java题集。希望可以与大家一起探索Java的神秘。3、2、1,请看!
本篇文章将带大家一起来写一个学生成绩查询系统。
目录
系统呈现效果
“学生成绩查询系统”中保存有学生姓名、课程名称以及学生的课程成绩。查询系统从控制台输入统计命令及参数,实现几种方式的成绩查询,如:
- avg Java:统计课程Java的平均分。
- avg song:统计学生song的平均分。
- get song Java:获取学生song的Java 课程的成绩。
- sort Java:列出 Java课程的成绩的排序结果。
- exit:退出程序。
如果查询的学生或课程不存在时,给出相应的提示。运行效果如图:
如运行效果所示,查询系统的总体任务应该包括:
- 系统数据(学生成绩)的初始化。
- 显示成绩单。
- 查询系统的控制台命令调度。
- 查询某门课或某人的平均成绩。
- 查询某人某门课的成绩。
- 对某门课程的成绩进行排序。
前言——成绩查询系统的数据结构
//用常量存储学生数和课程数
static final int STUDENT_NUM=6;
static final int COURSE_NUM=5;
//用字符串数组存储学生姓名和课程名称
static String[] students = {"zhang","wang","li","zhao","liu","song"};
static String[] courses = {"C","Java","mySQL","Linux","HTML"};
存储学生成绩
static int[][] score= new int[STUDENT_NUM][COURSE_NUM];
控制台命令的读取和控制
1.确定参数
avg+课程名
avg+姓名
get +姓名+课程名
sort + 课程名
匹配命令字符串时使用 equalsIgnoreCase 方法,匹配时忽略字符串的大小写。
2.退出系统
查询系统在未输入“exit”命令的情况下运行,可以在循环中使用“System.exit(0)”退出循环,结束系统的运行
public static void run(){
Scanner scn=new Scanner(System.in);
while(true){
System.out.print("请输入命令:");
String command=scn.next();
if(command.equalsIgnoreCase("avg")){//"avg"需要一个参数
String parameter=scn.next();
avg(parameter);
}else if(command.equalsIgnoreCase("get")){//"get"需要两个参数
String parameter1=scn.next();
String parameter2=scn.next();
get(parameter1,parameter2);
}else if(command.equalsIgnoreCase("sort")){//"sort"需要一个参数
String parameter=scn.next();
sortByScore(parameter);
}else if (command.equalsIgnoreCase("exit")){//退出系统
System.out.println("退出系统!byebye!");
System.exit(0);
}
}
}
查询某人某门课成绩
get()方法,先在 students数组中查询是否有 conditionl 指定的学生。如果有该学生,则记录下学生位置(作为成绩二维数组的行标),并继续在 courses数组中查询是否存在 condition2 指定的课程,如果有该课程,则记录下该课程的位置(作为成绩二维数组的列标);输出查找到位置上的成绩
public static void get(String condition1, String condition2){
int i_index=-1, j_index=-1;
//查询是否存在该学生i_index
for(int i=0; i<students.length; i++){
if (students[i].equalsIgnoreCase(condition1)){
i_index=i;
}
}
if(i_index!=-1){ //有此人,继续查找是否有该课程j_index
for(int j=0; j<courses.length; j++)
if (courses[j].equalsIgnoreCase(condition2)){
j_index=j;
}
}else{
System.out.println("没有 "+ condition1+ "这个学生");
return;
}
if(j_index!=-1){
System.out.println(condition1+"的"+condition2+"成绩是"+score[i_index][j_index]);
}else{
System.out.println(condition1+"没有"+condition2+" 这门课程");
return;
}
}
对某门课程成绩进行排序
先在 courses数组中查询是否存在 condition 指定的课程,如果有该课程,则记录下该课程的位置。并建立临时数组存储学生姓名和成绩,在对成绩数组冒泡排序过程中同时交换姓名。最后进行输出。
public static void sortByScore(String sort_condition){
int i, j;
int j_index=-1;
for(j=0; j<courses.length; j++){
if (courses[j].equalsIgnoreCase(sort_condition)){
j_index=j;
}
}
if(j_index==-1){
System.out.println("没有这门课程");
return;
}
//将成绩数据和姓名导入临时数组
int[] score_temp= new int[STUDENT_NUM];
for(i=0; i<score.length; i++){
score_temp[i]=score[i][j_index];
}
String[] students_temp=new String[STUDENT_NUM];
for(i=0; i<students.length; i++){
students_temp[i]=students[i];
}
//对score_temp数组进行冒泡排序,同时对student_temp数据进行同步交换
for(int k=0; k<score_temp.length-1; k++){
for (int kk=0; kk<score_temp.length-k-1; kk++){
if (score_temp[kk]>score_temp[kk+1]){
//交换成绩
int temp=score_temp[kk];
score_temp[kk]=score_temp[kk+1];
score_temp[kk+1]=temp;
//交换姓名
String tmp_str=students_temp[kk];
students_temp[kk]=students_temp[kk+1];
students_temp[kk+1]=tmp_str;
}
}
}
//输出结果
//1.输出抬头
System.out.print("名次\t");
System.out.print("姓名\t");
System.out.print(courses[j_index]+"\t");
System.out.println();
//2.输出数据
for(int k=0; k<score_temp.length; k++){
System.out.print((k+1)+"\t");
System.out.print(students_temp[k]+"\t"); //学生姓名
System.out.println(score_temp[k]); //学生成绩
}
}
当然还有一个功能是计算某一学生或课程成绩的平均分,这个功能的实现类似上面获取某人某成绩的get()方法,剩下的部分教给大家动手实现相关功能。
这篇文章到此结束,源码已经放在资源区了,大家可以前往查看。感谢各位的阅读和所提出的宝贵意见。如果觉得这篇文章写的还可以或者对您有帮助,麻烦点赞收藏加转发!!!