首页 > 解决方案 > 创建 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(总学分)

下面的代码: -

package main

import "fmt"
var gpa float64

func main() {
    // Schema
    var totalCredit float64
    var totalSubjects int
    var letterGrade string
    var credit float64
    var score float64
    var totalScore float64
    // Takes value of credits and subjects from user
    fmt.Print("Enter total credits")
    _, _ =  fmt.Scan(&totalCredit)
    fmt.Print("Enter total number of subjects")
    _, _ =  fmt.Scan(&totalSubjects)
    n := totalSubjects


    for i:=0; i < n; i++ {
        fmt.Println("Enter letterGrade")
        _, _ = fmt.Scanf("%s", &letterGrade)
        fmt.Println("Enter credits")
        _, _ = fmt.Scan(&credit)
        if letterGrade == "S" || letterGrade == "s" {
            score = credit * 10
        } else if letterGrade == "A" || letterGrade == "a" {
            score = credit * 9
        } else if letterGrade == "B" || letterGrade == "b" {
            score = credit * 8
        } else if letterGrade == "C" || letterGrade == "c" {
            score = credit * 7
        } else if letterGrade == "D" || letterGrade == "d" {
            score = credit * 6
        } else if letterGrade == "E" || letterGrade == "e" {
            score = credit * 5
        } else if letterGrade == "F" || letterGrade == "f" {
            score = credit * 0
        }
        totalScore += score
    }
    gpa = totalScore / totalCredit
    fmt.Println(gpa)
}

我想在 GO 中使用 OOP 创建上述内容。

标签: go

解决方案


这是这个循环构造作业的一个合理的 Programming 101 学生解决方案:

package main

import (
    "fmt"
    "strings"
)

var grades = map[string]float64{
    "S": 10,
    "A": 9,
    "B": 8,
    "C": 7,
    "D": 6,
    "E": 5,
    "F": 0,
}

func main() {
    totalCredits := 0.0
    totalScore := 0.0

    var subjects int
    for {
        fmt.Println("Enter number of subjects:")
        n, err := fmt.Scan(&subjects)
        if n == 1 && err == nil {
            if subjects >= 0 && subjects <= 20 {
                break
            }
        }
    }

    for i := 0; i < subjects; i++ {
        var grade float64
        for {
            var letterGrade string
            fmt.Println("Enter letter grade:")
            n, err := fmt.Scanf("%s", &letterGrade)
            if n == 1 && err == nil {
                var ok bool
                grade, ok = grades[strings.ToUpper(letterGrade)]
                if ok {
                    break
                }
            }
        }

        var credits float64
        for {
            fmt.Println("Enter credits:")
            n, err := fmt.Scan(&credits)
            if n == 1 && err == nil {
                if credits >= 0 && credits <= 10 {
                    break
                }
            }
        }

        totalCredits += credits
        totalScore += credits * grade
    }

    gpa := 0.0
    if totalCredits != 0.0 {
        gpa = totalScore / totalCredits
    }
    fmt.Println("GPA:", gpa)
}

输出:

$ go run gpa.go
Enter number of subjects:
2
Enter letter grade:
A
Enter credits:
3
Enter letter grade:
b
Enter credits:
4
GPA: 8.428571428571429
$

推荐阅读