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

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

프로젝트 02단계 도입

이제 클래스에 대한 기본적인 내용들을 공부하였다. 이젠 문법적요소에 신경쓰기보다는 무엇을 클래스로 만들 것이며 어떻게 클래스를 정의할 것인가에 더 신경을 써야 한다! C++는 문법의 80프로 만 이해하고 있어도 실무 프로젝트에 무리 없이 진행 할 수 있다.그러나 클래스를 제대로 만들어 내지 못한다면 아무리 문법을 100프로 이해하고 있어도 프로젝트의 진행 자체가 불가능해진다

프로그램 설명

뱅킹시스템 1단계를 2단계로 업그레이드 시켜보자 . 1단계에서 정의한 구조체 Account를 클래스 Account로 변경해보자. 이는 키워드 struct를 class로 변경하라는 뜻이 아니다.

다음과 같은 내용들을 더불어 고민하라는 뜻이다.

"어떻게 캡슐화를 시키고 정보 은닉시켜야 할까?"
"생성자와 소멸자는 어떻게 정의해야 할까?"

 

버전 1에서의 Account 구조체는 char형 배열을 맴버로 둬서 고객의 이름을 저장했는데, 버전 2 Account 클래스에서는 이를 동적 할당 형태로 구현하자. 즉, Account 클래스는 맴버변수로 문자열 포인터를 지니고 있어야 한다.

또 한가지는 객체를 저장하는 배열에 관한 것이다. 객체 배열을 선언하지 말고, 객체 포인터 배열을 선언해서 객체를 저장하자. 1버전에서는 구조체배열을 선언했으니 이를 포인터 배열로 변경하자

 

 

02단계 코드

#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);
	}
	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

반응형