חישובים עם זמן
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-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 לפעולות בלתי משתנות.
אתגר
קלצרו מחשבון למועדי יעד של פרויקט, המשתמש בחישובי זמן כדי לקבוע אבני דרך ומועדי יעד של הפרויקט. האתגר הזה יבדוק את יכולתכם להשתמש בשיטות 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")
עליכם:
- לנתח את הקלט הראשון באמצעות פיצול לפי נקודתיים, כדי לחלץ את ערכי השנה, החודש, היום, השעה והדקה
- להמיר את ערכי המחרוזות האלה למספרים שלמים וליצור זמן התחלה של הפרויקט באמצעות
time.Date(השתמשו ב-time.UTCכמיקום, וב-0 עבור שניות וננו־שניות) - לנתח את הקלט השני באמצעות פיצול לפי פסיקים, כדי לקבל רשומות של משימות בודדות
- עבור כל רשומת משימה, לפצל לפי נקודתיים כדי לחלץ את שם המשימה, ערך משך הזמן ויחידת משך הזמן
- להמיר את ערכי משך הזמן למספרים שלמים וליצור אובייקטים מסוג
time.Durationבאמצעות הקבועים המתאימים:- עבור
"Day": להכפיל ב-24 * time.Hour - עבור
"Week": להכפיל ב-7 * 24 * time.Hour - עבור
"Hour": להכפיל ב-time.Hour
- עבור
- להציג את כותרת היישום:
"=== PROJECT DEADLINE CALCULATOR ===" - להציג את תחילת הפרויקט:
"Project start time: [start_time_object]" - לחשב את מועדי היעד של המשימות באמצעות הוספת משך הזמן של כל משימה לשעת הסיום של המשימה הקודמת (המשימה הראשונה מתחילה בזמן תחילת הפרויקט):
- עבור כל משימה, להציג:
"Task: [task_name]"" Duration: [duration_object]"" Start: [task_start_time]"" End: [task_end_time]"(מחושב באמצעות השיטהAdd)
- לחשב ולהציג את ציר הזמן של הפרויקט:
"=== PROJECT TIMELINE ===""Project start: [start_time_object]""Project end: [final_task_end_time]""Total project duration: [total_duration_object]"(מחושב באמצעות השיטהSubבין סיום הפרויקט לתחילתו)
- להציג ניתוח של המשימות:
"=== TASK ANALYSIS ===""Number of tasks: [number_of_tasks]""Longest task: [longest_task_name] ([longest_duration_object])""Shortest task: [shortest_task_name] ([shortest_duration_object])"
- לחשב את הזמן בין משימות עוקבות ולהציג את הפערים:
"=== TASK TRANSITIONS ==="- עבור כל זוג של משימות עוקבות:
"[first_task_name] to [second_task_name]: [time_difference_object]"(הערך אמור להיות 0, מכיוון שהמשימות עוקבות)
- להציג את הסטטיסטיקות של הפרויקט:
"=== 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"
- להציג את הודעת ההשלמה:
"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: כתוב את הקוד שלך למטה
// - עבד כל רשומת משימה כדי לחלץ שם, ערך משך ויחידת זמן
// - צור אובייקטים של משך זמן לכל משימה
// - חשב את זמני ההתחלה והסיום של המשימות
// - מצא את המשימות הארוכה והקצרה ביותר
// - חשב את נתוני הפרויקט
// - הצג את כל חלקי הפלט הנדרשים
// הפלט ייווצר על ידי הקוד שתממש למעלה
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1בקרת זרימה מתקדמת
switch עם `fallthrough`יציאה מלולאות מקוננותהמשך לולאה מסוימתהצהרת `goto`סיכום – שליטה מתקדמת בלולאות4פרויקט: רשימת משימות פשוטה
הגדרת הפרויקטהוספת משימה7טיפול בשגיאות לעומק
סוגי שגיאות מותאמים אישיתעטיפת שגיאות באמצעות `%w`חילוץ שגיאות באמצעות `errors.Is`חילוץ שגיאות באמצעות `errors.As`הבנת `panic`שימוש ב־`recover`סיכום — חלוקה בטוחה10עבודה עם זמן
קבלת הזמן הנוכחייצירת זמן מסויםעיצוב זמןניתוח מחרוזות זמןמשך זמןחישובים עם זמןהשהיה וטיקריםסיכום - טיימר פשוט2מבנים ושיטות
הגדרת שיטות במבניםמקבלי ערךמקבלי מצביעבחירת מקבליםשיטות לעומת פונקציותסיכום — התנהגות המבנים5מפות לעומק
מפות של Structsמצביעים כערכים במפהבדיקה אם מפות הן nilהשוואת מפותסיכום - מונה תדירות מילים8פרויקט: ניהול מלאי פשוט
סקירת הפרויקטבדיקת המלאיתרגלו בעצמכם: קומפיילר Go אונליין