Menu
Coddy logo textTech

מפות של Structs

חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 26 מתוך 68.

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

כשמשתמשים במבנים כערכים במפה, למעשה יוצרים אוסף שבו כל מפתח מצביע לרשומת נתונים מלאה. כך מצהירים על מפה כזו ומאתחלים אותה:

type Student struct {
    ID    int
    Grade string
}

students := map[string]Student{
    "Alice": {ID: 101, Grade: "A"},
    "Bob":   {ID: 102, Grade: "B"},
}

אפשר לגשת לנתוני המבנה ולעבוד איתם דרך המפה, בדיוק כמו בכל פעולה אחרת על מפה. כדי לקבל את המידע של תלמיד, פשוט משתמשים בשם שלו כמפתח:

alice := students["Alice"]
fmt.Println(alice.ID)    // מדפיס: 101
fmt.Println(alice.Grade) // מדפיס: A

התבנית הזו נפוצה מאוד ביישומי Go לאחסון אוספים של נתונים קשורים, כגון פרופילי משתמשים, קטלוגים של מוצרים או הגדרות תצורה, במקרים שבהם נדרשים גם נתונים מובְנים וגם גישה מהירה המבוססת על מפתחות.

challenge icon

אתגר

קל

צרו מערכת לניהול ציוני תלמידים באמצעות מפות שבהן מבנים משמשים כערכים. האתגר הזה מדגים איך לארגן נתוני תלמידים מורכבים באמצעות מפתחות בעלי משמעות, כדי לאפשר חיפוש ואחזור יעילים.

תקבלו שני קלטים:

  • מחרוזת שמייצגת את מספר התלמידים (למשל, "4")
  • מחרוזת שמכילה נתוני תלמידים בתבנית: "name1:id1:grade1,name2:id2:grade2,name3:id3:grade3" (למשל, "Alice:101:A,Bob:102:B,Charlie:103:C,Diana:104:A")

המשימה שלכם היא:

  1. להגדיר מבנה Student עם השדות הבאים:
    • ID (int) - מספר הזיהוי של התלמיד
    • Grade (string) - הציון באותיות של התלמיד
  2. ליצור מפה שבה המפתחות הם שמות התלמידים (מחרוזות) והערכים הם מבני Student
  3. לנתח את נתוני התלמידים מהקלט השני:
    • לפצל את הקלט לפי פסיקים כדי לקבל רשומות של תלמידים בודדים
    • עבור כל רשומה, לפצל לפי נקודתיים כדי להפריד בין השם, המזהה והציון
    • להמיר את מחרוזת המזהה למספר שלם
    • ליצור מבנה Student ולהוסיף אותו למפה כשהשם משמש כמפתח
  4. להציג את כל התלמידים בסדר אלפביתי לפי שם, בתבנית: "[name]: ID [id], Grade [grade]"
  5. לחשב ולהציג סטטיסטיקות ציונים:
    • לספור כמה תלמידים קיבלו כל ציון (A, B, C, D, F)
    • להציג את הספירה של כל ציון שמופיע, בתבנית: "Grade [grade]: [count] students"
    • להציג את הציונים בסדר אלפביתי (A, B, C, D, F)
  6. למצוא ולהציג את התלמיד עם המזהה הגבוה ביותר, בתבנית: "Highest ID: [name] ([id])"
  7. להציג את המספר הכולל של התלמידים: "Total students: [count]"

השתמשו בחבילה strconv כדי להמיר את מחרוזת המזהה למספר שלם, ובחבילה sort כדי למיין את שמות התלמידים בסדר אלפביתי. האתגר הזה מדגים איך מפות עם ערכי מבנה מספקות דרך יעילה לארגן ולגשת לאוספי נתונים מורכבים באמצעות מזהים בעלי משמעות.

נסו בעצמכם

package main

import (
	"fmt"
)

func main() {
	// קרא את הקלט
	var numStudentsStr string
	var studentData string
	fmt.Scanln(&numStudentsStr)
	fmt.Scanln(&studentData)
	
	// TODO: הגדר כאן את המבנה Student
	
	// TODO: צור מפה לאחסון הסטודנטים (השם כמפתח, המבנה Student כערך)
	
	// TODO: נתח את נתוני הסטודנטים ומלא את המפה
	
	// TODO: הצג את כל הסטודנטים לפי סדר אלפביתי של השמות
	
	// TODO: חשב והצג סטטיסטיקות של הציונים
	
	// TODO: מצא והצג את הסטודנט בעל ה-ID הגבוה ביותר
	
	// TODO: הצג את מספר הסטודנטים הכולל
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת התוכנית

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