Golang实现GPA计算器时如何接收用户输入并存储到结构体
Golang实现GPA计算器时如何接收用户输入并存储到结构体
我想制作一个GPA计算器,首先要求用户输入他们本学期的总学分。我已经成功实现了这一步。然后,我想从用户那里获取总科目数,这个我也能做到。但现在遇到了真正的问题。我希望以以下形式从用户那里获取输入:```
“数学”:“A”, “物理”:“B”
然后,为了计算GPA,我想将相应的等级转换为分数
例如 S = 10, A = 9, B = 8, C = 7,并使用以下公式计算他们的GPA:
gpa = 总分 { 科目学分 * 相应等级分数 } / 总学分
因此,如果一个学生有2门科目:数学和物理,数学的学分是4,他得了S;物理的学分是3,他得了C,那么GPA将是:
gpa = 4(数学学分) * 10(S的等级分数) + 3(物理学分) * 7(C的等级分数) / 7(总学分)
更多关于Golang实现GPA计算器时如何接收用户输入并存储到结构体的实战教程也可以访问 https://www.itying.com/category-94-b0.html
2 回复
至少对我来说,你的输入格式以及数据是如何读取的(来自键盘还是其他形式)并不是很清楚。不过,既然你的数据不是来自API之类的,我想没有理由以编码形式读取它。
更多关于Golang实现GPA计算器时如何接收用户输入并存储到结构体的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
要实现GPA计算器,需要设计一个结构体来存储科目信息,并实现用户输入解析。以下是完整的实现方案:
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
// 定义科目结构体
type Subject struct {
Name string
Credit int
Grade string
}
// 定义GPA计算器结构体
type GPACalculator struct {
TotalCredits int
Subjects []Subject
}
// 等级到分数的映射
var gradeToScore = map[string]int{
"S": 10,
"A": 9,
"B": 8,
"C": 7,
"D": 6,
"E": 5,
"F": 0,
}
func main() {
calculator := GPACalculator{}
// 获取总学分
calculator.getTotalCredits()
// 获取科目信息
calculator.getSubjects()
// 计算并显示GPA
gpa := calculator.calculateGPA()
fmt.Printf("\n计算出的GPA: %.2f\n", gpa)
}
func (g *GPACalculator) getTotalCredits() {
reader := bufio.NewReader(os.Stdin)
for {
fmt.Print("请输入本学期总学分: ")
input, _ := reader.ReadString('\n')
input = strings.TrimSpace(input)
credits, err := strconv.Atoi(input)
if err != nil || credits <= 0 {
fmt.Println("错误:请输入有效的正整数")
continue
}
g.TotalCredits = credits
break
}
}
func (g *GPACalculator) getSubjects() {
reader := bufio.NewReader(os.Stdin)
fmt.Println("\n请输入科目信息(格式:科目名:等级,用逗号分隔)")
fmt.Println("示例:数学:S, 物理:A, 化学:B")
fmt.Print("输入: ")
input, _ := reader.ReadString('\n')
input = strings.TrimSpace(input)
// 解析输入
subjectEntries := strings.Split(input, ",")
for _, entry := range subjectEntries {
entry = strings.TrimSpace(entry)
if entry == "" {
continue
}
// 解析科目名和等级
parts := strings.Split(entry, ":")
if len(parts) != 2 {
fmt.Printf("格式错误: %s,跳过此项\n", entry)
continue
}
name := strings.TrimSpace(parts[0])
grade := strings.ToUpper(strings.TrimSpace(parts[1]))
// 验证等级是否有效
if _, valid := gradeToScore[grade]; !valid {
fmt.Printf("无效等级: %s,跳过科目: %s\n", grade, name)
continue
}
// 获取科目学分
credit := g.getSubjectCredit(name)
subject := Subject{
Name: name,
Credit: credit,
Grade: grade,
}
g.Subjects = append(g.Subjects, subject)
}
}
func (g *GPACalculator) getSubjectCredit(name string) int {
reader := bufio.NewReader(os.Stdin)
for {
fmt.Printf("请输入科目'%s'的学分: ", name)
input, _ := reader.ReadString('\n')
input = strings.TrimSpace(input)
credit, err := strconv.Atoi(input)
if err != nil || credit <= 0 {
fmt.Println("错误:请输入有效的正整数")
continue
}
return credit
}
}
func (g *GPACalculator) calculateGPA() float64 {
if len(g.Subjects) == 0 {
return 0.0
}
var totalWeightedScore float64
var totalCredits int
fmt.Println("\n科目详情:")
fmt.Println("科目\t\t学分\t等级\t分数")
fmt.Println("----------------------------------------")
for _, subject := range g.Subjects {
score := gradeToScore[subject.Grade]
weightedScore := float64(subject.Credit) * float64(score)
totalWeightedScore += weightedScore
totalCredits += subject.Credit
fmt.Printf("%s\t\t%d\t%s\t%d\n",
subject.Name, subject.Credit, subject.Grade, score)
}
if totalCredits == 0 {
return 0.0
}
return totalWeightedScore / float64(totalCredits)
}
这个实现提供了以下功能:
-
结构体设计:
Subject结构体存储科目名、学分和等级GPACalculator结构体管理总学分和科目列表
-
输入处理:
- 支持用户按"数学:S, 物理:A"格式输入
- 为每个科目单独输入学分
- 包含输入验证和错误处理
-
GPA计算:
- 使用映射表将等级转换为分数
- 按公式计算加权平均分
- 显示详细的科目信息
-
交互体验:
- 清晰的提示信息
- 格式化的输出显示
- 错误输入的容错处理
运行示例:
请输入本学期总学分: 7
请输入科目信息(格式:科目名:等级,用逗号分隔)
示例:数学:S, 物理:A, 化学:B
输入: 数学:S, 物理:C
请输入科目'数学'的学分: 4
请输入科目'物理'的学分: 3
科目详情:
科目 学分 等级 分数
----------------------------------------
数学 4 S 10
物理 3 C 7
计算出的GPA: 8.71

