상세 컨텐츠

본문 제목

2-6 계좌관리 class 구현

과제

by 근성 2021. 8. 5. 11:08

본문

이번문제는 Myaccount라는 class를 만들고 account를 관리하는 프로그램을 구현해야하는 문제입니다.

private에 unsigned int money(돈), char*name(주인이름),char* account_number(계좌번호)를 주고, public에 자유롭게 함수를 줘도 됩니다.

계좌의 제한 갯수는 5개 모두 myaccount* array에 저장시켜야합니다.

프로그램은 5가지 명령을 받습니다. NEW, DEPOSIT, WITHDRAW, PRINT, EXIT

NEW는 계좌주인이름, 계좌번호를 넣어야 하고, 계좌가 이미 5개인경우 꽉찼다고 출력
DEPOSIT은 같은 ACCOUNT NUMBER에 돈을 더하는 기능이고, 계좌갯수가 0일경우 계좌가 하나도 없다라고 출력해야합니다.
WITHDRAW는 DEPOSIT과 기능이 똑같으나, 계좌에서 돈을 빼는것만 같습니다.
PRINT는 계좌정보를 모두 출력입니다, EXIT은 프로그램 종료 입니다.
(Myaccount는 반드시 할당을 해줘야만합니다.)

 

 

이번문제는 class의 기본을 다루면서 class안의 함수를 다뤄야 할것만 같은 문제입니다.

뭐 까짓거 별거 없을겁니다. 그냥 public에다가 보통 함수처럼 때려박으면 되겠죠??

 

class형 변수인 Myaccount형의 info라는 변수를 선언해야하는데, 계좌가 5개로 제한이 되어야하므로

MyAccount* info[5];//class 변수선언

 

1. NEW

계좌생성은 NEW기능을 먼저 구현해보겠습니다.

먼저 NEW기능을 입력받았는데 계좌의 갯수가 5개를 넘어가는 경우는 계좌갯수 초과를 출력시켜줘야합니다.

 

5개가 넘지않는 경우는 해당계좌의 이름과 계좌번호를 입력받아 class함수에 인자로 넘겨줍니다.

넘겨주면서 person이라는 변수가 1씩 증가를 하게 했습니다.(계좌갯수확인)

cin >> command;
		if (command == "NEW")
		{//NEW를 받은경우
			if (person > 4)//5명 넘게 저장할 경우
				cout << "Number of Account is Limited" << endl;
			else {
				cin >> name >> address;
				info[person] = new MyAccount(name, address);//class 변수로 생성
				person++;
			}

		}

이렇게 해줬을때 class안의 함수는

MyAccount(char* co_name, char* co_number)
	{
		int length = strlen(co_name) + 1;
		int acc_length = strlen(co_number) + 1;
		name = new char[length];
		strcpy_s(name, length, co_name);
		account_number = new char[acc_length];
		strcpy_s(account_number, acc_length, co_number);
		cout << "계좌생성" << endl;
	}

이름과 계좌번호를 strcpy시켜버립니다.

(참고 : strcpy_s를 사용해서 정책을 좀 더 지킵시다 !)

 

2. DEPOSIT

DEPOSIT은 돈을 넣을 계좌와 얼마나 돈을 넣을건지 입력을 받으면 되는 command입니다.

그러면 계좌를 찾는기능과 그 계좌에 돈을 추가하는 함수를 생성하면 되는 간단한(?)방안입니다.

 

main함수에서는 계좌와 돈을 입력 받아야하므로

else if (command == "DEPOSIT")
		{//DEPOSIT을 받은경우
			if (person == 0)
			{//계좌갯수가 0인경우
				cout << "Number of Account is 0" << endl;
			}
			else {
				cin >> address >> money;
				for (int h = 0; ; h++) {

					index = info[h]->find_address(address);
					save = h;
					if (index == 0)
					{//계좌번호를 찾은경우
						info[save]->DEPOSIT(money);
						break;
					}
				}

			}
		}

class함수에서는

int find_address(char* cla_address)//계좌번호 찾기
	{
		int cmp = -1;
		if (strcmp(cla_address, account_number) == 0)
			cmp = strcmp(cla_address, account_number);
		return cmp;

	}
    
void DEPOSIT(unsigned int re_money)//DEPOSIT기능
{
	money += re_money;
}

인자로 받은 계좌가 class내 변수의 계좌번호와 일지할경우 main함수에 0을 반환하고, 그때 그 계좌의 인덱스를 h에 저장시킵니다.

main함수에서 0인경우 입력받은 돈을 class함수인 DEPOSIT으로 넘겨주고, 더해줍니다.

 

3.WITHDRAW

DEPOSIT과 똑같지만, 더하지않고 빼주기만 하면 됩니다.

else if (command == "WITHDRAW")
		{//WITHDRAW를 받은경우
			if (person == 0)
			{//계좌 갯수가 0인경우
				cout << "Number of Account is 0" << endl;
			}
			else {
				cin >> address >> money;
				for (int h = 0; ; h++) {

					index = info[h]->find_address(address);
					with_save = h;
					if (index == 0)
					{//계좌번호를 찾은경우
						info[with_save]->WITHDRAW(money);
						break;
					}

				}
			}
		}

main함수에서의 WITHDRAW인데 변수명 빼고는 DEPOSIT과 똑같습니다.

	void WITHDRAW(unsigned int with_money)//WITHDRAW기능
	{
		money -= with_money;
	}

class함수에서의 WITHDRAW입니다.

 

4. PRINT

PRINT는 모든 계좌의 이름과 계좌번호, 금액을 출력만 하면 되므로,

else if (command == "PRINT")
		{//PRINT를 받은경우
			for (int j = 0; j < person; j++)
			{
				cout << "\n" << j << "\t";
				info[j]->PRINT();//

			}cout << endl;
		}

main함수에서의 PRINT입니다.

 

 

void PRINT()//출력기능
	{
		cout << "이름 : " << name << "\t" << "ACount_Number : " << account_number << "\t" << "MONEY : " << money;
	}

class함수에서의 PRINT입니다.

 

 

 

5. EXIT

마지막 EXIT은 그냥 메모리해제입니다.

else if (command == "EXIT")
		{//EXIT을 받을경우
			for (int j = 0; j < person; j++) {
				cout << "계좌삭제 :" << j << endl;
				delete info[j];//메모리해제 
			}
			result = true;
		}

class변수의 메모리할당만 써주면 됩니다.

 

 

 

위 코드블럭과 변수를 합치면

#include<iostream>
#include<string>

using namespace std;

class MyAccount {//MyAccount class생성
private: unsigned int money = 0;
	   char* name;
	   char* account_number;
public:
	MyAccount(char* co_name, char* co_number)//생성자
	{
		int length = strlen(co_name) + 1;
		int acc_length = strlen(co_number) + 1;
		name = new char[length];
		strcpy_s(name, length, co_name);
		account_number = new char[acc_length];
		strcpy_s(account_number, acc_length, co_number);
		cout << "계좌생성" << endl;
	}
	MyAccount() {
		name = NULL;
		account_number = NULL;
	}

	int find_address(char* cla_address)//계좌번호 찾기
	{
		int cmp = -1;
		if (strcmp(cla_address, account_number) == 0)
			cmp = strcmp(cla_address, account_number);
		return cmp;

	}

	void PRINT()//출력기능
	{
		cout << "이름 : " << name << "\t" << "ACount_Number : " << account_number << "\t" << "MONEY : " << money;
	}
	void DEPOSIT(unsigned int re_money)//DEPOSIT기능
	{
		money += re_money;
	}
	void WITHDRAW(unsigned int with_money)//WITHDRAW기능
	{
		money -= with_money;
	}
	~MyAccount() {//소멸자
		delete[] name;
		delete[] account_number;
	}

};

int main()
{
	bool result = false;
	string command;
	char* name = new char[20];
	char* address = new char[40];
	char* re_address = new char[40];
	int index = -1;
	int save = 0;
	int with_save = 0;
	unsigned int money = 0;
	int person = 0;
	MyAccount* info[5];//class 변수선언
	for (int i = 0; result != true; i++)
	{
		cin >> command;
		if (command == "NEW")
		{//NEW를 받은경우
			if (person > 4)//5명 넘게 저장할 경우
				cout << "Number of Account is Limited" << endl;
			else {
				cin >> name >> address;
				info[person] = new MyAccount(name, address);//class 변수로 생성
				person++;
			}

		}
		else if (command == "PRINT")
		{//PRINT를 받은경우
			for (int j = 0; j < person; j++)
			{
				cout << "\n" << j << "\t";
				info[j]->PRINT();//

			}cout << endl;
		}
		else if (command == "DEPOSIT")
		{//DEPOSIT을 받은경우
			if (person == 0)
			{//계좌갯수가 0인경우
				cout << "Number of Account is 0" << endl;
			}
			else {
				cin >> address >> money;
				for (int h = 0; ; h++) {

					index = info[h]->find_address(address);
					save = h;
					if (index == 0)
					{//계좌번호를 찾은경우
						info[save]->DEPOSIT(money);
						break;
					}
				}

			}
		}

		else if (command == "WITHDRAW")
		{//WITHDRAW를 받은경우
			if (person == 0)
			{//계좌 갯수가 0인경우
				cout << "Number of Account is 0" << endl;
			}
			else {
				cin >> address >> money;
				for (int h = 0; ; h++) {

					index = info[h]->find_address(address);
					with_save = h;
					if (index == 0)
					{//계좌번호를 찾은경우
						info[with_save]->WITHDRAW(money);
						break;
					}

				}
			}
		}

		else if (command == "EXIT")
		{//EXIT을 받을경우
			for (int j = 0; j < person; j++) {
				cout << "계좌삭제 :" << j << endl;
				delete info[j];//메모리해제 
			}
			result = true;
		}
	}

	return 0;
}

이렇게 완성이 되고(class의 생성자와 소멸자 추가), 결과는

코드 실행결과

(실행결과예시 사진을 조교님 성함으로 설정해서 그나마 안보이게 했습니다.)

 

 

 

이번문제를 풀면서 느낀점은 class기능을 더 많이 써보고 class에 대해서 더 많이 알아봐야한다라는 느낌을 받았습니다. class가 c언어에서 구조체와 비슷한 느낌을 받았지만, 조금 더 체계적으로 쓸 수 있는거 같아서 조금 더 알아보고 공부하겠습니다.

 

객체지향프로그래밍의 편리함? 을 깨닫게 되었습니다.

 

#이 문제의 출처는 kw대학교 컴퓨터정보공학부 2021년 1학기 객체지향 프로그래밍 과제 문제입니다.

관련글 더보기

댓글 영역