Tag Archives: homework

연습문제 – Ex3

 

1142518796.hwp
연습문제 (3)







□ 단원 : MFC 구조 & 화면 출력

□ 목표 : MFC CObject 기반 클래스 생성 & 화면 출력

□ 주요 연습 내용 : CObject, CBitmap, CPen, Rectangle, Line, DrawText

□ 준비자료 : SimpleCObject.zip (Account.cpp, Account.h, ChildView.cpp,

                    ChildView.h, MainFrm.cpp, MainFrm.h, Simple.cpp, Simple.h,

                    stdafx.cpp, stdafx.h)




[연습문제]


연습문제 Ex3 (Due by 10/31 수 22시까지)


-cyber 강의실 (cyber.dku.edu)로 source code, executable file, solution/project VC++ 2005 file, 보고서를 학번_이름_Ex3.zip으로 묶어서 낼 것. 보고서 (30%)


-일단 6개~10개 정도의 데이터를 넣어서 출력을 하고, 추가로 데이터를 더 입력하거나 삭제하면 자동적으로 테이블 새로 변형되게 만들어지도록 할 것.
-추가로 CPen, CBrush, CFont의 속성을 바꾸어서 추가 (extra 10%)


0. 생성한 프로그램의 메인 프레임의 Title을 “HCI2_Ex3_이름_학번”으로 바꾼다. (예: Resource View에서 String Table의 IDR_MAINFRAME에 Caption을 “HCI2_Ex3_<이름>_<학번>”으로 하면 됨)




1. CPerson 클래스를 새로 생성한다. (10%)


-모든 변수명 지정 시 헝가리언 표기법을 사용한다 (예: CString m_strName).


-멤버 변수: ID, 성명 (FirstName & LastName), 전화번호, 주소


-멤버 함수:


디폴트 생성자, 파라메터로 입력받는 생성자,


GetID(), GetFirstName(), GetLastName(), GetPhone(), GetAddress(),


SetID(int), SetFirstName(CString), SetLastName(CString), SetPhone(CString), SetAddress(CString),


operator=(const CPerson& other), operator==(const CPerson& other)




2. 첨부된 CAccount 클래스에 다음을 추가한다.  (10%)


– 모든 변수명 지정 시 헝가리언 표기법을 사용한다.


– CAccount 클래스에 예금주이름을 (즉, CString m_strUserName) 없애고 대신 CPerson 형으로 (즉, CPerson m_User) 바꾼다. 그에 따른 Set, operator== 함수도 바꾼다.


– CAccount 클래스 Show 함수에 cout으로 출력하는 것을 TRACE로 바꾼다.


– CAccount 클래스에 이름(LastName + FirstName), 예금종류, 계좌번호, 잔고를 화면에 출력하는 void DrawText(CPaintDC& dc, int x, int y, int width, int height) 함수를 추가한다. dc는 dc.DrawText(HDC, LPCTSTR, int, LPRECT, UINT) 함수를 사용하는데 쓰일 것이고, x, y는 화면에 출력할 지점, width는 이름,예금종류, 계좌번호, 잔고를 출력할 사이 간격, height는 출력할 텍스트의 높이. DrawText는 http://msdn2.microsoft.com/en-us/library/ms533909.aspx 참고할 것.


– CAccount 클래스에 이름(LastName + FirstName), 예금종류, 계좌번호, 잔고를 CString의 배열(CString m_strAccountString[4])로 만들어서 넘겨주는 CString* GetAccountStringList() 함수를 추가한다.




3. Ex2의 AccountManager 클래스를 CAccountManager로 바꾼다. (10%)


– 모든 변수명 지정 시 헝가리언 표기법을 사용한다.


– 모든 함수에 Account 클래스 대신 CAccount 클래스로 바꿔준다.


– 모든 CAccount의 DrawText를 불러서 화면에 출력해 주는 void DrawText(CPaintDC& dc, int x, int y, int width, int height) 함수를 추가한다.




4. CChildView::OnPaint()에서 10개 정도의 CAccount의 상태를 리스트 모양으로 화면에 출력한다. (Line, Rectangle, DrawText를 이용할 것) (30%)




void CChildView::OnPaint()         // 예시


{


        CPaintDC dc(this);




        // 중간 생략 …




        CPerson dog, cat;


        dog.Set(1, “아지, “강, “041-550-4469”, “제과학관);


        cat.Set(2, “양이, “고, “041-550-4470”, “제과학관);


        CAccount account[10];


        account[0].Set(dog, “닷컴통장, “27394-27-46517”, 50000);


        account[1].Set(dog, “저축통장, “12394-47-46517”, 10000);


        account[2].Set(cat, “보통통장, “17394-72-46517”, 1000);


        account[3].Set(cat, “투자신탁, “67941-11-46517”, 2000);


        account[4].Set(dog, “보통통장, “12341-78-46517”, 2000);


        account[5].Set(cat, “닷컴통장, “98765-12-46517”, 2000);




        CAccountManager manager;


        for (int i=0; i<6; i++)


                manager.Add(account[i]);


        manager.Show();




        int width = 90;


        int height = 30;


        int numElement = manager.GetSize();




        // 회색배경 굵은선


        dc.SelectStockObject(LTGRAY_BRUSH);


        CPen penThick(PS_SOLID, 2, RGB(0, 0, 0));


        dc.SelectObject(&penThick);


        dc.Rectangle(CRect(10, 10, 10 + 4*width, 10 + height));


        // 굵은선으로 테이블 모양을 추가할 것


        // …




        // 보통선으로 가로선 더 추가할 것


        // …




        // 보통선으로 세로선 더 추가할것


        // …




        // 보통글자로 Title 출력


        CString strTitle[] = {


                “이름, “계좌종류, “계좌번호, “잔액


        };


        dc.SelectStockObject(SYSTEM_FONT);


        dc.SetBkMode(TRANSPARENT);


        for (int i = 0; i < 4; i++)


        {


                dc.DrawText(strTitle[i], strTitle[i].GetLength(),


                        CRect(10 + i*width, 10, 10 + (i + 1)*width, 10 + height),


                        DT_CENTER|DT_VCENTER|DT_SINGLELINE);


        }




        // Account 화면출력


        manager.DrawText(dc, 10, 40, width, height);


}




5. CChildView::OnPaint()에 Bitmap 그림을 화면에 출력한다. (10%)




[참고] 출력화면 예시


 사용자 삽입 이미지



연습문제 – Ex2

 연습문제 Ex2 (Due by 10/5 금 22시까지) – CString, CArray 연습
1079360745.zip

연습문제 Ex2 (Due by 10/5 금 22시까지)


-cyber 강의실 (cyber.dku.edu)로 source code, executable file, solution/project VC++ 2005 file, 보고서를 학번_이름_Ex2.zip으로 묶어서 낼 것. 보고서 (30%)




[연습문제]


1. 은행 계좌를 나타내는 Account 클래스에 CString 관련 내용을 추가한다. (25%)


예금주이름 (accountUser)을 CString 형으로 바꿈


– 계좌명 (accountName)를 CString 형으로 매개변수를 추가함 (계좌명의 예시: 닷컴통장, 저축예금, 보통예금, 투자신탁 등을 넣을 수 있음)


– Account의 생성자에 예금주 계좌명 처리 추가함


– Account에 계좌명을 반환하는 CString GetAccountName() const 함수를 추가함


– Account의 상태출력 멤버함수 void Show()에 계좌명 처리 추가함. cout 할 때 CString 형에 맞게 (LPCSTR) 연산자를 명시적으로 적용함.


– Account의 윈도우나 메시지 박스에 문자를 바로 출력할 수 있는 상태출력 멤버함수 CString GetAccount() const 함수를 추가함.  (출력 문자열 예시: “예금주: 박아무개 계좌명: 닷컴통장 계좌번호: 12345-72-34567 잔액: 5000”)




2. Account 목록을 CArray로 구성하고, Account를 입력, 출력을 관리하는 AccountManager 클래스를 작성한다. (25%)


– private 멤버로 CArray<Account, Account&> aList를 가짐


– 소멸자는 모든 Account를 리스트에서 제거함


– Add() 함수는 Account를 리스트에 추가함


– Remove(int i) 함수는 i번째 Account를 리스트에서 제거함


– RemoveAll() 함수는 모든 Account를 리스트에서 제거함


– GetSize() const 함수는 Account가 리스트에 몇 개 있는지를 알려줌


– Show() 함수는 모든 Account의 Show()를 사용하여 예금 내용을 출력함




3. main.cpp에서 AccountManager 목록에 10개의  Account를 추가하고 난 후, 다음을 수행한다. (20%)


– 먼저, 리스트에 몇 개의 Account가 있는지 출력. GetSize() 함수 사용


– 그리고, 리스트에 있는 모든 예금 내용(즉, 예금주 이름, 예금 계좌명, 계좌 번호, 잔액)을 출력. Show() 함수 사용


– 3번째 Account를 리스트에서 지우고 리스트에 있는 모든 예금 내용 (예금주 이름, 예금 계좌명, 계좌 번호, 잔고)을 출력. Remove(index)와 Show() 함수를 사용


– cin으로 예금주이름, 계좌명, 계좌번호, 잔액을 입력받고 새로운 Account를 생성 후, Account 클래스의 GetAccount() 멤버함수를 이용하여 새로 만든 은행계좌의 내용을 MessageBox(NULL, (LPCSTR)str, “CString 연습“, MB_OK)를 이용하여 출력.



연습문제 – Ex0 답안예시

Account.h


[#M_ more.. | less.. |#ifndef __ACCOUNT_H__
#define __ACCOUNT_H__

class Account
{
public:
 Account(char*, char*, int);
 Account();
 ~Account();
 void Show();
 void Deposit(int);
 void Withdraw(int);

private:
 char* accountUser;  // 예금주 이름
 char* accountNumber; // 계좌 번호
 int accountBalance;  // 잔액
};

#endif
_M#]

Account.cpp


[#M_ more.. | less.. | 
#include “Account.h”
#include <iostream>
using namespace std;

//생성자.
Account::Account()
{
 accountUser = new char[20];
 accountNumber = new char[20];
 accountBalance = 0;
 
 strcpy(accountUser,”수애”);
 strcpy(accountNumber, “27459-47-372671”);
 accountBalance = 2000;
}

//파라메터로 전달된 값으로 초기화.
Account::Account(char* user, char* number, int money)
{
 accountUser = new char[20];
 accountNumber = new char[20];
 accountBalance = 0;

 strcpy(accountUser, user);
 strcpy(accountNumber, number);
 accountBalance = money;
}

Account::~Account()
{
 delete [] accountUser;
 delete [] accountNumber;
}

//예금주의 이름, 계좌 번호, 잔액을 출력
void Account::Show()
{
 cout<<“이    름: “<< accountUser << endl;
 cout<<“계좌번호: “<< accountNumber << endl;
 cout<<“잔    액: “<< accountBalance <<endl << endl;
}


//전달인자로 전달된 금액을 입금
void Account::Deposit(int money)
{
 cout << money << “원을 입금하셨네요.” << endl;
 accountBalance +=  money;
 cout<<“잔    액: ” << accountBalance << endl << endl;
}

//전달인자로 전달된 금액을 출금
void Account::Withdraw(int money)
{
 cout << money <<“원을 출금하셨네요.”<< endl;
 accountBalance = accountBalance – money;
 cout<<“잔    액: “<< accountBalance << endl << endl;
}
_M#]

main.cpp


[#M_ more.. | less.. | 
#include <iostream>
#include “Account.h”

using namespace std;

int main(void)
{
 Account a;  // Default 객체를 생성
 a.Show();
 a.Deposit(1000);
 a.Withdraw(500);
 a.Show();

 Account b(“Park”, “27394-27-46517”, 50000); //인자로 전달해 준 값으로 객체를 생성
 b.Show();
 b.Deposit(1000);
 b.Withdraw(500);
 b.Show();

 // account c – 키보드로 입력받아서 객체 생성하고 입금, 출금, 출력할 것
 Account *c;
 // 키보드로 부터 입력받은 은행 계좌 예금주 이름, 계좌번호, 잔액을 넣어서 c를 새로 생성할 것
 char user[20], number[20];
 int balance;
 cout << “Enter account user name: “;
 cin >> user;
 cout << “Enter account account number: “;
 cin >> number;
 cout << “Enter account balance: “;
 cin >> balance;
 c = new Account(user, number, balance);
 // 키보드로 입력받은 은행계좌에 10000을 입금할 것
 c->Deposit(10000);
 // 키보드로 입력받은 은행계좌에 5000을 출금할 것
 c->Withdraw(5000);
 // 키보드로 입력받은 은행계좌 값을 출력할 것
 c->Show();

 // account d – 원하는 내용을 더 추가하거나 해서 테스트해볼 것
 Account *d;

 return 0;
}
_M#]