2016-07-27 5 views
-3

Jede andere Option funktioniert außer Option 1. Nachdem ein Benutzer den Namen und den Kontotyp eingegeben hat. Es tritt in eine Endlosschleife ein. Wie stelle ich meine Do-While-Schleife ein, um dieses Verhalten zu beheben? Kann mir bitte jemand helfen, dieses Problem zu beheben?Wie Sie eine do ... while-Schleife mehr als einmal in Schleife halten, während die Bedingung auf "true" gesetzt ist

#include <iostream> 
#include <queue> 
#include <stack> 
#include <vector> 
#include <unordered_map> 
#include <algorithm> 
using namespace std; 

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

class Bank{ 

    //data members 
private: 
    string customer_name; 
    double account_number; 
    string type_of_account; 
    double account_balance; 
    double balance; 


    //function declaration 
public: 
    void assignInitialValue(void); 
    void deposit(); 
    void makeWithdrawal(); 
    void displayNameAndBalance(); 
    void displayDetails(); 
}; 

//function definitions 
void Bank::assignInitialValue(void){ 
    cout<<"Welcome to Our Bank."<<endl; 
    cout<<"To open an Account with us,please supply the following details"<<endl; 
    cout<<"Enter your name in full"<<endl; 
    cin>>customer_name; 
    cout<<"Choose an Account type"<<endl; 
    cin>>type_of_account; 
    cout<<"Enter your Account Number"<<endl; 
    cin>>account_number; 
    cout<<"Enter an Amount you will like to open this account with"<<endl; 
    cin>>account_balance; 
    cout<<"Thank you for banking with us"; 
} 

void Bank::deposit(void){ 
    scout<<"Enter the amount you want to deposit"<<endl; 
    double deposit_amount = 0.0; 
    cin>>deposit_amount; 
    account_balance = account_balance + deposit_amount; 
    cout<<"Your new balance is now:"<<account_balance; 
    balance = account_balance; 
} 

void Bank::makeWithdrawal(void){ 
    int withdrawal_amount; 
    cout<<"\nBalance Amount = "<<balance; 
    cout<<"\nPlease Enter the Amount you want to withdraw:-"; 
    cin>>withdrawal_amount; 
    if(!(withdrawal_amount > balance)) 
     balance=balance-withdrawal_amount; 
    else 
    { 
     cout<<"Insufficient Balance"; 
    } 
    cout<<"Your Available Balance is:"<<balance; 
} 
void Bank::displayDetails(void) 
{ 
    cout<<endl<<endl<<endl; 
    cout<<setw(50)<<"CUSTOMER DETAILS"<<endl; 
    cout<<setw(50)<<"Customer Name "<<customer_name<<endl; 
    cout<<setw(50)<<"Account Number."<<account_number<<endl; 
    cout<<setw(50)<<"Account Type"<<type_of_account<<endl; 
    cout<<setw(50)<<"Balance"<<balance<<endl; 
} 

int main() 
{ 
    Bank app; 
    int Activity_code; 

    do 
    { 
     cout<<"\n\nAvailable Transactions\n\n"; 
     cout<<"1) To create Account with us press 1\n"; 
     cout<<"2) To make deposit press 2\n"; 
     cout<<"3) To make Withdrawal press 3\n"; 
     cout<<"4) To Display All Details press 4\n"; 
     cout<<"5) EXIT\n"; 
     cout<<"Please enter an Activity choice :-"; 

     cin>>Activity_code; 


     switch(Activity_code) 
     { 
      case 1: app.assignInitialValue(); 
       break; 
      case 2: app.deposit(); 
       break; 
      case 3: app.makeWithdrawal(); 
       break; 
      case 4: app.displayDetails(); 
       break; 
      case 5: goto terminate; 
     } 
    }while(true); 
terminate: 
    return 0; 
} 
+0

Können Sie bitte angeben, was das erwartete Verhalten ist? –

+4

Ernsthaft, niemand wird * jemals * deinen Code lesen wollen, wenn du ihn nicht nachvollziehbar formatieren kannst. Habe es diesmal für dich erledigt, aber bitte, nimm dir Zeit, um dir die Zeit zu nehmen. Sie denken vielleicht nicht, dass es wichtig ist, aber wenn Sie über einhunderttausend Zeilen über ein Dutzend Quelldateien hinweg strömen, macht das einen Unterschied. – WhozCraig

+0

Bitte geben Sie den Bereich an, in dem Sie kollabiert sind. –

Antwort

1

Völlig am Thema (eine Seltenheit für mich), so könnte ich dies auch eine Antwort geben.

>> liest nur 1 whitespace-abgegrenztes Token, alias 1 Wort, so wird cin >>customer_name; eine Menge Probleme mit "John Smith" haben. Dies lässt "Smith" in dem zu analysierenden Stream in type_of_account zurück, und das wird den Stream in einem sehr schlechten Zustand belassen, der zu einer Endlosschleife führt, wenn er nicht mit cin.clear und cin.ignore bereinigt wird. Ich empfehle, unter std::getline nachzulesen, um mehr als ein Wort gleichzeitig zu lesen.

+0

user4581301 cin.ignore() hat mir geholfen, dies zu beheben, aber das Problem ist, dass, wenn ich versuche, sagen, Kundenname ist es leer, wenn ich versuche, Accountnummer zu drucken, erscheint der Kundenname. Kann das anscheinend nicht beheben. Danke für Ihre Eingabe. –

+0

@HenryNnonyelu Was hier wahrscheinlich passiert ist, dass "cin.ignore" einen Linkstreich von einem Treffer auffrisst. Konzentriere dich nicht auf "ignorieren". Verwenden Sie es für die Bereinigung nach einem Fehler. Was Sie wirklich wollen, ist in der Lage, ganze Zeilen von Benutzereingaben auf einmal zu lesen. Dafür brauchst du 'std :: getline' – user4581301

0

Es liegt ein Problem vor, wenn Ihre Eingabe unerwartet ist, z. Ihr Programm erwartet ein Double, aber Ihre Eingabe ist etwas, das nicht richtig konvertiert werden kann. In diesem Fall wird der Puffer von cin nicht gelöscht und Ihre Schleife wird eingegeben, ohne Sie erneut zu fragen, was sich immer wieder wiederholt.

Ich empfehle die Verwendung von Strings für die Eingabe und die Konvertierung nach dem Lesen. Hier ist die modifizierte Funktion assignInitialValue():

void Bank::assignInitialValue(void){ 
    cout<<"Welcome to Our Bank."<<endl; 
    cout<<"To open an Account with us,please supply the following details"<<endl; 
    cout<<"Enter your name in full"<<endl; 
    cin>>customer_name; 
    cout<<"Choose an Account type"<<endl; 
    cin>>type_of_account; 
    cout<<"Enter your Account Number"<<endl; 
    string temp1; 
    cin>>temp1; 
    istringstream convert1(temp1); 
    convert1>>account_number; 
    cout<<"Enter an Amount you will like to open this account with"<<endl; 
    string temp2; 
    cin>>temp2; 
    istringstream convert2(temp2); 
    convert2>>account_balance; 
    cout<<"Thank you for banking with us"; 
} 

Beachten Sie, dass diese nicht perfekt weit weg ist, weil es immer noch nicht Ihre Eingabe bestätigen.

Verwandte Themen