D Programlama Dili - Çözümler

Üye İşlevler

  1. Azaltan işlev, eksi değerler nedeniyle daha karmaşık oluyor:
    struct GününSaati {
        // ...
    
        void azalt(Süre süre) {
            int azalanDakika = süre.dakika % 60;
            int azalanSaat = süre.dakika / 60;
    
            dakika -= azalanDakika;
    
            if (dakika < 0) {
                dakika += 60;
                ++azalanSaat;
            }
    
            saat -= azalanSaat;
    
            if (saat < 0) {
                saat = 24 - (-saat % 24);
            }
        }
    
        // ...
    }
    
  2. toString'in programı çok daha kısa ve kullanışlı hale getirdiğini göreceksiniz. Karşılaştırma amacıyla, programın önceki halinde Toplantı nesnesini yazdıran işlevi tekrar göstermek istiyorum:
    void bilgiVer(Toplantı toplantı) {
        bilgiVer(toplantı.başlangıç);
        write('-');
        bilgiVer(toplantı.bitiş);
    
        writef(" \"%s\" toplantısı (%s katılımcı)",
               toplantı.konu,
               toplantı.katılımcıSayısı);
    }
    

    Aşağıdaki programdaki Toplantı.toString ise kısaca şöyle yazılabiliyor:

        string toString() {
            return format("%s-%s \"%s\" toplantısı (%s katılımcı)",
                          başlangıç, bitiş, konu, katılımcıSayısı);
        }
    

    Programın tamamı:

    import std.stdio;
    import std.string;
    
    struct Süre {
        int dakika;
    }
    
    struct GününSaati {
        int saat;
        int dakika;
    
        string toString() {
            return format("%02s:%02s", saat, dakika);
        }
    
        void ekle(Süre süre) {
            dakika += süre.dakika;
    
            saat += dakika / 60;
            dakika %= 60;
            saat %= 24;
        }
    }
    
    struct Toplantı {
        string     konu;
        int        katılımcıSayısı;
        GününSaati başlangıç;
        GününSaati bitiş;
    
        string toString() {
            return format("%s-%s \"%s\" toplantısı (%s katılımcı)",
                          başlangıç, bitiş, konu, katılımcıSayısı);
        }
    }
    
    struct Yemek {
        GününSaati zaman;
        string     adres;
    
        string toString() {
            GününSaati bitiş = zaman;
            bitiş.ekle(Süre(90));
    
            return format("%s-%s Yemek, Yer: %s",
                          zaman, bitiş, adres);
        }
    }
    
    struct GünlükPlan {
        Toplantı sabahToplantısı;
        Yemek    öğleYemeği;
        Toplantı akşamToplantısı;
    
        string toString() {
            return format("%s\n%s\n%s",
                          sabahToplantısı,
                          öğleYemeği,
                          akşamToplantısı);
        }
    }
    
    void main() {
        auto geziToplantısı = Toplantı("Bisiklet gezisi", 4,
                                       GününSaati(10, 30),
                                       GününSaati(11, 45));
    
        auto öğleYemeği = Yemek(GününSaati(12, 30), "Taksim");
    
        auto bütçeToplantısı = Toplantı("Bütçe", 8,
                                        GününSaati(15, 30),
                                        GününSaati(17, 30));
    
        auto bugününPlanı = GünlükPlan(geziToplantısı,
                                       öğleYemeği,
                                       bütçeToplantısı);
    
        writeln(bugününPlanı);
        writeln();
    }
    

    Programın çıktısı da eski halinin aynısı:

    10:30-11:45 "Bisiklet gezisi" toplantısı (4 katılımcı)
    12:30-14:00 Yemek, Yer: Taksim
    15:30-17:30 "Bütçe" toplantısı (8 katılımcı)