#include <iostream>
using namespace std;
class Point
{
private:
int x;
int y;
public:
bool InitMembers(int xpos,int ypos);
int GetX() const;
int GetY() const;
bool SetX(int xpos);
bool SetY(int ypos);
};
bool Point::InitMembers(int xpos, int ypos)
{
if(xpos<0 || ypos<0)
{
cout<<"벗어난 범위의 값 전달"<<endl;
return false;
}
x=xpos;
y=ypos;
return true;
}
int Point::GetX() const
{
return x;
}
int Point::GetY() const
{
return y;
}
bool Point::SetX(int xpos)
{
if(0>xpos || xpos>100)
{
cout<<"벗어난 범위의 값 전달"<<endl;
return false;
}
x=xpos;
return true;
}
bool Point::SetY(int ypos)
{
if(0>ypos || ypos>100)
{
cout<<"벗어난 범위의 값 전달"<<endl;
return false;
}
y=ypos;
return true;
}
class Rectangle
{
private:
Point upLeft;
Point lowRight;
public:
bool InitMembers(const Point &ul, const Point &lr);
void ShowRecInfo() const;
};
bool Rectangle::InitMembers(const Point &ul, const Point &lr)
{
if(ul.GetX()>lr.GetX() || ul.GetY()>lr.GetY())
{
cout<<"잘못된 위치정보 전달"<<endl;
return false;
}
upLeft=ul;
lowRight=lr;
return true;
}
void Rectangle::ShowRecInfo() const
{
cout<<"좌 상단: "<<'['<<upLeft.GetX()<<",";
cout<<upLeft.GetY()<<']'<<endl;
cout<<"우 하단: "<<'['<<lowRight.GetX()<<",";
cout<<lowRight.GetY()<<']'<<endl<<endl;
}
int main(void)
{
Point pos1;
if(!pos1.InitMembers(-2,4))
cout<<"초기화 실패"<<endl;
if(!pos1.InitMembers(2,4))
cout<<"초기화 실패"<<endl;
Point pos2;
if(!pos2.InitMembers(5,9))
cout<<"초기화 실패"<<endl;
Rectangle rec;
if(!rec.InitMembers(pos2,pos1))
cout<<"직사각형 초기화 실패"<<endl;
if(!rec.InitMembers(pos1,pos2))
cout<<"직사각형 초기화 실패"<<endl;
rec.ShowRecInfo();
return 0;
}
실행결과:
벗어난 범위의 값 전달
초기화 실패
잘못된 위치정보 전달
직사각형 초기화 실패
좌 상단: [2, 4]
우 하단: [5, 9]
(위 소스는 한치의 오차도 없이 교재에 있는 글자 그대로 옮긴 것임을 밝힙니다.)
윤성우 열혈 c++ 153~157쪽에 나와있는 분할된 소스를 하나로 다 합친건데요
제가 초짜라 그런것 같은데 메인 함수에서 멤버함수를 호출하는 부분이 이해가 안가네요
초기화 실패??? 좌상단 우하단 모두 제대로 값이 잘들어갔는데 소스는 왜 초기화 실패라고 쓰여있는건가여??
그리고 InitMember 함수의 return 값은 0 아니면 1일 텐데
if(!0) 이나 if(!1)은 도대체 뭔가요??? if문에다가 저렇게도 쓸 수 있나요???
윤성우 열혈 c++프로그래밍 가지고 계신 분들 153~157쪽 도움좀 구해봅니다 ㅠㅠㅠㅠ
left =< right / top =< bottom
상식을 깨십시요 프로그래밍은 창조의 분야입니다. 고정관념은 독입니다. if 문 조건에 이런것도 들어갈수 있지 않을까 ? 하고 생각하십시요 ...
일단 Main 함수부터 천천히 보면 쉽게 알수 있습니다. 메모리 개념을 조금 아셔야 하는데 class Point 는 일단 틀만 만들어놓은것이고 Point pos1; 이라고 한순간 메모리에 pos1 이라는 이름의 class Point 가 생성된 것입니다.
그다음 if 문이 나오는군요 여기서 주의 해야할것은 if 문의 조건문은 어떨때 실행되느냐 이겠죠 ? if 문은 0을 제외한 어떤숫자가 오던간에 아래의 조건을 실행시킵니다 . 그렇기 때문에 !0 ( !false ) 의 의미를 "논리적" 으로 생각해보면 " 0 이 아니다 " 이뜻이 됩니다. 즉 거짓이 아니다 이런뜻이 되죠 다시말해 참 ( true) 가 됩니다. 그렇기 때문에 아래의 조건이 실행이 되겠지요? !1 은 생각을 조금 해봐야 합니다 . " 1이 아니다 " 1이 아니라면 2가될수도 있고 3이 될수도 있고 1억이 될수도 있습니다. 0만 아니면 참( true ) 이기때문에 언뜻보면 이조건도 참(true) 로 볼수 있지만 , 컴파일러는 " 진실(true) 이 아니다 " 로 받아들입니다. 진실이 아니기때문에
당연히 !1의 값은 " 거짓( false ) " 가 됩니다. 그러므로 !1 의 조건은 실행이 되지 않겠지요 .
본격적으로 if(!pos1.InitMembers(-2,4)) cout<<"초기화 실패"<<endl; 이부분을 보면 if(xpos<0 || ypos<0) { cout<<"벗어난 범위의 값 전달"<<endl; return false; } 인데요 , ( -2 < 0 || 4 < 0 ) 입니다.
이논리연산의 결과는 true 가 되지요? 그렇기 때문에 실행결과 맨첫번째부분에서 "벗어난 범위의 값 전달" 이 뜹니다. 그러고 나서 false( 0 ) 을 반환하고 함수를 종료 합니다. 그아래의 x=xpos;y=ypos; return true; 는 무시한체로 말이죠
그럼 다시 if(!pos1.InitMembers(-2,4)) cout<<"초기화 실패"<<endl; 이부분으로 오면 if ( ! 0 ) { cout << "초기화 실패 " << endl; } 이 됩니다 . 다시문법을 풀어보면 if ( true ) { cout << "초기화 실패 " << endl;} 가 되게 됩니다. 그렇다면 if 의 조건이 true 가 되기 때문에 당연히 아래의 조건이 실행 되겠지요 그러므로 실행결과 두번째줄에 " 초기화 실패 " 가 뜨게 되는것입니다.
눈팅족// 역시 위대하신 프갤러님들... 감사합니다 ㅠㅠ