MENU

Go语言 使用“面向对象”的思维方式编写一个学生信息管理系统。

November 6, 2020 • 技术分享

说明

原题:

使用“面向对象”的思维方式编写一个学生信息管理系统。

  1. 学生有id、姓名、年龄、分数等信息
  2. 程序提供展示学生列表、添加学生、编辑学生信息、删除学生等功能

题解

仅供个人学习,有更好的欢迎评论区讨论交流。

student.go

// @title student
// @desc
// @auth biuaxia 2020/11/6 10:52
package main

import (
    "errors"
    "fmt"
)

// 学生类型
type student struct {
    id    int
    age   int
    score int
    name  string
    class string
}

// 学生构造函数
func build(id, age, score int, name, class string) *student {
    return &student{
        id, age, score, name, class,
    }
}

/*--------------------------------------*/

// 管理学生类型
type managerStudent struct {
    allStudent []*student
}

// 管理学生构造函数
func buildManager() *managerStudent {
    return &managerStudent{
        make([]*student, 0, 100),
    }
}

// 检查ID是否存在
func (m *managerStudent) checkIdExist(id int) bool {
    for _, v := range m.allStudent {
        if id == v.id {
            return true
        }
    }
    return false
}

// 添加学生
func (m *managerStudent) add(newStu *student) {
    m.allStudent = append(m.allStudent, newStu)
}

// 编辑学生
func (m *managerStudent) edit(newStu *student) {
    for _, v := range m.allStudent {
        if newStu.id == v.id {
            v = newStu
            return
        }
    }
    fmt.Printf("系统中没有学号为%d的学生\n", newStu.id)
}

// 删除学生
func (m *managerStudent) delete(id int) {
    for i, v := range m.allStudent {
        if id == v.id {
            m.allStudent = append(m.allStudent[:i], m.allStudent[i+1:]...)
            return
        }
    }
    fmt.Printf("系统中没有学号为%d的学生\n", id)
}

// 展示所有学生
func (m *managerStudent) showAll() {
    for _, v := range m.allStudent {
        fmt.Printf("学号:%d 姓名:%s 年龄:%d 分数:%d 班级:%s\n", v.id, v.name, v.age, v.score, v.class)
    }
}

// 获取输入的学生信息
func (m *managerStudent) getInputStudentInfo(checkId bool) (*student, error) {
    var (
        id    int
        age   int
        score int
        name  string
        class string
    )

    fmt.Println("请按照系统要求输入学生信息")

    if checkId {
        if inputId, err := m.inputId(); nil != err {
            return nil, err
        } else {
            id = inputId
        }
    } else {
        fmt.Print("请输入学员的学号:")
        fmt.Scanf("%d\n", &id)
    }
    fmt.Print("请输入学员的姓名:")
    fmt.Scanf("%s\n", &name)
    fmt.Print("请输入学员的年龄:")
    fmt.Scanf("%d\n", &age)
    fmt.Print("请输入学员的分数:")
    fmt.Scanf("%d\n", &score)
    fmt.Print("请输入学员的班级:")
    fmt.Scanf("%s\n", &class)
    stu := build(id, age, score, name, class)
    return stu, nil
}

// 单独处理ID
func (m *managerStudent) inputId() (id int, err error) {
    fmt.Print("请输入学员的学号:")
    fmt.Scanf("%d\n", &id)
    if m.checkIdExist(id) {
        return id, nil
    }
    return 0, errors.New("不存在的学号")
}

entry.go

package main

import (
    "fmt"
    "os"
)

// 菜单展示
func showMenu() {
    fmt.Println("欢迎来到学员信息管理系统")
    fmt.Println("1.展示所有学员信息")
    fmt.Println("2.添加学员信息")
    fmt.Println("3.编辑学员信息")
    fmt.Println("4.删除学员信息")
    fmt.Println("5.退出系统")
}

func main() {
    manager := buildManager()

    for {
        showMenu()
        var input int
        fmt.Print("请输入你要操作的序号:")
        _, _ = fmt.Scanf("%d\n", &input)
        switch input {
        case 1:
            // 展示所有学员信息
            manager.showAll()
        case 2:
            // 添加学员信息
            if stu, err := manager.getInputStudentInfo(false); nil != err {
                fmt.Println(err)
            } else {
                manager.add(stu)
            }
        case 3:
            // 编辑学员信息
            if stu, err := manager.getInputStudentInfo(true); nil != err {
                fmt.Println(err)
            } else {
                manager.edit(stu)
            }
        case 4:
            // 删除学员信息
            if id, err := manager.inputId(); nil != err {
                fmt.Println(err)
            } else {
                manager.delete(id)
            }
        case 5:
            // 退出系统
            os.Exit(0)
        }
    }
}

尾注

应该是有更好的写法,个人只顾着完成目的;暂时没考虑其他地方了。

ArchivesQR Code
QR Code for this page
Tipping QR Code