Duyuruyu Kapat
Facebook Gözat
Twitter Gözat

c++ da kesirli işlemler

Konu, 'C / C++' kısmında BFS tarafından paylaşıldı.

  1. BFS

    BFS Üye

    Kayıt:
    14 Ağustos 2007
    Mesajlar:
    78
    Beğenilen Mesajlar:
    0
    Kulanıcıdan a/b ve c/d şeklinde iki kesir girmesini isteyen ve sonucu da x/y şekline veren bir c++ programı yazmak istiyorum ama ,kesiri girme kısmında ne yapacağımı bilmiyorum.
    Benim yazdığım kodlar kullanıcıdan pay ve paydayi tek tek alıp ondan sonra işlemi yapıyor ama ben kullanıcının kesri direk yazabilmesini istiyorum yani 1.kesir için önce a yı sonra da b yi girmek yerine direk a/b şeklinde girilmesini istiyorum bunu nasıl yapabilirim.
    Kod:
    #include <iostream>
    using namespace std;
    
    int main()
    {
        int a,b,c,d;
    
        cout<<"1.kesri giriniz :";
        cin>>a>>b; 
    
        cout<<"2.kesri giriniz :";
        cin>>c>>d;
    
        int pay=a*d+c*b;
        int payda=b*d;
    
        cout<<pay<<"/"<<payda;
    
        system("PAUSE");
        return 0;
    }
    
    ben bunları yazabildim ama bunlar istediğim gibi değil
     
  2. Coldplay

    Coldplay Daimi Üye

    Kayıt:
    23 Haziran 2008
    Mesajlar:
    1,448
    Beğenilen Mesajlar:
    0
    $imdi sen a/b gibi bir ifadeyi i$lemek istiyorsun, sence bu hangi standart veri tipine benziyor? Tabi ki string! Yani yapman gereken kullanicinin girdilerini string seklinde okuyup sonra bu stringi parcalayarak pay ve paydayi int cinsinden elde etmek.
    Asagida a/b seklinde bir girdiyi string olarak okuyan ve bundan integer degerleri yapan bir örnek kod veriyorum. Burada ödev cözmedigimiz icin programin tamamini vermiyorum. Geriye kalan kisimlari da kendin tamamlarsin. Iyi calismalar!

    Kod:
    #include <iostream>
    #include <cstdlib>
    #include <string>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        string s;
        string stringParcasi;
        int kesirCizgisiPozisyonu;
        int a,b,c,d;
    
        // Ilk kesri s isimli stringe kaydet
        cout<<"Lütfen a/b $eklinde ilk kesri giriniz: "<< endl;
        cin>>s;
    
        // s'de kesir isaretinin pozisyonunu elde et
        kesirCizgisiPozisyonu=s.find("/");
    
        // Kesir cizgisi bulunamazsa find() Fonksiyonu -1 degeri verir
        if (kesirCizgisiPozisyonu == -1)
        {
            cout<<"Kesir cizgisini girmediginiz icin islem gecersiz!"<<endl;
            return 1;
        }
    
        // Kesir cizgisi en basta veya en sondaysa pay veya payda belirsiz
        // Bu senin keyfine kalmis istersen burada böyle girdiye izin verip pay veya payi sifir kabul edebilirsin
        else if (kesirCizgisiPozisyonu == 0 || kesirCizgisiPozisyonu == s.size()-1)
        {
            cout<<"Kesir cizgisini basta veya sonda girdiginiz icin pay veya payda tanimlanamadi!"<<endl;
            return 1;
        }    
    
        // Kesir dogru girildiyse pay ve payda degerlerini elde et
        else
        {
            //s'de sifirdan kesme isaretine kadar olan stringi (yani pay) stringParcasina ata
            stringParcasi = s.substr(0,kesirCizgisiPozisyonu);
            
            // c_str() ile const char seklinde C-Formatina dönüsen stringi a'ya integer olarak ata
            a = atoi(stringParcasi.c_str());
    
            // Simdi yukarida ayni islemi payda (b) icin de yap 
            //(tabi ki paydanin baslangic ve bitis pozisyonlariyla)
            stringParcasi = s.substr(kesirCizgisiPozisyonu+1,s.size()-1);
            b = atoi(stringParcasi.c_str());
    
            
            // Integer a ve b degerlerini su sekilde ekrana yazdirabilirsin
            // a/b + c/d toplamindan sonra da ekrana benzer sekilde yazdir
            cout<<"Kesrimiz(a/b) : "<<a<<"/"<<b<<endl;
    
        }
    
        // Simdi tek yapman gereken aynen yukaridaki gibi c/d degerini okumak
        // ve kesir islemlerini yaptiktan sonra ekrana yazdirmak.
        // Kolay gelsin!
    
        return 0;
    }
     
  3. acehreli

    acehreli Ali Çehreli

    Kayıt:
    19 Ekim 2002
    Mesajlar:
    4,973
    Beğenilen Mesajlar:
    2
    string pozisyonlari icin string::size_type tUrU, bulunamama durumunun degeri icin de string::npos kullanilmasi onerilir. Baska turler her ortamda calismayabilir:

    Kod:
    string::size_type kesirCizgisiPozisyonu = s.find("/");
    
    if (kesirCizgisiPozisyonu != string::npos)
    Ali
     
  4. Coldplay

    Coldplay Daimi Üye

    Kayıt:
    23 Haziran 2008
    Mesajlar:
    1,448
    Beğenilen Mesajlar:
    0
    Ali bey, dikkatiniz icin tesekkürler. string::size_type türünde hakkiniz var. Ama string::npos -1 olarak tanimli degil mi? Yoksa C++'in pek cok özelliginde oldugu gibi bu da mi platforma göre fark ediyor? Ben http://www.cplusplus.com/reference/string/string/npos.html linkinde -1 olarak verildigi icin kisaca -1'le sorgulamistim. Bu arada örnek verdiginiz if sorgusu bulunmama durumu icin degil de bulunma durumu icin, yaniliyor muyum?
     
  5. BFS

    BFS Üye

    Kayıt:
    14 Ağustos 2007
    Mesajlar:
    78
    Beğenilen Mesajlar:
    0
    Yardımlarınız için teşekkur ederim.
     
  6. acehreli

    acehreli Ali Çehreli

    Kayıt:
    19 Ekim 2002
    Mesajlar:
    4,973
    Beğenilen Mesajlar:
    2
    string::npos herhalde her yerde -1 olarak tanimlidir ama string npos diye bir deger tanimladigi ve arama fonksiyonlarindan da onu dOndUrebilecegini soyledigi icin npos kullanilmasi onerilir.

    if dOngusunde haklisin tabii: '!= string::npos' denetimi arananin bulundugu duruma bakiyor.

    Ali