본문 바로가기
C++/열혈 C++

열혈 C++ oop 프로젝트 6단계

by Beijing_KingGod 2018. 4. 8.

#include <iostream>

using namespace::std;
const int NAME_LEN=20;

/***********Account Class**********/
class Account
{
 int id; //계좌번호
 int balance; //잔액
 char* name; //이름
public:
 Account(){}
 Account(int id, char* name, int balance);
 Account(const Account& acc);
 ~Account();

 int GetID() const; //계좌번호 조회
 int GetBalance() const; //잔액조회
 virtual void AddMoney(int val); //입금
 void MinMoney(int val); //출금
 const char* GetName() const;
 virtual void ShowAllData();
};

Account::Account(int id, char* name, int balance) // 생성자
{
 this->id=id;
 this->balance=balance;
 this->name=new char[strlen(name)+1];
 strcpy(this->name, name);
}
Account::Account(const Account& acc) // 복사 생성자
{
 this->id=acc.id;
 this->balance=acc.balance;
 this->name=new char[strlen(acc.name)+1];
 strcpy(this->name, acc.name);
}
Account::~Account(){ //소멸자
 delete []name;
}
int Account::GetID() const{
 return id;
}
int Account::GetBalance() const{
 return balance;
}
void Account::AddMoney(int val){
 balance+=val;
}
void Account::MinMoney(int val){
 balance-=val;
}
const char* Account::GetName() const{
 return name;
}
void Account::ShowAllData(){
 cout<<"계좌ID: "<<id<<endl;
 cout<<"이  름: "<<name<<endl;
 cout<<"잔  액: "<<balance<<endl;
}

/*********FaithAccount Class ********/
class FaithAccount : public Account
{
public:
 FaithAccount(int id, char* name, int balance)
  :Account(id,name, balance+balance*0.01) //balance를 받아서 계산한 값을 인자로 전달
 {}
 virtual void AddMoney(int  val){
  Account::AddMoney(val+val*0.01);
 }
};

/*********ContriAccount Class ********/
class ContriAccount : public Account
{
 int contribution; //기부금 총액
public:
 ContriAccount(int id, char* name, int balance)
  : Account(id , name, balance-balance*0.01)
 {
  contribution=balance*0.01;
 }
 virtual void AddMoney(int val){
  Account::AddMoney(val-val*0.01);
  contribution+=val*0.01;
 }
 virtual void ShowAllData(){
  Account::ShowAllData();
  cout<<"총 기부액: "<<contribution<<endl;
 }
};

/********** AccManager Class **********/
class AccManager
{
 Account* pArray[100]; //Account 저장을 위한 배열
 int index;
public:
 AccManager();
 void PrintMenu();
 void MakeAccount(); //계좌 개설을 위한 함수
 void Deposit(); // 입 금
 void Withdraw(); // 출 금
 void Inquire(); //잔액 조회
};

AccManager::AccManager(){
 index=0;
}

void AccManager::PrintMenu()
{
 cout<<"---Menu-----"<<endl;
 cout<<"1. 계좌 개설"<<endl;
 cout<<"2. 입금 " <<endl;
 cout<<"3. 출금 " <<endl;
 cout<<"4. 잔액 조회"<<endl;
 cout<<"5. 프로그램 종료"<<endl;
}

void AccManager::MakeAccount()
{
 int id;
 char name[NAME_LEN];
 int balance;
 int sel;

 cout<<"개설할 계좌의 종류-----"<<endl;
 cout<<"1. 일반 계좌. "<<endl;
 cout<<"2. 신용 계좌. "<<endl;
 cout<<"3. 기부 계좌. "<<endl;
 cout<<">>";
 cin>>sel;

 cout<<"계좌 개설------"<<endl;
 cout<<"계좌 ID: ";  cin>>id;
 cout<<"이  름: ";  cin>>id;
 cout<<"입금액: "; cin>>balance;

 if(sel==1)  //일반 계좌 개설 시
  pArray[index++]=new Account(id, name, balance);
 else if(sel==2) // 신용 계좌 개설 시
  pArray[index++]=new FaithAccount(id,name,balance);
 else if(sel==3) // 기부 계좌 개설 시
  pArray[index++]=new ContriAccount(id,name,balance);
 else
  cout<<"선택 요류! "<<endl;
}

void AccManager::Deposit() // 입 금
{
 int money;
 int id;

 cout<<"계좌 ID: ";  cin>>id;
 cout<<"입금액: ";  cin>>money;

 for(int i=0; i<index; i++)
 {
  if(pArray[i]->GetID()==id)
  {
   pArray[i]->AddMoney(money);
   cout<<"입금 완료"<<endl;
   return;
  }
 }
 cout<<"유효하지 않은 ID입니다."<<endl;
}

void AccManager::Withdraw() // 출금
{
 int money;
 int id;

 cout<<"계좌 ID: "; cin>>id;
 cout<<"출금액: "; cin>>money;

 for(int i=0; i<index; i++)
 {
  if(pArray[i]->GetID()==id)
  {
   if(pArray[i]->GetBalance()<money)
   {
    cout<<"잔액 부족"<<endl;
    return;
   }
   pArray[i]->MinMoney(money);
   cout<<" 출금 완료" <<endl;
   return;
  }
 }
 cout<<" 유효하지 않은 ID입니다."<<endl;
}

void AccManager::Inquire() // 전체 잔액 조회
{
 for(int i=0; i<index; i++)
  pArray[i]->ShowAllData();
}

/********main function ************/
enum{MAKE=1, DEPOSIT, WITHDRAW, INQUIRE,EXIT};

int main(void)
{
 int choice;
 AccManager manager;
 
 while(1)
 {
  manager.PrintMenu();
  cout<<"선택: ";
  cin>>choice;

  switch(choice)
  {
  case MAKE:
   manager.MakeAccount();
   break;
  case DEPOSIT:
   manager.Deposit();
   break;
  case WITHDRAW:
   manager.Withdraw();
   break;
  case EXIT:
   return 0;
  default:
   cout<<"Illegal selection.."<<endl;
   break;
  }
 }
 return 0;
}

 

 

 

댓글