ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C언어로 만든 간단한 온라인 은행 프로그램
    C언어 기초/C언어 연습 2021. 8. 30. 00:07

     

     

    입출금, 계좌 계설, 잔액 조회 기능을 가진 은행 프로그램

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdbool.h>
    #include <Windows.h>
    #include <string.h>
    
    #define SIZE 19
    
    /*
    사용자 구조체 관리
    */
    struct Bank_User {
    	char name[20];
    	char account[20];
    	int balance;
    };
    
    
    /*
    구조체 초기화
    */
    struct Bank_User BUser[10] = {
    	{"None", "None", 0},
    	{"None", "None", 0},
    	{"None", "None", 0},
    	{"None", "None", 0},
    	{"None", "None", 0},
    	{"None", "None", 0},
    	{"None", "None", 0},
    	{"None", "None", 0},
    	{"None", "None", 0},
    	{"None", "None", 0},
    };
    
    /*
    함수 선언
    */
    
    int Dposit(char name[20], char account[20], int money);  // 입금
    int Withdraw(char name[20], char account[20], int money);  // 출금
    void Inquiry(char name[20], char account[20]);  // 잔액조회
    void make_Account();  // 계좌 계설
    
    
    /*
    전역변수 설정
    */
    char answer[5] = "";
    char answer1[4] = "YES";
    char answer2[3] = "NO";
    
    
    
    
    /*
    main 함수
    */
    int main()
    {
    	char menu[20];
    	int d_money;       // 입출금액
    	char name[20];     // 고객 이름
    	char account[20];
    	int nmenu;         // 메뉴 선택 문자와 숫자 구별하기 위한 변수
    
    	while (1) {
    		printf(" ========================================================================\n");
    		printf(" [ 1 ~ 5 ] 메뉴를 선택해 주세요!\n [ 1. 입금 ], [ 2. 출금 ], [ 3. 잔액조회 ], [ 4. 계좌 계설 ], [ 5. 종료 ] :  ");
    		scanf_s(" %s", &menu, sizeof(SIZE));
    		printf("\n\n");
    
    		// 메뉴입력 정상적으로 입력 됐는지 확인
    		nmenu = atoi(menu);       // 문자로 입력된 메뉴를 atoi함수를 써서 숫자로 바꿔서 입력
    		if (nmenu < 1 || nmenu > 5 || isdigit(*menu) == 0) {          // 범위 내 숫자인지, menu가 숫자가 아닌지 확인
    			printf(" 메뉴를 잘못 입력하셨습니다.\n\n");
    			continue;
    		}
    
    		// 입금(1) 선택
    		if (nmenu == 1) {
    			printf(" 입금자명을 입력하세요: ");
    			scanf_s(" %s", &name, SIZE);
    			printf("\n");
    			
    			printf(" 계좌번호를 입력하세요: ");
    			scanf_s(" %s", &account, SIZE);
    			printf("\n");
    
    			printf(" 입금할 금액을 입력하세요: ");
    			scanf_s(" %d", &d_money);
    			printf("\n");
    
    			printf(" %s, %s, %d", name, account, d_money);
    
    			// 입금 처리하기 위한 함수 호출
    			Dposit(name, account, d_money);
    		}
    
    		// 출금(2) 선택
    		else if (nmenu == 2) {
    			printf(" 출금자명을 입력하세요: ");
    			scanf_s(" %s", &name, SIZE);
    			printf("\n\n");
    
    			printf(" 계좌번호를 입력하세요: ");
    			scanf_s(" %s", &account, SIZE);
    			printf("\n\n");
    
    			printf(" 출금할 금액을 입력하세요: ");
    			scanf_s(" %d", &d_money);
    			printf("\n\n");
    
    			// 출금 처리하기 위한 함수 호출
    			Withdraw(name, account, d_money);
    		}
    
    		// 잔액조회(3) 선택
    		else if (nmenu == 3) {
    			printf(" 본인 이름을 입력하세요: ");
    			scanf_s(" %s", &name, SIZE);
    			printf("\n");
    			printf(" 계좌번호를 입력하세요: ");
    			scanf_s(" %s", &account, SIZE);
    			printf("\n");
    
    			// 잔액조회 처리하시 위한 함수 호출
    			Inquiry(name, account);
    		}
    
    		// 계좌계설(4) 선택
    		else if (nmenu == 4)
    			make_Account();
    
    		// 종료(5) 선택
    		else if (nmenu == 5) {
    			printf(" 3초 뒤 프로그램을 종료합니다.\n");
    			Sleep(3000);
    			printf(" Good bye!\n");
    
    			exit(0);
    		}
    	}
    	return 0;
    }
    
    
    // 입금
    int Dposit(char name[20], char account[20], int money)
    {
    	bool chk = false;         // bool : 참(0), 거짓(1) 을 나타내는 함수
    	char tmp[20];
    	int i;
    	int res;
    
    	printf("\n");
    	for (i = 0; i < 10; i++)
    	{
    		strcpy(tmp, BUser[i].account);
    		if (strcmp(tmp, account) == 0)      // 두 문자열이 같은 경우(0)
    		{
    			chk = true;
    			break;
    		}
    	}
    	// 계좌가 존재할 때: 구조체 자료에 입금액 더함
    	if (chk)
    	{
    		BUser[i].balance = BUser[i].balance + money;
    		printf("\n [ %s ]님의 [ %s ]계좌에 [ %d ]원을 입금하여 \n  통장 잔액이 [ %li ]원이 되었습니다.\n\n", BUser[i].name, BUser[i].account, money, BUser[i].balance);
    	}
    	// 계좌가 존재하지 않을 때: 계좌 계설 함수 실행
    	else
    	{
    		printf("  계좌가 존재하지 않습니다.\n  계좌를 새로 만드시겠습니까? ( YES | NO )   ");
    		scanf_s(" %s", &answer, 4);
    		printf("\n\n");
    
    		res = strcmp(answer, answer1);
    
    		if (res == 0) {
    			printf(" 계좌를 계설하겠습니다.\n");
    			make_Account();            // 계좌 계설 함수 호출
    		}
    		else if (strcmp(answer, answer2) == 0) {
    			printf("  프로그램을 종료합니다.\n");
    			exit(0);
    		}
    		else {
    			printf("  YES 와 NO로 입력해 주세요  \n");
    		}
    
    	}
    	return 0;
    }
    
    
    
    // 출금
    int Withdraw(char name[20], char account[20], int money)
    {
    	bool chk = false;
    	char tmp[20];
    	int i;
    	int res;
    	int tmoney;
    
    	printf("\n");
    	for (i = 0; i < 10; i++) 
    	{
    		strcpy(tmp, BUser[i].account);
    		if (strcmp(tmp, account) == 0) 
    		{
    			chk = true;
    			break;
    		}
    	}
    	// 계좌가 존재할 때: 구조체 자료에 출금액 빼기
    	if (chk)
    	{
    		if (BUser[i].balance >= money) {
    			printf("  [ %s ]님의 [ %s ]계좌에서 금액 [ %d ]원이 출금 되었습니다.\n", BUser[i].name, BUser[i].account, money);
    			BUser[i].balance -= money;
    			printf("\n [ %s ]님의 [ %s ]계좌에서 [ %d ]원을 출금하여 \n  통장 잔액이 [ %d ]원이 되었습니다.\n\n", BUser[i].name, BUser[i].account, money, BUser[i].balance);
    		}
    		else {
    			tmoney = money - BUser[i].balance;
    			printf("  [ %s ]님의 [ %s ]계좌에 잔액이 [ %d ]원 부족합니다.\n", BUser[i].name, BUser[i].account, tmoney);
    		}
    		return 0;
    	}
    	// 계좌가 존재하지 않을 때: 계좌 계설 함수 실행
    	else 
    	{
    		printf("  계좌가 존재하지 않습니다.\n  계좌를 새로 만드시겠습니까? ( YES | NO )   ");
    		scanf_s(" %s", &answer, 4);
    		printf("\n\n");
    
    		res = strcmp(answer, answer1);
    
    		if (res == 0) {
    			printf(" 계좌를 계설하겠습니다.\n");
    			make_Account();            // 계좌 계설 함수 호출
    		}
    		else if (strcmp(answer, answer2) == 0) {
    			printf("  프로그램을 종료합니다.\n");
    			exit(0);
    		}
    		else {
    			printf("  YES 와 NO로 입력해 주세요  \n");
    		}
    
    	}
    	return 0;
    }
    
    
    
    // 잔액 조회
    void Inquiry(char name[20], char account[20])
    {
    	int i;
    	bool chk = false;
    	char tmp[20];
    	char answer[20];
    
    	printf("\n");
    	for (i = 0; i < 10; i++) {
    		strcpy(tmp, BUser[i].account);
    		if (strcmp(tmp, account) == 0) {
    			chk = true;
    		}
    		else
    			continue;
    		if (chk) {
    			printf("  ----------------------------------------------------------------------------\n");
    			printf("  [ %s ]님의 [ %s ]계좌에 남아있는 잔액은 [ %d ]원 입니다.\n\n", BUser[i].name, BUser[i].account, BUser[i].balance);
    		}
    		else {
    			printf("  계좌가 존재하지 않습니다.\n  계좌를 새로 만드시겠습니까? ( YES | NO )   ");
    			scanf_s(" %s\n", &answer, sizeof(SIZE));
    			if (answer == "YES\0")
    				make_Account();
    			else
    				exit(0);
    		}
    	}
    }
    
    
    
    // 계좌 계설
    void make_Account()
    {
    
    	for (int i = 0; i < 10; i++) {
    		if (strcmp(BUser[i].account, "None") == 0) {
    			printf("  이름을 입력하세요:  ");
    			scanf_s(" %s", &BUser[i].name, SIZE);
    			printf("\n");
    			printf("  계좌를 입력하세요:  ");
    			scanf_s(" %s", &BUser[i].account, SIZE);
    			printf("\n");
    			printf("  신설된 계좌에 입금하실 금액을 입력해주세요:  ");
    			scanf_s(" %d", &BUser[i].balance);
    			printf("\n");
    			printf("\n  [ %s ]님의 [ %s ]계좌를 개설하였습니다.\n  통장잔액은 [ %d ]원 입니다.\n\n", BUser[i].name, BUser[i].account, BUser[i].balance);
    			break;
    		}
    	}
    }

     

    코딩도리 님께서 블로그에 올리신 코드 내용을 바탕으로 코드를 짰습니다.

     

    추가하면 좋을 것 같은 기능에는

     

    1. 비밀번호 입력하는 단계
    2. 만든 계좌 저장시키는 기능
    3. 계좌 삭제 기능
    4. 입출금 기록 저장 기능

    이 있습니다. 후에 비슷한 코드를 작성해야 한다면 이 코드도 같이 수정하면 좋을 것 같네요!

     

    작성하면서 가장 오래 고민한 점은 scanf_s를 사용하면서 입력버퍼의 문제 인해 값들이 밀리는 것 이었습니다.

    그래서 %앞에 공백문자를 넣고, 같은 줄에 \n를 입력하면 오류가 발생하여 따로 printf() 를 활용하여 입력하는 방법으로 해결했습니다.

    ex)

    scanf_s(" %s", 변수);

    printf("\n");

    이 부분에서 아쉬웠던 점은 줄바꿈 문자를 따로 입력한 것입니다. 해결 방법을 찾아 다시 업로드 해보도록 하겠습니다 :)

     

     

Designed by Tistory.