C++. ATM Project ver.1

lsw·2021년 3월 23일
0

Mini Projects

목록 보기
1/11
post-thumbnail

1. 문제

  • 주제

    다음 기능을 포함한 "ATM" 프로그램을 만들어 보시오

    1. 계좌생성
    2. 입금
    3. 출금
    4. 조회
    5. 종료
  • 알고리즘

    1. 다섯기능을 볼 수 있는 menu창 생성
    2. 기능을 선택할 수 있도록 switch함수 이용
    3. 다섯개(개설, 입금, 출금, 조회, 종료)의 함수를 생성
    4. main함수에서 무한루프를 만든다.
    5. 배열을 사용하기위해 "cstring" 헤더파일을 사용하며, 이름 배열 길이의 일관성을 위해 name_len이라는 const int 타입의 전역변수 생성.

2. 코드

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. 결과

3.1.

  • 콘솔 입력 순서

    1. 1 입력(계좌 개설 선택)

    2. 최초금 1000으로 계좌 개설

    3. 거래 계속 진행(yes)

    4. 2 입력(입금)

    5. 500 입금

    6. 거래 계속 진행(yes)

      3.2

  • Console sequence

    1. 4 입력(조회, 정상 입금여부 확인)

    2. 거래 게속 진행(yes)

    3. 계좌번호 입력 오류

    4. 3 입력(출금)

    5. 300 출금

      3.3

  • Console sequence
  1. 4 입력(정상 출금 확인)
  2. 5 입력(프로그램 종료)

4. 사용된 구문, 함수, 타입 등..

  1. cstring for the use of standard function strcpy
  2. structure array to save customer's information
  3. enum for enumerating characters to function as integers
  4. switch ~ case ~ break for the selection of the customer
  5. while and for loop
  6. long long type to cover large size integer(account id)

5. 결론

Structure(구조체)를 이용하여 다수 고객의 정보를 저장해 보았다. 하나의 객체로 취급하기엔 특성적으로 부족해 보여져 차후 어떤 조정이 필요할지 고민해 보자.


6. 영상(다수 고객 입력)

StQD0P5O7X.mp4

profile
미생 개발자

0개의 댓글