数据结构课程实践(1)-代码实现

数据结构课程实践(1)

一.题目:学生成绩档案管理系统

----代码实现

1.数据类

(1)学生类

public class Student implements java.io.Serializable{
    //学号、姓名、专业、四门课成绩、总分、名次
    private String num;
    private String name;
    private String major;
    private double class1Score;
    private double class2Score;
    private double class3Score;
    private double class4Score;
    private double sum;
    private int place;

    public Student(String num, String name, String major, double class1Score, double class2Score, double class3Score, double class4Score) {
        this.num = num;
        this.name = name;
        this.major = major;
        this.class1Score = class1Score;
        this.class2Score = class2Score;
        this.class3Score = class3Score;
        this.class4Score = class4Score;
        this.sum=class1Score+class2Score+class3Score+class4Score;
    }

    public String getNum() {
        return num;
    }

    public void setNum(String num) {
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMajor() {
        return major;
    }

    public void setMajor(String major) {
        this.major = major;
    }

    public double getClass1Score() {
        return class1Score;
    }

    public void setClass1Score(double class1Score) {
        this.class1Score = class1Score;
    }

    public double getClass2Score() {
        return class2Score;
    }

    public void setClass2Score(double class2Score) {
        this.class2Score = class2Score;
    }

    public double getClass3Score() {
        return class3Score;
    }

    public void setClass3Score(double class3Score) {
        this.class3Score = class3Score;
    }

    public double getClass4Score() {
        return class4Score;
    }

    public void setClass4Score(double class4Score) {
        this.class4Score = class4Score;
    }

    public double getSum() {
        return sum;
    }

    public void setSum(double sum) {
        this.sum = sum;
    }

    public int getPlace() {
        return place;
    }

    public void setPlace(int place) {
        this.place = place;
    }
}

通过序列化学生类以方便存取到文本中

(2)账户类

public class Accounts implements java.io.Serializable{
    private String userName;
    private String passWord;

    public Accounts(String userName, String passWord) {
        this.userName = userName;
        this.passWord = passWord;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
}

通过序列化账户类以方便存取到文本中

2.文本交互类

—将数据存取到文本文件中

(1)账户交互

import java.io.*;
import java.util.List;

public class AccountsInOut {
    public  void outPut(List<Accounts> list)
    {
        try {
            FileOutputStream outputStream = new FileOutputStream("D:\\学生成绩管理系统数据文件\\Accounts.txt");
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
            objectOutputStream.writeObject(list);
            objectOutputStream.flush();
            objectOutputStream.close();
            outputStream.close();
        }catch (Exception e){
        }
    }
    public  List<Accounts> inPut()
    {
        try
        {
            FileInputStream inputStream=new FileInputStream("D:\\学生成绩管理系统数据文件\\Accounts.txt");
            ObjectInputStream objectInputStream=new ObjectInputStream(inputStream);
            List<Accounts>list=(List<Accounts>)objectInputStream.readObject();
            objectInputStream.close();
            inputStream.close();
            return list;
        }catch(IOException i)
        {
            return null;
        }catch(ClassNotFoundException c)
        {
            return null;
        }catch (Exception e){
            return null;
        }
    }
}

(2)学生交互

import java.io.*;
import java.util.List;

public class InAndOut {
    public  void outPut(List<Student>list)
    {
        try {
            FileOutputStream outputStream = new FileOutputStream("D:\\学生成绩管理系统数据文件\\test.txt");
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
            objectOutputStream.writeObject(list);
            objectOutputStream.flush();
            objectOutputStream.close();
            outputStream.close();
        }catch (Exception e){
    }
    }
    public  List<Student> inPut()
    {
        try
        {
            FileInputStream inputStream=new FileInputStream("D:\\学生成绩管理系统数据文件\\test.txt");
            ObjectInputStream objectInputStream=new ObjectInputStream(inputStream);
            List<Student>list=(List<Student>)objectInputStream.readObject();
            objectInputStream.close();
            inputStream.close();
            return list;
        }catch(IOException i)
        {
            return null;
        }catch(ClassNotFoundException c)
        {
            return null;
        }catch (Exception e){
            return null;
        }
    }
}

3.数据类

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

public class Database implements java.io.Serializable{
    List<Accounts>accountsList=new ArrayList<>();
    List<Student>studentList=new ArrayList<>();
    AccountsInOut accountsInOut=new AccountsInOut();
    InAndOut inAndOut=new InAndOut();
    public Database(){
        try{
            accountsList=accountsInOut.inPut();
            studentList=inAndOut.inPut();
          }catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
    public void accountOut(List<Accounts>list){
        accountsInOut.outPut(list);
    }
    public void studentOut(List<Student>list){
        inAndOut.outPut(list);
    }
    public List<Student> getStudentList() {
        return studentList;
    }

    public void setStudentList(List<Student> studentList) {
        this.studentList = studentList;
    }
    public List<Accounts> getAccountsList() {
        return accountsList;
    }

    public void setAccountsList(List<Accounts> accountsList) {
        this.accountsList = accountsList;
    }
}

4.方法类

(1)学生方法

import java.util.List;

public class StudentDao {
    Database database;
    public StudentDao(Database database){
        this.database=database;
    }
    public void add(Student student){
        database.getStudentList().add(student);
    }
    public void show(){
        List<Student> list=database.getStudentList();
        int n=1;
        for(Student student:list){
            System.out.println("编号"+n+" 学号:"
                    +student.getNum()+" 姓名:"
                    +student.getName()
                    +" 专业:"+student.getMajor()
                    +" 课程1成绩:"+student.getClass1Score()
                    +" 课程2成绩:"+student.getClass2Score()
                    +" 课程3成绩:"+student.getClass3Score()
                    +" 课程4成绩:"+student.getClass4Score()
                    +" 总分:"+student.getSum());
            n++;
        }
    }
    public void delete(Student student){
        Student student1=null;
        for(Student each:database.getStudentList()){
            if(student.getNum().equals(each.getNum())){
                student1=each;
            }
        }
        database.getStudentList().remove(student1);
    }
    public Student searchByNum(String num){
        Student student=null;
        for(Student each:database.getStudentList()){
            if(num.equals(each.getNum())){
                student=each;
            }
        }
        return student;
    }
    public Student searchByName(String name){
        Student student=null;
        for(Student each:database.getStudentList()){
            if(name.equals(each.getName())){
                student=each;
            }
        }
        return student;
    }

    /**
     * 双向冒泡排序
     * @param studentList
     * @return
     */
    public List<Student> doubleBubbleSort(List<Student> studentList){
        List<Student> list=studentList;
        Student student=null;
        int left=0,right=studentList.size()-1;
        while(left<right)
        {
            for(int i=left+1;i<=right;i++){
                if(list.get(left).getSum()<list.get(i).getSum()){
                    student=list.get(i);
                    list.set(i,list.get(left));
                    list.set(left,student);
                }
            }
            left++;
            for(int i=right-1;i>=left;i--){
                if(list.get(right).getSum()>list.get(i).getSum()){
                    student=list.get(i);
                    list.set(i,list.get(right));
                    list.set(right,student);
                }
            }
            right--;
        }
        return list;
    }

    /**
     * 快速排序
     * @param studentList
     * @return
     */
    public List<Student> quickSort(List<Student> studentList){
        List<Student> list=studentList;
        quickSort1(list,0,list.size()-1);
        return list;
    }
    public void quickSort1(List<Student> studentList,int left,int right){
        if(left<right){
            int i=left,j=right;
            Student student=studentList.get(left);
            double x=student.getSum();
            while(i<j){
                while((i<j)&&(studentList.get(j).getSum()<x)){
                    j--;
                }
                if(i<j){
                    studentList.set(i,studentList.get(j));
                    i++;
                }
                while((i<j)&&(studentList.get(i).getSum()>x)){
                    i++;
                }
                if(i<j){
                    studentList.set(j,studentList.get(i));
                    j--;
                }
            }
            studentList.set(i,student);
            quickSort1(studentList,left,i-1);
            quickSort1(studentList,i+1,right);
        }
    }

    /**
     * 希尔排序
     * @param studentList
     * @return
     */
    public List<Student> shellSort(List<Student> studentList){
        List<Student> list=studentList;
        Student student=null;
        int j;
        for (int gap = list.size() / 2; gap >  0; gap /= 2) {
            for (int i = gap; i < list.size(); i++) {
                student=list.get(i);
                double tmp=student.getSum();
                for (j = i; j >= gap && tmp>list.get(j-gap).getSum(); j -= gap) {
                    list.set(j,list.get(j-gap));
                }
                list.set(j,student);
            }
        }
        return list;
    }

    /**
     * 堆排序
     * @param studentList
     * @return
     */
    public List<Student> heapSort(List<Student> studentList){
        List<Student> list=studentList;
        int len = list.size();

        buildMaxHeap(list, len);

        for (int i = len - 1; i > 0; i--) {
            swap(list, 0, i);
            len--;
            heapify(list, 0, len);
        }
        return list;
    }

    private void buildMaxHeap(List<Student> studentList, int len) {
        for (int i = (int) Math.floor(len / 2); i >= 0; i--) {
            heapify(studentList, i, len);
        }
    }

    private void heapify(List<Student> studentList, int i, int len) {
        int left = 2 * i + 1;
        int right = 2 * i + 2;
        int largest = i;

        if (left < len && studentList.get(left).getSum() < studentList.get(largest).getSum()) {
            largest = left;
        }

        if (right < len && studentList.get(right).getSum() < studentList.get(largest).getSum()) {
            largest = right;
        }

        if (largest != i) {
            swap(studentList, i, largest);
            heapify(studentList, largest, len);
        }
    }

    private void swap(List<Student> studentList, int i, int j) {
        Student student=studentList.get(i);
        studentList.set(i,studentList.get(j));
        studentList.set(j,student);
    }

    /**
     * 排名赋值并打印
     * @param studentList
     */
    public void showPlace(List<Student> studentList){
        for(int i=0;i<studentList.size();i++){
            studentList.get(i).setPlace(i+1);
        }
        int i=1;
        for(Student each:studentList){
            System.out.println(i+"."+" 姓名 "+each.getName()+" 专业 "+each.getMajor()+" 总分 "+each.getSum()+" 名次 "+each.getPlace());
            i++;
        }
    }
}

(2)账户方法

public class AccountsDao {
    Database database;
    public AccountsDao(Database database){
        this.database=database;
    }
    public void add(Accounts accounts){
        database.getAccountsList().add(accounts);
    }
}

5.系统类

import java.util.List;
import java.util.Scanner;

public class StudentSys {
    Database database;
    StudentDao studentDao;
    AccountsDao accountsDao;
    Scanner scanner=new Scanner(System.in);
    public StudentSys(Database database){
        this.database=database;
        studentDao=new StudentDao(database);
        accountsDao=new AccountsDao(database);
    }
    public void loginPage(){
        System.out.println("学生成绩档案管理系统");
        System.out.println("1.登录");
        System.out.println("2.注册");
        System.out.println("3.退出系统");
        System.out.println("请输入你的选择:");
        String input=scanner.next();
        switch (input){
            case "1":login();
                break;
            case "2":register();loginPage();
                break;
            case "3":System.out.println("系统已经退出");
                break;
            default:{
                System.out.println("非法输入,请重新输入");
                loginPage();
            }
        }
    }

    /**
     * 登录
     */
    public void login(){
        Accounts accounts1=null;
        Boolean find=false;
        System.out.println("请输入账号");
        String userName=scanner.next();
        List<Accounts> list=database.getAccountsList();
        for(Accounts accounts:list){
            if(userName.equals(accounts.getUserName()))
            {
                accounts1=accounts;
                find=true;
                break;
            }
        }
        if(find==true){
            System.out.println("请输入密码");
            String passWord=scanner.next();
            if(passWord.equals(accounts1.getPassWord())){
                System.out.println("登录成功");
                mainPage();
            }
            else{
                System.out.println("密码错误,请重新登录");
                login();
            }
        }
        else {
            System.out.println("账号不存在");
            loginPage();
        }
    }
    /**
     * 注册
     */
    public void register(){
        System.out.println("请输入账号");
        String userName=scanner.next();
        System.out.println("请输入密码");
        String passWord=scanner.next();
        accountsDao.add(new Accounts(userName,passWord));
        System.out.println("注册成功");
        database.accountOut(database.getAccountsList());
    }
    /**
     * 主界面
     */
    public void mainPage(){
        System.out.println("1.新增学生信息");
        System.out.println("2.浏览学生信息");
        System.out.println("3.查找学生信息");
        System.out.println("4.删除学生信息");
        System.out.println("5.退出登录");
        System.out.println("请输入你的选择:");
        String choose=scanner.next();
        switch (choose){
            case "1":add();mainPage();
                break;
            case "2":showInformation();mainPage();
                break;
            case "3":search();
                break;
            case "4":delete();mainPage();
                break;
            case "5":database.studentOut(database.getStudentList());loginPage();
                break;
            default:System.out.println("非法输入,请重新选择");mainPage();
        }
    }
    /**
     * 新增学生信息
     */
    public void add(){
        System.out.println("学生学号:");
        String num=scanner.next();
        System.out.println("学生姓名:");
        String name=scanner.next();
        System.out.println("学生专业:");
        String major=scanner.next();
        System.out.println("课程1成绩:");
        double class1Score=scanner.nextDouble();
        System.out.println("课程2成绩:");
        double class2Score=scanner.nextDouble();
        System.out.println("课程3成绩:");
        double class3Score=scanner.nextDouble();
        System.out.println("课程4成绩:");
        double class4Score=scanner.nextDouble();
        studentDao.add(new Student(num,name,major,class1Score,class2Score,class3Score,class4Score));
    }
    /**
     * 展示学生信息
     */
    public void showInformation(){
        List<Student> list=null;
        studentDao.show();
        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("请输入你的选择");
        String choose=scanner.next();
        switch (choose){
            case "1":
                list=studentDao.doubleBubbleSort(database.getStudentList());
                studentDao.showPlace(list);
                break;
            case "2":
                list=studentDao.shellSort(database.getStudentList());
                studentDao.showPlace(list);
                break;
            case "3":
                list=studentDao.quickSort(database.getStudentList());
                studentDao.showPlace(list);
                break;
            case "4":
                list=studentDao.heapSort(database.getStudentList());
                studentDao.showPlace(list);
                break;
            case "5":
                break;
        }
    }

    /**
     * 查找学生信息
     */
    public void search(){
        studentDao.show();
        System.out.println("1.按学号查找");
        System.out.println("2.按姓名查找");
        System.out.println("3.返回上一级");
        System.out.println("请输入选项:");
        String choose=scanner.next();
        switch (choose){
            case "1":searchByNum();
                break;
            case "2":searchByName();
                break;
            case "3":mainPage();
                break;
            default:
                System.out.println("非法输入,请重新输入");
                search();
        }
    }
    /**
     * 删除学生信息
     */
    public void delete(){
        studentDao.show();
        System.out.println("要删除的学号:");
        String num=scanner.next();
        Student student=studentDao.searchByNum(num);
        studentDao.delete(student);
        System.out.println("删除成功");
    }
    public void searchByName(){
        System.out.println("请输入要查找的姓名:");
        String name=scanner.next();
        Student student;
        student=studentDao.searchByName(name);
        System.out.println(" 学号:"
                +student.getNum()+" 姓名:"
                +student.getName()
                +" 专业:"+student.getMajor()
                +" 课程1成绩:"+student.getClass1Score()
                +" 课程2成绩:"+student.getClass2Score()
                +" 课程3成绩:"+student.getClass3Score()
                +" 课程4成绩:"+student.getClass4Score());
        System.out.println("是否修改成绩(Y\\N)");
        String choose=scanner.next();
        if(choose.equals("Y")){
            System.out.println("修改第几门课成绩:");
            String input=scanner.next();
            double score;
            switch (input){
                case "1":score=scanner.nextDouble();student.setClass1Score(score);
                    break;
                case "2":score=scanner.nextDouble();student.setClass2Score(score);
                    break;
                case "3":score=scanner.nextDouble();student.setClass3Score(score);
                    break;
                case "4":score=scanner.nextDouble();student.setClass4Score(score);
                    break;
                default:System.out.println("输入错误");
                    searchByName();
            }
            student.setSum(student.getClass1Score()+student.getClass2Score()+student.getClass3Score()+student.getClass4Score());
            mainPage();
        }
        else{
            mainPage();
        }
    }
    public void searchByNum(){
        System.out.println("请输入要查找的学号:");
        String num=scanner.next();
        Student student;
        student=studentDao.searchByNum(num);
        System.out.println(" 学号:"
                        +student.getNum()+" 姓名:"
                        +student.getName()
                        +" 专业:"+student.getMajor()
                        +" 课程1成绩:"+student.getClass1Score()
                        +" 课程2成绩:"+student.getClass2Score()
                        +" 课程3成绩:"+student.getClass3Score()
                        +" 课程4成绩:"+student.getClass4Score());
        System.out.println("是否修改成绩(Y\\N)");
        String choose=scanner.next();
        if(choose.equals("Y")){
            System.out.println("修改第几门课成绩:");
            String input=scanner.next();
            double score;
            switch (input){
                case "1":score=scanner.nextDouble();student.setClass1Score(score);
                    break;
                case "2":score=scanner.nextDouble();student.setClass2Score(score);
                    break;
                case "3":score=scanner.nextDouble();student.setClass3Score(score);
                    break;
                case "4":score=scanner.nextDouble();student.setClass4Score(score);
                    break;
                default:System.out.println("输入错误");
                searchByNum();
            }
            student.setSum(student.getClass1Score()+student.getClass2Score()+student.getClass3Score()+student.getClass4Score());
            mainPage();
        }
        else{
            mainPage();
        }
    }
}

6.main方法类

public class Main {
    public static void main(String[]args){
            Database database = new Database();
            StudentSys studentSys=new StudentSys(database);
            studentSys.loginPage();
    }
}

代码实现结果:
运行结果
运行结果
运行结果
运行结果
运行结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. 建立文件 (1)可以使用默认文件名或指定文件名将记录存储到文件 (2)设置适当的标志位,作为对记录进行操作的信息 (3)写同名文件将覆盖原来文件的内容 2.增加学生记录 (1) 可在已有记录后面追加新的记录  (2) 可以随时增加新的记录,它们仅保存在向量数组 (3) 可以将一个文件读入,追加在已有记录之后 (4) 采取文件追加方式时,在没有保存到文件之前,将继续保持文件追加状态,以便实现连 续追加操作方式 3. 新建学生信息文件 (1) 用来新建学生信息记录 (2) 如果已经有记录存在,可以覆盖原记录或者在原记录后面追加,也可以将原有记录信息保存 到一个指定文件,然后重新建立记录 (3) 给出相应的提示信息 4. 显示记录 (1) 如果没有记录可供显示,给出提示信息 (2) 可以随时显示内存的记录 (3) 显示表头 5. 文件存储 可以按默认名字或指定名字存储记录文件 6. 读取文件 (1) 可以按默认名字或指定名字将记录文件读入内存 (2) 可以将指定或默认文件追加到现有记录的尾部 (3) 可以将文件连续追加到现有记录并更新记录的“名次”项 7. 删除记录 (1) 可以按“学号”、“姓名”或“名次”方式删除记录 (2) 标志将被删除的记录, 可以再次取消标志, 经确认后删除已经标志的记录 (3) 如果记录是空表, 删除时应给出提示信息并返回主菜单 (4) 如果没有要删除的信息, 输出“没有找到”的信息 (5) 更新其他记录的名次 (6) 删除操作仅限于内存, 只有执行存储操作时, 才能覆盖原记录 8. 修改记录 (1) 可以按“学号”、“姓名”或“名次”方式查找要修改的记录内容 (2) 给出将被修改记录的信息, 经确认后进行修改 (3) 如果记录已经是空表,应给出提示信息并返回主菜单 (4) 如果没有找到需要修改的信息, 输出“没有找到”的信息 (5) 更新其他记录的名次 (6) 修改操作仅限于内存, 只有执行存储操作时, 才能覆盖原记录 9. 查询记录 (1) 可以按“学号”、“姓名”或“名次”方式查询记录 (2) 能给出查询记录的信息 (3) 如果查询的信息不存在, 输出提示信息 10. 对记录进行排序 (1) 可以按”学号”进行升序和降序排列 (2) 可以按”姓名”进行升序和降序排列 (3) 可以按”名次”进行升序和降序排列 (4) 如果属于选择错误, 可以立即退出程序

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nightelves11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值