2016-04-10 19 views
-2

Für ein Hausaufgabe-Problem muss ich eine Struktur definieren, die in einem Programm verwendet werden kann, um einen Bruch zu vertreten, zusammen mit einer Set-Funktion, die verwendet werden kann, um den Wert eines Bruches einzurichten, und eine Druckfunktion, die den Fraktion schön. Wir sind die Hauptfunktion gegeben und nach dem Problem sollte die AusgabeVariable nicht initialisiert?

(2/3) (1/5) (3/5)

Hier ist das, was ich geschrieben habe:

#include "library.h" 
struct fraction 
{ 
    int numerator; 
    int denominator; 
}; 

void set (fraction st, int n, int d) 
{ 
    if (d>0) 
    { 
     n = st.numerator; 
     d = st.denominator; 
    } 
} 

void print(fraction st) 
{ 
    int x = st.numerator; 
    int y = st.denominator; 
    print("(x/y)"); 
    print(" "); 
} 

void main() 
{ 
    fraction a, b, c; 
    set(a, 2, 3); 
    set(b, 1, 5); 
    set(c, 3, 5); 
    print(a); 
    print(b); 
    print(c); 
} 

Wenn Sie sich fragen, "Bibliothek.h" ist, was meine Universität als Abkürzung für die meisten der Standard enthält.

Ich bekomme immer den Fehler, dass die Variable 'a' verwendet wird, ohne initialisiert zu werden. Jede Hilfe würde sehr geschätzt werden.

+3

Wenn Sie glauben, dass * initialisiert ist, geben Sie an, wo? (Tipp, der Compiler ist richtig zu beschweren, und nicht nur über 'a'). – WhozCraig

+1

Ermittelt der Compiler nicht genau, um welche Zeile (n) es sich handelt? – juanchopanza

+0

Fwiw, die Zuweisungsanweisungen in 'set()' scheinen rückwärts zu sein. Außerdem, selbst wenn diese behoben wurden, übertrage man immer noch 'a',' b' und 'c' mit * value * auf' set() ', so dass nichts zurück in' main() 'unabhängig davon geändert wird. – WhozCraig

Antwort

2

Sie übergeben a, b, c nach set() nach Wert. Natürlich sind sie in main() (und in print()) nicht initialisiert. Versuchen Sie folgendes:

void set (fraction &st, int n, int d) 
{ 
    if (d>0) 
    { 
     //n = st.numerator; 
     //d = st.denominator; 
     // I suppose this part should be: 
     st.numerator = n; 
     st.denominator = d; 
    } 

    /* Edit, thanks to @Tyler S comments: 
     Not sure what author needs, but something like this 
     should be here to really avoid uninitialized values. 

     Other options: 
     Use unsigned int if you use only positive integers (d>0). 
     Use exceptions to handle negative inputs, zero denominator.. 
    */ 
    else 
    { 
     st.numerator = 1; 
     st.denominator = 1; 
    } 
} 

in main():

set(a, 2, 3); 
set(b, 1, 5); 
set(c, 3, 5); 

ich auch print(..)-void print(const fraction &st) ändern würde. Es gibt keine Notwendigkeit, nach Wert zu gehen. Stellen Sie sich eine größere Datenstruktur vor - Kopieren nur zum Drucken ist Zeitverschwendung.

Ich empfehle zu überprüfen pass by value/reference und const correctness.

+1

Dies ist immer noch gefährlich, da es möglich ist, dass die Mitglieder der Struktur nicht initialisiert werden, falls d <= 0. Wenn Sie versuchen, Print nach dem Aufruf von' set() 'aufzurufen Bei Parametern außerhalb des akzeptierten Bereichs könnten Sie einige bizzare Werte haben. Wenn OP Zeiger verwendete, könnte diese Art von Übung sehr wahrscheinlich zu einem Segmentierungsfehler führen. –

+0

Stimmt, aber ich verstehe den Zustand nicht - warum nur d überprüfen - negativen Nenner vermeiden? Was ist mit negativem Zähler? Ich habe nur eine Lösung geschrieben, aber danke für die Bemerkung. – Enkelli

+0

Wenn das Ziel war, einfach negative Werte zu vermeiden, sollte OP unsigned Ints verwenden. Ich glaube jedoch, dass das Ziel ist, 'DIV/0' zu vermeiden, also sollte eine Ausnahme als' else' Bedingung in der 'set()' Methode geworfen werden. [Dieser Stack-Überlauf-Artikel] (http://stackoverflow.com/questions/8480640/how-to-throw-a-c-exception) deckt das Thema ausreichend detailliert ab. –

1

Wenn die set Funktion wird erwartet, dass ein fraction dann zu definieren, sollten Sie die st.numerator und st.denominator Membervariablen mit den Werten von n und d wie so werden die Zuordnung:

void set (fraction st, int n, int d) 
{ 
    if (d>0) 
    { 
     st.numerator = n; 
     st.denominator = d; 
    } 
} 

Sie sollten auch die fraction Variablen gehen in die set Funktion durch Referenz dh: void set(fraction& st, ...) oder Zeiger void set(fraction* st, ...), um irgendwelche Ergebnisse zurück zu erhalten.

Verwandte Themen