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

Erstelle einen umfassenden mathematischen Taschenrechner, der eine sichere Division mit mehreren benutzerdefinierten Fehlertypen und einer geeigneten Fehlerbehandlung implementiert. Diese Herausforderung kombiniert benutzerdefinierte Fehlertypen, Fehler-Wrapping und Fehlerprüfung, um ein robustes System zu erstellen, das verschiedene Fehler bei mathematischen Operationen zuverlässig behandelt.

Du erhältst zwei Eingaben:

  • Eine Zeichenkette mit Operationsdetails im Format "operation,num1,num2,precision" (z. B. "divide,10,0,2")
  • Eine Zeichenkette mit Taschenrechnereinstellungen im Format "calculator_name,mode" (z. B. "ScientificCalc,strict")

Deine Aufgabe ist es:

  1. Zwei benutzerdefinierte Fehlertypen zu erstellen:
    • Eine DivisionError-Struktur mit den Feldern Dividend (float64) und Divisor (float64)
    • Eine ValidationError-Struktur mit den Feldern Field (string) und Value (float64)
  2. Die Methode Error() string für DivisionError zu implementieren, die Folgendes zurückgibt: "division error: cannot divide [dividend] by [divisor]"
  3. Die Methode Error() string für ValidationError zu implementieren, die Folgendes zurückgibt: "validation error: invalid [field] value [value]"
  4. Die erste Eingabe durch Aufteilen an Kommas zu analysieren, um operation, num1, num2 und precision zu erhalten
  5. Die zweite Eingabe durch Aufteilen an Kommas zu analysieren, um den Namen des Taschenrechners und den Modus zu erhalten
  6. Die Zeichenkettenzahlen in float64 und precision in int umzuwandeln
  7. Eine safeDivide-Funktion zu erstellen, die zwei float64-Parameter entgegennimmt und (float64, error) zurückgibt:
    • Wenn divisor 0 ist, 0 und einen DivisionError mit den Werten von dividend und divisor zurückzugeben
    • Wenn dividend negativ ist und mode "strict" lautet, 0 und einen ValidationError mit dem Feld "dividend" und dem Wert von dividend zurückzugeben
    • Wenn divisor negativ ist und mode "strict" lautet, 0 und einen ValidationError mit dem Feld "divisor" und dem Wert von divisor zurückzugeben
    • Andernfalls das Divisionsergebnis und nil zurückzugeben
  8. Eine performCalculation-Funktion zu erstellen, die das Ergebnis von safeDivide verpackt:
    • Wenn safeDivide einen Fehler zurückgibt, ihn mit Folgendem zu verpacken: "calculation failed in [calculator_name]: %w"
    • Bei Erfolg das Ergebnis und nil zurückzugeben
  9. performCalculation aufzurufen und das Ergebnis zu behandeln:
    • Wenn kein Fehler auftritt: "Calculation successful: [result_formatted_to_precision_decimal_places]" auszugeben
    • Wenn ein Fehler auftritt: "Calculation failed: [error_message]" auszugeben
  10. errors.As zu verwenden, um bestimmte Fehlertypen im verpackten Fehler zu prüfen:
    • "Checking for division error: [true/false]" auszugeben
    • "Checking for validation error: [true/false]" auszugeben
  11. Wenn ein DivisionError gefunden wird, seine Details auszugeben:
    • "Division Error Details:"
    • "Dividend: [dividend]"
    • "Divisor: [divisor]"
  12. Wenn ein ValidationError gefunden wird, seine Details auszugeben:
    • "Validation Error Details:"
    • "Field: [field]"
    • "Value: [value]"
  13. Eine abschließende Zusammenfassung anzuzeigen:
    • "Calculator Summary:"
    • "Name: [calculator_name]"
    • "Mode: [mode]"
    • "Operation: [operation]"
    • "Input: [num1] [operation_symbol] [num2]", wobei operation_symbol für divide "/" ist
    • "Precision: [precision] decimal places"
    • "Status: [Success/Failed]"

Verwende das strings-Paket, um die Eingabezeichenketten an Kommas aufzuteilen, das strconv-Paket, um Zeichenketten in Zahlen umzuwandeln, das errors-Paket für errors.As und das fmt-Paket für das Verpacken und Formatieren von Fehlern. Diese Herausforderung zeigt, wie benutzerdefinierte Fehlertypen, Fehler-Wrapping und eine geeignete Fehlerprüfung zusammenwirken, um robuste Systeme zur Fehlerbehandlung zu erstellen, die detaillierte Informationen über verschiedene Fehlertypen 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

Übe selbstständig: Online-Go-Compiler