Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

ملخص - القسمة الآمنة

جزء من قسم Logic & Flow في رحلة GO على Coddy — الدرس 44 من 68.

challenge icon

التحدي

سهل

قم ببناء آلة حاسبة رياضية شاملة تنفذ عملية القسمة الآمنة مع أنواع أخطاء مخصصة متعددة ومعالجة صحيحة للأخطاء. يجمع هذا التحدي بين أنواع الأخطاء المخصصة، وتغليف الأخطاء (error wrapping)، وفحص الأخطاء لإنشاء نظام قوي يتعامل مع حالات فشل العمليات الرياضية المختلفة بسلاسة.

ستتلقى مدخلين:

  • سلسلة نصية تحتوي على تفاصيل العملية بتنسيق "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. تحليل المدخل الأول عن طريق التقسيم عند الفواصل للحصول على operation و num1 و num2 و precision
  5. تحليل المدخل الثاني عن طريق التقسيم عند الفواصل للحصول على calculator name و mode
  6. تحويل الأرقام النصية إلى float64 والدقة (precision) إلى int
  7. إنشاء دالة safeDivide تأخذ معاملين من نوع float64 وتعيد (float64, error):
    • إذا كان المقسوم عليه (divisor) هو 0، فقم بإعادة 0 و DivisionError مع قيم المقسوم والمقسوم عليه
    • إذا كان المقسوم (dividend) سالباً وكان الوضع (mode) هو "strict"، فقم بإعادة 0 و ValidationError مع الحقل "dividend" وقيمة المقسوم
    • إذا كان المقسوم عليه (divisor) سالباً وكان الوضع (mode) هو "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)
	
	// تحليل مدخلات العملية (العملية، الرقم1، الرقم2، الدقة)
	operationParts := strings.Split(operationInput, ",")
	operation := operationParts[0]
	num1, _ := strconv.ParseFloat(operationParts[1], 64)
	num2, _ := strconv.ParseFloat(operationParts[2], 64)
	precision, _ := strconv.Atoi(operationParts[3])
	
	// تحليل مدخلات الإعدادات (اسم_الحاسبة، الوضع)
	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. اعرض الملخص النهائي
	
}

جميع دروس Logic & Flow