본문 바로가기

C++ 언어/연습문제

C++ 언어 연습문제14

[문제]

아래의 코드에는 두 가지 문제가 있다.
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