JAVA模拟学生选课系统

大家好,我是WilliamCode,继高中C++的lowB学习之后,大一的我来学Java了。其实都是为了学Android才来学Java的。自己写了一个java模拟选课的作业,写一篇博客分享一下。
本篇文章为个人作品,转载请注明出处,并注明:WilliamCode真帅。(emmm,开个玩笑)

不说了,直接上代码。(下面有代码相关说明,以及我在写这段代码之后觉得的注意事项和一些感受)

******************我是分割线*****************
显示Course类,存储课程信息,静态变量mark用于给新输入的课程编代号。

package com.classselect;

public class Course {
    long ID;
    String name;

    public static int mark=0;

    public Course(String name) {
        this.ID=++mark;
        this.name=name;
    }
    public void ChangeId(int a) {
        this.ID=a;
    }
    public Course() {
    }
}

然后是Student类,其中CourseSelect是存储该学生已选课程的ArrayList。


package com.classselect;

import java.util.ArrayList;
import java.util.List;

public class Student {
    int ID;
    String name;
    List<Course> CourseSelected = new ArrayList<Course>();

    public Student(int num,String name) {
        this.ID=num;
        this.name=name;
    }

    public Student() {

    }
    public int compare(Student aa,Student bb) {
        if (aa.ID>bb.ID) return 1;
        if (aa.ID<bb.ID) return -1;
        return 1;
    }
}

然后是AllCourse类,用于存储待选课程。

package com.classselect;

import java.util.ArrayList;
import java.util.List;

public class AllCourse {
    List<Course> CourseList = new ArrayList<Course>();

    public void AddCourse(Course a) {
        this.CourseList.add(a);
    }

    public boolean CourseExist(String a) {
        for (int i=0;i<CourseList.size();i++) {
            Course tmp = (Course)CourseList.get(i);
            if (tmp.name == a) return true;
        }
        return false;
    }

    public boolean CourseExist(int id) {
        Course a=new Course();
        if (id>0 && id<=a.mark) {
            return true;
        }
        return false;

    }

    public void PrintCourseList() {
        for (int i=0;i<CourseList.size();i++) {
            Course a=(Course)CourseList.get(i);
            System.out.println(a.ID+" "+a.name);
        }
        if (CourseList.size()==0) {
            System.out.println("你还没有选择任何课程");
        }
    }

    public void CourseInit() {

        Course a = new Course("高等数学");
        CourseList.add(a);
        Course b = new Course("大学英语");
        CourseList.add(b);
        Course c = new Course("世界史");
        CourseList.add(c);
    }

    public String ReturnCourseName(int aa) {
        Course a=new Course();
        for (int i=0;i<CourseList.size();i++) {
            a=(Course)CourseList.get(i);
            if (a.ID==aa) break;
        }
        return a.name;
    }

}

下面是SCList(Student-Course List)类,存储多个学生及其已经选择的课程。

package com.classselect;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class SCListGo {
    public static int NowPos = 0;
    List<Student> SCList = new ArrayList<Student>();

    public void AddStudent(Student a) {
        SCList.add(a);
        NowPos=SCList.size()-1;
    }


    public String StudentExist(int a) {
        for (int i=0;i<SCList.size();i++) {
            Student tmp2 = (Student)SCList.get(i);
            if (a == tmp2.ID) {
                NowPos=i;
                return tmp2.name;
            }
        }
    return "111111";
    }

    public boolean StudentCourseExist(int CID) {
        Student b=(Student)SCList.get(NowPos);
        for (int i=0;i<b.CourseSelected.size();i++) {
            Course c=b.CourseSelected.get(i);
            if (c.ID==CID) return true;
        }
        return false;
    }

    public void CourseDelete(int CID) {
        Student b=SCList.get(NowPos);
        for (int i=0;i<b.CourseSelected.size();i++) {
            Course c=b.CourseSelected.get(i);
            if (c.ID==CID) {
                b.CourseSelected.remove(i); 
                return;
            }
         }      
    }

    public void AddCourse(Course a) {
        Student b=(Student)SCList.get(NowPos);


        Course c=new Course();

        for (int i=0;i<b.CourseSelected.size();i++) {
            c=b.CourseSelected.get(i);      
        }

        b.CourseSelected.add(a);


        for (int i=0;i<b.CourseSelected.size();i++) {
            a=b.CourseSelected.get(i);
        }
        SCList.set(NowPos, b);
    }

    public static int Compare(Student aa,Student bb) {
        if (aa.ID>bb.ID) return 1;
        if (aa.ID<bb.ID) return -1;
        return 1;
    }
    public void PrintSCInfo() {
        int flag1=0;
        int flag2=0;
        for (int i=0;i<SCList.size();i++) {
            flag1=1;
            Student b = (Student)SCList.get(i);
            System.out.println("学号:"+b.ID+"  姓名:"+b.name);
            System.out.println("      已经选择了如下课程:");
            for (int j=0;j<b.CourseSelected.size();j++) {
                flag2=1;
                Course c=(Course)b.CourseSelected.get(j);
                System.out.println("        "+c.ID+" "+c.name);
            }
            if (flag2==0) {
                System.out.println("该学生还没有选择课程");
            }
        }
        if (flag1==0) {
            System.out.println("没有学生的选课信息");
        }
    }

    public void PrintSingleStudentInfo(int a) {
        for (int i=0;i<this.SCList.size();i++) {
            Student tmp2 = (Student)SCList.get(i);
            if (tmp2.ID==a) {
                for (int j=0;j<tmp2.CourseSelected.size();j++) {
                    Course b=tmp2.CourseSelected.get(j);
                    System.out.println(b.ID+"  "+b.name);
                }
            if (tmp2.CourseSelected.size()==0) {
                System.out.println("你没有选择任何课程");
            }
            return;
            }
        }
    }
}

下面是主函数ToSelect类

package com.classselect;

import java.util.InputMismatchException;
import java.util.Scanner;

public class ToSelect {

    public static void main(String[] args) {
        //Init The Class
        AllCourse allcourse=new AllCourse();
        Student student=new Student();
        SCListGo e=new SCListGo();
        God god=new God();
        Scanner console=new Scanner(System.in);
        allcourse.CourseInit();



        int num;
        int id;
        String name;
        while(1==1) {
            System.out.println("欢迎来到gay理选课系统");
            System.out.println("请输入你的学号");
            num=console.nextInt();
            id=num;
            if (num == 99991111) {
                System.out.println("你好,管理员,请输入管理员密码");
                num=console.nextInt();
                int flag=0;
                while(num!=1120172954){
                    System.out.println("管理员密码错误,请重新输入<输入54138退出管理员模式>");
                    num=console.nextInt();
                    if(num==54138) {
                        flag=1;
                        break;
                    }
                }
                if (flag==1) continue;

                //************************************管理员模式代码*****************************************
                System.out.println("你好,管理员!请输入要执行的操作代码");
                while(1==1) {
                    System.out.println("1 查看课程");
                    System.out.println("2 添加课程");
                    System.out.println("3 查看所有学生及选课信息");
                    System.out.println("4 退出管理员模式");
                    int tmp;
                    tmp=console.nextInt();
                    while (tmp<=0 || tmp>=5) {
                        System.out.println("代码错误,请输入1到4之间的代码");
                    }
                    if (tmp == 4) break;
                    if (tmp == 1) {
                        allcourse.PrintCourseList();
                        System.out.println("**********************分割线***********************");
                        continue;
                    }
                    String TmpName;
                    if (tmp == 2) {
                        System.out.println("请输入要添加的课程,系统将自动分配代号");
                        TmpName=console.next();
                        if (allcourse.CourseExist(TmpName)==true) {
                            System.out.println("课程已经存在");
                            continue;
                        }
                        Course course=new Course(TmpName);
                        allcourse.AddCourse(course);
                        System.out.println("添加课程成功,课程代码"+course.ID+"  课程名称:"+course.name);
                        System.out.println("**********************分割线***********************");
                        continue;
                    }
                    if (tmp == 3) {
                        e.PrintSCInfo();
                        System.out.println("**********************分割线***********************");
                        continue;
                    }
                }
                continue;
            }


            name=e.StudentExist(num);
            if (name!="111111") {
                System.out.println("你好,"+name);
            }
            else {
                System.out.println("请输入你的姓名");
                name=console.next();
                System.out.println("你好,"+name+",你的学号是"+num+"。信息添加成功");
                student.name=name;
                student.ID=num;
                e.AddStudent(student);
            }
            while(1==1){
                System.out.println("请选择操作并输入操作代号");
                System.out.println("1 查看已选课程");
                System.out.println("2 选课");
                System.out.println("3 删除课程");
                System.out.println("4 退出");
                System.out.println("**********************分割线***********************");
                num=console.nextInt();
                if (num<=0 || num>=5)
                do {
                    System.out.println("请输入1到3之间的整数");
                    num=console.nextInt();
                }while(num<=0 || num >4);
                if(num==4) break;
                if (num == 1) {
                    e.PrintSingleStudentInfo(id);
                    System.out.println("**********************分割线***********************");
                    continue;
                }
                else if (num == 2) {
                    allcourse.PrintCourseList();
                    while(1==1){
                        System.out.println("请输入要选的课程代码,输入9999退出");
                        int CID=console.nextInt();
                        if(CID==9999) break;
                        if (allcourse.CourseExist(CID)==false) {
                            System.out.println("课程不存在");
                            System.out.println("**********************分割线***********************");
                            continue;
                        }
                        if (e.StudentCourseExist(CID)==true) {
                            System.out.println("你已经选择了该课程");
                            System.out.println("**********************分割线***********************");
                            continue;
                        }
                        Course course=new Course();
                        course.ID=CID;
                        course.name=allcourse.ReturnCourseName(CID);
                        e.AddCourse(course);
                        System.out.println("你已经成功选择了该课程:"+CID+" "+course.name);
                        System.out.println("**********************分割线***********************");
                    }
                }
                else if (num == 3) {
                    System.out.println("你的已选课程列表为");
                    e.PrintSingleStudentInfo(id);
                    while(1==1) {
                        System.out.println("请输入要删除的课程代码,输入9999退出");
                        int CID=console.nextInt();
                        if (CID==9999) break;
                        if (allcourse.CourseExist(CID)==false) {
                            System.out.println("课程不存在");
                            System.out.println("**********************分割线***********************");
                            continue;
                        }
                        if (e.StudentCourseExist(CID)==false) {
                            System.out.println("你并未选择了该课程");
                            System.out.println("**********************分割线***********************");
                            continue;
                        }
                        e.CourseDelete(CID);    
                        System.out.println("你成功的删除了课程"+CID+" "+allcourse.ReturnCourseName(CID));
                        System.out.println("**********************分割线***********************");
                    }
                }
            }   
        }   
        }   
}

完了,这就是所有东西。
这个工程可以下载,我分享在了百度云,下载之后导入就可以了
百度云地址:https://pan.baidu.com/s/1i5iVtCL
提取密码:g6vm
如果链接失效可以给[email protected]发邮件。
要注意的是代码里面有的方法压根就没有用。只是要用其他方法实现时候要写的。

其中有很多细节,有些细节我已经写出来了,但是有些细节没有写,我知道的细节如下:
1、输入错误时应该用try-catch抛出错误并处理
2、打印学生信息时,给学生、课程列表列表排序,用sort(),重写compare方法可以自定义排序规则
3、判断arraylist中有没有某个学生信息,可以用contain来判断,重写一下equals()就可以,但是contains内部也是由循环来遍历list比较的,所以这里我直接手动遍历了

然后就是我写这个工程的一点体会,作为新手:

1、一定要先写出整个project的思路图。很多资深的开发者用那个什么软件直接画,画好之后就可以直接生成基本的代码结构
2、如果思路不是那么成熟。先建立最基本的类,比如这个模拟选课系统里面我先写Student、Course类的属性和初始化方法;之后先去写主函数,当遇到要调用的方法时就去写其他具体的类。
3、对于新手来说可能这个project是一个比较大的任务。以前学c++老是觉得应该一次写完,但一个比较大的工程可能是很多人一起写,或者需要一个人分多次写很多次。所以程序最好条理清晰,变量命名也必须合乎规范。
4、遇见问题时一定要会用debug程序。新手一定要学会用debug,用断点调试可以大大提高效率。
5、对于一个要用多次的类的实例,不要只在开头实例化一个,后面都用。这样做可以省空间,但可能出现错误,莫名其妙;应该用之前再实例化。
6、一定要理解类、对象、属性、方法之间的关系,要明白只有类实例化成为对象之后才有内存来存储数据。所以在main函数里,基本每一个类都要实例化一次,整个main里面只有一个的对象可以在main方法开头写在一起。
7、新手学习的话,基础一定要扎实,否则写代码这个不会那个有问题还得去查,很浪费时间,比如equal函数怎么重写,比如List之中嵌套set要重写hashset啊,特别细节。

emmm,BB的有点多。以上都是新手的看法,很多东西可能有问题,仅供参考。如果您有什么看法也可以留言或评论,作为新手的我会认真学习的哦。

猜你喜欢

转载自blog.csdn.net/williamcode/article/details/78304742