基於“結構體”實現簡易版學生管理系統(Golang)

Payne-Wu發表於2020-11-23


首先我們們在做專案之前,需要對專案進行分析。切記不可貪功冒進,從而導致無用功

分析

  1. 學生類
  2. 管理者類
  3. 選單欄
  4. 基於管理類實現功能
    1. 檢視
    2. 新增
    3. 修改
    4. 刪除
    5. 退出

結構圖如下:

採用自頂向下的程式設計思維對以上分析進行復述,先整體、後細節(先全域性、後詳細)實現如上結構

定義全域性的學生類

在定義學生類之前,我們需瞭解學生類包含的欄位。這裡我只定義了Id、姓名。其中id為唯一,姓名可重複。程式碼如下所示

type student struct {
	id   int64
	name string
}

定義全域性的管理(即操作類)

由於學號為唯一,且其對照關係,非常適合使用Map的Key-value格式。在這裡僅做定義及宣告並不做初始化,程式碼如下所示

type studentMgr struct {
	allStudent map[int64]student
}

借用好的資料結構,會讓您的程式設計效率,編碼思維,事半功倍

定義選單欄

定義選單欄,以供使用者選擇所對應的功能。根據其功能展示。並根據相對功能,定義應函式。如下

func showMenu() {
	fmt.Printf("Welcome student Manage System, TimeNow:%v", time.Now())
	fmt.Println(
		` 
			1: 檢視學生
			2: 增加學生
			3: 修改學生
			4: 刪除學生
			5: 退出~
				`)
	fmt.Print("What are you want do? Please input Serial number:")

}

由以上所知,我們許定義的函式有5個,他們分別是檢視學生,增加學生,修改學生,刪除學生,退出,如下所示:

func main() {
	smr = studentMgr{
		allStudent: make(map[int64]student),
	}
	for {
		showMenu()
		var choice int64
		fmt.Scan(&choice)
		fmt.Printf("You select %d\n", choice)
		switch choice {
		case 1:
			smr.showStudent()
		case 2:
			smr.addStudent()
		case 3:
			smr.editStudent()
		case 4:
			smr.delStudent()
		case 5:
			os.Exit(1)
		default:
			fmt.Println("Invalid input, please select again:")
		}
	}
}

在這裡例項化了一個全域性的管理類,所有的操作都經過它。

使用switch語句,進行多項的條件分支,更有利於我們編寫更簡潔的程式碼

定義功能函式

檢視學生,增加學生,修改學生,刪除學生

// 檢視學生函式
func (s studentMgr) showStudent() {}
// 增加學生函式
func (s studentMgr) addStudent()	{}
// 修改學生函式
func (s studentMgr) editStudent()	{}
// 刪除學生函式
func (s studentMgr) delStudent()	{}

基本的就已經做完了,基礎結構就已經完成了,鼓掌~

那麼接下來,我們只需要一個個實現相對應的函式。即可實現功能。

首先我們實現的是檢視學生函式。

實現檢視學生功能

func (s studentMgr) showStudent() {
	for _, stu := range s.allStudent {
		fmt.Printf("ID:%d, Name:%s\n", stu.id, stu.name)
	}
}

我們只需要遍歷Map中所有的鍵與值,即可拿到所有的學生。這裡沒什麼好說的

實現增加學生功能

func (s studentMgr) addStudent() {
	var (
		stuId   int64
		stuName string
	)
	// 1. 根據輸入內容建立學生
	fmt.Print("Please input you need ID:")
	fmt.Scanln(&stuId)
	fmt.Print("Please input you need name:")
	fmt.Scanln(&stuName)
	newStu := student{
		id:   stuId,
		name: stuName,
	}
	// 2. 將建立的學生加入stu中
	s.allStudent[newStu.id] = newStu
	fmt.Println("Added successfully")
}

在這裡,我們需要進行的有兩步

  1. 獲取使用者鍵盤輸入

    var (
    		stuId   int64
    		stuName string
    	)
    	// 1. 根據輸入內容建立學生
    	fmt.Print("Please input you need ID:")
    	fmt.Scanln(&stuId)
    	fmt.Print("Please input you need name:")
    	fmt.Scanln(&stuName)
    
  2. 將輸入的學生資訊加入到管理函式中

    newStu := student{
    		id:   stuId,
    		name: stuName,
    	}
    	// 2. 將建立的學生加入stu中
    	s.allStudent[newStu.id] = newStu
    	fmt.Println("Added successfully")
    }
    

    新增成功則提示成功

做到這裡,我們們就可以進行一個小小的檢測,有木有點小激動以及一點小方張。反正我有,示例如下

留下一個小Bug,等你去解決,提示,如果key已存在,那麼該新增操作會進行?如果暫時沒思路,可以繼續往下看。雖然並沒有直接這裡告訴你,但卻在下方進行的相對應的解決

實現修改學生功能

func (s studentMgr) editStudent() {
	// 獲取使用者輸入
	var StuId int64
	fmt.Print("Please input want change student IdCode:")
	fmt.Scanln(&StuId)
  // 檢查該學號學生是否存在,沒有則提示不存在
	value, ok := s.allStudent[StuId]
	if !ok {
		fmt.Println("Not found")
		return
	}
	fmt.Printf("You want change student message:"+
		" Id: %d, Name:%s\n", value.id, value.name)
	// 獲取修改
	var newName string
	fmt.Print("Please change to new message:")
	fmt.Scanln(&newName)
	value.name = newName
	// 更新學生的姓名
	s.allStudent[StuId] = value
}
  1. 首先我們獲取使用者輸入

    // 獲取使用者輸入
    	var StuId int64
    	fmt.Print("Please input want change student IdCode:")
    	fmt.Scanln(&StuId)
    
  2. 拿著使用者輸入的學生Id,去Map裡面查詢相對應的學生Id

    value, ok := s.allStudent[StuId]
    	if !ok {
    		fmt.Println("Not found")
    		return
    	}
    	fmt.Printf("You want change student message:"+
    		" Id: %d, Name:%s\n", value.id, value.name)
    

    若想實現修改,是需要存在的。如果不存在此學生,提示沒有找到該學生,直接return掉。證明無法修改。如果存在那麼它一定是唯一的一個Id,因為我們用的是Map格式的嘛,key唯一。

  3. 如果存在我們就需要獲取到使用者所修改的值,並且將原有的Name覆蓋掉。即可實現修改

    var newName string
    	fmt.Print("Please change to new message:")
    	fmt.Scanln(&newName)
    	value.name = newName
    	// 更新學生的姓名
    	s.allStudent[StuId] = value
    

測試時間,示例如下:

首先我是新增了一個學生在裡面,Id:1,Name:Payne.

實現刪除學生功能

func (s studentMgr) delStudent() {
	var studentID int64
	// 獲取使用者需刪除的id
	fmt.Print("Please input want delete studentId:")
	fmt.Scanln(&studentID)
	// 去map裡面查詢,若有則刪除。沒有則退出重新選擇
	value, ok := s.allStudent[studentID]
	if !ok {
		fmt.Println("Not found")
		return
	}
	fmt.Printf("You want delete student message:"+
		" Id: %d, Name:%s\n", value.id, value.name)
	delete(s.allStudent, studentID)
	fmt.Print("Deleted Successfully\n")
}
  1. 首先我們需要刪除,那麼它是一定存在我們才能去刪除。這個沒毛病吧?我覺很ok。

    	var studentID int64
    	// 獲取使用者需刪除的id
    	fmt.Print("Please input want delete studentId:")
    	fmt.Scanln(&studentID)
    
  2. 不存在提示未找到

    value, ok := s.allStudent[studentID]
    	if !ok {
    		fmt.Println("Not found")
    		return
    	}
    	fmt.Printf("You want delete student message:"+
    		" Id: %d, Name:%s\n", value.id, value.name)
    
  3. 存在進行修改

    	fmt.Printf("You want delete student message:"+
    		" Id: %d, Name:%s\n", value.id, value.name)
    	delete(s.allStudent, studentID)
    	fmt.Print("Deleted Successfully\n")
    

相關文章