2016-12-27 10 views
1

Ich bin neu hier und neu im Programmieren, also habe ich in meiner ersten Lektion den folgenden Code gemacht, alles ging gut, außer der letzten "Gesamtzahl der Waffen", die nicht aktualisiert wurde, als ich +1 hinzufügte zu der AnzahlPistolen. Ich habe verstanden, dass die numberPistols aktualisiert wurde, aber wenn Sie die numberWeapons in der letzten Zeile verwenden, wird der neue Wert nicht angezeigt.C++ - Variable wird nicht aktualisiert

Ich kann immer noch nicht verstehen, warum, kann mir jemand erklären und mir zeigen, was ich falsch mache?

#include <iostream> 
using namespace std; 

int main() { 
    int numberPistols = 5; 
    int numberKnives = 18; 
    int numberWeapons = numberPistols + numberKnives; 

    cout << "Number of Pistols: " << numberPistols << endl; 
    cout << "Number of Knives: " << numberKnives << endl; 
    cout << "Total of Weapons: " << numberPistols + numberKnives << endl; 

    cout << "There's a new Pistol available!" << endl; 

    numberPistols = numberPistols + 1; 
    cout << "New amount of Pistols " << numberPistols << endl; 
    cout << "Updated total of Weapons " << numberWeapons << endl; 

    return 0; 
} 

Vielen Dank und viele Grüße!

+2

Sie sind nicht den Wert von numberWeapons Inkrementieren – Zeokav

+6

Sie nicht 'int numberWeapons = numberPistols + numberKnives schreiben kann;' bei der top und erwarte, dass es jedes Mal aktualisiert wird, wenn Sie eine Variable ändern. Diese Zeile wird einmal und nur einmal ausgeführt. Sie müssen 'numberWeapons' nach einer Änderung manuell aktualisieren. Das Schreiben einer Funktion wäre auch der typische Weg, um dies zu lösen, aber wenn man nur zwei Werte zusammenzählt, würde das Erstellen einer Funktion für solch eine kleine Aufgabe nur die Logik zusammenfalten. – Carcigenicate

+2

C++ führt Programme von oben nach unten durch den Quellcode aus. Diese Zeile, die die Pistolen und Messer hinzufügt, ist die dritte Zeile im Programm und wird zu diesem Zeitpunkt ausgeführt. Es gibt keine Magie für C++, um zu dieser Zeile zurückzukehren und alles neu zu berechnen. – PaulMcKenzie

Antwort

0

In diesem Programm werden alle Anweisungen nacheinander ausgeführt und jede Anweisung wird nur einmal ausgeführt. Sie müssen die zu wiederholende Anweisung umschreiben oder wiederholen.

int numberPistols = 5; 
int numberKnives = 18; 
int numberWeapons = numberPistols + numberKnives; 

die einen Testlauf auf dem Programm Lassen Sie tun:

  • Zunächst einmal haben Sie eine Variable vom Typ Integer numberPistols und initialisiert sie mit dem Wert ‚5‘ erklärt.
  • dann haben Sie eine Integer-Variable numberKnives deklariert und mit dem Wert '18' initialisiert.
  • In der nächsten Anweisung haben Sie eine Variable numberWeapons deklariert und mit einem Wert initialisiert, der aus der Summe numberPistols und numberKnives erhalten wurde.
  • Nachdem alle Variablen Druck, werden Sie den Wert numberPistols von 1.

Fehler Inkrementieren:

Sie haben numberPistols aktualisiert, aber Sie haben nicht numberWeapons wieder aktualisiert.Wenn Sie den Wert numberPistols oder numberKnives ändern, wirkt sich dies nicht auf den Wert numberWeapons aus, da dieser bereits gespeichert ist und Sie den gespeicherten Wert mit einem neuen Wert aktualisieren müssen, damit die Änderung erfolgt.

Lösung:

diese Zeilen hinzufügen numberWeapons = numberPistols + numberKnives;

nach numberPistols = numberPistols + 1;

Nun wird Ihr endgültiger Code sein:

#include <iostream> 
using namespace std; 

int main() { 
    int numberPistols = 5; 
    int numberKnives = 18; 
    int numberWeapons = numberPistols + numberKnives; 

    cout << "Number of Pistols: " << numberPistols << endl; 
    cout << "Number of Knives: " << numberKnives << endl; 
    cout << "Total of Weapons: " << numberPistols + numberKnives << endl; 

    cout << "There's a new Pistol available!" << endl; 

    numberPistols = numberPistols + 1; 
    numberWeapons = numberPistols + numberKnives;   //update the numberWeapons here 

    cout << "New amount of Pistols " << numberPistols << endl; 
    cout << "Updated total of Weapons " << numberWeapons << endl; 

    return 0; 
} 
+0

Nice! Ich versuche jetzt eine Funktion zu machen, wie es die anderen Jungs empfohlen haben. Sehr detailliert Ihre Erklärung @M Asad Ali. Vielen Dank dafür. – AnnakinBR

0

Dies ist vielleicht nicht etwas, das Sie in Ihrem ersten C++ Lektion lernen wollen würde, aber wenn Sie C++ 11 verwenden Sie int numberWeapons mit einer Lambda-Funktion ersetzen könnten, die die aktuellen Werte von numberPistols addiert und numberKnives bei die Zeit, die Sie es nennen:

auto numberWeapons = [&numberPistols, &numberKnives]() { 
    return numberPistols + numberKnives; 
    }; 

numberWeapons ist jetzt eine Funktion, die über das numberPistol und numberKnives Variablen kennt, aus dem [&numberPistols, &numberKnives] Teil der Aussage. Es braucht keine Argumente - () - und es gibt die Summe der beiden Variablen zurück.

(In der Tat kann die () hier weggelassen werden, da sie leer sind, gibt es keine Argumente für diese Funktion, aber ich habe sie in, weil es es als eine Lambda-Funktion erkennbar macht, die im Allgemeinen wie […](…){…} aussehen.

)
#include <iostream> 
using namespace std; 

int main() { 
    int numberPistols = 5; 
    int numberKnives = 18; 
    auto numberWeapons = [&numberPistols, &numberKnives]() { 
    return numberPistols + numberKnives; 
    }; 

    cout << "Number of Pistols: " << numberPistols << endl; 
    cout << "Number of Knives: " << numberKnives << endl; 
    cout << "Total of Weapons: " << numberWeapons() << endl; // outputs 23 
    //       note the brackets ^^ 

    cout << "There's a new Pistol available!" << endl; 

    numberPistols = numberPistols + 1; 
    cout << "New amount of Pistols " << numberPistols << endl; 
    cout << "Updated total of Weapons " << numberWeapons() << endl; // outputs 24 
    //             ^^ 

    return 0; 
} 
+0

Sie können '[& numberPistols, & numberKnives]' durch '[&]' ersetzen, was '[& everything]' bedeutet. Aber das bedeutet, dass deine Funktion jetzt alles sehen kann. Im Großen und Ganzen möchten Sie nicht, dass ein bisschen Code auf etwas zugreifen kann, das er nicht benötigt. Indem Sie '[& numberPistols, & numberKnives]' schreiben, erklären Sie ausdrücklich, dass Ihre Funktion nur daran interessiert ist, auf diese beiden Variablen zuzugreifen. –

+0

Sie müssen keine Argumentliste '()' haben, wenn Sie keine Argumente haben. I.e. 'auto numberWeapons = [& numberPistolen, & numberKnives] {return numberPistols + numberKnives; }; ' – MSalters

+0

@MSalters Ich war mir nicht sicher, ob dieses Detail zu viele Informationen für diesen Beitrag enthält. Hinzugefügt jetzt, was zum Teufel. –

0

Wenn Sie

int numberWeapons = numberPistols + numberKnives; 

schreiben Dies bedeutet keine "Gleichung", das auto-Updates selbst nach jeder Änderung erstellen. Diese Zeile wird einmal am Anfang ausgeführt, und da Sie keine Schleifen haben, wird nie wieder ausgeführt.

Sie müssen manuell die Gesamt nach einer Änderung aktualisiert:

#include <iostream> 
using namespace std; 

int main() { 
    int numberPistols = 5; 
    int numberKnives = 18; 
    int numberWeapons = numberPistols + numberKnives; 

    cout << "Number of Pistols: " << numberPistols << endl; 
    cout << "Number of Knives: " << numberKnives << endl; 
    cout << "Total of Weapons: " << numberPistols + numberKnives << endl; 

    cout << "There's a new Pistol available!" << endl; 

    numberPistols = numberPistols + 1; 
    //Manually update the variable. 
    numberWeapons = numberPistols + numberKnives; 

    cout << "New amount of Pistols " << numberPistols << endl; 
    cout << "Updated total of Weapons " << numberWeapons << endl; 

    return 0; 
} 

Hinweis es genau wie beim ersten Mal sieht es gesetzt, mit Ausnahme der int, da ich erklärt nicht binnumberWeapons nur re -zuweisen es.

In "echten" Programmen würden Sie eine Funktion verwenden, die die Aktualisierung behandelt, aber ich denke, das würde nur die Logik verdecken, da Sie nur 2 Zahlen zusammenfügen.

1

Wie Carcigenicate bereits kommentiert, eine übliche Art und Weise zu schreiben, wäre eine Funktion

#include <iostream> 
using namespace std; 

int getNumberWeapons(int numberPistols, int numberKnives) 
{ 
    return numberPistols + numberKnives; 
} 

int main() { 
    int numberPistols = 5; 
    int numberKnives = 18; 

    cout << "Number of Pistols: " << numberPistols << endl; 
    cout << "Number of Knives: " << numberKnives << endl; 
    cout << "Total of Weapons: " << getNumberWeapons(numberPistols, numberKnives) << endl; 

    cout << "There's a new Pistol available!" << endl; 

    numberPistols = numberPistols + 1; 
    cout << "New amount of Pistols " << numberPistols << endl; 
    cout << "Updated total of Weapons " << getNumberWeapons(numberPistols, numberKnives) << endl; 

    return 0; 
} 

Eine noch bessere Lösung wäre, eine Klasse zu machen. Dies könnte übertrieben sein, wäre aber angebracht, wenn Sie Ihren "Waffen-Carbinet" erweitern möchten. Es fügt mehrere Mitgliedsfunktionen hinzu, um den Status der Klasse zu manipulieren und Zugriff darauf zu erhalten.

#include <iostream> 
using namespace std; 

class WeaponCabinet 
{ 
public: 
    void setNumberPistols(int pistols) 
    { 
     numberPistols = pistols; 
    } 

    void setNumberKnives(int knives) 
    { 
     numberKnives = knives; 
    } 

    void addPistol() 
    { 
     ++numberPistols; 
    } 

    void addKnive() 
    { 
     ++numberKnives; 
    } 

    void removePistol() 
    { 
     if (numberPistols == 0) return; 
     --numberPistols; 
    } 

    void removeKnive() 
    { 
     if (numberKnives == 0) return; 
     --numberKnives; 
    } 

    int getNumberKnives() 
    { 
     return numberKnives; 
    } 

    int getNumberPistols() 
    { 
     return numberPistols; 
    } 

    int getNumberWeapons() 
    { 
     return numberKnives + numberPistols; 
    } 

private: 
    int numberPistols; 
    int numberKnives; 
}; 

int main() { 
    WeaponCabinet weaponCabinet; 
    weaponCabinet.setPistols(5); 
    weaponCabinet.setKnives(18); 

    cout << "Number of Pistols: " << weaponCabinet.getNumberPistols() << endl; 
    cout << "Number of Knives: " << weaponCabinet.getNumberKnives() << endl; 
    cout << "Total of Weapons: " << weaponCabinet.getNumberWeapons() << endl; 

    cout << "There's a new Pistol available!" << endl; 

    weaponCabinet.addPistol(); 
    cout << "New amount of Pistols " << weaponCabinet.getNumberPistols() << endl; 
    cout << "Updated total of Weapons " << weaponCabinet.getNumberWeapons() << endl; 

    return 0; 
} 

Auf diese Weise haben Sie eine direkte Verbindung zwischen den Messern und Pistolen und haben sie nicht jedes Mal auf die Funktion getNumberWeapons passieren.

Wenn Sie nicht eine ganze Klasse benötigen, um Ihre Waffen die modernste Technik der Handhabung wäre eine Lambda zu verwenden (und es ist viel näher an der Lösung unter Verwendung einer Funktion)

#include <iostream> 
using namespace std; 

int main() { 
    int numberPistols = 5; 
    int numberKnives = 18; 
    auto numberWeapons = [&numberPistols, &numberKnives]() 
     { 
      return numberPistols + numberKnives; 
     }; 

    cout << "Number of Pistols: " << numberPistols << endl; 
    cout << "Number of Knives: " << numberKnives << endl; 
    cout << "Total of Weapons: " << numberWeapons() << endl; 

    cout << "There's a new Pistol available!" << endl; 

    numberPistols = numberPistols + 1; 
    cout << "New amount of Pistols " << numberPistols << endl; 
    cout << "Updated total of Weapons " << numberWeapons() << endl; 

    return 0; 
} 
+1

Warum all diese nutzlosen Getter und Setter? Wäre es nicht einfacher, diese fallen zu lassen und nur das zu behalten, was für das Verständnis von OP wichtig ist? –

+1

Sie haben Recht, es ist definitiv übertrieben. Es hat mich einfach weitergetragen ... – marlam

0

Variable sind unabhängig voneinander . Um das zu erklären, könnten wir mit Äpfeln beginnen:

Ich gebe Lucie zwei Äpfel. Ich gebe dir drei Äpfel und sage: "Ich gebe dir einen Apfel plus die Anzahl der Äpfel, die ich Lucie gegeben habe." Dann, einige Zeit später, gebe ich Lucie einen weiteren Apfel. Wie viele Äpfel hast du?

Die Antwort ist ganz einfach: es ist drei. Genau wie Variablen in C++ oder einer anderen Programmiersprache ist die Anzahl der Äpfel, die Sie und Lucie haben, unabhängig voneinander. Variablen sind unabhängig voneinander.

Das Mutieren des Werts einer Variablen wirkt sich nicht auf den Wert eines anderen aus, auch wenn Sie eine Variable verwenden, um den Wert des anderen zu berechnen.


Was ist, wenn Sie immer eine aktualisierte Nummer haben möchten?

Dann müssten Sie den Wert jedes Mal berechnen. Programmierer tun dies normalerweise mit einer Funktion. In Ihrem Beispiel könnten wir die Gesamtzahl der Waffe als Funktion definieren, die numberPistols plus numberKnives zurückgibt. Hier ist, wie ich es tun würde:

#include <iostream> 
using namespace std; 

int main() { 
    int numberPistols = 5; 
    int numberKnives = 18; 
    auto computeNumberWeapons = [&]{ return numberPistols + numberKnives; }; 

    cout << "Number of Pistols: " << numberPistols << endl; 
    cout << "Number of Knives: " << numberKnives << endl; 
    cout << "Total of Weapons: " << numberPistols + numberKnives << endl; 

    cout << "There's a new Pistol available!" << endl; 
    numberPistols = numberPistols + 1; 

    cout << "New amount of Pistols " << numberPistols << endl; 

    cout << "Updated total of Weapons " << computeNumberWeapons() << endl; 
    return 0; 
} 

Nun computeNumberWeapons ist keine Variable vom Typ int, sondern eine Funktion, die die Summe der beiden vorangegangenen Variablen berechnen. Sie müssen diese Funktion mit dem Operator () aufrufen.

+0

Ich habe versucht, wie Sie empfohlen und aus irgendeinem Grund nicht funktioniert, und ich verstehe nicht, warum ... Ich verwende Dev-C++ 5.11. Bitte beachten Sie die Fehler unter C: \ logs \ main.cpp In Funktion 'int main()': 9 7 C: \ logs \ main.cpp [Fehler] 'computeNumberWeapons' gibt keinen Namen 17 62 C : \ logs \ main.cpp [Fehler] 'computeNumberWeapons' wurde in diesem Bereich nicht deklariert 28 C: \ logs \ Makefile.win Rezept für Ziel 'main.o' fehlgeschlagen – AnnakinBR

0

ich verstanden und auch versucht, eine andere Codes, die ihr Leute hier gepostet, einer von ihnen gibt mir einen Fehler, wenn ich versuche, mitzuhelfen mpile und run (unten ist der Code). Ich benutze Dev-C++ 5.11.

int main() { 

int numberPistols = 5; 
int numberKnives = 18; 
auto computeNumberWeapons = [&]{ return numberPistols + numberKnives; }; 

cout << "Number of Pistols: " << numberPistols << endl; 
cout << "Number of Knives: " << numberKnives << endl; 
cout << "Total of Weapons: " << numberPistols + numberKnives << endl; 
cout << "There's a new Pistol available!" << endl; 
numberPistols = numberPistols + 1; 
cout << "New amount of Pistols " << numberPistols << endl; 
cout << "Updated total of Weapons " << computeNumberWeapons()) << endl; 
return 0; 
} 

Manchmal wird diese IDE + Compiler, die ich mache mich verwenden denken, wenn es der Code ist, die falsch oder etwas, was ich falsch gemacht, wenn installiert und gestartet, ein Projekt im Innern ...

Error Image

0

Alles klar machen eine Funktion wie unter diese Funktion hinzufügen, bevor int main()

//function for calculating numberWeapons 
int totalWeapons(int numberPistols, int numberKnives){ 
    return numberPistols+numberKnives; 
} 

und die Zeile unten angegeben, wo immer Sie wollen aktualisiert numberWea pons:

numberWeapons = totalWeapons(numberPistols, numberKnives);

dh Ihr Code wie:

#include <iostream> 
using namespace std; 

//function for calculating numberWeapons 
int totalWeapons(int numberPistols, int numberKnives){ 
    return numberPistols+numberKnives; 
} 

int main() { 
    int numberPistols = 5; 
    int numberKnives = 18; 
    int numberWeapons = totalWeapons(numberPistols, numberKnives); //call function here 

    cout << "Number of Pistols: " << numberPistols << endl; 
    cout << "Number of Knives: " << numberKnives << endl; 
    cout << "Total of Weapons: " << numberWeapons << endl; 

    cout << "There's a new Pistol available!" << endl; 

    numberPistols = numberPistols + 1; 

    //call function here to get updated numberWeapons 
    numberWeapons = totalWeapons(numberPistols, numberKnives); 

    cout << "New amount of Pistols " << numberPistols << endl; 
    cout << "Updated total of Weapons " << numberWeapons << endl; 

    return 0; 
} 
Verwandte Themen