AzLearn

تمرين إعادة البناء

Bank Ledger

أعد كتابة دفتر حسابات بسيط يستخدم الهللات كأعداد صحيحة ويحسب الرصيد.

rust ~20 دقيقة متوسط
أعد بناء الكود Rebuild

هذا هو الكود. اكتبه بنفسك.

الكود المرجعي
use std::env;
use std::fs;
use std::io;

#[derive(Debug)]
struct Entry {
    date: String,
    description: String,
    halalas: i64,
}

fn main() -> io::Result<()> {
    let path = env::args()
        .nth(1)
        .unwrap_or_else(|| "ledger.csv".to_string());
    let data = fs::read_to_string(path).unwrap_or_else(|_| sample_ledger());
    let entries = parse_entries(&data);
    let mut balance = 0i64;

    for entry in entries {
        balance += entry.halalas;
        println!(
            "{} | {:<18} | {:>10} | balance {}",
            entry.date,
            entry.description,
            format_money(entry.halalas),
            format_money(balance)
        );
    }

    Ok(())
}

fn parse_entries(data: &str) -> Vec<Entry> {
    data.lines()
        .skip(1)
        .filter_map(|line| {
            let fields: Vec<_> = line.split(',').map(str::trim).collect();
            Some(Entry {
                date: fields.get(0)?.to_string(),
                description: fields.get(1)?.to_string(),
                halalas: fields.get(2)?.parse().ok()?,
            })
        })
        .collect()
}

fn sample_ledger() -> String {
    "date,description,halalas\n2026-01-01,Opening,100000\n2026-01-03,Supplies,-2450\n2026-01-05,Sale,18500\n".to_string()
}

fn format_money(halalas: i64) -> String {
    let sign = if halalas < 0 { "-" } else { "" };
    let value = halalas.abs();
    format!("{sign}{}.{:02}", value / 100, value % 100)
}
اكتب هنا