• 07-04-2016, 00:50:31
    #1
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Merhaba arkadaşlar,

    C++ konsol uygulaması için bir vize projem var, ancak bazı sebeplerden dolayı derslere giremediğim için hocanın belirlemiş olduğu bazı şartlar altında programı yazmakta güçlük çekiyorum ve yardıma ihtiyacım var.



    Hocanın verdiği ödevin programının çıktısı yukarıdaki gibi olacak. Ancak aşağıdaki şartları istemesi nedeniyle pek sağlıklı bir mantıkla çalışan ve görevinin tamamını yerine getiren bir program yazamadım. Hocanın istediği şartlar şunlar:
    • -Sadece if kullanılacak, döngü falan yasak. Yani for, while, do-while, goto, switch, until, repeat-until, try-catch tarzı komutlar kullanılmayacak.
    • -Program 19 basamaklı sayılara kadar ayırma işlemi yapacak.
    • -En fazla 10 adet noktalı virgül kullanılacak.
    • -En fazla 3 adet değişken kullanılacak.
    • -Iostream.h, conio.h kütüphaneleri ve getch() kullanılacak.

    Aşağıda benim denemiş olduğum program var fakat 5 basamağa kadar desteklediği için pek bir işe yaramıyor. 10 noktalı virgül kullanarak en fazla bu kadar yapabildim, ? ve : operatörlerini kullanarak bu şekilde yazılabiliyor hocanın istediği program ama biraz ameleliğe giriyor. Amelelik olsa da hocanın belirlediği şartlar altında programı yazmak için yardımınıza ihtiyacım var arkadaşlar. Araştırmalarıma göre özyineleme diye birşeyle de yapılabiliyormuş ama beceremedim bir türlü. Yardımlarınızı bekliyorum, şimdiden teşekkürler.

    #include <iostream.h>
    #include <conio.h>
    
    int main()
    {
        unsigned long long sayi;
    
        cout << "Pozitif bir tamsayi giriniz: ";
        if (!(cin >> sayi) || (sayi > 99999))
            return !!(cout << "Hatali sayi girdiniz." << endl);
    
        cout << sayi;
    
        unsigned long long bolum, arti;
        if (arti = bolum = sayi / 10000)
            cout << " = " << bolum << "*10000";
    
        if (bolum = (sayi = sayi % 10000) / 1000)
            cout << (arti ? " + " : " = ") << bolum << "*1000";
    
        if (arti |= bolum, bolum = (sayi = sayi % 1000) / 100)
            cout << (arti ? " + " : " = ") << bolum << "*100";
    
        if (arti |= bolum, bolum = (sayi = sayi % 100) / 10)
            cout << (arti ? " + " : " = ") << bolum << "*10";
    
        if (arti |= bolum, bolum = sayi % 10)
            cout << (arti ? " + " : " = ") << bolum << "*1";
            getch();
    }
  • 07-04-2016, 13:43:53
    #2
    Üyeliği durduruldu
    Merhaba, "öz yinelemeli" tanımının temel anlamı bir fonksiyonun kendisini çağırması diyebiliriz.

    Problem kendisi ile aynı daha küçük problemlerin birleşmesinden oluşuyorsa öz yinelemeli (Recursive) şeklinde oluşturabilirsin.

    Öz yinelemeli kavramını şu şekilde anlatırsak daha yararlı olacaktır. Örneğin 1 ile 30 arasındaki sayıları tanımlarken 1 ile 29 arasındaki sayıların toplamı, artı 30 diyebiliriz. Aynı şekilde 1 ile 28 arasındaki sayıların toplamı, artı 29 diyebiliriz, bu şekilde fark edeceğin üzere aynı problem daha küçük şekilde karşımıza çıkıyor.

    Önemli bir konu Recursive functions'lar da küçükten büyüğe işlem yapman gerekir, bu şekilde küçük problemler birleşerek büyük problemin sonucunu oluşturur.

    Senin probleminde ise durum şu şekilde olacaktır, En büyük basamaktan en küçük basamağa kadar parçalaman gerekiyor, sonrasında fonksiyonun return kısmında basamakta bulunan sayı çarpı basamak sayısı şeklinde return yapabilirsin.
  • 07-04-2016, 14:29:09
    #3
    mvk5 adlı üyeden alıntı: mesajı görüntüle
    Merhaba arkadaşlar,

    C++ konsol uygulaması için bir vize projem var, ancak bazı sebeplerden dolayı derslere giremediğim için hocanın belirlemiş olduğu bazı şartlar altında programı yazmakta güçlük çekiyorum ve yardıma ihtiyacım var.



    Hocanın verdiği ödevin programının çıktısı yukarıdaki gibi olacak. Ancak aşağıdaki şartları istemesi nedeniyle pek sağlıklı bir mantıkla çalışan ve görevinin tamamını yerine getiren bir program yazamadım. Hocanın istediği şartlar şunlar:
    • -Sadece if kullanılacak, döngü falan yasak. Yani for, while, do-while, goto, switch, until, repeat-until, try-catch tarzı komutlar kullanılmayacak.
    • -Program 19 basamaklı sayılara kadar ayırma işlemi yapacak.
    • -En fazla 10 adet noktalı virgül kullanılacak.
    • -En fazla 3 adet değişken kullanılacak.
    • -Iostream.h, conio.h kütüphaneleri ve getch() kullanılacak.

    Aşağıda benim denemiş olduğum program var fakat 5 basamağa kadar desteklediği için pek bir işe yaramıyor. 10 noktalı virgül kullanarak en fazla bu kadar yapabildim, ? ve : operatörlerini kullanarak bu şekilde yazılabiliyor hocanın istediği program ama biraz ameleliğe giriyor. Amelelik olsa da hocanın belirlediği şartlar altında programı yazmak için yardımınıza ihtiyacım var arkadaşlar. Araştırmalarıma göre özyineleme diye birşeyle de yapılabiliyormuş ama beceremedim bir türlü. Yardımlarınızı bekliyorum, şimdiden teşekkürler.

    #include <iostream.h>
    #include <conio.h>
    
    int main()
    {
        unsigned long long sayi;
    
        cout << "Pozitif bir tamsayi giriniz: ";
        if (!(cin >> sayi) || (sayi > 99999))
            return !!(cout << "Hatali sayi girdiniz." << endl);
    
        cout << sayi;
    
        unsigned long long bolum, arti;
        if (arti = bolum = sayi / 10000)
            cout << " = " << bolum << "*10000";
    
        if (bolum = (sayi = sayi % 10000) / 1000)
            cout << (arti ? " + " : " = ") << bolum << "*1000";
    
        if (arti |= bolum, bolum = (sayi = sayi % 1000) / 100)
            cout << (arti ? " + " : " = ") << bolum << "*100";
    
        if (arti |= bolum, bolum = (sayi = sayi % 100) / 10)
            cout << (arti ? " + " : " = ") << bolum << "*10";
    
        if (arti |= bolum, bolum = sayi % 10)
            cout << (arti ? " + " : " = ") << bolum << "*1";
            getch();
    }
    Hocam recursive mantığıyla kabul oluyorsa aşağıdaki gibi bir örnek yazdım sizin için( math.h kütüphanesi kullandım ).
    Sizin tek yapmanız gereken long long haline çevirmek çünkü ben int kullandığım için 19 basamaklı bir sayıyı hesaplayamıyor.
    digits( 84012100, 8 ); buradaki 8 rakamını 19 yaparsanız 19 basamaklı sayıları hesaplayabilirsiniz. Ama dediğim gibi önce long haline çevirmeniz ve 19 basamaklı bir sayıyı depolamanız gerekmektedir. Tekrar bir sorunuz olursa yardımcı olabilirim. Kolay gelsin.
    #include<iostream>
    #include<conio.h>
    #include<math.h>
    void digits( int n, int digit ){
    	
    	if( digit != -1 ){
    		
    		if( n / (int)pow(10,digit) > 0 ){
    			
    			printf("%d * %d", n/(int)pow(10,digit), (int)pow(10,digit));
    			if(n % (int)pow(10,digit) != 0) printf(" + ");
    			digits( n % (int)pow(10,digit), digit - 1 );
    			
    		}else{
    			
    			digits( n, digit - 1 );
    			
    		}
    	}
    	
    	
    }
    
    int main(){
    
    	
    	digits( 84012100, 8 );
    	getch();
    	
    }
  • 07-04-2016, 14:49:28
    #4
    Üyeliği durduruldu
    Hocam string olarak olursa bir örnekte benden
    void ccc(char *p)
    {
       char ct[20]="0000000000000000000";
       printf("  %c * 1%s",p[0],ct+(20-strlen(p)));
       if(strlen(++p)) 
          ccc(p);
    }
    int main()
    {
        ccc("7805");
        getch();
    }
    isterseniz 1000 basak girin ufak bir düzenlemeyle tamamdır.
  • 07-04-2016, 19:53:00
    #5
    Ugurock adlı üyeden alıntı: mesajı görüntüle
    Merhaba, "öz yinelemeli" tanımının temel anlamı bir fonksiyonun kendisini çağırması diyebiliriz.

    Problem kendisi ile aynı daha küçük problemlerin birleşmesinden oluşuyorsa öz yinelemeli (Recursive) şeklinde oluşturabilirsin.

    Öz yinelemeli kavramını şu şekilde anlatırsak daha yararlı olacaktır. Örneğin 1 ile 30 arasındaki sayıları tanımlarken 1 ile 29 arasındaki sayıların toplamı, artı 30 diyebiliriz. Aynı şekilde 1 ile 28 arasındaki sayıların toplamı, artı 29 diyebiliriz, bu şekilde fark edeceğin üzere aynı problem daha küçük şekilde karşımıza çıkıyor.

    Önemli bir konu Recursive functions'lar da küçükten büyüğe işlem yapman gerekir, bu şekilde küçük problemler birleşerek büyük problemin sonucunu oluşturur.

    Senin probleminde ise durum şu şekilde olacaktır, En büyük basamaktan en küçük basamağa kadar parçalaman gerekiyor, sonrasında fonksiyonun return kısmında basamakta bulunan sayı çarpı basamak sayısı şeklinde return yapabilirsin.
    Teşekkürler.

    inspectorrr adlı üyeden alıntı: mesajı görüntüle
    Hocam recursive mantığıyla kabul oluyorsa aşağıdaki gibi bir örnek yazdım sizin için( math.h kütüphanesi kullandım ).
    Sizin tek yapmanız gereken long long haline çevirmek çünkü ben int kullandığım için 19 basamaklı bir sayıyı hesaplayamıyor.
    digits( 84012100, 8 ); buradaki 8 rakamını 19 yaparsanız 19 basamaklı sayıları hesaplayabilirsiniz. Ama dediğim gibi önce long haline çevirmeniz ve 19 basamaklı bir sayıyı depolamanız gerekmektedir. Tekrar bir sorunuz olursa yardımcı olabilirim. Kolay gelsin.
    #include<iostream>
    #include<conio.h>
    #include<math.h>
    void digits( int n, int digit ){
    	
    	if( digit != -1 ){
    		
    		if( n / (int)pow(10,digit) > 0 ){
    			
    			printf("%d * %d", n/(int)pow(10,digit), (int)pow(10,digit));
    			if(n % (int)pow(10,digit) != 0) printf(" + ");
    			digits( n % (int)pow(10,digit), digit - 1 );
    			
    		}else{
    			
    			digits( n, digit - 1 );
    			
    		}
    	}
    	
    	
    }
    
    int main(){
    
    	
    	digits( 84012100, 8 );
    	getch();
    	
    }
    Teşekkürler fakat hocam math.h kütüphanesini kabul etmiyor sadece iostream ve conio istiyor.

    ercans adlı üyeden alıntı: mesajı görüntüle
    Hocam string olarak olursa bir örnekte benden
    void ccc(char *p)
    {
       char ct[20]="0000000000000000000";
       printf("  %c * 1%s",p[0],ct+(20-strlen(p)));
       if(strlen(++p)) 
          ccc(p);
    }
    int main()
    {
        ccc("7805");
        getch();
    }
    isterseniz 1000 basak girin ufak bir düzenlemeyle tamamdır.
    Hocam elinize sağlık ancak sizin başta girdiğiniz değeri ayırıyor, nasıl kendi girdiğimiz rakamı ayıracak şekilde yazabiliriz.
  • 07-04-2016, 20:10:45
    #6
    Üyeliği durduruldu
    mvk5 adlı üyeden alıntı: mesajı görüntüle
    Hocam elinize sağlık ancak sizin başta girdiğiniz değeri ayırıyor, nasıl kendi girdiğimiz rakamı ayıracak şekilde yazabiliriz.
    gets komutu ile veriyi string şeklinde alabilirsin.
    Edit: hocam benim verdiğim kod C kodu örnek olsun diye yazdım siz C++ a çevirirsiniz.
  • 08-04-2016, 02:12:10
    #7
    ercans adlı üyeden alıntı: mesajı görüntüle
    gets komutu ile veriyi string şeklinde alabilirsin.
    Edit: hocam benim verdiğim kod C kodu örnek olsun diye yazdım siz C++ a çevirirsiniz.
    C'yi pek bilmiyorum, C++ olarak verebilir misiniz?
  • 08-04-2016, 13:17:18
    #8
    Üyeliği durduruldu
    mvk5 adlı üyeden alıntı: mesajı görüntüle
    C'yi pek bilmiyorum, C++ olarak verebilir misiniz?
    Hocam ben örnek olsun diye verdim kodu (Recursive için) malesef daha fazla yardımcı olamayacağım.

    Tavsiyem bu işi ciddi olarak düşünüyorsanız önce C yi öğrenin.