2017-03-16 4 views
0

Je fais un programme pour une classe à l'école, et quand j'essaie d'exécuter le code que j'ai écrit ci-dessous (seulement la moitié du projet est fait, mais il est dans un état où il devrait fonctionner de toute façon) le menu se lève bien, mais alors il saute directement à la fin du programme et ne me laisse pas entrer la partie importante ..Mon programme C++ n'accepte pas les entrées après le menu

Lorsque je supprime le menu (ce qui sera une nécessité plus tard quand je finis le projet), il fonctionne très bien, mais quand il est là comme je l'ai besoin d'être, courir correctement coutume

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

Merci ..

+4

considèrent fortement d'utiliser une fonction plutôt que 'goto stockProgram; – user4581301

+1

Nous vous recommandons de tester l'entrée pour vous assurer que la lecture a réussi et que le flux n'est pas en état d'échec. 'if (cin >> menuOption) {fait des choses} else {erreur de gestion}' – user4581301

+0

Est-ce que quelqu'un vous a laissé entrer dans [Logiciel de débogage] (https://en.wikipedia.org/wiki/Debugger)? Un débogueur est livré avec à peu près tous les environnements de développement qui valent la peine d'être utilisés. Il vous permettra de contrôler l'exécution de votre programme, en l'exécutant ligne par ligne le cas échéant, et de surveiller l'état des variables. Savoir comment utiliser les débogueurs vous facilitera la vie et l'utilisation du débogueur est une compétence essentielle pour le programmeur qui travaille. – user4581301

Répondre

2

Vous avez probablement encore le caractère de nouvelle ligne ou d'autres caractères après le 1 dans l'entrée initiale. Vous avez utilisé cin.ignore sur d'autres entrées mais pas sur la première.

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'); 

ignorer extraira la délimitation \ n

Aussi, chaque fois affaire avec le contrôle de istream qu'il a réussi à obtenir l'entrée dans le type correct:

#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

Ajout de cin.ignore() après cin>>menuOption - ceci va lire celui int qui réside actuellement dans le tampon & le rejeter puisque l'EOF est la nouvelle ligne après l'entrée.

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

Nous vous recommandons de transformer 'cin.ignore();' en 'cin.ignore (std :: numeric_limits :: max(), '\ n');' pour vous assurer d'avoir tout. Cela ou nuke le site de l'orbite. – user4581301

+0

Pourriez-vous clarifier pourquoi vous remplaceriez les paramètres par défaut déjà corrects? La taille du flux est un. Le délimiteur est EOF, ce qui équivaut à une nouvelle ligne dans ce contexte. –

+1

Entrée de "10" et similaires. Soit piègez-le comme une mauvaise entrée ici afin que l'utilisateur sache où ils ont foiré ou l'autoriser. – user4581301