+ Cevap Yaz
Toplam 3 sayfadan 1. sayfa
1 2 3 En SonEn Son
21 sonuçtan 1 ile 10 arası gösteriliyor

Konu: sayıları roma rakamlarına çeviren program

  1. #1
    energy engineer
    Üyelik Tarihi
    08/2008
    Yer
    Ankara||Istanbul
    Mesaj
    1,309

    sayıları roma rakamlarına çeviren program

    Zamanında C programlama öğrenmeye başladığım kitaba yine bakıyorum, yapmadığım alıştırmaları yapmak amacıyla. 0-9999 arası sayıları roma rakamlarına çeviren bir program yazınız diyor. aslında döngüleri kullanmamam gerekirdi kitapta o aşamada henüz döngüler anlatılmadığı için ama çözümü çok kısalttığı için kullandım. ilginç olduğunu düşündüğüm için paylaşıyorum.

    Kod:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(){
        int number, i;
        char *romanNum[11] = {"","I","II","III","IV","V","VI","VII","VIII","IX","X"};
        
        do{
              printf("Enter a number between 0-9999 :");
              scanf("%d", &number);
        }while (number < 0 || number > 9999);
        
        for (i = 0; number >= 1000; number -= 1000) ++i;
        if (i > 0) printf("\n%sM", (i > 1 ? romanNum[i] : ""));
        for (i = 0; number >= 500; number -= 500) ++i;
        if (i == 1) printf("D");
        for (i = 0; number >= 100; number -= 100) ++i;
        if (i > 0) printf("%sC", (i > 1 ? romanNum[i] : ""));
        for (i = 0; number >= 50; number -= 50) ++i;
        if (i == 1) printf("L");
        for (i = 0; number >= 10; number -= 10) ++i;
        if (i > 0) printf("%sX", (i > 1 ? romanNum[i] : ""));
        printf("%s\n\n", romanNum[number]);
        
        system("PAUSE");
        return 0;
    }
    
    Kod:
    Enter a number between 0-9999 :8888
    
    VIIIMDIIICLIIIXVIII
    
    ...

  2. #2
    Ali Çehreli
    Üyelik Tarihi
    10/2002
    Mesaj
    2,870

    Çok güzel... Doğru çalışınca daha da güzel olur...

    İlk rastgele denediğim sayı: 543. Sonuç: DIVXIII. Ben olsam DXLIII şeklinde yazardım.

    Ali

  3. #3
    energy engineer
    Üyelik Tarihi
    08/2008
    Yer
    Ankara||Istanbul
    Mesaj
    1,309

    Roma rakamlarını çok bilmiyorum Ali hoca, kitapta
    1000 için M
    500 için D
    100 için C
    50 için L
    10 için X
    5 için V
    1 için I değerleri verilmiş, sayıyı küçülte küçülte bir sonuca ulaşıyorum.
    Dediğiniz sayıda ve benzer sayılarda roma rakamı halinde birden fazla şekilde yazılabilmesi söz konusu sanırım, bunu belirleyecek bir algoritma nasıl olur?

    ve L'den X çıkarınca 40 sayısı anlamına geldiğini bilmiyordum.
    ...

  4. #4
    Ali Çehreli
    Üyelik Tarihi
    10/2002
    Mesaj
    2,870

    Ben aynı harfin üç tekrarından sonra "çıkarma işlemi" uygulanan yöntemi biliyorum. Ama şimdi araştırdım, dört tekrar da kullanılabiliyormuş: Yani 40 için XXXX de oluyor, 50-10 da: XL. Dört tekrardan haberim yoktu.

    Ama IVX'in 40 olduğunu sanmıyorum. Bence o sıra geçersiz. Ama görüldüğü gibi ben de uzmanı değilim...

    Ali

  5. #5
    energy engineer
    Üyelik Tarihi
    08/2008
    Yer
    Ankara||Istanbul
    Mesaj
    1,309

    teşekkür ederim, bende araştırıcam daha düzgün sonuç veren bi algoritma yazınca buraya yazarım yine.
    ...

  6. #6
    Ziraat Mühendisi _Onk@_ Adlı Üyenin Profil Grafiği
    Üyelik Tarihi
    09/2008
    Yer
    Ankara
    Mesaj
    686

    Alıntı acehreli, mesajından alıntı: Mesajı Gör
    Ben aynı harfin üç tekrarından sonra "çıkarma işlemi" uygulanan yöntemi biliyorum. Ama şimdi araştırdım, dört tekrar da kullanılabiliyormuş...
    Belki bu yüzden Romalılar bile kullanmayı bıraktı

  7. #7
    Primus inter pares Sahin Adlı Üyenin Profil Grafiği
    Üyelik Tarihi
    05/2002
    Yer
    Kuzey Kutbu
    Mesaj
    8,669

    Alıntı _Onk@_, mesajından alıntı: Mesajı Gör
    Belki bu yüzden Romalılar bile kullanmayı bıraktı
    Sanirim saka yaptin ama dogruyu söyledin Romalilar degilsede avrupalilar arap rakamlarini görunce roma rakamlarini birakmislardir.
    hava sıcak, de ki mayıs papatyasıyım
    ardımda dört mevsim, içimde sen...

  8. #8
    Üye
    Üyelik Tarihi
    01/2010
    Mesaj
    48

    printf yaptığın program sende nasıl çalıştı bilemiyorum ama ben iki kere derledim ve çalıştırdım, program sürekli çalışmadı ,ilkinden sonra durdu.Ama şöyle yapınca sürekli çalışıyor:

    Kod:
    int main()
    {
    
    for(;;){ //bütün programı kapsayıcı şekilde
        //...
           }
        // system("PAUSE"); 
            return 0;
    }
    
    Ayrıca şunu anlayamadım,
    Kod:
     for (i = 0; number >= 1000; number -= 1000) ++i;
    
    Niçin number >= 1000; iken number den her seferinde 1000 çıkıyor?
    Bir de if içinde if kullanırken
    Kod:
     (i > 1 ? romanNum[i] : ""));
    
    Bu mantığı anlayamadım.Zaten döngüde 1 den büyük çalışacak, şart koymanın mantığını anlayamadım.Hadi for a bakınca bir şeyler kafamda canlanıyor,o zaman number 1000 den büyük veya eşitse 1000 çıkarmanın anlamı nedir?
    Ayrıca programı eklediğin için teşekkürler.

  9. #9
    energy engineer
    Üyelik Tarihi
    08/2008
    Yer
    Ankara||Istanbul
    Mesaj
    1,309

    Alıntı openrlerv, mesajından alıntı: Mesajı Gör
    Bir de if içinde if kullanırken
    Kod:
     (i > 1 ? romanNum[i] : ""));
    
    Bu mantığı anlayamadım.Zaten döngüde 1 den büyük çalışacak, şart koymanın mantığını anlayamadım.Hadi for a bakınca bir şeyler kafamda canlanıyor,o zaman number 1000 den büyük veya eşitse 1000 çıkarmanın anlamı nedir?
    Ayrıca programı eklediğin için teşekkürler.
    bende program çalışıyor, Ali hoca da çalıştırdı. Dev-C++'ta .cpp dosyası olarak kaydedin ve derleyin.
    programın sürekli çalışmak gibi bir amacıda yok en başa dönmez yani, sadece işlem bitince pencere kapanmıyor pause dolayısıyla.

    1000'e eşitken niye hala 1000 çıkarıyorum çünkü sayıda kaç tane 1000 olduğunu bulmaya çalışıyorum.

    Sayı 2567 olsun,
    1000 çıkardım 1567
    1000 çıkardım 567 ... iki tane 1000 var ilk döngü ile IIM yazdırdım, diğerleride benzer mantıkla çalışıyor.
    başka bi örnek
    Sayı 2000, 1000 çıkardım 1000 kaldı 1000 daha çıkardım 0 kaldı, 2 tane 1000 var
    sonuç IIM

    Kod:
     (i > 1 ? romanNum[i] : ""));
    
    bu şart şununla ilgili mesela M harfi 1000 demek ya, bu şart olmasa IM yazardı aslında
    1000 için M, 2000 için IIM yazmalı. programı en çok kısaltan bu ? soru işaretli if'ler.
    tam olarak ne denir bu tür şartlara bilmiyorum, soru işaretli if denmiyordur o açık
    ...

  10. #10
    Ali Çehreli
    Üyelik Tarihi
    10/2002
    Mesaj
    2,870

    Alıntı printf, mesajından alıntı: Mesajı Gör
    iki tane 1000 var ilk döngü ile IIM yazdırdım
    Daha önce tam bilmediğini söylediğin için hatırlatıyorum: iki adet olursa, MM yazılması gerekir.

    Mantık kabaca şöyle: Tekrar üç taneye kadarsa, tekrarlanır:

    1: I
    2: II
    3: III

    Üçten fazlaysa, bir sonraki değerin karakteri yazılır ve "çıkarma" anlamında, bir önceki değer "sola" yazılır:

    4: IV anlamı: 5'ten 1 çıkart
    5: V
    6: VI
    7: VII
    8: VIII

    Dokuz için yine üçten fazla tekrar gerekecek. Onu da 10-1 olarak yazabiliriz:

    9: IX

    ...

    Yani, küçükten sonra büyük gelirse, küçük büyükten çıkartılır:

    44: XLIV çünkü 50-10 ve 5-1

    Ali

+ Cevap Yaz

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

     

Bookmarks

Mesaj Yazma Hakları

  • Yeni mesajgöndermezsiniz
  • Cevap yazamazsınız
  • Dosya ekleyemezsiniz
  • Mesajınızı düzenleyemezsiniz