2016-03-19 16 views
-4

struct numaralı bir kesimi yapmam gerekiyor, zaten iki gerekli koşulu denetleyen nominator ve denominator ve işlevleri var. Ama şimdi, kesirimi indirgenemeyen bir shorten() işlevi yapmalıyım."?" Dan sonra birden fazla talimat Operatör

gcd() işlevini (en yaygın ortak bölüm) yaptım ve yapmam için shorten() işlevini kullanmam gerekiyor. Bu şuna benzer: değil 1 değeri

struct fraction { 
       int n,d; 
       bool is_correct(){return d!=0?(abs(n)<abs(d)?true:false):false;}; 
       void shorten(){gcd(n,d)!=1?(n=n/gcd(n,d);d=d/gcd(n,d)):;}; 
       }; 

int gcd(int x, int y) 
{ 
    int z; 
    while (y!=0){z=x%y;x=y;y=z;} 
    return x; 
} 

Yani gcd() eğer döner, o zaman bu değer ile n bölmek ve bu değer ile d bölmek istiyorum.

Ve yapmaya çalıştığımda, ":" önce bana beklenen ":" verir. birçok yerde belirteci. Neyi yanlış yapıyorum?

+2

Onun yerine 'çok fazla yapmanın? O kod daha kısa yapabilir iken if' /' başka ... '' (, aynı zamanda daha az kod yapabilir 'dışarı yazma okunabilir). – crashmstr

+0

Bu kodun okunması ve anlaşılması kolay mı? –

cevap

3

?: işlecinin : bölümüne bir ifade vermediniz.

void shorten(){gcd(n,d)!=1?(n=n/gcd(n,d);d=d/gcd(n,d)):;};

void shorten() { gcd(n, d) != 1 ? (n = n/gcd(n, d) ; d = d/gcd (n , d)):; }; 
                ^^^^^^      ^^ 
              missing      colon should be 
              paranthesis/    in between the 
              semicolon doesn't   statements 
              belong here 

Yani geçerli: Hata nokta olur, doğru kod biçimlendirme By

int g = gcd(n, d); 
if (g != 1) 
{ 
    n = n/g; 
    d = d/g; 
} 
+0

Peki ya gcd() 'negatif sayılarım varsa? Bu biraz dağınık olmaz mıydı? – Frynio

+0

Mutlak değeri gcd işlevinizden dönüş olarak kullanmalısınız. Her iki pay ve payda ile negatif olmak için hala uğraşmak gerekebilir, ama bu ayrı bir sorun. –

+0

Ben payda sıfıra eşit bir kontrol olması gerektiğine inanıyorum. 1 ile bölünmesi sadece zaman kaybıdır. –

0

: Böyle if deyimi yerine üçlü operatörü kullanmalıdır olarak yazabilir:

void shorten() { gcd(n, d) != 1 ? (n /= gcd(n, d)) : (d /= gcd(n, d)); } 

veya daha iyi

void shorten() 
{ 
    if (gcd(n, d) != 1) 
     n /= gcd(n, d); 
    else 
     d /= gcd(n, d); 
}