Menu
Coddy logo textTech

סיכום — חלוקה בטוחה

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

challenge icon

אתגר

קל

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

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

  • מחרוזת שמכילה פרטי פעולה בפורמט "operation,num1,num2,precision" (לדוגמה, "divide,10,0,2")
  • מחרוזת שמכילה הגדרות של המחשבון בפורמט "calculator_name,mode" (לדוגמה, "ScientificCalc,strict")

עליכם:

  1. ליצור שני סוגי שגיאות מותאמים אישית:
    • מבנה DivisionError עם השדות Dividend (float64) ו-Divisor (float64)
    • מבנה ValidationError עם השדות Field (string) ו-Value (float64)
  2. לממש את המתודה Error() string עבור DivisionError, כך שתחזיר: "division error: cannot divide [dividend] by [divisor]"
  3. לממש את המתודה Error() string עבור ValidationError, כך שתחזיר: "validation error: invalid [field] value [value]"
  4. לנתח את הקלט הראשון על ידי פיצול לפי פסיקים כדי לקבל את הפעולה, num1, num2 ו-precision
  5. לנתח את הקלט השני על ידי פיצול לפי פסיקים כדי לקבל את שם המחשבון ואת mode
  6. להמיר את המספרים שבמחרוזות ל-float64 ואת precision ל-int
  7. ליצור פונקציה safeDivide שמקבלת שני פרמטרים מסוג float64 ומחזירה (float64, error):
    • אם המחלק הוא 0, להחזיר 0 ושגיאת DivisionError עם ערכי המחולק והמחלק
    • אם המחולק שלילי והמצב הוא "strict", להחזיר 0 ושגיאת ValidationError עם השדה "dividend" וערך המחולק
    • אם המחלק שלילי והמצב הוא "strict", להחזיר 0 ושגיאת ValidationError עם השדה "divisor" וערך המחלק
    • אחרת, להחזיר את תוצאת החילוק ואת nil
  8. ליצור פונקציה performCalculation שעוטפת את התוצאה של safeDivide:
    • אם safeDivide מחזירה שגיאה, לעטוף אותה כך: "calculation failed in [calculator_name]: %w"
    • אם הפעולה הצליחה, להחזיר את התוצאה ואת nil
  9. לקרוא ל-performCalculation ולטפל בתוצאה:
    • אם אין שגיאה: להדפיס "Calculation successful: [result_formatted_to_precision_decimal_places]"
    • אם קיימת שגיאה: להדפיס "Calculation failed: [error_message]"
  10. להשתמש ב-errors.As כדי לבדוק אם סוגי שגיאות מסוימים נמצאים בשגיאה העטופה:
    • להדפיס "Checking for division error: [true/false]"
    • להדפיס "Checking for validation error: [true/false]"
  11. אם נמצאה שגיאת DivisionError, להדפיס את הפרטים שלה:
    • "Division Error Details:"
    • "Dividend: [dividend]"
    • "Divisor: [divisor]"
  12. אם נמצאה שגיאת ValidationError, להדפיס את הפרטים שלה:
    • "Validation Error Details:"
    • "Field: [field]"
    • "Value: [value]"
  13. להציג סיכום סופי:
    • "Calculator Summary:"
    • "Name: [calculator_name]"
    • "Mode: [mode]"
    • "Operation: [operation]"
    • "Input: [num1] [operation_symbol] [num2]" כאשר operation_symbol הוא "/" עבור חילוק
    • "Precision: [precision] decimal places"
    • "Status: [Success/Failed]"

השתמשו בחבילה strings כדי לפצל את מחרוזות הקלט לפי פסיקים, בחבילה strconv כדי להמיר מחרוזות למספרים, בחבילה errors עבור errors.As, ובחבילה fmt לעטיפת שגיאות ולעיצוב פלט. האתגר הזה מדגים כיצד סוגי שגיאות מותאמים אישית, עטיפת שגיאות ובדיקת שגיאות נכונה פועלים יחד כדי ליצור מערכות אמינות לטיפול בשגיאות, שמספקות מידע מפורט על סוגים שונים של כשלים.

נסו בעצמכם

package main

import (
	"errors"
	"fmt"
	"strconv"
	"strings"
)

func main() {
	// קראו את הקלט
	var operationInput string
	var settingsInput string
	fmt.Scanln(&operationInput)
	fmt.Scanln(&settingsInput)
	
	// נתחו את קלט הפעולה (operation,num1,num2,precision)
	operationParts := strings.Split(operationInput, ",")
	operation := operationParts[0]
	num1, _ := strconv.ParseFloat(operationParts[1], 64)
	num2, _ := strconv.ParseFloat(operationParts[2], 64)
	precision, _ := strconv.Atoi(operationParts[3])
	
	// נתחו את קלט ההגדרות (calculator_name,mode)
	settingsParts := strings.Split(settingsInput, ",")
	calculatorName := settingsParts[0]
	mode := settingsParts[1]
	
	// TODO: כתבו את הקוד שלכם למטה
	// 1. צרו מבנים מסוג DivisionError ו־ValidationError עם מתודות Error()
	// 2. ממשו את הפונקציה safeDivide
	// 3. ממשו את הפונקציה performCalculation
	// 4. קראו לפונקציה performCalculation וטפלו בתוצאות
	// 5. השתמשו ב־errors.As כדי לבדוק סוגי שגיאות מסוימים
	// 6. הדפיסו את פרטי השגיאה אם נמצאה
	// 7. הציגו סיכום סופי
	
}

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

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