2015-12-29 3 views
-4
#include <iostream> 
using namespace std; 

class Bank 
{ 
private: 
    char account_holder[50]; 
    int accnum; 
    int balance; 
    int dep_amount; 
    int with_amount; 
public: 
    void getdata(); 
    void putdata(); 
    void deposit(); 
    void withdraw(); 
}; 

void Bank::getdata() 
{ 
cout << "Enter the account holders name : " << endl; 
cin >> account_holder; 
cout << "Enter the account number : " << endl; 
cin >> accnum; 
cout << "Enter the balance in your account : " << endl; 
cin >> balance; 
} 

void Bank::putdata() 
{ 
cout << "The account holders name is : " << account_holder << endl; 
cout << "The account number is : " << accnum << endl; 
cout << "The balance in your account is : " << balance << endl; 
cout << endl; 
} 

void Bank::deposit() 
{ 


cout << "Enter the amount to be deposited : " << endl; 
cin >> dep_amount; 
balance = balance + dep_amount; 
cout << "Your current balance is : " << balance << endl; 
} 

void Bank::withdraw() 
{ 
cout << "Enter the amount to be withdrawn : " << endl; 
cin >> with_amount; 
balance = balance - with_amount; 
cout << "Your current balance is : " << balance << endl; 
} 

int main(){ 

Bank ram[5]; 

int ch, a, n, acc; 

cout << "How you account holders you want to add : " << endl; 
cin >> n; 

do 
{ 

    cout << "Enter 1.To insert data" << endl; 
    cout << "Enter 2.To display data" << endl; 
    cout << "Enter 3.To deposit amount" << endl; 
    cout << "Enter 4.To withdraw amount" << endl; 

    cout << "Enter your choice : " << endl; 
    cin >> ch; 

    switch (ch) 
    { 
    case 1: 
     for (int i = 0; i < n;i++) 
     ram[i].getdata(); 
     break; 

    case 2: 
     for (int i = 0; i < n; i++) 
     ram[i].putdata(); 
     break; 

    case 3: 
     cout << "Enter the account you want to deposit money into " << endl; 
     cin >> acc; 
     for (int i = 0; i < n; i++) 
     ram[acc].deposit(); 
     break; 

    case 4: 
     for (int i = 0; i < n; i++) 
     ram[i].withdraw(); 
     break; 

    } 
    cout << "Enter 6. To Continue" << endl; 
    cin >> a; 
} while (a == 6); 
return 0; 
} 

Я использую этот код, и моя проблема в том, что когда я хочу внести или снять какую-либо сумму, я хочу взять номер счета у пользователя, а затем внести/снять сумму с этого объекта только. Как я могу ввести этот объект, используя номер счета, взятый у пользователя? Пожалуйста помоги.Невозможно создать массив объектов в C++

+0

Я не следую. Что ваш вопрос связан с созданием массива объектов? –

+0

Пожалуйста, отредактируйте вопрос с помощью [mcve]. Кроме того, уделите немного времени, чтобы [задать] хороший вопрос. – YSC

+0

Я думаю, проблема в «n» - сколько учетных записей вы вводите? У вас их 5. А также посмотрите на эту строку: ram [acc] .deposit(); У вас есть цикл для «i», но используйте «acc» в качестве индекса. – Dmitriy

ответ

0

К сожалению, у вас есть несколько проблем с кодом и вашей логикой. Обратимся к ним один за другим:

1 Вы используете массив char, чтобы сохранить имя владельца учетной записи. Если вы программируете C++, вы должны использовать std::string практически во всех ситуациях.

2- Вы используете нетрадиционные имена для своих общедоступных методов в Bank, и это плохая привычка в лучшем случае.

Более конкретно, getdata() является плохим имя метода, потому что mehtods, которые начинаются с «получить» как правило, должны быть зарезервированы для методов, которые возвращают одно поле, которое принадлежит к экземпляру класса. Например int getAccountNumber() Ваш getdata() должен быть fillInData() следовать за мной?

3- Вы используете массив Bank в своем main, чтобы удерживать количество учетных записей. Хотя это возможно, это далеко не идеально. Вы должны стремиться использовать std::vector, когда это имеет смысл (например, здесь). Почему голый массив плохой? потому что, если вы используете массив, размер массива должен быть известен во время компиляции, а это означает, что вы не можете увеличить количество учетных записей при запуске программы. Если вы объявляете большой массив в стеке, у вас может быть много места, но вы тратите драгоценное пространство стека.

4 Логика, которую вы использовали для вашего «входного контура», беспорядочна и сложна для навигации. Конструкция может быть значительно улучшена для улучшения удобочитаемости и ремонтопригодности кода. Рассмотрите тот факт, что вы объявляете и читаете int n;, но вы никогда не используете его в программе.

5- ошибки компиляции время от необъявленных переменных, как i

6- Логически и семантически некорректное поведение программы: итерации через цикл всех записей и вывести/депозит во всех записях, вместо того, чтобы выбрать тот, который вы необходимость.

7- Без ограничений проверка любого вида. Просить, чтобы случилось что-то плохое.

Я даю вам минимально скорректированный код, который имеет смысл. Обратите внимание, что это еще не идеальный способ выполнить эту задачу, но по крайней мере у нее нет синтаксических и семантических ошибок:

int Bank::getAccountNumber() 
{ 
    return this->accnum; 
} 

int getIndexByAccountNumber(Bank allAccounts[], int size, int accountNumber) //returns index or -1 in case account number is not found 
{ 
    for(int i=0; i<size; ++i) 
    { 
     if (allAccounts[i].getAccountNumber()==accountNumber) return i; 
    } 
return -1; 
} 


int main(){ 

    const int NumberOfAccounts=5; 
    Bank ram[NumberOfAccounts]; 
    int nextIndex=0; 

    int ch, a, acc; 

    while(true) 
    { 
     cout << "Enter 1.To insert data for a new account" << endl; 
     cout << "Enter 2.To display data of all existing accounts" << endl; 
     cout << "Enter 3.To deposit to an existing account" << endl; 
     cout << "Enter 4.To withdraw from an existing account" << endl; 
     cout << "Enter 5.To terminate program" << endl; 
     cout << "Enter your choice : " << endl; 
     cin >> ch; 

     if(ch==1) 
     { 
      if(nextIndex>=NumberOfAccounts) 
      { 
       cout<<"error: you have space for only "<<NumberOfAccounts<<" accounts! terminating program"; 
       break;//breaks out of while loop 
      } 

      ram[nextIndex].getdata();//gets all fields for the account 
      nextIndex++; 
     } 

     else if(ch==2) 
     { 
     cout << "showing information for all accounts: " << endl; 

     for (int i = 0; i < nextIndex; i++) ram[i].putdata(); 
      cout<<"\n\n"; 

     } 

     else if(ch==3) 
     { 
      cout << "Enter the account you want to deposit money into " << endl; 
      cin >> acc; 
      int index = getIndexByAccountNumber(ram,NumberOfAccounts,acc); 
      if(index==-1) 
      { 
       cout<<"the account number you entered could not be found, terminating program!\n"; 
       break;//breaks out of while loop 
      } 
      ram[index].deposit(); 
     } 

     else if(ch==4) 
     { 
      cout << "Enter the account you want to withdraw from " << endl; 
      cin >> acc; 
      int index= getIndexByAccountNumber(ram,NumberOfAccounts,acc); 
      if(index==-1) 
      { 
       cout<<"the account number you entered could not be found, terminating program!\n"; 
       break;//breaks out of while loop 
      } 
      ram[index].withdraw(); 
     } 

     else if(ch==5) 
     { 
      break; 
     } 

     else 
     { 
      cout<<"you entered invalid choice\n"; 
     } 
    }//end of while loop 

return 0; 
} 
+0

Большое спасибо, сэр. Это мне очень помогло. – Fusionist

+0

Извещение Я добавил 2 функции: getAccountNumber(), потому что ваши банковские поля являются частными и функция, которая поможет вам найти индекс учетной записи в массиве на основе номера его учетной записи. Я бы по-прежнему призывал вас использовать строку и вектор вместо массивов – ForeverStudent

0
cout << "Enter the account you want to deposit money into " << endl; 
    cin >> acc; 
    for (int i = 0; i < n; i++) 
    ram[acc].deposit(); 
    break; 

Вот ваша проблема - неправильная переменная индекса. Попробуйте «i»

+0

Я использую acc как индекс массива, чтобы я мог снять или внести сумму из этой конкретной учетной записи, поэтому я передал ей переменную acc, и я беру ее значение из пользователь в функции депозита - Fusionist 7 мин. назад – Fusionist

+0

@Фьюзионист: так вам не нужен этот цикл, но вам нужно проверить границы –

0

В вашем случае 3 вы используете другой итератор, чем остальные. Это по дизайну или что? Мне не хватает цели использовать acc вместо i. Это может быть вашей проблемой, если я не упускаю из виду вашу цель использовать ее.

Смежные вопросы