[C++] 씹어먹는 C++ - <4 - 2. 함수의 오버로딩, 생성자>

Kim Dongil·2022년 11월 26일
0

C++

목록 보기
2/23

1. Date 클래스에 여러가지 생성자들을 추가해보세요

(난이도 : 下)

#include <iostream>

class Date {
	int year_;
	int month_;  // 1 부터 12 까지.
	int date_;    // 1 부터 31 까지.

public:
	Date() { // 기본 생성자 호출
		year_ = 2022;
		month_ = 11;
		date_ = 26;
	}
	Date(int year, int month, int day) { // 인자 3 개인 생성자 호출
		year_ = year;
		month_ = month;
		date_ = day;
	}
	void AddDay(int inc) {
		date_ += inc;
		if (month_ == 2 && date_ > 28) {
			AddMonth(1);
			date_ -= 28;
			AddDay(0);
		}
		if (month_ == 4 || month_ == 6 || month_ == 9 || month_ == 11 && date_ > 30) {
			AddMonth(1);
			date_ -= 30;
			AddDay(0);
		}
		if (month_ == 1 || month_ == 3 || month_ == 5 || month_ == 7 || month_ == 8 || month_ == 10 || month_ == 12 && date_ > 31) {
			AddMonth(1);
			date_ -= 31;
			AddDay(0);
		}
	}
	void AddMonth(int inc) {
		month_ += inc;
		if (month_ > 12) {
			AddYear(1);
			month_ -= 12;
			AddMonth(0);
		}
	}
	void AddYear(int inc) {
		year_ += inc;
	}
	void ShowDate() {
		std::cout << year_ << month_ << date_ << std::endl;
	}
};

int main() {
	int year, month, day;

	std::cout << "year, month, date 값 입력 : " << std::endl;
	std::cin >> year >> month >> day;

	// Date date; 위에 인자 3개를 받는것과 상관없이 기본 생성자 호출
	Date date(year, month, day); // 인자가 3개인 기본 생성자 호출
	date.ShowDate();

	while (1) {
		int input1, input2;
		std::cout << "1. day 추가 \n" << "2. month 추가 \n" << "3. year 추가 \n";
		std::cin >> input1;
		std::cout << "얼마나 추가하시겠습니까? \n";
		std::cin >> input2;

		switch (input1) {
		case 1:
			date.AddDay(input2);
			break;
		case 2:
			date.AddMonth(input2);
			break;
		case 3:
			date.AddYear(input2);
			break;
		}

		date.ShowDate();
	}
	return 0;
}

setdate 함수를 없애고 생성자 2개를 만들었다.
1. 현재 작성중인 날짜 2022.11.16 날짜를 가진 기본 생성자
2. 인자가 3개인 기본 생성자

2. 수학 관련 소프트웨어를 만드는 회사에서 의뢰가 들어왔습니다. 중학생용 기하학 소프트웨워를 만드는 것인데요, 클래스는 총 두 개로 하나는 Point 로 점에 관한 정보를 담는 것이고 다른 하나는 Geometry 로 점들을 가지고 연산을 하는 클래스 입니다. 즉 아래와 같은 두 클래스의 함수들을 모두 정의하세요

(난이도 : 上)

#include <iostream>
#include <cmath>

class Point {
	int x, y;

public:
	Point(int pos_x, int pos_y) {
		x = pos_x;
		y = pos_y;
	}

	int GetX() { return x; }
	int GetX() const { return x; }
	int GetY() { return y; }
	int GetY() const { return y; }
};

class Geometry {
	Point* point_array[100];	// 점 100개를 보관하는 배열
	int num_points;
public:
	Geometry() {
		num_points = 0;
	}

	void AddPoint(const Point& point) {
		point_array[num_points++] = new Point(point.GetX(), point.GetY());
	}

	// 모든 점들 간의 거리를 출력하는 함수입니다.
	void PrintDistance();

	// 모든 점들을 잇는 직선들 간의 교점의 수를 출력해주는 함수입니다.
	void PrintNumMeets();

	// point1과 point2를 잇는 직선의 방정식에 insert를 집어넣은 값 출력
	int InsertLineToPoint(const Point* point1, const Point* point2, const Point* insert);
};

void Geometry::PrintDistance() {
	for (int i = 0; i < num_points - 1; i++) {
		for (int j = i + 1; j < num_points; j++) {
			std::cout << i + 1 << "번째 점과 " << j + 1 << "번째 점 사이의 거리는 "
				<< sqrt(pow(point_array[i]->GetX() - point_array[j]->GetX(), 2) + pow(point_array[i]->GetY() - point_array[j]->GetY(), 2))
				<< "입니다." << std::endl;
		}
	}
}

int Geometry::InsertLineToPoint(const Point* point1, const Point* point2, const Point* insert) {
	return (point1->GetX() - point2->GetX()) * (insert->GetX() - point1->GetX()) - (point1->GetY() - point2->GetY()) * (insert->GetY() - point1->GetY());
}

void Geometry::PrintNumMeets() {
	int cnt = 0;

	if (num_points <= 3) {
		std::cout << "점이 부족하여 교점이 없습니다." << std::endl;
		return;
	}


	for (int i = 0; i < num_points - 3; i++) {
		for (int j = i + 1; j < num_points - 2; j++) {
			for (int k = j + 1; k < num_points - 1; k++) {
				for (int l = k + 1; l < num_points; l++) {
					if (InsertLineToPoint(point_array[i], point_array[j], point_array[k]) * InsertLineToPoint(point_array[i], point_array[j], point_array[l]) <= 0)
						cnt++;
				}
			}
		}
	}

	std::cout << "교점은 총 " << cnt << "개 입니다." << std::endl;
}



int main() {
	// 테스트
	Point pos1(1, 2), pos2(3, 1), pos3(-1, -4), pos4(5, 2);
	Geometry Geo;
	Geo.AddPoint(pos1);
	Geo.AddPoint(pos2);
	Geo.AddPoint(pos3);
	Geo.AddPoint(pos4);

	Geo.PrintDistance();
	Geo.PrintNumMeets();

	return 0;
}

씹어먹는 C++ - <4 - 2. 클래스의 세계로 오신 것을 환영합니다. (함수의 오버로딩, 생성자)>
C++ Chapter 8.3 : 생성자
[C++ Basic] 수학 함수(cmath)

0개의 댓글

관련 채용 정보