C++. Exchange project


1.質問


アップルを販売する「業者」とアップルを購入する「顧客」との取引プロセスを実施する

2.目的

  • classによってオブジェクト(object)概念を理解する.
  • 構造(構造体)とクラスの違いを理解します.
  • オブジェクト間の動作をコードで表す.
  • ヘッダ/ソースファイルの分割を練習します.
  • 3.コード

  • Exchange.h(header file)
  • #pragma once
    
    /*Seller class - 상인 클래스*/
    class Seller
    {
    private: //정보 은닉
    // 멤버변수
    	int Price; // 사과 판매가(1개)
    	int Remain; // 보유 사과 개수
    	int Money; // 보유 금액
    	int Sel; // 판매 개수
    	int Paid; // 지불받은 금액
    
    public: // 외부 참조 가능
    	void Init(int price, int remain, int money); // 생성자 **함수**
    	int Getprice() const; // 판매금액 반환 함수, 하루 간 가격은 미변동 -> const선언
    	int Getpaid(); // 지불받은 금액 반환 함수
    // 거래를 통해 발생하는 멤버변수의 변동(재초기화) 과정을 수행하는 **거래함수**
    	bool Procedure(int pay); 
    	int Getsel(); // 판매 사과개수 반환함수
    	void Showinform(); // 상인정보 조회함수
    };
    
    /*Buyer class - 구매자 클래스*/
    class Buyer
    {
    private:
    	int Money; // 보유 금액
    	int Gain; // 보유 사과 개수
    
    public:
    	void Init(int money); // 생성자 함수
    // 거래함수 : 거래과정 멤버변수의 재초기화를 수행하는 함수(변동 저장)
    	void Procedure(Seller & merchant); 
    // 구매자 정보 조회함수
    	void Showinform();
    };
  • Exchange.cpp(source file)
  • #include "apple.h"
    #include<iostream>
    using namespace std;
    
    /*Seller class*/
    /*생성자 함수*/
    void Seller::Init(int price, int remain, int money)
    {
    // 입력받은 인자값으로 멤버변수 초기화1
    	Price = price; 
    	Remain = remain;
    	Money = money;
    }
    
    /*지급받은 금액 반환함수*/
    int Seller::Getprice() const
    {
    	return Price;
    }
    
    /*거래함수 - boolean type*/
    bool Seller::Procedure(int paid)
    {
    	if (paid <= Getprice()) // 최소 지불 금액 설정 - 사과 하나의값보다 지불받은 금액이 적을 시 
    	{
    // 경고문구
    		cout << Getprice() << "원 이상의 금액을 지불하십시오." << endl;
    // 반환 1, 거래중지
    		return false;
    	}
    // 입력받은 인자값으로 멤버변수 초기화2
    	Paid = paid;
    	Sel = paid / Getprice();
    // 일부 멤버변수 **재**초기화
    	Remain -= Sel;
    	Money += paid;
    // 반환 2, 거래완료
    	return true;
    }
    
    /*지급받은 금액 반환함수*/
    int Seller::Getpaid()
    {
    	return Paid;
    }
    /*판매한 사과개수 반환함수*/
    int Seller::Getsel()
    {
    	return Sel;
    }
    /*판매자 정보조회 함수*/
    void Seller::Showinform()
    {
    	cout << "보유 사과 개수 : " << Remain << endl;
    	cout << "보유 금액 : " << Money << endl;
    }
    
    /*Buyer class*/
    /*생성자 함수*/
    void Buyer::Init(int money)
    {
    // 입력받은 인자로 멤버변수 초기화
    	Money = money;
      Gain = 0; // 최초 보유 사과개수 0개
    }
    
    /*거래함수*/
    void Buyer::Procedure(Seller & merchant) // Seller 클래스 함수에 접근하기 위해 객체 참조
    {
    	if (merchant.Procedure()) // **"거래완료" 시에만** 고객 보유금액의 재초기화
      {
        Money -= merchant.Getpaid(); // 구매자 보유액 재초기화
      }
        Gain = merchant.Getsel(); // 구매자 보유 사과개수 재초기화
    }
    
    /*구매자 정보조회 함수*/
    void Buyer::Showinform()
    {
    	cout << "고객 잔여 금액 : " << Money << endl;
    	cout << "고객 보유 사과 수 : " << Gain << endl;
    }
  • main.cpp
  • #include "Exchange.h"
    #include <iostream>
    using namespace std;
    
    int main()
    {
    // 차례로 지불금액 / 사과 가격 / 팔리고 남은 사과개수 / 상인보유금 / 구매자보유금 변수 
    	int PayMoney, appleprice, appleremain, Mpropert, Cpropert;
    	Seller merchant; // Seller클래스 객체 생성 - 상인 
    	Buyer customer; // Buyer클래스 객체 생성 - 고객
    // 변수 초기화
    	cout << "<상인 정보 입력>" << endl << "오늘의 사과 금액 : ";
    	cin >> appleprice;
    	cout << "상인 보유 사과 개수 : ";
    	cin >> appleremain;
    	cout << "상인 초기 자산 금액(원) : ";
    	cin >> Mpropert;
    	cout << "\n\n<구매자 정보 입력>" << endl;
    
    // 입력된 변수값을 인자로 하여 Seller생성자 함수를 호출, 객체 멤버변수를 초기화한다.
    	merchant.Init(appleprice, appleremain, Mpropert);
    // 구매자 정보 입력 
    	cout << "구매자 보유 금액(원) : ";
    	cin >> Cpropert; \
    // 입력된 변수값을 인자로 하여 Buyer생성자 함수 호출, 객체 멤버변수 초기화
    	customer.Init(Cpropert);
    // 고객 지불금액 입력
    	cout << "고객이 지불할 금액을 입력하시오 : ";
    	cin >> PayMoney;
    // Seller클래스의 거래함수 호출
    	merchant.Procedure(PayMoney);
    // Buyer클래스의 거래함수 호출
    	customer.Procedure(merchant);
    
    // 거래 후 상인-고객 각각의 정보조회 함수 호출
    	cout << "\n<거래 후 상인 정보>\n" ;
    	merchant.Showinform();
    	cout << "\n<거래 후 구매자 정보>\n" ;
    	customer.Showinform();
    	return 0;
    }

    4.結果

  • 正常
  • 非正常(支払)

  • 5.難しいところ/感じ


  • 難点
    Cからファイルを分離する方法を完全に把握していないので、この部分は少し苦労しました.また,新たに学習したクラス概念を実際に用いた場合にも,試行錯誤を数回経験した.

  • に感銘を与える
    オブジェクトを生成できる「クラス」の全体的な構造と各構文の役割を全面的に理解しました.