【JAVA】使用集合容器Set等,模拟学生选课功能(Student类和Course类),涵盖自比较接口和外部比较器接口的使用~



✍版权声明:@CSDN遊光

版权声明:
@Kcx@遊光@胤殁@Karl@Karlcixio

有幸您能来看我的博客,本博客仅供大家学术交流,如您有需要将本博客用作它用,请与我联系!
我的联系方式:

微信搜索公众号:Karlcixio
也可以直接扫描以下二维码
----------------------------------公众号二维码
个人 QQ:1005589159


?第零步:审题!!!

首先,我们先来看看题目要求,然后再罗列我们大体需要做些什么:
使用集合容器,模拟学生选课功能

  1. 创建实体类Student,并写入相关变量及方法;
  2. 创建实体类Course(采用自接口比较),并写入相关变量及方法;
    (也可创建外部接口比较器CourseComparator类,写入其比较规则;)
  3. 创建测试类SimluCourse,并写入测试过程;
  4. 在测试类中,进行相关数据测试;
    ps:注意右框右下角的要求 —— 操作过程中,若输入的数据非法,做相应的提示,如选修不存在的课程。

?第一步:实体类Student

package 【PackageName】;

public class Student {
    private String sid;
    private String sname;
    private TreeSet<Course> scourses;

    public Student() {
    }

    public Student(String sid, String sname, TreeSet<Course> scourse) {
        this.sid = sid;
        this.sname = sname;
        this.scourses = scourse;
    }

    public String getSid() {
        return sid;
    }

    public void setSid(String sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

	public TreeSet<Course> getScourses() {
        return scourses;
    }

    public void setScourses(TreeSet scourses) {
        this.scourses = scourses;
    }
}

?第二步:实体类Course

- 方法1:实体类Course(自接口比较)

package 【PackageName】;

import java.util.Comparator;
import java.util.Objects;

public class Course implements Comparable<Course>{
    private String cid;
    private String cname;

    public Course(){}
    public Course(String cid, String cname) {
        this.cid = cid;
        this.cname = cname;
    }

    public Course(String cid) {
        this.cid = cid;
    }

    public String getCid() {
        return cid;
    }

    public void setCid(String cid) {
        this.cid = cid;
    }

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }

    @Override
    public String toString() {
        return "\n\t* 编号:" + cid+", 科目名:【" + cname+"】\n";
    }

    //@Kcx: _compare type String
    @Override
    public int compareTo(Course o) {
        return this.getCid().compareTo(o.getCid());
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Course course = (Course) o;
        return Objects.equals(cid, course.cid) &&
                Objects.equals(cname, course.cname);
    }

    @Override
    public int hashCode() {
        return Objects.hash(cid, cname);
    }
}

- 方法2:实体类Course(无自接口比较)& 比较器Coursecomparator类(外部接口比较)

- - 实体类Course:
package 【PackageName】;

import java.util.Comparator;
import java.util.Objects;

public class Course  /*//@Kcx _此句注释代码为【第二步】方法1的自接口比较的代码:implements Comparable<Course>*/  {
    private String cid;
    private String cname;

    public Course(){}
    public Course(String cid, String cname) {
        this.cid = cid;
        this.cname = cname;
    }

    public Course(String cid) {
        this.cid = cid;
    }

    public String getCid() {
        return cid;
    }

    public void setCid(String cid) {
        this.cid = cid;
    }

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }

    @Override
    public String toString() {
        return "\n\t* 编号:" + cid+", 科目名:【" + cname+"】\n";
    }

    //@Kcx: _以下注释代码为【第二步】方法1的自接口比较的代码;
    /*
    //@Kcx: _compare type String
    @Override
    public int compareTo(Course o) {
        return this.getCid().compareTo(o.getCid());
    }
    */
    
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Course course = (Course) o;
        return Objects.equals(cid, course.cid) &&
                Objects.equals(cname, course.cname);
    }

    @Override
    public int hashCode() {
        return Objects.hash(cid, cname);
    }
}
- - 比较器Coursecomparator类:
package 【PackageName】;

import java.util.Comparator;

public class CourseComparator implements Comparator<Course> {
    @Override
    //@Kcx: _外部接口比较器(Course型),对String型变量即Course类的成员变量id进行比较排序;
    //       注:compareTo的返回值为整型;
    //       ps:可以用自接口比较~见Course方法内;
    //@Kcx: _use out-comparator to compare type String
    public int compare(Course o1, Course o2) {
        return o1.getCid().compareTo(o2.getCid());
    }
}

?第三步:测试类SimluCourse

package com.Task;

import java.util.*;

/**
 * *****************
 * K-cx
 * com.Task
 * 2019/3/30 10:20
 * *****************
 */
/**
 *----------------------------------------------------------------------------------------
 *@Aunthor:K-cx
 * Tip:
 *      courses —— Course型【数组】,用于存放【全部】科目。(该数组仅做原始参考作用不参与任何变化)
 *                 -->主要依据其下标的初始不变性协助处理其他容器及数组
 *      coursesS —— TreeSet型【容器】(内仅存放Course型对象),用于存放用户【选择】科目【后】的课程情况。
 *                  -->在该容器内做科目选择后,实时处理选后的科目变化
 *
 *      selCourse —— Course型【数组】,用于存放用户【所选】的课程。
 *                   -->该数组仅用于选课过程中,选课结束,全元赋给courseEnd,做后续的删改工作
 *      courseEnd —— TreeSet型【容器】(内仅存放Course型对象),用于存放用户【最终确定】的课程。
 *                   -->该容器用于后续的删改已选课程,初始元素由selCourse进行赋给,
 *                      后续利用其容器特性进行删改工作
 *----------------------------------------------------------------------------------------
 */
public class SimluCourse {
    public static void main(String[] args) {
        System.out.println("* 学生选课模拟系统");
        /**
         *----------------------------------------------------------------------------------------
         *@Aunthor:K-cx
         *@Time:2019/3/31_14:06
         *@Description:
         *      _创建Course型数组courses,放入9门课程;
         *----------------------------------------------------------------------------------------
         */
        Course[] courses=new Course[9];
        courses[0]=new Course("001","语文");
        courses[1]=new Course("002","数学");
        courses[2]= new Course("003","英语");
        courses[3]=new Course("004","物理");
        courses[4]=new Course("005","化学");
        courses[5]=new Course("006","生物");
        courses[6]=new Course("007","历史");
        courses[7]=new Course("008","政治");
        courses[8]=new Course("009","地理");
        /**
         *----------------------------------------------------------------------------------------
         *@Aunthor:K-cx
         *@Time:2019/3/31_14:08
         *@Description:
         *      _创建TreeSet样Course型容器对象coursesS,             (包含所有的课程)
         *      并使用外部比较器CourseComparator用于对容器内所有Course型对象进行比较排序;
         *----------------------------------------------------------------------------------------
         */
        TreeSet<Course> coursesS=new TreeSet<>(new CourseComparator());
        /**
         *----------------------------------------------------------------------------------------
         *@Aunthor:K-cx
         *@Time:2019/3/31_14:09
         *@Description:
         *      _将数组courses中所有Course型对象全部放入TreeSet样Course型容器对象coursesS内;
         *----------------------------------------------------------------------------------------
         */
        for(int i=0;i<courses.length;i++){
            coursesS.add(courses[i]);
        }
        /**
         *----------------------------------------------------------------------------------------
         *@Aunthor:K-cx
         *@Time:2019/3/31_14:11
         *@Description:
         *      _输出提示信息,并将学生信息(姓名、学号)进行记录;
         *      创建Student型对象student,将初始化信息放入构造;
         *----------------------------------------------------------------------------------------
         */
        System.out.println("---------------------------------------------------------\n" +
                "* 本次选课提供[科目]有:\n* "
                +coursesS);
        Scanner sin=new Scanner(System.in);
        System.out.println("---------------------------------------------------------\n" +
                "* 请输入你的[学号]:");
        String sid=sin.next();
        System.out.println("* 请输入你的[姓名]:");
        String sname=sin.next();
        Student student=new Student(sid,sname,coursesS);
        /**
         *----------------------------------------------------------------------------------------
         *@Aunthor:K-cx
         *@Time:2019/3/31_14:13
         *@Description:
         *      _定义计数器count(数组selCourse的下标),用于对数组selCourse内元素进行依次放入处理;
         *      创建Course型数组selCourse用于对用户所选的课程进行收录;
         *----------------------------------------------------------------------------------------
         */
        int count=0;
        Course[] selCourse=new Course[9];
        /**
         *----------------------------------------------------------------------------------------
         *@Aunthor:K-cx
         *@Time:2019/3/31_14:16
         *@Description:
         *      _立外部循环标号:fChoseCourse,便于选课3门后(或多于3门后)跳出循环体;
         *----------------------------------------------------------------------------------------
         */
        fChoseCourse:while (true){
             //@Kcx: _小于三门(已选1、2门课)时,进行以下语句;
            if (count<3){
                //@Kcx: _输出提示信息;
                System.out.println("---------------------------------------------------------\n" +
                        "* 你可选的[科目]有:\n" +
                        "* "+coursesS);
                System.out.println("* 请输入你的第"+(count+1)+"门[课程]对应[编号]:");
                //@Kcx: _记录String类型的编号(与Course类的成员变量cid相同);
                String selCourseNum=sin.next();
                //@Kcx: _将Sting型转换为int型,便于使用数组(courses)的下标,
                //                           从而直接获得对应编号的科目名;
                int selCourseNumInt=Integer.parseInt(selCourseNum);

                //@Kcx: _原始想法;
                //@Kcx: _original idea
                    /*System.out.println("请输入你的第"+(count+1)+"门科目对应名称:");
                    String selCourseName=sin.next();*/

                //@Kcx: _越界提示信息,并重新进入外部循环;
                //@Kcx: _越界判定解释:共9门课,数组下标最大值为8,
                //       若输入(selCourseNumInt)的值-1【非】小于等于8,即输入的值【非】小于等于9,
                //       输出错误提示信息,重新进入外部循环;
                if (selCourseNumInt-1>8){
                    System.out.println("* 输入有误!请重新输入!");
                    continue fChoseCourse;
                }
                //@Kcx: _创建Course型数组selCourse中selCourse[count]元素的Course型对象,并传参构造;
                //      注:Course对象两个参数类型都为String,参数一:编号,参数二:编号对应的课程名称;
                //      例:编号001的课程,由于其courses数组对应下标要-1,
                //         因此下标为0,再.它的【获取名称】方法,获取课程名称;
                selCourse[count]=new Course(selCourseNum,courses[selCourseNumInt-1].getCname());
                //@Kcx: _判断在Course型容器coursesS中是否包含——刚刚所创建的Course型对象selCourse[count];
                if (coursesS.contains(selCourse[count])) {
                    //@Kcx: _若包含,则拿走容器coursesS中与selCourse[count]相同的Course型对象;
                    coursesS.remove(selCourse[count]);
                    //@Kcx: _selCourse数组下标+1;
                    count++;
                }else {
                    //@Kcx: _若不包含,输出错误提示信息,结束本次循环,进入下一次循环
                    //      (由于count的条件限制,无需continue);
                    System.out.println("* 该课不存在(输入[编号]有误),或已被选过!请重新选课!");
                }
            }
            //@Kcx: _大于等于三门(即已选满三门课程)时,进行以下语句;
            if (count>=3){
                //@Kcx: _输出提示信息;
                System.out.println("---------------------------------------------------------\n" +
                        "* 你可选的[科目]有:\n" +
                        "* "+coursesS);
                //@Kcx: _立内部循环标号:fChoseCourseContinue,便于选3门课后继续选后续(4、5、6……)课程;
                fChoseCourseContinue:while (true) {
                    //@Kcx: _输出提示信息;
                    System.out.println("* 已选" + count + "门[课程],是否继续选课?\n" +
                            "* [是]请输入:1;\t[否]请输入:2");
                    //@Kcx: _记录是否继续进行选课的对应输入数字;
                    int isContinue = sin.nextInt();
                    //@Kcx: _若输入2:不进行继续选课,则跳出外部循环(break标号fChoseCourse);
                    //@Kcx: _if 2 --> out ChoseCourse
                    if (isContinue == 2) {
                        break fChoseCourse;
                    }
                    //@Kcx: _若输入的不是1也不是2(注意else if的区间范围),则输出错误提示信息,
                    //       并重新进入内部循环(continue标号fChoseCourseContinue);
                    //@Kcx: _if !(1||2) --> print error and continue ChoseCourseContinue
                    else if (isContinue != 1) {
                        System.out.println("* 输入有误!请重新输入!");
                        continue fChoseCourseContinue;
                    }
                    //@Kcx: _若输入1:继续选课,则跳出内部循环(continue标号fChoseCourseContinue)
                    //       继续执行if (count>=3)语句块中剩余代码,进行继续选课;
                    //@Kcx: _if 1 --> continue ChoseCourse
                    break fChoseCourseContinue;
                }
                //@Kcx: _以下为继续选课;
                //@Kcx: _输出提示信息;
                System.out.println("* 请输入你的第"+(count+1)+"门[课程]对应[编号]:");
                //@Kcx: _记录String类型的编号(与Course类的成员变量cid相同);
                String selCourseNum=sin.next();
                //@Kcx: _将Sting型转换为int型,便于使用数组(courses)的下标,
                //                           从而直接获得对应编号的科目名;
                int selCourseNumInt=Integer.parseInt(selCourseNum);

                        //@Kcx: _原始想法;
                        //@Kcx: _original idea
                                /*System.out.println("请输入你的第"+(count+1)+"门科目对应名称:");
                                String selCourseName=sin.next();*/

                //@Kcx: _越界提示信息,并重新进入外部循环;
                //@Kcx: _越界判定解释:共9门课,数组下标最大值为8,
                //       若输入(selCourseNumInt)的值-1【非】小于等于8,即输入的值【非】小于等于9,
                //       输出错误提示信息,重新进入外部循环;
                if (selCourseNumInt-1>8){
                    System.out.println("* 输入有误!请重新输入!");
                    continue fChoseCourse;
                }
                //@Kcx: _创建Course型数组selCourse中selCourse[count]元素的Course型对象,并传参构造;
                //      注:Course对象两个参数类型都为String,参数一:编号,参数二:编号对应的课程名称;
                //      例:编号001的课程,由于其courses数组对应下标要-1,
                //         因此下标为0,再.它的【获取名称】方法,获取课程名称;
                selCourse[count]=new Course(selCourseNum,courses[selCourseNumInt-1].getCname());
                //@Kcx: _判断在Course型容器coursesS中是否包含——刚刚所创建的Course型对象selCourse[count];
                if (coursesS.contains(selCourse[count])) {
                    //@Kcx: _若包含,则拿走容器coursesS中与selCourse[count]相同的Course型对象;
                    coursesS.remove(selCourse[count]);
                    //@Kcx: _selCourse数组下标+1;
                    count++;
                }else {
                    //@Kcx: _若不包含,输出错误提示信息,结束本次循环,进入下一次循环
                    //      (由于count的条件限制,无需continue);
                    System.out.println("* 该课不存在(输入[编号]有误),或已被选过!请重新选课!");
                }
            }
        }

        //@Kcx: _测试:  计数器count是否正确计数 & 用户选的课程是否收入正确;
        //@Kcx: _Test count & selCourse
        /*System.out.println(count);*/
        /*for(Object element:selCourse){
            System.out.print(element+" ");
        }*/

        /**
         *----------------------------------------------------------------------------------------
         *@Aunthor:K-cx
         *@Time:2019/3/31_15:16
         *@Description:
         *      _创建TreeSet样Course型容器对象courseEnd,             (包含用户最终所选的课程)
         *      并使用外部比较器CourseComparator用于对容器内所有Course型对象进行比较排序;
         *----------------------------------------------------------------------------------------
         */
        TreeSet<Course> courseEnd=new TreeSet<>(new CourseComparator());
        /**
         *----------------------------------------------------------------------------------------
         *@Aunthor:K-cx
         *@Time:2019/3/31_15:21
         *@Description:
         *      _将存放用户所有选课的Course型数组selCourse中的所有元素全部放入容器对象courseEnd
         *      (便于使用add、remove等容器特有方法);
         *----------------------------------------------------------------------------------------
         */
        for(int i=0;i<count;i++){
            courseEnd.add(selCourse[i]);
        }
        //@Kcx: _输出显示信息;
        System.out.println("---------------------------------------------------------\n" +
                "* 学号为: ["+student.getSid()+"] ,名叫 ["+student.getSname()+"] 的同学");
        /**
         *----------------------------------------------------------------------------------------
         *@Aunthor:K-cx
         *@Time:2019/3/31_15:25
         *@Description:
         *      _立标号fConfirmCourseContinue
         *      (立不立无所谓,不存在多层循环跳出问题,这里立是为了方便理解);
         *----------------------------------------------------------------------------------------
         */
        fConfirmCourseContinue:while (true) {
             //@Kcx: _输出提示信息;
            System.out.println("---------------------------------------------------------\n" +
                    "* 你已选的[课程]有:\n" +
                    "* "+courseEnd+ "\n" +
                    "---------------------------------------------------------");
            System.out.println("* 请确认你的选课。\n[确认]请输入:1;\t\t[删除]请输入:2;\t\t[修改]请输入:3;\n[查看已选课程]请输入:4;\t\t[查看可选科目]请输入:5;");
            //@Kcx: _记录确认信息,或是需要(继续)进行删除或修改的对应输入数字;
            int isConfirm = sin.nextInt();
            //@Kcx: _若输入4:进行对已选课的查询;
            //@Kcx: _if 4 --> check what has been chosen
            if (isConfirm==4){
                //@Kcx: _“ 直接 ”继续循环;
                continue fConfirmCourseContinue;
            }
            //@Kcx: _若输入5:进行对可选科的查询;
            //@Kcx: _if 5 --> check what can be chosen
            if (isConfirm==5){
                System.out.println("---------------------------------------------------------\n"+
                        "* 你可选的[科目]有:\n"+
                        "* "+coursesS);

                //@Kcx: _继续循环(为了能执行输入1时的代码,采用continue);
                continue fConfirmCourseContinue;
            }
            //@Kcx: _若输入2:进行对已选课的【删除】;
            //@Kcx: _if 2 --> delete chosen course
            if (isConfirm == 2) {
                //@Kcx: _输出提示信息;
                System.out.println("* 请输入删除[课程]的[编号]:");
                //@Kcx: _记录被【删除】的已选课科目String类型的编号(与Course类的成员变量cid相同);
                String whichNumNeed=sin.next();
                //@Kcx: _将Sting型转换为int型,便于使用数组(courses)的下标,
                //                           从而对相应编号的科目进行一系列操作;
                int whichNumNeedInt=Integer.parseInt(whichNumNeed);

                //@Kcx: _测试:  下标是否已经正确转换为int类型;
                //@Kcx: _Test subscript whether it has conversed to type int correctly
                /*System.out.println(whichNumNeedInt);*/

                //@Kcx: _创建Course型对象whichCourseNeed,并传参构造;
                //      注:Course对象两个参数类型都为String,参数一:编号,参数二:编号对应的课程名称;
                //      例:编号001的课程,由于其courses数组对应下标要-1,
                //         因此下标为0,再.它的【获取名称】方法,获取课程名称;
                Course whichCourseNeed=new Course(whichNumNeed,courses[whichNumNeedInt-1].getCname());
                //@Kcx: _判断Course型容器对象courseEnd中是否包含——刚刚所创建的Course型对象whichCourseNeed;
                if (!courseEnd.contains(whichCourseNeed)){
                    //@Kcx: _若不包含,则输出错误提示信息,并结束本次循环,进入下一次循环;
                    System.out.println("* 该需被删除课不存在(输入[编号]有误),请重新进入!");
                    continue fConfirmCourseContinue;
                }
                //@Kcx: _若包含,则拿走course型对象容器courseEnd中的与whichCourseNeed内容相同的元素,完成【删除】;
                courseEnd.remove(whichCourseNeed);
                //@Kcx: _除了以下代码(到EEE),其余代码和【修改】代码大体一致;
                //@Kcx: _other code is the same as the below part(Change)by and large,just the below is different(to EEE)
                if (courseEnd.size()<3){
                    //@Kcx: _若完成删除工作后,course型对象容器courseEnd的大小小于3,则输出错误提示信息,
                    //       并将已删除元素重新放入courseEnd容器,结束本次循环,进行下一次循环;
                    System.out.println("* 每名学生至少选择三门[课程],无法操作!");
                    courseEnd.add(whichCourseNeed);
                    continue fConfirmCourseContinue;
                }
                //@Kcx: _若完成删除工作后,course型对象容器courseEnd的大小没有小于3,
                //       那么,将被删除元素,重新放回course型对象容器coursesS中,
                //       便于下一次【删除】和【修改】时,该元素重新进入选单;
                coursesS.add(whichCourseNeed);
                //@Kcx: _与【修改】的差异代码到此为止;
                //@Kcx: _EEE

                //@Kcx: _继续循环(为了能执行输入1时的代码,采用continue);
                continue fConfirmCourseContinue;
            }
            //@Kcx: _若输入3:进行对已选课的【修改】;
            //@Kcx: _if 3 --> change chosen course
            else if (isConfirm==3){
                //@Kcx: _输出提示信息;
                System.out.println("* 请输入被修改[课程]的[编号]:");
                //@Kcx: _记录被【修改】的已选课科目String类型的编号(与Course类的成员变量cid相同);
                String whichNumNeed=sin.next();
                //@Kcx: _将Sting型转换为int型,便于使用数组(courses)的下标,
                //                           从而对相应编号的科目进行一系列操作;
                int whichNumNeedInt=Integer.parseInt(whichNumNeed);

                //@Kcx: _测试:  下标是否已经正确转换为int类型;
                //@Kcx: _Test subscript whether it has conversed to type int correctly
                /*System.out.println(whichNumNeedInt);*/

                //@Kcx: _创建Course型对象whichCourseNeed,并传参构造;
                //      注:Course对象两个参数类型都为String,参数一:编号,参数二:编号对应的课程名称;
                //      例:编号001的课程,由于其courses数组对应下标要-1,
                //         因此下标为0,再.它的【获取名称】方法,获取课程名称;
                Course whichCourseNeed=new Course(whichNumNeed,courses[whichNumNeedInt-1].getCname());
                //@Kcx: _判断Course型容器对象courseEnd中是否包含——刚刚所创建的Course型对象whichCourseNeed;
                if (!courseEnd.contains(whichCourseNeed)){
                    //@Kcx: _若不包含,则输出错误提示信息,并结束本次循环,进入下一次循环;
                    System.out.println("* 该需被修改课不存在(输入[编号]有误),请重新进入!");
                    continue fConfirmCourseContinue;
                }
                //@Kcx: _若包含,则拿走course型对象容器courseEnd中的与whichCourseNeed内容相同的元素,完成【移除】;
                courseEnd.remove(whichCourseNeed);
                //@Kcx: _除了以下代码(到EEE),其余代码和【删除】代码大体一致;
                //@Kcx: _other code is the same as the above part(Delete)by and large,just the below is different(to EEE)
                //@Kcx: _将已【移除】的元素重新放入Course型容器coursesS中,便于进行【修改】操作时,目前可选课程的正确性;
                coursesS.add(whichCourseNeed);
                //@Kcx: _输出提示信息;
                System.out.println("* 剩余可选选课[科目]还有:\n" +
                        "* " + coursesS+
                        "\n* 请输入你新改[课程]的[编号]:");
                //@Kcx: _记录想要【改为】的选课科目String类型的编号(与Course类的成员变量cid相同);
                String whichNumToChange=sin.next();
                //@Kcx: _将Sting型转换为int型,便于使用数组(courses)的下标,
                //                           从而对相应编号的科目进行一系列操作;
                int whichNumToChangeInt=Integer.parseInt(whichNumToChange);
                //@Kcx: _创建Course型对象whichCourseToChange,并传参构造;
                //      注:Course对象两个参数类型都为String,参数一:编号,参数二:编号对应的课程名称;
                //      例:编号001的课程,由于其courses数组对应下标要-1,
                //         因此下标为0,再.它的【获取名称】方法,获取课程名称;
                Course whichCourseToChange=new Course(whichNumToChange,courses[whichNumToChangeInt-1].getCname());
                //@Kcx: _判断Course型容器对象coursesS中是否包含——刚刚所创建的Course型对象whichCourseToChange;
                if (!coursesS.contains(whichCourseToChange)){
                    //@Kcx: _若不包含,则输出错误提示信息,
                    //       将被【修改】元素放回Course型容器对象courseEnd中,
                    //       将已被重新放回coursesS的whichCourseNeed元素做【移除】工作,
                    //       并结束本次循环,进入下一次循环;
                    System.out.println("* 该需新改课不存在(输入[编号]有误),请重新进入!");
                    courseEnd.add(whichCourseNeed);
                    coursesS.remove(whichCourseNeed);
                    continue fConfirmCourseContinue;
                }
                //@Kcx: _若包含,则将想要【改为】的course型对象whichCourseToChange添入courseEnd对象容器中,
                //       并拿走course型对象容器coursesS中的与whichCourseToChange内容相同的元素,完成【修改】;
                courseEnd.add(whichCourseToChange);
                coursesS.remove(whichCourseToChange);
                //@Kcx: _与【删除】的差异代码到此为止;
                //@Kcx: _EEE

                //@Kcx: _继续循环(为了能执行输入1时的代码,采用continue);
                continue fConfirmCourseContinue;
            }
            //@Kcx: _若输入的既不是1:确认,也不是2:删除,又不是3:修改,
            //       则输出错误提示信息,结束本次循环,重新进入循环;
            //@Kcx: _if !(1||2||3) --> print error and continue fConfirmCourseContinue
            else if (isConfirm != 1) {
                System.out.println("* 输入有误!请重新输入!");
                continue fConfirmCourseContinue;
            }
            //@Kcx: _若输入1:确认,则完成【学生选课】,输出学生信息及选课信息!结束程序。
            //@Kcx: _if 1 --> confirm
            System.out.println("---------------------------------------------------------\n" +
                    "* 学号为: ["+student.getSid()+"] ,名叫 ["+student.getSname()+"] 的同学\n" +
                    "---------------------------------------------------------\n" +
                        "* 你最终确认的[课程]如下:\n" +
                        "* "+courseEnd+ "\n" +
                        "---------------------------------------------------------");
            System.exit(0);
        }
    }
}

?第四步:数据测试

1. 成功运行程序

成功运行程序

2. 输入学生相关信息

输入学生相关信息

3. 选择3门课程

由于题中要求最低选三门,此处以“009”、“006”、“003”为例(用户可以输入错误信息来测试程序的可执行性)
选择3门课程

4. 根据提示信息继续选择第4、5门选课,并结束选课

为了测试后续的删除修改选课程序,此处增入第4、5门选课,以“001”、“002”为例(用户可以输入错误信息来测试程序的可执行性)

选择继续选课:
选择继续选课

选择第4、5门课:
选择第4、5门课

结束选课:
结束选课

5. 测试【删除】功能

测试程序的删除功能的可执行性,此处以删除“009”一门已选选课为例(用户可以输入错误信息来测试程序的可执行性)

选择删除选课:
选择删除选课

输入被删除的课程编号,完成删除
输入被删除的课程编号,完成**删除**

6. 测试【修改】功能

测试程序的修改功能的可执行性,此处以修改“006”一门已选选课为“004”为例(用户可以输入错误信息来测试程序的可执行性)

选择修改选课:
选择修改选课

输入被修改的课程编号:
输入被修改的课程编号

输入新改课程的编号,完成修改
输入新改课程的编号,完成**修改**

7. 测试【查询】功能

- 测试【查看已选课程】功能

测试【查看已选课程】功能

- 测试【查看可选科目】功能

测试【查看可选科目】功能

8. 【确认】学生选课信息

【确认】学生选课信息


?End

版权声明:
@Kcx@遊光@胤殁@Karl@Karlcixio

感谢您能来看我的博客,本博客仅供大家学术交流,如您有需要将本博客用作它用,请与我联系!
我的联系方式:

微信搜索公众号:Karlcixio
也可以直接扫描以下二维码
----------------------------------公众号二维码
个人 QQ:1005589159


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值