復習 - 学生記録システム
CoddyのGDScriptジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 30/65。
チャレンジ
中級2つのクラスを使って、小さな学生記録システムを作成しましょう。
Student は student.gd 内でデータを非公開に保ちます。
_init(id, new_name)はIDを非公開変数に保存し、student_nameセッターを通じて名前を設定します。student_idは読み取り専用で、IDを返します。student_nameにはセッターがあります。2文字未満の名前は拒否され(以前の名前が維持され)、last_errorはName must be at least 2 charactersになります。有効な名前の場合、last_errorはクリアされます。add_grade(course, grade)は、コースの成績を非公開のDictionaryに保存し(同じコースの新しい成績は以前の成績を置き換えます)、trueを返します。0未満または100を超える成績は保存されず、falseを返します。averageは読み取り専用の計算プロパティです。成績がある場合はその平均をfloatとして返し、成績がない場合は0.0を返します。course_count()は、成績が登録されているコースの数を返します。
StudentRegistry は student_registry.gd 内で、IDをキーとして学生を非公開のDictionaryに保持します。
add_student(student)は、IDがすでに登録されている場合は何も変更せずにfalseを返し、それ以外の場合は学生を保存してtrueを返します。remove_student(id)は、学生が削除されたかどうかを返します。get_student(id)は学生を返し、該当する学生がいない場合はnullを返します。top_student()は、平均点が最も高い学生(同点の場合は先に追加された学生)を返します。レジストリが空の場合はnullを返します。get_ids()は、学生が追加された順にIDを返します。
用意されているコードはコマンド数を読み取り、その後、1行につき1つのコマンドを実行します。コマンドは add ID NAME、grade ID COURSE GRADE、rename ID NAME、remove ID、show ID、tamper ID(student_id と average を上書きしようとしますが、これらは変更されてはいけません)、top、list です。次の入力の場合:
10
add 1001 Alice Smith
add 1002 Bob
grade 1001 Math 90
grade 1001 Art 85
grade 1002 Math 95
grade 1002 Art 120
rename 1002 B
show 1002
top
list次のように出力されます:
Added Alice Smith (1001)
Added Bob (1002)
Alice Smith: Math = 90
Alice Smith: Art = 85
Bob: Math = 95
Invalid grade: 120
Rejected: Name must be at least 2 characters
ID: 1002, Name: Bob, Courses: 1, Average: 95.00
Top: Bob (95.00)
ID: 1001, Name: Alice Smith, Courses: 2, Average: 87.50
ID: 1002, Name: Bob, Courses: 1, Average: 95.00コードは student.gd と student_registry.gd に記述します。main.gd には用意されている入出力コードが含まれており、編集できません。
自分で試してみよう
extends Node
func _ready():
# 用意された入出力コード:そのままにしてください
var registry := StudentRegistry.new()
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ", true, 2)
var command := parts[0]
if command == "top":
var best := registry.top_student()
if best == null:
print("Top: none")
else:
print("Top: %s (%.2f)" % [best.student_name, best.average])
continue
if command == "list":
for listed_id in registry.get_ids():
print_student(registry.get_student(listed_id))
continue
var id := int(parts[1])
if command == "add":
var student := Student.new(id, parts[2])
if student.last_error != "":
print("Rejected: " + student.last_error)
elif registry.add_student(student):
print("Added %s (%d)" % [student.student_name, id])
else:
print("Duplicate ID: %d" % id)
continue
if command == "remove":
print(("Removed %d" if registry.remove_student(id) else "No student %d") % id)
continue
var student := registry.get_student(id)
if student == null:
print("No student %d" % id)
elif command == "grade":
var grade_parts := parts[2].split(" ")
if student.add_grade(grade_parts[0], int(grade_parts[1])):
print("%s: %s = %s" % [student.student_name, grade_parts[0], grade_parts[1]])
else:
print("Invalid grade: " + grade_parts[1])
elif command == "rename":
student.student_name = parts[2]
if student.last_error != "":
print("Rejected: " + student.last_error)
else:
print("Renamed to " + student.student_name)
elif command == "tamper":
# 読み取り専用プロパティを上書きしようとします
student.student_id = 0
student.average = 100.0
print_student(student)
else:
print_student(student)
func print_student(student: Student) -> void:
print("ID: %d, Name: %s, Courses: %d, Average: %.2f" % [student.student_id, student.student_name, student.course_count(), student.average])
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: GDScriptオンラインコンパイラ