2016-03-19 14 views
-4

Ich habe einen Bruch struct, bereits nominator und denominator und is_correct() Funktion, die zwei notwendige Bedingungen überprüft. Aber jetzt muss ich eine shorten() Funktion machen, die meine Fraktion irreduzibel machen würde.Mehrere Anweisungen nach "?" Operator

Ich habe eine gcd() Funktion (größte gemeinsame Teiler) gemacht und ich muss eine shorten() Funktion in meiner Struktur setzen. Es sieht wie folgt aus:

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; 
} 

Also, wenn gcd() kehrt nicht 1 Wert, dann will ich n um diesen Wert teilen und d durch diesen Wert dividieren.

Und wenn ich versuche, es macht mir erwartet ":" vor ";" Token an vielen Orten. Was mache ich falsch?

+2

es einfach schreiben 'if' /' else ... 'statt zu viel zu tun mit'? '(Während es kann Code kürzer machen, kann es auch weniger machen Code lesbar). – crashmstr

+0

Sieht dieser Code für Sie leicht lesbar und verständlich aus? –

Antwort

3

Sie haben den :-Teil des ?:-Operators nicht mit einem Ausdruck versehen. richtig

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

Und was, wenn ich 'gcd() negative Zahlen habe? Würde es nicht ein bisschen durcheinander bringen? – Frynio

+0

Sie sollten den absoluten Wert als Rückgabe von Ihrer GCD-Funktion verwenden. Sie müssen möglicherweise immer noch damit umgehen, dass Zähler und Nenner negativ sind, aber das ist ein separates Problem. –

+0

Ich glaube, es sollte eine Überprüfung für Nenner gleich Null sein. Teilen um 1 ist nur eine Zeitverschwendung. –

0

Durch das Formatieren Sie den Code, würden Sie den Fehler erkennen: Sie sollten if Anweisung anstelle ternäre Operator wie folgt verwenden

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

ist

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 

So Sie würde es schreiben als:

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

oder noch besser

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