课程设计要求:
设计一个学生成绩排名系统
实现以下功能:
1) 具备对成绩的管理功能(添加、删除、排序);
2) 具备对成绩的统计功能(最高分,最低分,平均分,及格率等);
3) 具备按学号、姓名、或课程名查询成绩的功能;
备注:成绩记录以下信息:班级,学号,姓名,四门成绩(百分制)。
废话不多说,直接上代码。 GUI版本到我主页找另一篇博客。
包名:com.hncj.tt类名:sssss 读者自行修改。
package com.hncj.tt;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
public class sssss {
static List<String> stuName = new ArrayList();
static List<String> stuClass = new ArrayList();
static List<String> stuNumber = new ArrayList();
static int[][] stuScore = new int[10001][5];// 二维数组,第一个对应学生,第二个该学生的四科成绩,语文,数学,英语,政治
static int logout = 1;// 用于用户退出程序
static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
stuName.add("张三");
stuClass.add("0824172");
stuNumber.add("082417220");
stuScore[0][0] = 72;
// stuScore[0][1] = 74;
stuScore[0][2] = 76;
stuScore[0][3] = 78;
stuName.add("李四");
stuClass.add("0824172");
stuNumber.add("082417299");
stuScore[1][0] = 62;
stuScore[1][1] = 64;
stuScore[1][2] = 66;
stuScore[1][3] = 68;
stuName.add("王五");
stuClass.add("0824172");
stuNumber.add("082417289");
stuScore[2][0] = 82;
stuScore[2][1] = 84;
stuScore[2][2] = 86;
// 初始化数据
do {
System.out.println("------欢迎进入学生成绩排名系统--------");
System.out.println("\n1.查询成绩");
System.out.println("2.添加或修改成绩");
System.out.println("3.删除成绩");
System.out.println("4.成绩排序");
System.out.println("5.成绩统计");
System.out.println("6.退出系统");
System.out.println("请输入对应数字进行选择:");
String choice = input.next();
switch (choice) {
case "1":
lookScore();
break;
case "2":
addScore();
break;
case "3":
deleteScore();
break;
case "4":
scoreStatistics(choice);
break;
case "5":
scoreStatistics(choice);
break;
case "6":
logout = 2;
break;
default:
System.out.println("非法操作!");
logout = 1;
}
if (logout != 2) {// 如果为2则是用户选择了退出或者是非法操作
System.out.println("输入0返回主界面,输入非0值退出系统 ");
int back = input.nextInt();
if (back != 0) {// 如果用户没选择0则为非法操作
logout = 2;
}
}
} while (logout == 1); // 判断用户择退出还是返回
System.out.println("----谢谢使用!----");
}
private static void lookScore() {
int exitlook = 0;
// 这一层do while是为了查询一个结果后能继续查询
do {
System.out.println("----请选择按哪种方式查询------");
System.out.println("\n1.学号查询");
System.out.println("2.姓名查询");
System.out.println("3.课程名查询");
System.out.println("4.返回或退出");
System.out.println("请输入对应数字进行选择:");
int k = 0;// 多次输入错误之后,跳出查询。返回主界面
int choiceLI = input.nextInt();
do {
int i = 0;// i用于通过循环次数准确查找数据
switch (choiceLI) {
case 1:
System.out.println("请输入学号:");
String choiceNumber = input.next();
for (String a : stuNumber) {
if (choiceNumber.equals(a) == true) {
k = 4;
break;
} else {
i++;
}
}
break;
case 2:
System.out.println("请输入姓名:");
String choiceName = input.next();
for (String name : stuName) {
if (choiceName.equals(name) == true) {
k = 4;
break;
} else {
i++;
}
}
break;
case 3:
System.out.println("请输入课程名:");
String choicekecheng = input.next();
if ("语文".equals(choicekecheng)) {
i = 0;
k = 5;
} else if ("数学".equals(choicekecheng)) {
i = 1;
k = 5;
} else if ("英语".equals(choicekecheng)) {
i = 2;
k = 5;
} else if ("政治".equals(choicekecheng)) {
i = 3;
k = 5;
}
break;
case 4:
k = 3;
exitlook = 1;
break;
}
if (k < 2) {
System.out.println("未找到对应字段,请重新输入");
k++;
} else if (k == 2) {
System.out.println("错误三次,请继续操作");
k++;
} else if (k == 4) {
System.out.println("查询结果如下:");
System.out.println("姓名\t" + stuName.get(i) + "\n学号\t" + stuNumber.get(i) + "\n班级\t"
+ stuClass.get(i) + "\n语文\t" + stuScore[i][0] + "\n数学\t" + stuScore[i][1] + "\n英语\t"
+ stuScore[i][2] + "\n政治\t" + stuScore[i][3]);
} else if (k == 5) {
System.out.println("具有该课程的学生查询结果如下:");
for (int j = 0; j < stuName.size(); j++) {
if (stuScore[j][i] > 0 && stuScore[j][i] <= 100) {// 范围是0~100,不包含零的原因是int型默认值是0,这也是一个bug
String sss = null;
if (i == 0)
sss = "语文";
if (i == 1)
sss = "数学";
if (i == 2)
sss = "英语";
if (i == 3)
sss = "政治";
System.out.println("姓名\t" + stuName.get(j) + "\n学号\t" + stuNumber.get(j) + "\n班级\t"
+ stuClass.get(j) + "\n" + sss + "\t" + stuScore[j][i]);
}
}
}
} while (k < 3);
if (k != 3) {
System.out.println("是否继续查询(输入0继续,非0退出):");
int choicenext = input.nextInt();
if (choicenext != 0) {
exitlook = 1;
}
}
} while (exitlook == 0);
}
private static void addScore() {
// 添加已有的成绩时,相当于修改
int exitadd = 0;
do {
int k = 0;
System.out.println("----请输入需要添加或修改成绩的学生姓名或0退出------");
String addName = input.next();
int i = 0; // 用于计数,以找到对应学生的学号
if (!"0".equals(addName)) {
for (String st : stuName) {
if (st.equals(addName)) {
System.out.println("学生信息如下:");
System.out.println(
"姓名\t" + stuName.get(i) + "\n学号\t" + stuNumber.get(i) + "\n班级\t" + stuClass.get(i));
for (int jj = 0; jj < 4; jj++) {
String sss = null;
if (jj == 0)
sss = "语文";
if (jj == 1)
sss = "数学";
if (jj == 2)
sss = "英语";
if (jj == 3)
sss = "政治";
if (stuScore[i][jj] > 0) {
System.out.println(sss + "\t" + stuScore[i][jj]);
}
}
int xxx = 0;// 判断用户是否继续添加该学生信息
do {
System.out.println("请输入要添加或修改的科目:");
String add = input.next();
int j = 10;// 10 是随便附的值,为了不为0~3.因为0~3刚好可以对应二维数组中的科目
if ("语文".equals(add)) {
j = 0;
} else if ("数学".equals(add)) {
j = 1;
} else if ("英语".equals(add)) {
j = 2;
} else if ("政治".equals(add)) {
j = 3;
} else {
j = 5;
}
if (j != 5) {
System.out.println("请填写该科目的成绩(0~100分):");
int Score = input.nextInt();
if (Score > 0 && Score <= 100) {
stuScore[i][j] = Score;// 将该科目赋值为0,就是删除该科目。因为int型默认值为0
System.out.println("修改成功,该学生信息如下:");
System.out.println("姓名\t" + stuName.get(i) + "\n学号\t" + stuNumber.get(i) + "\n班级\t"
+ stuClass.get(i));
for (int jj = 0; jj < 4; jj++) {
String sss = null;
if (jj == 0)
sss = "语文";
if (jj == 1)
sss = "数学";
if (jj == 2)
sss = "英语";
if (jj == 3)
sss = "政治";
if (stuScore[i][jj] > 0) {
System.out.println(sss + "\t" + stuScore[i][jj]);
}
}
} else {
System.out.println("非法输入!");
}
System.out.println("是否继续添加或修改该学生的成绩(是:0,否:非0):");
int chonet = input.nextInt();
if (chonet != 0) {
xxx = 4;
}
} else {
System.out.println("非法输入!\n提示:科目名只有语文,数学,英语,政治");
xxx++;
}
if (xxx == 3) {
System.out.println("错误三次,请继续操作");
}
} while (xxx < 3);
k = 1;
} else {
i++;
}
}
} else if ("0".equals(addName)) {
exitadd = 1;
k = 2;
}
if (k == 0) {
System.out.println("未找到该学生,请确认后输入");
}
if (k == 1) {
System.out.println("是否继续添加或退出(输入0继续,非0退出):");
int choicene = input.nextInt();
if (choicene != 0) {
exitadd = 1;
}
}
} while (exitadd == 0);
}
private static void deleteScore() {
int exitdelete = 0;
do {
int k = 0;
System.out.println("----请输入需要删除成绩的学生姓名或0退出------");
String deleteName = input.next();
int i = 0; // 用于计数,以找到对应学生的学号
if (!"0".equals(deleteName)) {
for (String st : stuName) {
if (st.equals(deleteName)) {
System.out.println("学生信息如下,");
System.out.println(
"姓名\t" + stuName.get(i) + "\n学号\t" + stuNumber.get(i) + "\n班级\t" + stuClass.get(i));
for (int jj = 0; jj < 4; jj++) {
String sss = null;
if (jj == 0)
sss = "语文";
if (jj == 1)
sss = "数学";
if (jj == 2)
sss = "英语";
if (jj == 3)
sss = "政治";
if (stuScore[i][jj] > 0) {
System.out.println(sss + "\t" + stuScore[i][jj]);
}
}
int xxx = 0;// 判断用户是否继续删除该学生信息
do {
System.out.println("请输入要删除的科目:");
String del = input.next();
int j = 10;// 10 是随便附的值,为了不为0~3.因为0~3刚好可以对应二维数组中的科目
if ("语文".equals(del)) {
j = 0;
} else if ("数学".equals(del)) {
j = 1;
} else if ("英语".equals(del)) {
j = 2;
} else if ("政治".equals(del)) {
j = 3;
} else {
j = 5;
}
if (j != 5) {
stuScore[i][j] = 0;// 将该科目赋值为0,就是删除该科目。因为int型默认值为0
System.out.println("删除成功,该学生信息如下:");
System.out.println("姓名\t" + stuName.get(i) + "\n学号\t" + stuNumber.get(i) + "\n班级\t"
+ stuClass.get(i));
for (int jj = 0; jj < 4; jj++) {
String sss = null;
if (jj == 0)
sss = "语文";
if (jj == 1)
sss = "数学";
if (jj == 2)
sss = "英语";
if (jj == 3)
sss = "政治";
if (stuScore[i][jj] > 0) {
System.out.println(sss + "\t" + stuScore[i][jj]);
}
}
System.out.println("是否继续删除该学生的成绩(是:0,否:非0):");
int chonet = input.nextInt();
if (chonet != 0) {
xxx = 4;
}
} else {
System.out.println("非法输入!\n提示:科目名只有语文,数学,英语,政治");
xxx++;
}
if (xxx == 3) {
System.out.println("错误三次,请继续操作");
}
} while (xxx < 3);
k = 1;
} else {
i++;
}
}
} else if ("0".equals(deleteName)) {
exitdelete = 1;
k = 2;
}
if (k == 0) {
System.out.println("未找到该学生,请确认后输入");
}
if (k == 1) {
System.out.println("是否继续删除或退出(输入0继续,非0退出):");
int choicene = input.nextInt();
if (choicene != 0) {
exitdelete = 1;
}
}
} while (exitdelete == 0);
}
private static void scoreStatistics(String choice) {
int exitSta = 0, j = 0;
do {
int k = 0, n = 100;// n的值随便设置的,也是因为0~3表示的是课程名,不冲突
System.out.println("----请输入需要统计分析的课程名或0退出------");
String StaName = input.next();
if ("语文".equals(StaName)) {
n = 0;
} else if ("数学".equals(StaName)) {
n = 1;
} else if ("英语".equals(StaName)) {
n = 2;
} else if ("政治".equals(StaName)) {
n = 3;
} else if ("0".equals(StaName)) {
exitSta = 1;
k = 2;
j = 1;
} else {
System.out.println("输入有误!\n提示:科目名只有语文,数学,英语,政治");
j++;
}
if (j == 0) {
int[] ls = new int[10001];
int len = 0;// 统计有多少个成绩
for (int ii = 0; ii < stuName.size(); ii++) {// 因为一科成绩相当于一个二维数组中的列。排序比较麻烦,先用一维数组接收
if (stuScore[ii][n] != 0) {
ls[len] = stuScore[ii][n];
len++;
}
}
if("4".equals(choice)) {
toptop(len,ls,exitSta);
}else {
topStatis(len,ls,exitSta);
}
}
} while (exitSta == 0 && j < 3);
}
private static int topStatis(int len,int[] ls,int exitSta) {
int exitttt=0;
do {
System.out.println("----请选择统计方式------");
System.out.println("1.最高分");
System.out.println("2.最低分");
System.out.println("3.平均值");
System.out.println("4.及格率");
System.out.println("请输入对应数字进行选择:");
String choii = input.next();
int count=0;//count用于统计个数,result用于累计求和
float result=0;
if("1".equals(choii)) {
for (int i = 0; i < len; i++) {
if(ls[i]>ls[i+1])
{
result = ls[i];
}
}
System.out.println("最高分: "+result);
exitttt=0;//归零,当前面输入有错误的时候,后面输入正确之后,将错误数归零
}else if("2".equals(choii)) {
for (int i = 0; i < len; i++) {
if(ls[i]<ls[i+1])
{
result = ls[i];
}
}
System.out.println("最低分: "+result);
exitttt=0;//归零,当前面输入有错误的时候,后面输入正确之后,将错误数归零
}else if("3".equals(choii)) {
for (int i : ls) {
if(i>0) {
count++;
result=result+i;
}
}
System.out.println("平均值: "+result/count);
exitttt=0;//归零,当前面输入有错误的时候,后面输入正确之后,将错误数归零
}else if("4".equals(choii)) {
float j=0;
for (int i : ls) {
if(i>0) {
if(i>60) {
j++;
}
count++;
}}
System.out.println("及格率: "+j/count);
exitttt=0;//归零,当前面输入有错误的时候,后面输入正确之后,将错误数归零
}else {
System.out.println("非法输入!");
exitttt++;
}
if(exitttt==3) {//错误数到达到三次,退出当前循环。
System.out.println("错误三次,请继续操作");
}
if(exitttt==0) {
System.out.println("是否继续统计该科目信息(是:0,否:非0值)");
String next = input.next();
if (!"0".equals(next)) {
exitttt= 4;//用户自己不再统计,推出该科目信息的统计循环
}
}
}while(exitttt<3);
System.out.println("是否继续进行统计(是:0,否:非0值)");
String next = input.next();
if (!"0".equals(next)) {
exitSta = 1;
}
return exitSta;
}
private static int toptop(int len,int[] ls,int exitSta) {
System.out.println("升序输出:0,降序输出:非0值");
String choi = input.next();
if ("0".equals(choi)) {
for (int ll = 0; ll < len - 1; ll++) {// 冒泡升排序
for (int lj = len-2; lj >=0; lj--) {
if (ls[lj] >ls[lj + 1]) {
int temp = ls[lj];
ls[lj] = ls[lj + 1];
ls[lj + 1] = temp;
}
}
}
for (int i = 0; i < len; i++) {// 循环输出
System.out.println(ls[i]);
}
} else {
for (int ll = 0; ll < len - 1; ll++) {// 冒泡降序排序
for (int lj = 0; lj < len - ll; lj++) {
if (ls[lj] < ls[lj + 1]) {
int temp = ls[lj];
ls[lj] = ls[lj + 1];
ls[lj + 1] = temp;
}
}
}
for (int i = 0; i < len; i++) {// 循环输出
System.out.println(ls[i]);
}
}
System.out.println("是否继续排序(是:0,否:非0值)");
int next = input.nextInt();
if (next != 0) {
exitSta = 1;
}
return exitSta;
}
}