주제
다음 기능을 포함한 "ATM" 프로그램을 만들어 보시오
알고리즘
header file
#include <iostream>
#include <cstring> //strcpy
Source1 function declaration
using namespace std;
//std라는 이름공간의 객체 cin, cout, endl을 별도 "std::~"지정 없이 사용
const int name_len = 100; // 문자열 길이 지정
//각각 계좌생성, 입금, 출금, 조회 역할을 할 함수 선언
void Make_account();
void Deposit_account();
void Withdraw_account();
void Showall_account();
Source2
typedef struct // "Customer" 타입의 구조체 정의
{
long long id; // 계좌번호의 자릿수를 고려하여 long long 타입으로 선언
char name[name_len]; // 성명
int balance; // 잔여금액
} Customer;
enum { make = 1, deposit, withdraw, showall, close};
// 문자가 숫자고유의 의미를 갖게 하여 switch ~ case문에 활용할 계획
int customer_num = 0; // 고객 고유번호, 최초값 = 0
Customer account_arr[100];
// Customer 구조체 타입의 배열 account_arr을 길이 100으로 생성.(선착순고객 100명 계좌개설)
main function
int main()
{
while (1) // close(5) 전까지 메뉴생성 반복(거래를 더 진행하시겠습니까??)
{
int choice;
// Menu창 생성
cout << "\n\n" << "-----Menu-----" << endl
<< "1. 계좌개설" << endl
<< "2. 입금" << endl
<< "3. 출금" << endl
<< "4. 계좌정보 전체 출력" << endl
<< "5. 프로그램 종료" << endl;
// 거래 유형 선택
cout << "거래 유형 선택 : ";
cin >> choice;
switch (choice)
{
case make: // make 는 **int type**인 1을 의미하며 차례로 deposit = 2, withdraw = 3 ..
{
Make_account(); // 개설
break;
}
case deposit:
{
Deposit_account(); // 입금
break;
}
case withdraw:
{
Withdraw_account(); // 출금
break;
}
case showall:
{
Showall_account(); // 조회
break;
}
case close: // 종료
{
cout << "거래를 종료합니다" ;
return 0;
}
default: // 그 외 옵션을 선택할 경우
{
cout << "Take different Access!" << endl;
return 0; // 종료
}
}
// 1회 거래가 종료 후 거래 계속/중지 를 물음
char yesno[10];
cout << "거래를 계속 하시겠습니까? : ";
cin >> yesno;
if(strcpy(yesno,"no")==0)
{
cout << "거래를 종료합니다.";
return 0;
}
else if(strcpy(yesno, "yes")==0)
{
cout << "거래를 계속합니다." << endl;
}
}
}
Source1 function definition
/*개설*/
void Make_account()
{
long long id;
char name[name_len];
int balance;
// 고객 신상 입력
cout << "1. 계좌번호 : "; cin >> id;
cout << "2. 성 명 : "; cin >> name;
cout << "3. 잔여금 : "; cin >> balance;
// 입력받은 값으로 Customer 구조체 배열의 멤버변수 초기화
account_arr[customer_num].id = id; // customer_num=0
strcpy(account_arr[customer_num].name, name);
account_arr[customer_num].balance = balance;
customer_num++; // 고객 고유번호 1 증가
}
/*입금*/
void Deposit_account()
{
long long id;
int money;
// 입금 거래내용 입력(id)
cout << "계좌번호 : "; cin >> id;
for (int i = 0; i < customer_num; i++) // 현재까지 채워진 고유번호 수만큼만..
{
if (account_arr[i].id == id) // 입력되 id와 개설된 계좌 id의 일치여부 확인
{
cout << "계좌가 확인되었습니다." << endl;
// 입금 거래내용 입력(money)
cout << "입금액 : "; cin >> money;
if (money >= 0)
{
account_arr[i].balance += money; // 원금 + 입금액
cout << "입금완료!";
break;
}
else
{
cout << "1원 이상의 금액을 입금하십시오." << endl;
break;
}
}
// 계좌번호 불일치 시
else
{
if (i == customer_num - 1) // 마지막까지 스캐닝 하였으나 일치id가 없다면..
{
cout << "계좌가 존재하지 않습니다."; // 계좌 불일치
break;
}
}
}
}
/*출금*/
void Withdraw_account()
{
long long id;
int money;
// 거래 내용 입력(id)
cout << "계좌번호 : "; cin >> id;
for (int i = 0; i < customer_num; i++)
{
if (account_arr[i].id == id)
{
cout << "계좌가 확인되었습니다." << endl;
// 거래 내용 입력(money)
cout << "출금액 : "; cin >> money;
if (money >= 0)
{
account_arr[i].balance -= money;
cout << "출금완료!";
break;
}
else
{
cout << "1원 이상의 금액을 입력하십시오." << endl;
break;
}
}
//계좌 불일치
else
{
if (i == customer_num - 1)
{
cout << "계좌가 존재하지 않습니다.";
break;
}
}
}
}
/*조회 - 개설된 모든 계좌정보 조회*/
void Showall_account()
{
for (int i = 0; i < customer_num; i++)
{
cout << i+1 << "번째 고객님 정보" << endl;
cout << "1. 계좌번호 : " << account_arr[i].id <<endl;
cout << "2. 성 명 : " << account_arr[i].name <<endl;
cout << "3. 잔액금 : " << account_arr[i].balance <<endl;
}
}
3.1.
콘솔 입력 순서
1 입력(계좌 개설 선택)
최초금 1000으로 계좌 개설
거래 계속 진행(yes)
2 입력(입금)
500 입금
거래 계속 진행(yes)
3.2
Console sequence
4 입력(조회, 정상 입금여부 확인)
거래 게속 진행(yes)
계좌번호 입력 오류
3 입력(출금)
300 출금
3.3
Structure(구조체)를 이용하여 다수 고객의 정보를 저장해 보았다. 하나의 객체로 취급하기엔 특성적으로 부족해 보여져 차후 어떤 조정이 필요할지 고민해 보자.