Menu
Coddy logo textTech

חישובים עם זמן

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

עכשיו, כשאתם מבינים אובייקטים מסוג time.Time וערכים מסוג time.Duration, תוכלו לבצע פעולות חשבון כדי לחשב זמנים בעבר או בעתיד. Go מספקת שתי מתודות חיוניות לחישובי זמן: Add ו-Sub.

המתודה Add מקבלת time.Duration ומחזירה time.Time חדש שמייצג את הזמן המקורי בתוספת משך הזמן:

now := time.Now()
tomorrow := now.Add(24 * time.Hour)
fmt.Println(tomorrow)

השיטה Sub פועלת בשתי דרכים. כשמחסרים ערך time.Time אחד מערך time.Time אחר, היא מחזירה ערך time.Duration שמייצג את ההפרש ביניהם:

start := time.Now()
end := start.Add(2 * time.Hour)
difference := end.Sub(start) // מחזיר 2h0m0s

השיטות האלה מקלות על חישוב מועדי יעד, מדידת הזמן שחלף או תזמון אירועים עתידיים. האובייקט המקורי time.Time נשאר ללא שינוי - שתי השיטות מחזירות ערכים חדשים, בהתאם להעדפה של Go לפעולות בלתי משתנות.

challenge icon

אתגר

קל

צרו מחשבון למועדי יעד של פרויקט, המשתמש בחישובי זמן כדי לקבוע אבני דרך ומועדי יעד של הפרויקט. האתגר הזה יבדוק את יכולתכם להשתמש בשיטות Add ו-Sub על אובייקטים מסוג time.Time כדי לחשב תאריכים עתידיים והפרשי זמן בין אירועים.

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

  • מחרוזת המכילה מידע על תחילת הפרויקט בפורמט "year:month:day:hour:minute" (למשל, "2024:1:15:9:0")
  • מחרוזת המכילה את משכי המשימות בפורמט "task1:duration_value:duration_unit,task2:duration_value:duration_unit" (למשל, "Planning:5:Day,Development:3:Week,Testing:10:Day")

עליכם:

  1. לנתח את הקלט הראשון באמצעות פיצול לפי נקודתיים, כדי לחלץ את ערכי השנה, החודש, היום, השעה והדקה
  2. להמיר את ערכי המחרוזות האלה למספרים שלמים וליצור זמן התחלה של הפרויקט באמצעות time.Date (השתמשו ב-time.UTC כמיקום, וב-0 עבור שניות וננו־שניות)
  3. לנתח את הקלט השני באמצעות פיצול לפי פסיקים, כדי לקבל רשומות של משימות בודדות
  4. עבור כל רשומת משימה, לפצל לפי נקודתיים כדי לחלץ את שם המשימה, ערך משך הזמן ויחידת משך הזמן
  5. להמיר את ערכי משך הזמן למספרים שלמים וליצור אובייקטים מסוג time.Duration באמצעות הקבועים המתאימים:
    • עבור "Day": להכפיל ב-24 * time.Hour
    • עבור "Week": להכפיל ב-7 * 24 * time.Hour
    • עבור "Hour": להכפיל ב-time.Hour
  6. להציג את כותרת היישום: "=== PROJECT DEADLINE CALCULATOR ==="
  7. להציג את תחילת הפרויקט: "Project start time: [start_time_object]"
  8. לחשב את מועדי היעד של המשימות באמצעות הוספת משך הזמן של כל משימה לשעת הסיום של המשימה הקודמת (המשימה הראשונה מתחילה בזמן תחילת הפרויקט):
  9. עבור כל משימה, להציג:
    • "Task: [task_name]"
    • " Duration: [duration_object]"
    • " Start: [task_start_time]"
    • " End: [task_end_time]" (מחושב באמצעות השיטה Add)
  10. לחשב ולהציג את ציר הזמן של הפרויקט:
    • "=== PROJECT TIMELINE ==="
    • "Project start: [start_time_object]"
    • "Project end: [final_task_end_time]"
    • "Total project duration: [total_duration_object]" (מחושב באמצעות השיטה Sub בין סיום הפרויקט לתחילתו)
  11. להציג ניתוח של המשימות:
    • "=== TASK ANALYSIS ==="
    • "Number of tasks: [number_of_tasks]"
    • "Longest task: [longest_task_name] ([longest_duration_object])"
    • "Shortest task: [shortest_task_name] ([shortest_duration_object])"
  12. לחשב את הזמן בין משימות עוקבות ולהציג את הפערים:
    • "=== TASK TRANSITIONS ==="
    • עבור כל זוג של משימות עוקבות: "[first_task_name] to [second_task_name]: [time_difference_object]" (הערך אמור להיות 0, מכיוון שהמשימות עוקבות)
  13. להציג את הסטטיסטיקות של הפרויקט:
    • "=== PROJECT STATISTICS ==="
    • "Total working days: [total_duration_in_hours_divided_by_24]"
    • "Total working hours: [total_duration_in_hours]"
    • "Project spans [number_of_calendar_days] calendar days"
  14. להציג את הודעת ההשלמה: "Project timeline calculation completed successfully"

השתמשו בחבילה time לפעולות זמן, בחבילה strings לפיצול מחרוזות קלט, בחבילה strconv להמרת מחרוזות למספרים שלמים, ובחבילה fmt לפלט מעוצב. זכרו שהשיטה Add מחזירה אובייקט חדש מסוג time.Time, המייצג את הזמן המקורי בתוספת משך הזמן, ושהשיטה Sub מחזירה time.Duration, המייצג את ההפרש בין שני זמנים. האתגר הזה מדגים כיצד לבנות ציר זמן מלא של פרויקט באמצעות פעולות חשבון על זמן.

נסו בעצמכם

package main

import (
	"fmt"
	"strconv"
	"strings"
	"time"
)

func main() {
	// קרא את הקלט
	var startInfo string
	var taskInfo string
	fmt.Scanln(&startInfo)
	fmt.Scanln(&taskInfo)
	
	// נתח את פרטי שעת ההתחלה
	startParts := strings.Split(startInfo, ":")
	year, _ := strconv.Atoi(startParts[0])
	month, _ := strconv.Atoi(startParts[1])
	day, _ := strconv.Atoi(startParts[2])
	hour, _ := strconv.Atoi(startParts[3])
	minute, _ := strconv.Atoi(startParts[4])
	
	// צור את זמן תחילת הפרויקט
	startTime := time.Date(year, time.Month(month), day, hour, minute, 0, 0, time.UTC)
	
	// נתח את פרטי המשימות
	taskEntries := strings.Split(taskInfo, ",")
	
	// TODO: כתוב את הקוד שלך למטה
	// - עבד כל רשומת משימה כדי לחלץ שם, ערך משך ויחידת זמן
	// - צור אובייקטים של משך זמן לכל משימה
	// - חשב את זמני ההתחלה והסיום של המשימות
	// - מצא את המשימות הארוכה והקצרה ביותר
	// - חשב את נתוני הפרויקט
	// - הצג את כל חלקי הפלט הנדרשים
	
	// הפלט ייווצר על ידי הקוד שתממש למעלה
}
quiz iconבחנו את עצמכם

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

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

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