은행계좌프로그램 실습 3단계

2024. 4. 15. 15:28[C++]/C++ 언어 기초

프로젝트 03단계의 도입

깊은 복사를 원칙으로 한다면, 클래스의 생성자만 봐도 복사 생성자의 필요성을 판단할 수 있다. 실제 복사 생성자의 호출 여부는 중요하지 않다. 클래스는 그 자체로 완성품이 되어야 하기 때문에, 당장 필요한 것만으로는 채우지 않는다.

 

프로그램 설명

Account 클래스에 깊은 복사를 진행하는 복사 생성자를 정의하면서, Banking System의 버전을 0.2에서 0.3으로 업그레이드 시켜보겠다. 비록 복사 생성자가 호출되지는 않지만, 깊은 복사를 원칙으로 정하고 이를 위해서 복사 생성자를 추가하기로 하겠다.

 

03단계 코드

#include "stdafx.h"
#include <iostream>
#include <cstring>

using namespace std;

void ShowMenu(void);
void MakeAcc(void);
void DepositMoney(void);
void WithdrawMoney(void);
void ShowAccInfo(void);

enum {Make = 1, Deposit, Withdraw, ShowAcc, EXIT};

class Accounts{ //Account 클래스 정의
private:
	int accId;
	int money;
	char *cusName;
public:
	Accounts(int Id, int mymoney, char *name):accId(Id), money(mymoney){
		cusName = new char[strlen(name)+1];
		strcpy_s(cusName,strlen(name)+1, name);
	}
    //복사 생성자 추가
	Accounts(const Accounts &copy):accId(copy.accId), money(copy.money){
		cusName = new char[strlen(cusName + 1)];
		strcpy(cusName, copy.cusName);
	}

	int GetAccId(){return accId;}
	void Deposit(int mymoney){
		money +=  mymoney;
	}
	int Withdraw(int mymoney){
		if(money < mymoney)
			return 0;
		money -= mymoney;
		return mymoney;
	}
	const char* GetCusName() const {
		return cusName;
	}
	int GetMoney() const {
		return money;
	}
	void ShowAccInfo(){
		
		cout<<"계좌Id: "<<accId<<endl;
		cout<<"이름: "<<cusName<<endl;
		cout<<"잔액: "<<money<<endl<<endl;
	}
	~Accounts(){
		delete []cusName;
	}
};

Accounts * accArr[100];
int accNum = 0;

int main(void)
{
	while(1){
		ShowMenu();
	}   
}

void ShowMenu(void){

	int select;
	cout<<"-------Menu-------"<<endl<<"1. 계좌개설"<<endl<<"2. 입 금"<<endl<<"3. 출 금"<<endl<<"4. 계좌정보 전체 출력"<<endl<<"5. 프로그램 종료"<<endl;
	cout<<"번호를 입력하세요. : ";cin>>select;
	cout<<endl;

	switch(select){
	case Make:
		MakeAcc();
		break;
	case Deposit:
		DepositMoney();
		break;
	case Withdraw:
		WithdrawMoney();
		break;
	case ShowAcc:
		ShowAccInfo();
		break;
	case EXIT:
		for(int i; i<accNum; i++){
			delete accArr[i];
		}
		exit(0);
	default:
		cout<<"유효하지 않은 번호입니다."<<endl<<endl;
	}
}

void MakeAcc(void){
	int id, money;
	char name[20];

	cout<<"[계좌개설]"<<endl;
	cout<<"계좌ID: ";
	while (!(cin >> id)) {      
		cin.clear();      
		cin.ignore(INT_MAX,'\n');      
		cout << "잘못된 값을 입력하셨습니다. 정수로 입력해주세요 \n";
		cout <<"계좌 ID: ";
	}
	cout<<"이름(최대 20자): "; cin>>name;
	cout<<"입금액: "; cin>>money; cout<<endl;

	accArr[accNum++] = new Accounts(id, money, name);
}

void DepositMoney(void){
	int id, money;
	cout<<"[입   금]"<<endl;
	cout<<"계좌ID: ";
	while (!(cin >> id)) {      
		cin.clear();      
		cin.ignore(INT_MAX,'\n');      
		cout << "잘못된 값을 입력하셨습니다. 정수로 입력해주세요 \n";
		cout <<"계좌 ID: ";
	}
	cout<<"입금액: ";cin>>money;

	for(int i = 0; i<accNum; i++){
		if(accArr[i] -> GetAccId() == id){
			accArr[i] -> Deposit(money);
			cout<<"입금완료"<<endl;
			cout<<accArr[i]->GetCusName()<<"고객님의 입금 후 잔액 : "<<accArr[i]->GetMoney()<<endl;
			return;
		}
	}
	cout<<"아이디가 없습니다."<<endl;
}

void WithdrawMoney(void){
	int id, money;
	cout<<"[출   금]"<<endl;
	cout<<"계좌ID: ";
	while (!(cin >> id)) {      
		cin.clear();      
		cin.ignore(INT_MAX,'\n');      
		cout << "잘못된 값을 입력하셨습니다. 정수로 입력해주세요."<<endl;
		cout <<"계좌 ID: ";
	}
	cout<<"출금액: ";
	while (!(cin >> money)) {      
		cin.clear();      
		cin.ignore(INT_MAX,'\n');      
		cout << "잘못된 값을 입력하셨습니다."<<endl;
		cout <<"출금액: ";
	}   

	for(int i = 0; i<accNum; i++){
		if(accArr[i] -> GetAccId() == id){
			
			if(accArr[i] ->Withdraw(money) == 0){
				cout<<"잔액부족"<<endl<<endl;
				return ;
			}
			
			cout<<"출금완료"<<endl;
			cout<<accArr[i]->GetCusName()<<"고객님의 출금 후 잔액 : "<<accArr[i]->GetMoney()<<endl;

			return;
		}
	}

	cout<<"아이디가 없습니다."<<endl;
}

//계좌정보 전체 출력
void ShowAccInfo(void){

	for(int i = 0; i<accNum;i++){
		cout<<"["<<i+1<<"번째 계좌정보]"<<endl;
		accArr[i] -> ShowAccInfo();
		if(i+1 == accNum){
			cout<<"-------전체 계좌 출력 완료-------"<<endl<<endl;
		}
	}

}

 

 

복사 생성자


기존 코드

01 단계 코드

https://kjy1ho.tistory.com/337

 

01-06 은행계좌프로그램 실습 1단계

프로그램 설명 우리가 구현하고자 하는것은 "은행계좌 관리 프로그램"이다. 1단계에서는 C스타일로 구현하는 것을 목표로 한다. 구현할 기능은 다음과 같다. 기능 1. 계좌개설 기능 2. 입 금 기능

kjy1ho.tistory.com

02단계 코드

https://kjy1ho.tistory.com/351

 

04-05 은행계좌문제 2단계

01단계 코드 #include "stdafx.h" #include using namespace std; using namespace System; void ShowMenu(void); void MakeAcc(void); void DepositMoney(void); void WithdrawMoney(void); void ShowAccInfo(void); enum {Make = 1, Deposit, Withdraw, ShowAcc}; typed

kjy1ho.tistory.com

 

반응형