[문제]
아래의 코드에는 두 가지 문제가 있다.
1) 점의 좌표는 0이상 100이하가 되어야 하는데, 잘못된 값이 들어오는 것을 막을 수 없다.
2) 직사각형을 의미하는 Rectangle 객체의 좌 상단과 우 하단의 좌표 값이 바뀌는 것에 대한 대책이 없다.
아래의 코드와 변경된 main문 그리고 실행결과를 참고하여 위의 두 가지 문제점을 해결하는 코드를 작성하라.
조건1) 파일을 Point.h, Point.cpp, Rectangle.h, Rectangle.cpp, main.cpp로 분활하라.
조건2) const 함수를 선언할 것
#include<iostream>
using namespace std;
class Point
{
public:
int x; // x좌표의 범위는 0이상 100이하
int y; // y좌표의 범위는 0이상 100이하
};
class Rectangle
{
public:
Point upLeft;
Point lowRight;
public:
void ShowRecInfo()
{
cout << "좌 상단: " << '[' << upLeft.x << ", ";
cout << upLeft.y << ']' << endl;
cout << "우 하단: " << '[' << lowRight.x << ", ";
cout << lowRight.y << ']' << endl;
}
};
int main(void)
{
Point pos1 = { -2, 4 };
Point pos2 = { 5, 9 };
Rectangle rec = { pos2, pos1 };
rec.ShowRecInfo();
return 0;
}
[변경된 main]
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]
[코드]
<Point.h>
#ifndef __POINT_H__
#define __POINT_H__
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);
};
#endif
<Point.cpp>
#include<iostream>
#include "Point.h"
using namespace std;
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 (xpos < 0 || xpos > 100) {
cout << "벗어난 범위의 값 전달" << endl;
return false;
}
x = xpos;
return true;
}
bool Point::SetY(int ypos)
{
if (ypos < 0 || ypos > 100) {
cout << "벗어난 범위의 값 전달" << endl;
return false;
}
y = ypos;
return true;
}
<Rectangle.h>
#ifndef __RECTANGLE_H__
#define __RECTANGLE_H__
#include "Point.h"
class Rectangle
{
private:
Point upLeft;
Point lowRight;
public:
bool InitMembers(const Point& ul, const Point& lr);
void ShowRecInfo() const;
};
#endif
<Rectangle.cpp>
#include<iostream>
#include"Rectangle.h"
using namespace std;
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.GetY() << ", ";
cout << lowRight.GetY() << ']' << endl;
}
<참고>
윤성우의 열혈 C++ 프로그래밍
'C++ 언어 > 연습문제' 카테고리의 다른 글
C++ 언어 연습문제16 (0) | 2022.10.18 |
---|---|
C++ 언어 연습문제15 (0) | 2022.10.14 |
C++ 언어 연습문제13 (0) | 2022.09.28 |
C++ 언어 연습문제12 (0) | 2022.09.27 |
C++ 언어 연습문제11 (0) | 2022.09.27 |