基于java单链表的学生成绩管理系统

要求:
每个学生的成绩信息包括:学号、语文、 数学、英语、总分、加权平均分;
采用链表存储若干学生的成绩信息;输入学生的学号、语文、数学、英语成绩;
计算学生的总分和加权平均分(语文占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("*********************");
	}
}
发布了55 篇原创文章 · 获赞 25 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/mr_zql/article/details/102471977