프로그램 설계 ¶
í�´ëž˜ìФ 나누기 ¶
- ë¨¼ì € ìž�íŒ�기(VendingMachine)ì�´ í•„ìš”í• ê²ƒì�´ê³ ,
- 주문하는 사람(Man)ë�„ 있어야 í• ê²ƒì�´ë‹¤..
- ìž�íŒ�기는 사용ìž� ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ 구현하는ë�° ì‚¬ìš©í•˜ê³ , 사람ì�´ ì£¼ë¬¸í• ì�Œë£Œ(Drink)를 따로 분류하ìž�..
- 그러면 주문ì�„ í• ë•Œ ë�ˆì�´ 필요하니까 ë�ˆì�„ 세는 계수기 비슷한 것(CoinCounter)ë�„ í•„ìš”í• ê²ƒ 같다..^^
ì—í• ë¶„ë‹´í•˜ê¸° ¶
- ë¨¼ì € ìž�íŒ�기ì�˜ ì—í• ì�„ ë³´ìž�..... ìž�íŒ�기는 ë¨¼ì € 메뉴를 사람ì—�게 보여줄 수 있어야 ë� 꺼얌...
- ê·¸ë¦¬ê³ ì‚¬ëžŒì�€ 메뉴를 ë³´ê³ ê°� 메뉴ì—� 알맞ì�€ ëª…ë ¹ì�„ 내릴 수 있어야 í• ê²ƒì�´ê³ ...
- ì�Œë£Œê°€ í•´ì•¼í• ì�¼ì�€ ë�ê°€ 있ì�„까?
ë¨¼ì € ìž�ì‹ ì�˜ ìƒ�태(품목,가격,수량)ì�„ ê¸°ì–µí•˜ê³ ì‚¬ëžŒì—�게 보여줄 수 ìžˆì–´ì•¼ê² ì§€...
ê·¸ë¦¬ê³ ì‚¬ëžŒì�´ 주문ì�„ í–ˆì�„ 때 주문받ì�€ ìƒ�í’ˆì�˜ 가격ì—� 비해 잔액ì�´ 충분한지 확ì�¸ 하는 것 하구..... / 계수기
ë˜� 주문받ì�€ ìƒ�í’ˆì�´ 남아있는지ë�„ ì²´í�¬í•´ì•¼ ë� 꺼야!!^^
ì�´ ë‘�가지 ì¡°ê±´ì—� ë§Œì¡±í• ë•Œì—�는 주문한 ìƒ�í’ˆì�„ 내줄 수 있어야 í•˜ê² ê³ , ì�´ 때 ìƒ�í’ˆì�˜ 수량ì�„ ê°±ì‹ í•´ì•¼ê² ì§€!^^
- í� .. ê·¸ë¦¬ê³ ê³„ìˆ˜ê¸°ì�˜ ì—í• ì�„ 한번 볼까? ì�´ë…€ì„�ì�€ ë¨¼ì € 잔액ì�„ 기억해서 보여주어야 í• ê²ƒì�´ê³ ..
사람ì�´ 투입한 ë�ˆì�´ 형ì‹�ì—� 맞는지(10,50,100,500,1000ì›�) 확ì�¸í•´ì„œ 잔액ì�„ ëŠ˜ë ¤ì£¼ì–´ì•¼ í• ê²ƒì�´ê³ ,
사람ì�´ ë�ˆì�˜ 반환ì�„ 요구하면 ë�ˆì�„ êº¼ë‚´ì£¼ê³ ìž”ì•¡ì�„ 초기화 í• ìˆ˜ 있어야 í•˜ê² ì§€?^^
ì•„!! ê·¸ë¦¬ê³ ì£¼ë¬¸í•œ ì�Œë£Œì�˜ 가격ì—� ë”°ë�¼ 금액ì�„ 지불해주는 ì—í• ë�„ ìžˆì–´ì•¼ê² êµ°!^^
소스 ¶
~cpp
#include <iostream>
#include <cstring>
using namespace std;
int selection, num;
class Man{
public:
void select(){
selection = 0;
while (selection < 1 || selection > num){
cout << ">> ";
cin >> selection;
if (selection < 1 || selection > num)
cout << "잘못 ìž…ë ¥í•˜ì…¨ìŠµë‹ˆë‹¤. n";
}
};
};
class CoinCounter{
public:
int remainders, coin;
void resetCoins(){
remainders = 0;
};
void showRemainders(){
cout << "REMAINDERS : " << remainders << endl;
};
void insertCoins(){
cout << "�� 넣으세요.n 1. 10� n 2. 50� n 3. 100� n 4. 500� n 5. 1000� n>> ";
cin >> coin;
if (coin == 1) coin = 10;
else if (coin == 2) coin = 50;
else if (coin == 3) coin = 100;
else if (coin == 4) coin = 500;
else if (coin == 5) coin = 1000;
else coin = 0;
remainders += coin;
cout << coin <<"�� 넣으셨습니다. n잔액� " << remainders << "입니다.n";
};
void pay(int used){
cout << used << "�� 사용하셨습니다.n";
remainders -= used;
};
};
class VendingMachine{
public:
void showMenu(){
num = 4;
cout << "MAIN MENU n 1. INSERT COIN n 2. BUY n 3. RETURN THE REMAINDERS n 4. EXIT n";
};
};
class Drink{
public:
struct drinks{
char name[10];
int price;
int quantity;
};
drinks detail[3];
Drink(){
strcpy(detail[0].name, "사�다");
strcpy(detail[1].name, "콜�");
strcpy(detail[2].name, "2% 부족");
detail[0].price = 500;
detail[1].price = 400;
detail[2].price = 600;
for (int i = 0 ; i < 3 ; i++)
detail[i].quantity = 10;
};
void showDetails(){
num = 3;
cout << " �품명t 가격t 수량n";
for (int i = 0 ; i < 3; i++)
cout << i+1 << ". " << detail[i].name << "t"
<< detail[i].price << "t"
<< detail[i].quantity << endl;
};
int buy(int remainders){
if (remainders >= detail[selection - 1].price && detail[selection - 1].quantity != 0){
cout << detail[selection - 1].name << "ì�„ ì„ íƒ�하셨습니다.n";
detail[selection - 1].quantity--;
return detail[selection - 1].price;
}
else if (detail[selection - 1].price > remainders)
cout << "잔액� 부족합니다.n";
else if (detail[selection - 1].quantity == 0)
cout << "매진ë�˜ì—ˆìŠµë‹ˆë‹¤. 다른 ìƒ�í’ˆì�„ 골ë�¼ì£¼ì‹ì‹œì˜¤.n";
return 0;
};
};
int main(){
Man man;
CoinCounter coin_counter;
VendingMachine vending_machine;
Drink drink;
int usedmoney;
coin_counter.resetCoins();
while(selection != 4)
{
vending_machine.showMenu();
coin_counter.showRemainders();
man.select();
if (selection == 1)
coin_counter.insertCoins();
else if (selection == 2){
drink.showDetails();
man.select();
usedmoney = drink.buy(coin_counter.remainders);
coin_counter.pay(usedmoney);
}
else if (selection == 3){
cout << "잔액� 반환합니다.n";
coin_counter.resetCoins();
}
else if (selection == 4)
break;
else cout << "잘못 ìž…ë ¥í•˜ì…¨ìŠµë‹ˆë‹¤.n";
system("pause");
system("cls");
};
return 0;
}
ë§Œë“¤ê³ ë‚˜ì„œ.. ¶
- í�´ëž˜ìŠ¤ë¥¼ 너무 ë§Žì�´ 만들어서 괜히 복잡해졌다는 재ë�™ì�´ 형ì�˜ ì§€ì �ì�„ 받았습니다.
ì•„ì§� í�´ëž˜ìФ 사용법ë�„ ì œëŒ€ë¡œ 모르는지ë�¼ 서툴기ë�„ í•˜ê³ .. ê²°ë¡ ì�€ ì—시 ê³µë¶€í•´ì•¼í• ê²ƒì�´ 많다는 것...^^
- 지금까지는 안했었지만 대충� 구조는 �해�는 게 좋� 것 같습니다...^^
배우는 게 많아질수ë¡� 코드가 조금씩 ë³µìž¡í•´ì ¸ì„œ 나중ì—�는 못 알아볼지ë�„ 모르는 ìƒ�ê°�ì�´ 드는군요..^^
- ì�´ë²ˆì—” 프로그램 설계를 한글로 했지만 ì˜�어로 í•´ë³´ê³ ì‹¶ì�€ 욕심ì�´ ìƒ�기네엽..^^
(그럼 ê³µë¶€í• ì˜�ì—ì�´ 하나 ë�” 늘어나는건가...^^∂)
í�´ëž˜ìФ 수가 많아서 복잡해진건 아닌듯(모 VendingMachine ì�˜ 경우 Requirement 변경ì—� ë”°ë�¼ í�´ëž˜ìŠ¤ê°¯ìˆ˜ê°€ 10ê°œ ì�´ìƒ�ì�´ ë�˜ê¸°ë�„ 함; í�´ëž˜ìФ 수가 중요하다기보다ë�„ 최종 완료ë�œ 소스가 얼마나 명료해졌ëŠ�ëƒ�ê°€ 복잡ë�„를 ê²°ì •í•˜ë¦¬ë�¼ ìƒ�ê°�). 단, ì—í• ë¶„ë‹´í• ë•Œ ê°� í�´ëž˜ìŠ¤ë³„ ì—í• ì�´ 명료한지 ì‹ ê²½ì�„ 쓰는것ì�´ ì¢‹ê² ë‹¤. CoinCounter ì�˜ 경우 VendingMachine 안ì—� 멤버로 있어ë�„ 좋ì�„듯. CRC 세션ì�„ í• ë•Œ í�´ëž˜ìŠ¤ë“¤ì�´ ê°�ê°� 따로 존재하는 것 같지만, ì‹¤ì œë¡ ê·¸ í�´ëž˜ìŠ¤ë“¤ì�´ 서로를 í�¬í•¨í•˜ê³ 있기ë�„ í•˜ê±°ë“ . ë˜�는 해당 기능ì�„ 구현하기 위해 다른 í�´ëž˜ìŠ¤ë“¤ê³¼ 협ë�™í•˜ê¸°ë�„ í•˜ê³ (Collaboration. ì‹¤ì œ 구현시엔 다른 í�´ëž˜ìФì�˜ 메소드들ì�„ 호출해서 구현한다ë�˜ì§€ ì‹�ìž„). ì—í• ë¶„ë‹´ì�„ í•˜ê³ ë‚œ 다ì�Œ 모ì�˜ 시나리오를 ë§Œë“ ë’¤ 코딩해나갔다면 ì–´ë– í–ˆì�„까 하는 ìƒ�ê°�ë�„ 해본다. ì�´ 경우ì—�는 UnitTest 를 작성하는게 ì¢‹ê² ì§€. UnitTest 작성 & ì§„í–‰ì—� ëŒ€í•´ì„ ScheduledWalk/ì„�천 ì�˜ 중반부분ì�´ëž‘ UnitTest 참조.--1002
see also FifteenSecondsRule
----
CppStudy_2002_2 VendingMachine










