Menu
Coddy logo textTech

まとめ - 学生の記録

CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 51/107。

challenge icon

チャレンジ

簡単

適切なカプセル化を示す Student Records システムを構築しましょう。機密性の高い学業データを保護しながら、適切に設計された method を通じて制御されたアクセスを提供する学生管理構造を Create します。

コードを2つのファイルに分けて整理します。

  • student.go: 機密情報を保護しながら、安全な公開データを公開する Student struct を Create します。学生の Name は Exported(publicly accessible)にしますが、grade(float64)と studentID(string)は、この機密情報を保護するために非公開にします。

    次を Implement してください。

    • 学生を creates コンストラクター NewStudent(name, id string, initialGrade float64) *Student。initial grade は 0 から 100 の inclusive の範囲にある場合に only 設定し、それ以外は default で 0 にします。
    • current grade を返す getter Grade() float64
    • 学生の ID を返す getter StudentID() string
    • 新しい値が 0 から 100 の inclusive の範囲にある場合に only grade を更新する setter SetGrade(newGrade float64) bool。grade が更新された場合は true、otherwise は false を返します。
    • 次の Format を返す method Summary() string[Name] (ID: [studentID]) - Grade: [grade]
  • main.go: input から学生 information を読み取り、constructor を使用して学生を Create し、その後 grade の操作を実行します。creation 後、および各 grade 更新 Attempt 後に、学生の summary を表示します。

次の input が提供されます。

  • line 1: 学生名
  • line 2: 学生 ID
  • line 3: Initial grade
  • line 4: 設定する first new grade
  • line 5: 設定する2番目の new grade

学生を creation した後、その summary を print します。次に各 grade 更新を Attempt し、成功した場合は更新された summary を print します。拒否された場合は Invalid grade rejected を print します。すべての grade 値は小数点以下2 places で Format してください。

たとえば、Emma WilsonSTU00185.592.0150 が与えられた場合、出力は次のようになります。

Emma Wilson (ID: STU001) - Grade: 85.50
Emma Wilson (ID: STU001) - Grade: 92.00
Invalid grade rejected

最後の更新は、150 が有効な範囲外であるため失敗します。setter method がこのルールを適用し、学生の data を valid に保ちます。studentIDgrade が直接 accessible になることは never ない点に注目してください。外部コードは、この保護された data を操作するために getter と setter method を使用する必要があります。

自分で試してみよう

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// 学生名を読み取る
	name, _ := reader.ReadString('\n')
	name = strings.TrimSpace(name)

	// 学生IDを読み取る
	id, _ := reader.ReadString('\n')
	id = strings.TrimSpace(id)

	// 初期成績を読み取る
	initialGradeStr, _ := reader.ReadString('\n')
	initialGrade, _ := strconv.ParseFloat(strings.TrimSpace(initialGradeStr), 64)

	// 最初の新しい成績を読み取る
	newGrade1Str, _ := reader.ReadString('\n')
	newGrade1, _ := strconv.ParseFloat(strings.TrimSpace(newGrade1Str), 64)

	// 2つ目の新しい成績を読み取る
	newGrade2Str, _ := reader.ReadString('\n')
	newGrade2, _ := strconv.ParseFloat(strings.TrimSpace(newGrade2Str), 64)

	// TODO: NewStudentコンストラクタを使用して新しい学生を作成する

	// TODO: 作成後に学生のサマリーを出力する

	// TODO: 最初の成績更新を試みる
	// 成功した場合、更新されたサマリーを出力する
	// If rejected, print "Invalid grade rejected"

	// TODO: 2つ目の成績更新を試みる
	// 成功した場合、更新されたサマリーを出力する
	// If rejected, print "Invalid grade rejected"

	// Hint: Summary()で成績をフォーマットするにはfmt.Sprintfと%.2fを使用する
	_ = newGrade1 // 変数を使用するときにこの行を削除する
	_ = newGrade2 // 変数を使用するときにこの行を削除する
}

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Goオンラインコンパイラ