Menu
Coddy logo textTech

Özet - Güvenli Bölme

Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 44 / 68.

challenge icon

Görev

Kolay

Birden fazla özel hata türü ve uygun hata yönetimi ile güvenli bölme işlemini uygulayan kapsamlı bir matematiksel hesap makinesi oluşturun. Bu zorluk, çeşitli matematiksel işlem hatalarını zarif bir şekilde ele alan sağlam bir sistem oluşturmak için özel hata türlerini, hata sarmalamayı (error wrapping) ve hata kontrolünü birleştirir.

İki girdi alacaksınız:

  • "operation,num1,num2,precision" formatında işlem ayrıntılarını içeren bir dize (örneğin, "divide,10,0,2")
  • "calculator_name,mode" formatında hesap makinesi ayarlarını içeren bir dize (örneğin, "ScientificCalc,strict")

Göreviniz şunları yapmaktır:

  1. İki özel hata türü oluşturun:
    • Dividend (float64) ve Divisor (float64) alanlarına sahip DivisionError yapısı (struct)
    • Field (string) ve Value (float64) alanlarına sahip ValidationError yapısı (struct)
  2. DivisionError için şu sonucu döndüren Error() string metodunu uygulayın: "division error: cannot divide [dividend] by [divisor]"
  3. ValidationError için şu sonucu döndüren Error() string metodunu uygulayın: "validation error: invalid [field] value [value]"
  4. İlk girdiyi virgüllere göre ayırarak operation, num1, num2 ve precision değerlerini elde edin
  5. İkinci girdiyi virgüllere göre ayırarak calculator name ve mode değerlerini elde edin
  6. Dize halindeki sayıları float64'e ve precision değerini int'e dönüştürün
  7. İki float64 parametresi alan ve (float64, error) döndüren bir safeDivide fonksiyonu oluşturun:
    • Eğer bölen (divisor) 0 ise, 0 ve dividend ile divisor değerlerini içeren bir DivisionError döndürün
    • Eğer bölünen (dividend) negatifse ve mod "strict" ise, 0 ve "dividend" alanı ile dividend değerini içeren bir ValidationError döndürün
    • Eğer bölen (divisor) negatifse ve mod "strict" ise, 0 ve "divisor" alanı ile divisor değerini içeren bir ValidationError döndürün
    • Aksi takdirde, bölme sonucunu ve nil döndürün
  8. safeDivide sonucunu sarmalayan bir performCalculation fonksiyonu oluşturun:
    • Eğer safeDivide bir hata döndürürse, hatayı şu şekilde sarmalayın: "calculation failed in [calculator_name]: %w"
    • Başarılı olursa, sonucu ve nil döndürün
  9. performCalculation fonksiyonunu çağırın ve sonucu işleyin:
    • Hata yoksa: "Calculation successful: [result_formatted_to_precision_decimal_places]" yazdırın
    • Hata varsa: "Calculation failed: [error_message]" yazdırın
  10. Sarmalanmış hata içindeki belirli hata türlerini kontrol etmek için errors.As kullanın:
    • "Checking for division error: [true/false]" yazdırın
    • "Checking for validation error: [true/false]" yazdırın
  11. Eğer bir DivisionError bulunursa, ayrıntılarını yazdırın:
    • "Division Error Details:"
    • "Dividend: [dividend]"
    • "Divisor: [divisor]"
  12. Eğer bir ValidationError bulunursa, ayrıntılarını yazdırın:
    • "Validation Error Details:"
    • "Field: [field]"
    • "Value: [value]"
  13. Final özetini görüntüleyin:
    • "Calculator Summary:"
    • "Name: [calculator_name]"
    • "Mode: [mode]"
    • "Operation: [operation]"
    • "Input: [num1] [operation_symbol] [num2]" (burada operation_symbol bölme için "/" olmalıdır)
    • "Precision: [precision] decimal places"
    • "Status: [Success/Failed]"

Girdi dizelerini virgüllere göre ayırmak için strings paketini, dizeleri sayılara dönüştürmek için strconv paketini, errors.As için errors paketini ve hata sarmalama ile biçimlendirme için fmt paketini kullanın. Bu zorluk; özel hata türlerinin, hata sarmalamanın ve uygun hata kontrolünün, farklı hata türleri hakkında ayrıntılı bilgi sağlayan sağlam hata yönetimi sistemleri oluşturmak için nasıl birlikte çalıştığını gösterir.

Kendin dene

package main

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

func main() {
	// Girdiyi oku
	var operationInput string
	var settingsInput string
	fmt.Scanln(&operationInput)
	fmt.Scanln(&settingsInput)
	
	// İşlem girdisini ayrıştır (işlem,sayı1,sayı2,hassasiyet)
	operationParts := strings.Split(operationInput, ",")
	operation := operationParts[0]
	num1, _ := strconv.ParseFloat(operationParts[1], 64)
	num2, _ := strconv.ParseFloat(operationParts[2], 64)
	precision, _ := strconv.Atoi(operationParts[3])
	
	// Ayar girdisini ayrıştır (hesap_makinesi_adı,mod)
	settingsParts := strings.Split(settingsInput, ",")
	calculatorName := settingsParts[0]
	mode := settingsParts[1]
	
	// YAPILACAK: Kodunuzu aşağıya yazın
	// 1. Error() metotlarına sahip DivisionError ve ValidationError yapılarını oluşturun
	// 2. safeDivide fonksiyonunu uygulayın
	// 3. performCalculation fonksiyonunu uygulayın
	// 4. performCalculation fonksiyonunu çağırın ve sonuçları işleyin
	// 5. Belirli hata türlerini kontrol etmek için errors.As kullanın
	// 6. Bulunursa hata ayrıntılarını yazdırın
	// 7. Nihai özeti görüntüleyin
	
}

Mantık ve Akış bölümündeki tüm dersler