目录
引子
本人是一个计算机专业的大一新生,适逢疫情,寒假期间无处可去,便想着不要虚度光阴,尽我所能的做些微不足道的小项目,作为一种娱乐,也可以使我更加熟悉go语言的语法和一些与C、C++和Python不同的特性。
只是一个小小的练习,有很多不足的地方,希望各位大佬能够不吝赐教
简易学生管理系统
系统仅有简单的 添加、读取、查询、删除、修改 功能
学生信息的格式为:
学号 姓名 性别 年龄 成绩
本系统使用仿C风格的链表实现对学生信息的管理
代码一览
全局变量及“student”结构体的定义:
type student struct {
number string //学号 //数据域
name string //姓名
sex byte //性别
age int //年龄
score float64 //分数
next *student //指针域
}
var (
People = 0 //用于记录学生的人数
head *student = nil //头指针
)
主函数 func main()
package main
import(
"fmt"
"os"
)
func main(){
var(
key string
jud bool
count = 0
exit bool
)
fmt.Printf("请输入密码:")
for true {
if count != 0 {
fmt.Println("请重新输入:")
}
fmt.Scan(&key)
jud = Key_jud(&key)
if jud == true{
fmt.Println("密码通过!正在载入……")
break
}else{
count ++ //超过三次错误退出程序
}
if count == 3{
fmt.Println("多次错误!退出程序!")
os.Exit(1)
}
}
for exit != true{
exit = Displaymenu()
}
fmt.Println("结束!")
}
密码函数 func Key_jud(p *string) bool
package main
import(
"fmt"
)
func Key_jud(p *string) bool{
var(
key_builded = "wanlxj0429"
)
if *p == key_builded{
return true
}else{
fmt.Println("密码错误!")
return false
}
}
主菜单打印函数 func Displaymenu() bool
package main
import(
"fmt"
)
func Displaymenu() bool{
var(
choose int
)
fmt.Println(`******************************
欢迎来到Xunyira的学生管理系统!
******************************
* 输入数字键以选择功能 *
* 1.添加学生信息 *
* 2.读取学生信息 *
* 3.查询学生信息 *
* 4.删除学生信息 *
* 5.修改学生信息 *
* 6.退出管理系统 *
******************************`)
fmt.Println(" 当前学生人数为:",People)
fmt.Println("请输入你的选择:")
fmt.Scan(&choose)
if choose == 1{
head = Add(head)
}else if choose == 2{
Print_(head)
}else if choose == 3{
query(head)
}else if choose == 4{
head = delete(head)
}else if choose == 5{
head = alter(head)
} else if choose == 6{
return true
}
return false
}
添加学生信息函数 func Add(head *student) *student
package main
import(
"fmt"
"os"
)
func Add(head *student) *student{ //输入学生信息
var(
p *student = nil
pr *student = nil
num string
Name string
Sex byte
Age int
Score float64
)
fmt.Println("开始录入学生信息:")
fmt.Println("请按照学号、姓名、性别、年龄、成绩的顺序录入:")
fmt.Println("输入esc结束输入:")
for true{
p = new(student) //申请内存
if p == nil{
fmt.Println("不够内存!")
os.Exit(1)
}
if head == nil{
head = p //若 头指针 为 空,则头指针指向 新申请内存空间p
}else{
pr = head
for pr.next != nil{
pr = pr.next
}
pr.next = p
}
fmt.Scanf("%s",&num)
if num == "esc"{
fmt.Println("录入结束!")
break
}
fmt.Scanf("%s %c %d %f",&Name,&Sex,&Age,&Score)
p.number = num
p.name = Name
p.sex = Sex
p.age = Age
p.score = Score
p.next = nil
p = nil
People ++
}
fmt.Println("录入成功!")
return head //返回
}
学生信息打印输出 func Print_(head *student)
package main
import (
"fmt"
)
func Print_(head *student){ //输出学生信息
if head == nil{
fmt.Println("你的学生信息表单为空!")
return
}
var pr = head
for pr.next != nil{
if pr.age != 0 {
fmt.Printf("%s %s %c %d %.2f\n",pr.number,
pr.name,pr.sex,pr.age,pr.score)
}
pr = pr.next
}
}
学生信息查询 func query(head *student)
package main
import (
"fmt"
)
func query(head *student) {
var (
que string
pr *student
skip = 0
)
if head == nil{
fmt.Println("学生信息为空!")
return
}
fmt.Println("请输入你要查询的学生的姓名或学号:")
fmt.Scan(&que)
pr = head
for pr.next != nil{
if pr.number == que || pr.name == que{
skip = 1
fmt.Printf("%s %s %c %d %f",pr.number,pr.name,
pr.sex,pr.age,pr.score)
break
}
pr = pr.next
}
if skip == 0{
fmt.Println("未查找到结果")
}
}
删除学生信息 func delete(head *student) *student
package main
import (
"fmt"
)
func delete(head *student) *student{
var(
pr *student
p *student
que string
t_f byte
skip = 0
)
if head == nil{
fmt.Println("学生信息为空!")
return head
}
fmt.Println("请输入你想要删除的学生的学号或姓名:")
fmt.Println("输入esc以中断")
fmt.Scan(&que)
if que == "esc"{
return head
}
p = head
for p.next != nil{
if p.name == que || p.number == que{
fmt.Printf("%s %s %c %d %f\n",p.number,p.name,
p.sex,p.age,p.score)
fmt.Println("是否删除?(Y/N)")
fmt.Scanf("%c",&t_f)
skip = 1
break
}
pr = p
p = p.next
}
if skip == 0{
fmt.Println("该学生不存在!")
}else{
if t_f == 'y' || t_f == 'Y'{
if p == head && p.next != nil{
head = p.next
}else if p.next == nil && p != head{
pr.next = nil
}else{
pr.next = p.next
}
People --
fmt.Println("删除成功!")
}
}
return head
}
修改学生信息 func alter(head *student) *student
package main
import "fmt"
func alter(head *student) *student{
var(
que string
newnum string
newnam string
newsex byte
newage int
newsc float64
p *student
skip = 0
)
if head == nil{
fmt.Println("学生信息为空!")
return head
}
p = head
fmt.Println("请输入你要修改的学生的姓名或学号")
fmt.Println("输入esc以中断:")
fmt.Scan(&que)
if que == "esc"{
return head
}
for p.next != nil{
if p.number == que || p.name == que{
fmt.Printf("%s %s %c %d %f\n",p.number,p.name,
p.sex,p.age,p.score)
fmt.Println("请输入修改后的内容:")
fmt.Scanf("%s %s %c %d %f",&newnum,&newnam,
&newsex,&newage,&newsc)
p.number = newnum
p.name = newnam
p.sex = newsex
p.age = newage
p.score = newsc
skip = 1
break
}
p = p.next
}
if skip == 0{
fmt.Println("查无此人!")
}else{
fmt.Println("修改后的信息为")
fmt.Printf("%s %s %c %d %f\n",p.number,p.name,
p.sex,p.age,p.score)
}
return head
}
运行