2017-03-16 4 views
0

Ich mache ein Programm für eine Klasse in der Schule, und wenn ich versuche, den Code auszuführen, schrieb ich unten (nur die Hälfte des Projekts ist fertig, aber es ist in einem Zustand, wo es sollte sowieso laufen) das Menü kommt gut in Ordnung, aber dann springt es direkt zum Ende des Programms und läßt mich den wichtigen Teil nicht eingeben.Mein C++ Programm akzeptiert keine Eingaben nach dem Menü

Wenn ich das Menü entferne (was eine Notwendigkeit später sein wird, wenn ich beende das Projekt) es funktioniert gut, aber wenn es da ist, wie ich es sein muss, führen sie es gewohnt richtig

//Project 4 Written By Nate 

#include <iostream> 
#include <iomanip> 
using namespace std; 

int menuOption; 
char stockName[21],symbol[10]; 
float openingPrice,closingPrice,numberShares,gain; 

int main() 
{ 
    // MENU // 
    cout<<"Welcome to Project 4! Please select the program you would like to run:\n\n 1)Stock Program\n\nEnter your selection: "; 
    cin>>menuOption; 
    if(menuOption == 1) { 
     goto stockProgram; 
    } else 
    { 
     cout<<"Invalid response received. Program will now terminate"; 
     return 0; 
    } 

    stockProgram: 
    cout<<"This program will ask you information about a stock you own.\n\n"; 
    cout<<"Enter stock name: "; 
    cin.get(stockName,21); 
    cin.ignore(80,'\n'); 
    cout<<"Symbol: "; 
    cin.get(symbol,10); 
    cin.ignore(80,'\n'); 
    cout<<"Enter opening price: "; 
    cin>>openingPrice; 
    cout<<"Enter closing price: "; 
    cin>>closingPrice; 
    cout<<"Enter the number of shares: "; 
    cin>>numberShares; 
    cout<<"\n\n"; 
    gain=(numberShares*closingPrice)-(numberShares*openingPrice); 
    cout<<setw(10)<<"Stock Name"<<setw(10)<<"Symbol"<<setw(10)<<"Opening"<<setw(10)<<"Closing"<<setw(10)<<"Shares"<<setw(11)<<"Gain\n"; 
    cout<<setw(10)<<stockName<<setw(10)<<symbol<<setw(10)<<openingPrice<<setw(10)<<closingPrice<<setw(10)<<numberShares<<setw(10)<<gain<<"\n\n"; 
    cout<<"=====================================================================\n"; 
    cout<<" This gain could've been yours, too bad you are an anti-mac person.\n"; 
    return 0; 
} 

Dank ..

+4

in Erwägung ziehen, eher eine Funktion als 'gehe zu stockProgram;'. – user4581301

+1

Empfehlen Sie das Testen der Eingabe, um sicherzustellen, dass der Lesevorgang erfolgreich war und der Stream nicht fehlgeschlagen ist. 'if (cin >> menuOption) {tu Zeug} else {handle error}' – user4581301

+0

Hat dich jemand auf [Debugging-Software] (https://en.wikipedia.org/wiki/Debugger) hereingelassen? Ein Debugger kommt mit nahezu jeder Entwicklungsumgebung zum Einsatz. Es ermöglicht Ihnen, die Ausführung Ihres Programms zu steuern, es bei Bedarf Zeile für Zeile auszuführen und den Zustand der Variablen zu überwachen. Wenn Sie wissen, wie Sie Debugger verwenden, wird Ihr Leben viel einfacher und der Debugger-Einsatz ist eine wesentliche Fähigkeit für den arbeitenden Programmierer. – user4581301

Antwort

2

Sie haben wahrscheinlich noch die eine neue Zeile Zeichen oder andere Zeichen nach dem 1 in der ursprünglichen Eingang. Sie haben cin.ignore für andere Eingaben verwendet, aber nicht für die erste.

cout<<"Welcome to Project 4! Please select the program you would like to run:\n\n 1)Stock Program\n\nEnter your selection: "; 
cin>>menuOption; 
cin.ignore(80,'\n'); 

ignorieren die Begrenzungs \ n

auch extrahieren, wann immer mit istream Kontrolle zu tun, dass es in immer die Eingabe in den richtigen Typ erfolgreich war:

#include <limits> 
#include <sstream> 

int myVariable; 
if((cin >> myVariable).fail()) 
{ 
    // Error - input was not an integer 
    std::cerr << "Input was not an integer" << std::endl; 
    return -1; 
} 
cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
1

Hinzufügen cin.ignore() nach cin>>menuOption - dies wird die int lesen, die derzeit in dem Puffer & verwerfen, da der EOF die neue Zeile nach der Eingabe ist.

int main() 
{ 
    // MENU // 
    cout<<"Welcome to Project 4! Please select the program you would like to run:\n\n 1)Stock Program\n\nEnter your selection: "; 
    cin>>menuOption; cin.ignore(); 
    if(menuOption != 1) { 
     cout<<"Invalid response received. Program will now terminate"; 
     return 0; 
    } 
//etc 
} 
+1

Empfehlen Sie, 'cin.ignore();' in 'cin.ignore (std :: numeric_limits :: max(), '\ n');' um sicherzustellen, dass Sie alles bekommen. Das oder nuke die Seite aus dem Orbit. – user4581301

+0

Könnten Sie erläutern, warum Sie die bereits korrekten Standardparameter überschreiben würden? Die Streamgröße ist eins. Das Trennzeichen ist EOF, was in diesem Kontext einer neuen Zeile entspricht. –

+1

Eingabe von "10" und dergleichen. Entweder fangen Sie es als schlechte Eingabe hier ein, so dass der Benutzer weiß, wo er es vermasselt oder erlaubt hat. – user4581301

Verwandte Themen