(난이도 : 下)
#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개인 기본 생성자
(난이도 : 上)
#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)