Menu
Coddy logo textTech

Zusammenfassung – Sichere Division

Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy — Lektion 44 von 68.

challenge icon

Aufgabe

Einfach

Erstellen Sie einen umfassenden mathematischen Taschenrechner, der eine sichere Division mit mehreren benutzerdefinierten Fehlertypen und ordnungsgemäßer Fehlerbehandlung implementiert. Diese Herausforderung kombiniert benutzerdefinierte Fehlertypen, Error Wrapping und Fehlerprüfung, um ein robustes System zu schaffen, das verschiedene Fehler bei mathematischen Operationen elegant handhabt.

Sie erhalten zwei Eingaben:

  • Einen String, der Operationsdetails im Format "operation,num1,num2,precision" enthält (z. B. "divide,10,0,2")
  • Einen String, der Rechnereinstellungen im Format "calculator_name,mode" enthält (z. B. "ScientificCalc,strict")

Ihre Aufgabe ist es:

  1. Erstellen Sie zwei benutzerdefinierte Fehlertypen:
    • DivisionError Struct mit den Feldern Dividend (float64) und Divisor (float64)
    • ValidationError Struct mit den Feldern Field (string) und Value (float64)
  2. Implementieren Sie die Methode Error() string für DivisionError, die Folgendes zurückgibt: "division error: cannot divide [dividend] by [divisor]"
  3. Implementieren Sie die Methode Error() string für ValidationError, die Folgendes zurückgibt: "validation error: invalid [field] value [value]"
  4. Parsen Sie die erste Eingabe, indem Sie sie an Kommas aufteilen, um operation, num1, num2 und precision zu erhalten
  5. Parsen Sie die zweite Eingabe, indem Sie sie an Kommas aufteilen, um calculator name und mode zu erhalten
  6. Konvertieren Sie die String-Zahlen in float64 und precision in int
  7. Erstellen Sie eine Funktion safeDivide, die zwei float64-Parameter entgegennimmt und (float64, error) zurückgibt:
    • Wenn der Divisor 0 ist, geben Sie 0 und einen DivisionError mit den Werten für Dividend und Divisor zurück
    • Wenn der Dividend negativ ist und der Modus "strict" ist, geben Sie 0 und einen ValidationError mit dem Feld "dividend" und dem Dividendenwert zurück
    • Wenn der Divisor negativ ist und der Modus "strict" ist, geben Sie 0 und einen ValidationError mit dem Feld "divisor" und dem Divisorwert zurück
    • Andernfalls geben Sie das Divisionsergebnis und nil zurück
  8. Erstellen Sie eine Funktion performCalculation, die das Ergebnis von safeDivide wrappt:
    • Wenn safeDivide einen Fehler zurückgibt, wrappen Sie ihn mit: "calculation failed in [calculator_name]: %w"
    • Wenn erfolgreich, geben Sie das Ergebnis und nil zurück
  9. Rufen Sie performCalculation auf und verarbeiten Sie das Ergebnis:
    • Wenn kein Fehler vorliegt: Geben Sie "Calculation successful: [result_formatted_to_precision_decimal_places]" aus
    • Wenn ein Fehler vorliegt: Geben Sie "Calculation failed: [error_message]" aus
  10. Verwenden Sie errors.As, um im gewrappten Fehler nach spezifischen Fehlertypen zu suchen:
    • Geben Sie "Checking for division error: [true/false]" aus
    • Geben Sie "Checking for validation error: [true/false]" aus
  11. Wenn ein DivisionError gefunden wird, geben Sie dessen Details aus:
    • "Division Error Details:"
    • "Dividend: [dividend]"
    • "Divisor: [divisor]"
  12. Wenn ein ValidationError gefunden wird, geben Sie dessen Details aus:
    • "Validation Error Details:"
    • "Field: [field]"
    • "Value: [value]"
  13. Zeigen Sie eine abschließende Zusammenfassung an:
    • "Calculator Summary:"
    • "Name: [calculator_name]"
    • "Mode: [mode]"
    • "Operation: [operation]"
    • "Input: [num1] [operation_symbol] [num2]" wobei operation_symbol "/" für Division ist
    • "Precision: [precision] decimal places"
    • "Status: [Success/Failed]"

Verwenden Sie das Paket strings, um die Eingabestrings an Kommas aufzuteilen, das Paket strconv, um Strings in Zahlen umzuwandeln, das Paket errors für errors.As und das Paket fmt für Error Wrapping und Formatierung. Diese Herausforderung zeigt, wie benutzerdefinierte Fehlertypen, Error Wrapping und ordnungsgemäße Fehlerprüfung zusammenarbeiten, um robuste Fehlerbehandlungssysteme zu erstellen, die detaillierte Informationen über verschiedene Arten von Fehlern liefern.

Probier es selbst

package main

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

func main() {
	// Eingabe lesen
	var operationInput string
	var settingsInput string
	fmt.Scanln(&operationInput)
	fmt.Scanln(&settingsInput)
	
	// Operationseingabe parsen (Operation,Zahl1,Zahl2,Präzision)
	operationParts := strings.Split(operationInput, ",")
	operation := operationParts[0]
	num1, _ := strconv.ParseFloat(operationParts[1], 64)
	num2, _ := strconv.ParseFloat(operationParts[2], 64)
	precision, _ := strconv.Atoi(operationParts[3])
	
	// Einstellungseingabe parsen (Taschenrechner_Name,Modus)
	settingsParts := strings.Split(settingsInput, ",")
	calculatorName := settingsParts[0]
	mode := settingsParts[1]
	
	// TODO: Schreiben Sie Ihren Code unten
	// 1. Erstellen Sie DivisionError- und ValidationError-Structs mit Error()-Methoden
	// 2. Implementieren Sie die Funktion safeDivide
	// 3. Implementieren Sie die Funktion performCalculation
	// 4. Rufen Sie performCalculation auf und verarbeiten Sie die Ergebnisse
	// 5. Verwenden Sie errors.As, um auf spezifische Fehlertypen zu prüfen
	// 6. Geben Sie Fehlerdetails aus, falls welche gefunden wurden
	// 7. Zeigen Sie die abschließende Zusammenfassung an
	
}

Alle Lektionen in Logik & Ablauf