要求:
每个学生的成绩信息包括:学号、语文、 数学、英语、总分、加权平均分;
采用链表存储若干学生的成绩信息;输入学生的学号、语文、数学、英语成绩;
计算学生的总分和加权平均分(语文占30%,数学占50%,英语占20%);
输出学生的成绩信息。
可以在链表末尾追加新学生的成绩信息;
可以根据学号,删除该学生的成绩信息。
可以根据学号或总分,升序排序学生的成 绩信息。
在完成程序功能的前提下,尽量保证程序交互界面友好,提示完整。
尽量考虑程序的健壮性,在输入错误的情况下,至少能够保证系统不崩溃。
程序的主界面,要求用switch语句实现一个选择菜单,显示如下:
学生成绩管理小系统
1------插入学生成绩
2------删除学生成绩
3------查询某生成绩
4------修改某生成绩
5------显示所有成绩
6------显示成绩条数
7------根据学号排序
8------根据总分排序
0------退出管理系统
/**
* @author zql on 2019-10-10
*/
public class StudentsManage {
public class Student {
/**
* 学号
*/
private String serialNo;
/**
* 语文
*/
private int Chinese;
/**
* 数学
*/
private int Math;
/**
* 英语
*/
private int English;
/**
* 总分
*/
private int total;
/**
* 加权平均分
*/
private double WAS;
public Student next;
public Student() {}
public Student(String serialNo, int Chinese, int Math, int English) {
this.serialNo = serialNo;
this.Chinese = Chinese;
this.Math = Math;
this.English = English;
this.setTotalAndWAS();
}
public String getSerialNo() {
return serialNo;
}
public void setSerialNo(String serialNo) {
this.serialNo = serialNo;
}
public int getChinese() {
return Chinese;
}
public void setChinese(int Chinese) {
this.Chinese = Chinese;
this.setTotalAndWAS();
}
public int getMath() {
return Math;
}
public void setMath(int Math) {
this.Math = Math;
this.setTotalAndWAS();
}
public int getEnglish() {
return English;
}
public void setEnglish(int English) {
this.English = English;
this.setTotalAndWAS();
}
public int getTotal() {
return total;
}
public double getWAS() {
return WAS;
}
private void setTotalAndWAS() {
this.total = this.Chinese + this.Math + this.English;
this.WAS = this.Chinese * 0.3 + this.Math * 0.5 + this.English * 0.2;
}
/**
* 更新整个节点信息
*
* @param serialNo
* @param Chinese
* @param Math
* @param English
*/
public void setScore(String serialNo, int Chinese, int Math, int English) {
this.serialNo = serialNo;
this.Chinese = Chinese;
this.Math = Math;
this.English = English;
setTotalAndWAS();
}
@Override
public String toString() {
return this.serialNo + "\t" + this.Chinese + "\t" + this.Math + "\t" + this.English + "\t" + this.total + "\t" + this.WAS;
}
}
/**
* 链表大小
*/
private int size;
/**
* 头部节点
*/
private Student head;
public int size() {
return this.size;
}
//构造代码块在创建对象时被调用,每次创建对象都会调用一次,但是优先于构造函数执行
{
this.size = 0;
this.head = null;
}
/**
* 定义一个无参构造函数,用于实例化头节点和尾结点
*/
public StudentsManage() {
this.head = new Student();
}
/**
* 从链表头部插入
*
* @param s
*/
public void insertHead(Student s) {
if (this.size == 0) {
this.head = s;
} else {
s.next = this.head;
this.head = s;
}
this.size++;
}
/**
* 从链表尾部插入
*
* @param s
*/
public void insertTailer(Student s) {
Student front = this.head;
if (this.size == 0) {
this.head = s;
this.size++;
} else {
while (front != null) {
if (front.next == null) {
front.next = s;
this.size++;
return;
}
front = front.next;
;
}
}
}
/**
* 是否存在该学号的成绩
*
* @param serialNo
* @return
*/
public boolean isExist(String serialNo) {
Student front = this.head;
while (front != null) {
if (serialNo.equals(front.getSerialNo())) {
return true;
}
front = front.next;
}
return false;
}
/**
* 根据学号删除节点
*
* @param serialNo 学号
* @return 删除成功返回true,反之返回false
*/
public boolean delete(String serialNo) {
Student front = this.head;
// 判断是否是删除头节点
if (serialNo.equals(front.getSerialNo())) {
this.head = this.head.next;
this.size--;
return true;
}
while (!serialNo.equals(front.next.getSerialNo())) {
front = front.next;
}
if (front.next != null) {
front.next = front.next.next;
this.size--;
return true;
}
return false;
}
/**
* 根据学号查询学生信息
*
* @param serialNo 学号
* @return
*/
public Student select(String serialNo) {
Student front = this.head;
// 如果是头节点
if (serialNo.equals(front.getSerialNo())) {
Student s = new Student(serialNo, front.getChinese(), front.getMath(), front.getEnglish());
return s;
}
while (front.next != null) {
front = front.next;
if (serialNo.equals(front.getSerialNo())) {
Student s = new Student(serialNo, front.getChinese(), front.getMath(), front.getEnglish());
return s;
}
}
return null;
}
/**
* 根据学号更新节点
*
* @param serialNo 学号
* @param score 得分
* @param type 要更新的成绩,1表示语文,2表示数字,3表示英语
* @return 更新成功返回true,反之返回false
*/
public boolean update(String serialNo,int score,int type) {
Student front = this.head;
while (front.next != null) {
if (serialNo.equals(front.getSerialNo())) {
switch (type) {
case 1:
front.setChinese(score);
break;
case 2:
front.setMath(score);
break;
case 3:
front.setEnglish(score);
break;
}
return true;
}
front = front.next;
}
return false;
}
/**
*根据总分进行降序排序 (该排序使用选择排序的方式)
*/
public void sortTotal() {
Student front = this.head;
Student rear = front.next;
while (front.next != null && rear.next != null) {
while (rear != null) {
if (front.getTotal() < rear.getTotal()) {
String serialNo = front.getSerialNo();
int Chinese = front.getChinese();
int Math = front.getMath();
int English = front.getEnglish();
front.setScore(rear.getSerialNo(), rear.getChinese(), rear.getMath(), rear.getEnglish());
rear.setScore(serialNo, Chinese, Math, English);
}
rear = rear.next;
}
front = front.next;
rear = front.next;
// 最后一组对比
if (rear.next == null && front.getTotal() < rear.getTotal()) {
String serialNo = front.getSerialNo();
int Chinese = front.getChinese();
int Math = front.getMath();
int English = front.getEnglish();
front.setScore(rear.getSerialNo(), rear.getChinese(), rear.getMath(), rear.getEnglish());
rear.setScore(serialNo, Chinese, Math, English);
}
}
}
/**
*根据分号进行升序排序 (该排序使用选择排序的方式)
*/
public void sortSerialNo() {
Student front = this.head;
Student rear = front.next;
while (front.next != null && rear.next != null) {
while (rear != null) {
if (front.getSerialNo().compareTo(rear.getSerialNo()) > 0) {
String serialNo = front.getSerialNo();
int Chinese = front.getChinese();
int Math = front.getMath();
int English = front.getEnglish();
front.setScore(rear.getSerialNo(), rear.getChinese(), rear.getMath(), rear.getEnglish());
rear.setScore(serialNo, Chinese, Math, English);
}
rear = rear.next;
}
front = front.next;
rear = front.next;
// 最后一组对比
if (rear.next == null && front.getSerialNo().compareTo(rear.getSerialNo()) > 0) {
String serialNo = front.getSerialNo();
int Chinese = front.getChinese();
int Math = front.getMath();
int English = front.getEnglish();
front.setScore(rear.getSerialNo(), rear.getChinese(), rear.getMath(), rear.getEnglish());
rear.setScore(serialNo, Chinese, Math, English);
}
}
}
/**
*显示成绩
*/
public void display() {
System.out.println("学号\t语文\t数学\t英语\t总分\t加权平均分");
Student front = this.head;
while (front != null && front.getSerialNo() != null) {
System.out.println(front.toString());
front = front.next;
}
if (this.head == null || this.head.getSerialNo() == null) {
System.out.println("无成绩数据!");
}
}
public static void main(String[] args) {
StudentsManage sm = new StudentsManage();
Scanner in = new Scanner(System.in);
boolean open = true;
while (open) {
printMenu();
System.out.println("请输入菜单序号进行操作");
int menu = -1;
try {
menu = in.nextInt();
} catch (Exception e) {
// Scanner声明在while循环外时,当第一次出现异常后没有清空Scanner中的数据,会造成无限死循环,因此需要重新在catch里声明Scanner
in = new Scanner(System.in);
}
switch (menu) {
case 1:
System.out.println("请输入学号(回车结束)");
String serialNo = in.next();
if (sm.isExist(serialNo)) {
System.out.println("该学号已存在!");
break;
}
System.out.println("请输入语文、数学、英语成绩(空格结束,回车确认插入)");
try {
int Chinese = in.nextInt();
int Math = in.nextInt();
int English = in.nextInt();
Student newS = sm.new Student(serialNo, Chinese, Math, English);
sm.insertTailer(newS);
} catch (Exception e) {
System.out.println("成绩输入错误!请确认是否是整数!");
in = new Scanner(System.in);
}
break;
case 2:
System.out.println("请输入要删除的学生学号");
String serialNo2 = in.next();
if (sm.delete(serialNo2)) {
System.out.println("删除成功");
} else {
System.out.println("删除失败");
}
sm.display();
break;
case 3:
System.out.println("请输入要查询的学生学号");
String serialNo3 = in.next();
Student selectS = sm.select(serialNo3);
System.out.println("学号\t语文\t数学\t英语\t总分\t加权平均分");
if (selectS == null) {
System.out.println("无此学生!");
} else {
System.out.println(selectS.toString());
}
break;
case 4:
System.out.println("请输入要修改成绩的学生学号");
String serialNo4 = in.next();
if (!sm.isExist(serialNo4)) {
System.out.println("无此学生!");
break;
}
System.out.println("请选择要修改的课程");
System.out.println("1.语文");
System.out.println("2.数学");
System.out.println("3.英语");
int type = 0;
try {
type = in.nextInt();
} catch (Exception e) {
in = new Scanner(System.in);
}
if (!(type == 1 || type == 2 || type == 3)) {
System.out.println("没有此课程");
break;
}
System.out.println("请输入该课程成绩");
try {
int score = in.nextInt();
sm.update(serialNo4, score, type);
sm.display();
} catch (Exception e) {
System.out.println("成绩输入错误!请确认是否是整数!");
in = new Scanner(System.in);
}
break;
case 5:
sm.display();
break;
case 6:
System.out.println("成绩条数为:" + sm.size());
break;
case 7:
sm.sortSerialNo();
sm.display();
break;
case 8:
sm.sortTotal();
sm.display();
break;
case 0:
System.out.println("系统已退出!");
System.exit(0);
break;
default:
System.out.println("没有此菜单!");
}
}
in.close();
}
/**
* 打印菜单
*/
public static void printMenu() {
System.out.println("学生成绩管理小系统");
System.out.println("*********************");
System.out.println("* 1------插入学生成绩 *");
System.out.println("* 2------删除学生成绩 *");
System.out.println("* 3------查询某生成绩 *");
System.out.println("* 4------修改某生成绩 *");
System.out.println("* 5------显示所有成绩 *");
System.out.println("* 6------显示成绩条数 *");
System.out.println("* 7------根据学号排序 *");
System.out.println("* 8------根据总分排序 *");
System.out.println("* 0------退出管理系统 *");
System.out.println("*********************");
}
}