728x90
728x90
OOP 단계별 프로젝트는 총 7단계로 진행될 예정
1단계에서는 구현에 필요한 틀을 제시. C스타일로 구현할 예정.

 

구현하려는 프로그램 : 은행계좌 관리 프로그램
구현하려는 기능 : 계좌개설, 입금, 출금, 전체고객 잔액조회

통장 계좌번호는 중복되지 않는다.(중복검사를 하지 않음)
입금액, 출금액은 무조건 0보다 크다.(입금, 출금액의 오류검사 하지 않음)
고객 계좌정보는 계좌번호, 고객이름, 고객의 잔액을 저장, 관리한다
둘 이상 고객정보 저장을 위해 배열을 사용한다
계좌번호는 정수이다.

 

계좌 개설과정 실행 예
-----Menu-----
1. 계좌개설
2. 입금
3. 출금
4. 계좌번호 전체 출력
5. 프로그램 종료
선택: 1

[계좌개설]
계좌ID: 115
이름: 이우석
입금액: 15000

 

계좌개설 후에도 계속해서 메뉴가 출력되어 추가 메뉴 선택이 가능해야 한다.
입력한 정보를 대상으로 입금 진행 후 출력될 전체정보 화면이다.

 

입금 및 정보 조회 예
-----Menu-----
1. 계좌개설
2. 입금
3. 출금
4. 계좌번호 전체 출력
5. 프로그램 종료
선택: 2

[입금]
계좌ID: 115
입금액: 70
입금완료

-----Menu-----
1. 계좌개설
2. 입금
3. 출금
4. 계좌번호 전체 출력
5. 프로그램 종료
선택: 4

계좌ID: 115
이름: 이우석
입금액: 15070

 

메뉴에서 계좌정보 전체 출력을 선택하면 모든 계좌의 ID, 이름, 잔액정보가 출력되어야 한다.

 

// 은행 계좌 관리 프로그램
//#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>

using namespace std;
const int NAME_LEN = 20; //이름의길이

void ShowMenu(void); //메뉴출력
void MakeAccount(void); //계좌개설
void DepositMoney(void); //입금
void WithdrawMoney(void); //출금
void ShowAllAccInfo(void); //잔액조회

// 버튼 1~5까지 부여
//1. 계좌개설
//2. 입금
//3. 출금
//4. 계좌번호 전체 출력
//5. 프로그램 종료
enum {MAKE=1, DEPOSIT, WITHDRAW, INQUIRE, EXIT};

typedef struct
{
    int accID; //계좌번호
    int balance; //잔액
    char cusName[NAME_LEN]; //고객이름
} Account;

Account accArr[100]; //Account 저장을 위한 배열
int accNum = 0; //저장된 Account 수

int main()
{
    int choice;

    while (1)
    {
        ShowMenu();
        
        cout << "선택 : ";
        cin >> choice;
        cout << endl;

       switch(choice)
        {
        case MAKE:
            MakeAccount();
            break;
        case DEPOSIT:
            DepositMoney();
            break;
        case WITHDRAW:
            WithdrawMoney();
            break;
        case INQUIRE:
            ShowAllAccInfo();
            break;
        case EXIT:
            return 0;
        default:
            cout << "잘못된 선택" << endl;
        }
    }
    return 0;
}

// 메뉴출력
void ShowMenu(void) {
    /*cout<< "-----Menu----- \n "
        "1. 계좌개설 \n " 
        "2. 입금 \n "
        "3. 출금 \n "
        "4. 계좌번호 전체 출력 \n "
        "5. 프로그램 종료" <<endl;*/
    cout << "-----Menu-----" << endl;
    cout << "1. 계좌개설" << endl;
    cout << "2. 입금" << endl;
    cout << "3. 출금" << endl;
    cout << "4. 계좌번호 전체 출력" << endl;
    cout << "5. 프로그램 종료" << endl;
}

// 계좌개설
void MakeAccount(void)
{
    int id;
    char name[NAME_LEN];
    int balance;

    cout << "[계좌개설]" << endl;
    cout << "계좌ID:(숫자로 입력) "; cin >> accArr[accNum].accID;
    cout << "이름: "; cin >> accArr[accNum].cusName;
    cout << "입금액: "; cin >> accArr[accNum].balance;
    cout << endl;
      
   /* accArr[accNum].accID = id;
    accArr[accNum].balance = balance;
    strcpy_s(accArr[accNum].cusName, NAME_LEN, name);*/
    cout << accNum << endl;
    accNum++; 
}

// 입금
void DepositMoney(void)
{
    int money;
    int id;
    cout << "[입  금]" << endl;
    cout << "계좌ID: "; cin >> id;
    cout << "입금액: "; cin >> money;

    for (int i = 0; i < accNum; i++)
    {
        if (accArr[i].accID == id)
        {
            accArr[i].balance += money;
            cout << "입금완료" << endl << endl;
            return;
        }
    }
    cout << "유효하지 않은 ID 입니다." << endl << endl;
}

// 출금
void WithdrawMoney(void)
{
    int money;
    int id;
    cout << "[출  금]" << endl;
    cout << "계좌ID: "; cin>>id; 
    cout << "출금액: "; cin >>money;

    for (int i = 0; i < accNum; i++)
    {
        if (accArr[i].accID == id)
        {
            if (accArr[i].balance < money)
            {
                cout << "잔액부족" << endl << endl;
                return;
            }
            accArr[i].balance -= money;
            cout << "출금완료" << endl << endl;
            return;
        }
    }
    cout << "유효하지 않은 ID 입니다" << endl << endl;
}

// 전체고객 잔액조회
void ShowAllAccInfo(void)
{
    for (int i = 0; i < accNum; i++)
    {
        cout << "계좌ID: "<<accArr[i].accID<<endl;
        cout << "이름: " << accArr[i].cusName<< endl;
        cout << "잔액: " << accArr[i].balance<< endl<<endl;
    }
}

 

 

메모

 

 

작성하면서 나온 에러

E0349 : 이러한 피연산자와 일치하는 ">>" 연산자가 없습니다.  #include "string" 추가

계좌ID에 기대한 int 값이 아니라 문자열이 들어가면
처리되지 않은 예외가 있습니다.  ... 위치를 기록하는 동안 액세스 위반이 발생했습니다 와 같은 에러메세지가 출력된다.
형식이 잘못된 데이터가 들어가면 튕겨내고 읽는게 계속 반복된다. 그래서 무한 반복..

더보기

표준 stream 관련 입력 함수들은 대개 주어진 format과 일치하지 않는 데이터가 들어오면 무시해버립니다. 무시한다는 것이 입력된 data를 날려버린다는 것이 아니라, 에러로 처리하고 그 data는 그대로 보존되는 것입니다.

따라서 첫번째에 문자를 입력하면, 입력 버퍼에 문자가 들어가게 되고, 이는 변수 i의 타입인 int로 해석될 수 없기 때문에 error로 처리되고 입력 버퍼에는 그대로 문자가 남아있게 됩니다.

따라서 다음에 다시 변수 i로 입력을 받게 하더라도 무시되는 것을 볼 수 있습니다. (두번째 cin >> i)

결국 제대로 된 프로그램을 쓰려면 입력을 받을 때 문자열로 받은 다음 이것을 다시 원하는 포맷으로 변경하는 작업을 거치는 것이 일반적입니다.

C++을 쓴 지 꽤 되서 답변이 정확할 지 잘 모르겠습니다. :-)

같은 이유에서 scanf(3)도 그럴듯한 프로그램에서는 전혀 쓰이지 않습니다. 쓰인다면 fscanf, sscanf가 주로 쓰이죠.

제가 보기에는 C++에서 이를 해결하려면,
일단 string type으로 입력을 받아서 처리하던지, 아니면,
string stream buffer를 쓰면 해결될 것 같습니다. :-)

마지막으로 책 하나 추천해드리죠. 이 책을 보시면 iostream에 관해 전문가가 되실 수 있을 겁니다:

"Standard C++ IOStreams and Locales. - Advanced Programmer's Guide and Reference", Angelika Langer and Klaus Kreft, Addison Wesley

 

출처 : https://kldp.org/node/19262

C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/

 

LNK1168 : 쓰기용으로 열 수 없습니다. 에러는 프로젝트가 실행되고 있어서니까
프로그램을 종료시켜서 해결이 안되면 작업끝내기로 끝내주고
그도 안되면 새로 프로젝트를 만드는 방법도 있는 듯 하다.

큰 3가지 이유와 관련된 내용 : https://codecollector.tistory.com/1

728x90
728x90

'C, C++ > 열혈 C++ 프로그래밍' 카테고리의 다른 글

02. C언어 기반의 C++ 연습문제  (0) 2021.09.14
02-3. 참조자(Reference)의 이해  (0) 2021.09.13
02-1 챕터 02의 시작에 앞서  (0) 2021.08.19
01-5 이름공간  (0) 2021.08.19
01-4 인라인 함수  (0) 2021.08.18
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,

v