Menu
CoddyTech

Rangkuman: Pembagian Aman

Termasuk bagian Logika & Alur dalam perjalanan GO di Coddy. Pelajaran 44 dari 68.

challenge icon

Tantangan

Mudah

Buat kalkulator matematika komprehensif yang menerapkan pembagian aman dengan beberapa tipe error khusus dan penanganan error yang tepat. Tantangan ini menggabungkan tipe error khusus, pembungkusan error, dan pemeriksaan error untuk membuat sistem tangguh yang menangani berbagai kegagalan operasi matematika dengan baik.

Kamu akan menerima dua input:

  • Sebuah string yang berisi detail operasi dengan format "operation,num1,num2,precision" (misalnya, "divide,10,0,2")
  • Sebuah string yang berisi pengaturan kalkulator dengan format "calculator_name,mode" (misalnya, "ScientificCalc,strict")

Tugasmu adalah:

  1. Buat dua tipe error khusus:
    • struct DivisionError dengan field Dividend (float64) dan Divisor (float64)
    • struct ValidationError dengan field Field (string) dan Value (float64)
  2. Terapkan method Error() string untuk DivisionError yang mengembalikan: "division error: cannot divide [dividend] by [divisor]"
  3. Terapkan method Error() string untuk ValidationError yang mengembalikan: "validation error: invalid [field] value [value]"
  4. Uraikan input pertama dengan memisahkannya berdasarkan koma untuk mendapatkan operasi, num1, num2, dan precision
  5. Uraikan input kedua dengan memisahkannya berdasarkan koma untuk mendapatkan nama kalkulator dan mode
  6. Konversi angka dalam string menjadi float64 dan precision menjadi int
  7. Buat fungsi safeDivide yang menerima dua parameter float64 dan mengembalikan (float64, error):
    • Jika divisor bernilai 0, kembalikan 0 dan DivisionError dengan nilai dividend dan divisor
    • Jika dividend negatif dan mode adalah "strict", kembalikan 0 dan ValidationError dengan field "dividend" dan nilai dividend
    • Jika divisor negatif dan mode adalah "strict", kembalikan 0 dan ValidationError dengan field "divisor" dan nilai divisor
    • Jika tidak, kembalikan hasil pembagian dan nil
  8. Buat fungsi performCalculation yang membungkus hasil dari safeDivide:
    • Jika safeDivide mengembalikan error, bungkus dengan: "calculation failed in [calculator_name]: %w"
    • Jika berhasil, kembalikan hasil dan nil
  9. Panggil performCalculation dan tangani hasilnya:
    • Jika tidak ada error: cetak "Calculation successful: [result_formatted_to_precision_decimal_places]"
    • Jika ada error: cetak "Calculation failed: [error_message]"
  10. Gunakan errors.As untuk memeriksa tipe error tertentu dalam error yang dibungkus:
    • Cetak "Checking for division error: [true/false]"
    • Cetak "Checking for validation error: [true/false]"
  11. Jika DivisionError ditemukan, cetak detailnya:
    • "Division Error Details:"
    • "Dividend: [dividend]"
    • "Divisor: [divisor]"
  12. Jika ValidationError ditemukan, cetak detailnya:
    • "Validation Error Details:"
    • "Field: [field]"
    • "Value: [value]"
  13. Tampilkan ringkasan akhir:
    • "Calculator Summary:"
    • "Name: [calculator_name]"
    • "Mode: [mode]"
    • "Operation: [operation]"
    • "Input: [num1] [operation_symbol] [num2]", dengan operation_symbol adalah "/" untuk divide
    • "Precision: [precision] decimal places"
    • "Status: [Success/Failed]"

Gunakan package strings untuk memisahkan string input berdasarkan koma, package strconv untuk mengonversi string menjadi angka, package errors untuk errors.As, dan package fmt untuk membungkus serta memformat error. Tantangan ini menunjukkan cara tipe error khusus, pembungkusan error, dan pemeriksaan error yang tepat bekerja bersama untuk membuat sistem penanganan error yang tangguh dan memberikan informasi terperinci tentang berbagai jenis kegagalan.

Coba sendiri

package main

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

func main() {
	// Baca input
	var operationInput string
	var settingsInput string
	fmt.Scanln(&operationInput)
	fmt.Scanln(&settingsInput)
	
	// Uraikan input operasi (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])
	
	// Uraikan input pengaturan (calculator_name,mode)
	settingsParts := strings.Split(settingsInput, ",")
	calculatorName := settingsParts[0]
	mode := settingsParts[1]
	
	// TODO: Tulis kodemu di bawah ini
	// 1. Buat struct DivisionError dan ValidationError dengan method Error()
	// 2. Implementasikan fungsi safeDivide
	// 3. Implementasikan fungsi performCalculation
	// 4. Panggil performCalculation dan tangani hasilnya
	// 5. Gunakan errors.As untuk memeriksa tipe error tertentu
	// 6. Cetak detail error jika ditemukan
	// 7. Tampilkan ringkasan akhir
	
}

Semua pelajaran di Logika & Alur

Latihan sendiri: Compiler Go online