Menu
Coddy logo textTech

סיכום – רשומות תלמידים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-GO של Coddy. שיעור 51 מתוך 107.

challenge icon

אתגר

קל

בוא נבנה מערכת לניהול רישומי תלמידים שמדגימה כימוס נכון. תיצור מבנה לניהול תלמידים שבו נתונים אקדמיים רגישים מוגנים, תוך מתן גישה מבוקרת באמצעות מתודות שתוכננו היטב.

תארגן את הקוד שלך בשני קבצים:

  • student.go: צור מבנה Student שמגן על מידע רגיש ובו בזמן חושף נתונים ציבוריים בטוחים. השדה Name של התלמיד צריך להיות מיוצא (נגיש לציבור), אך השדות grade (float64) ו-studentID (string) צריכים להיות לא מיוצאים כדי להגן על המידע הרגיש הזה.

    ממש את הדברים הבאים:

    • בנאי NewStudent(name, id string, initialGrade float64) *Student שיוצר תלמיד. יש להגדיר את הציון ההתחלתי רק אם הוא בין 0 ל-100 (כולל); אחרת, ברירת המחדל תהיה 0.
    • מתודת אחזור Grade() float64 שמחזירה את הציון הנוכחי
    • מתודת אחזור StudentID() string שמחזירה את מזהה התלמיד
    • מתודת הצבה SetGrade(newGrade float64) bool שמעדכנת את הציון רק אם הערך החדש בין 0 ל-100 (כולל). החזר true אם הציון עודכן, ו-false אחרת.
    • מתודה Summary() string שמחזירה את התבנית: [Name] (ID: [studentID]) - Grade: [grade]
  • main.go: קרא את פרטי התלמיד מהקלט, צור תלמיד באמצעות הבנאי, ולאחר מכן בצע פעולות על הציון. הצג את סיכום התלמיד לאחר יצירתו ולאחר כל ניסיון לעדכן את הציון.

הקלט הבא יסופק:

  • שורה 1: שם התלמיד
  • שורה 2: מזהה התלמיד
  • שורה 3: ציון התחלתי
  • שורה 4: ציון חדש ראשון להצבה
  • שורה 5: ציון חדש שני להצבה

לאחר יצירת התלמיד, הדפס את הסיכום שלו. לאחר מכן נסה לעדכן כל ציון; אם העדכון הצליח, הדפס את הסיכום המעודכן; אם הוא נדחה, הדפס Invalid grade rejected. עצב את כל ערכי הציון עם שתי ספרות אחרי הנקודה העשרונית.

לדוגמה, עבור Emma Wilson, STU001, 85.5, 92.0 ו-150, הפלט שלך צריך להיות:

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

העדכון האחרון נכשל משום ש-150 מחוץ לטווח התקין. מתודת ההצבה שלך אוכפת את הכלל הזה ושומרת על תקינות נתוני התלמיד. שים לב שאי אפשר לגשת ישירות אל studentID ואל grade: קוד חיצוני חייב להשתמש במתודות האחזור וההצבה שלך כדי לגשת לנתונים המוגנים האלה.

נסו בעצמכם

package main

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

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

	// קרא את שם התלמיד
	name, _ := reader.ReadString('\n')
	name = strings.TrimSpace(name)

	// קרא את מזהה התלמיד
	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)

	// קרא את הציון החדש השני
	newGrade2Str, _ := reader.ReadString('\n')
	newGrade2, _ := strconv.ParseFloat(strings.TrimSpace(newGrade2Str), 64)

	// TODO: צור תלמיד חדש באמצעות הבנאי NewStudent

	// TODO: הדפס את סיכום פרטי התלמיד לאחר יצירתו

	// TODO: נסה לעדכן את הציון בפעם הראשונה
	// אם העדכון הצליח, הדפס את הסיכום המעודכן
	// אם העדכון נדחה, הדפס "Invalid grade rejected"

	// TODO: נסה לעדכן את הציון בפעם השנייה
	// אם העדכון הצליח, הדפס את הסיכום המעודכן
	// אם העדכון נדחה, הדפס "Invalid grade rejected"

	// רמז: השתמש ב-fmt.Sprintf עם %.2f כדי לעצב ציונים ב-Summary()
	_ = newGrade1 // הסר שורה זו כשתשתמש במשתנה
	_ = newGrade2 // הסר שורה זו כשתשתמש במשתנה
}

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Go אונליין