C++

    포르잔 C++ 바이블 ch12 연습문제 & 프로그래밍 문제

    연습 문제 1번 Base 클래스와 Base 클래스를 상속받는 Derived1과 Derived2 클래스가 있다고 합시다. 이 클래스를 다형성 관계로 활용하려고 합니다. 각 클래스에 가상 print 함수와 가상 소멸자가 있는 경우의 가상 테이블을 그림으로 표현하세요. 2번 다음과 같은 두 클래스가 있다고 합시다. 두 클래스가 다형성을 갖게 스택 메모리 위에 인스턴스화하는 코드를 작성하세요. 다형성을 활용한다는 것은 부모 클래스에 대한 포인터를 사용한다는 것입니다. 다만 객체의 실체를 스택 메모리에 만들어서 활용하라는 것이 문제의 포인트입니다. class First { private: int fr; public: First(int fr); virtual ~First(); virtual void print() ..

    포르잔 C++ 바이블 Ch.11 연습문제 & 프로그래밍 문제

    연습문제 1번 다음과 같이 2개의 클래스를 정의했을 떄, 위임(delegation)을 사용해서 두 클래스의 set 함수와 print 함수를 정의해주세요. //First 클래스 선언 class First { private: int a; public: void set(int a); void print() const; }; //Second 클래스 선언 class Second :public First { private: int b; public: void set(int a, int b); void print() const; }; 풀이. //First 클래스의 메소드 정의 void First::set(int a2) { First::a = a2; } void First::print() const { cout

    [C++] 생성자와 소멸자

    객체에는 특별한 멤버 함수인 생성자와 소멸자가 있다. 생성자가 호출되면 객체가 생성되고, 소멸자가 호출되면 객체가 정리된다. 생성자 생성자는 객체를 생성하는 멤버 함수이다. 생성자 내부에서 객체의 데이터 멤버를 초기화한다. 클래스를 정의할 때 멤버를 선언한다고 초기화가 이루어지는 것은 아니다. 선언 과정에서는 멤버의 이름과 자료형만 지정한다. 생성자는 1. 객체를 생성하고 데이터 멤버를 초기화하는 역할을 수행하므로 리턴값을 가질 수 없다. 2. 이름이 클래스의 이름과 같다. 3. 멤버를 초기화하려면 값을 변경해야 하므로 const 한정자를 붙일 수 없다. 4. 멤버 함수이므로 클래스 정의에서 선언해야 한다. class Circle { public: /*생성자*/ Circle(double radius);/..

    [C++] 클래스의 구조

    C++에서는 새로운 자료형(타입)을 만들 때 클래스(class)를 사용한다. 타입으로 클래스를 만들고, 이를 기반으로 인스턴스인 객체를 만든다. 클래스를 기반으로 인스턴스를 만드는 행위를 인스턴스화(instantiation)이라고 부른다. 객체 지향 프로그래밍에서는 속성과 행위를 선언하는 클래스 정의, 행위를 정의하는 멤버 함수 정의, 객체를 인스턴스화하고 사용하는 애플리케이션 구현이 필요하다. 클래스 작성하기 클래스 정의 #include using namespace std; //클래스 정의 class Circle { private: double radius; public: double getArea() const; void setRadius(double value); }; //멤버 함수 정의 doubl..

    while 반복문을 종료하는 방법: 센티넬, EOF, 플래그

    카운터 제어 while 반복문 #include using namespace std; int main() { int counter = 0; while (counter > num; } cout > 연산자를 입력하면 된다. 이 연산자는 스트림에서 항목을 읽다가 EOF를 만나면 false를 리턴한다. //키보드 while(cin >> num) { ... } //파일 while(infile >> num) { ... } //키보드 입력 EOF로 반복 종료하기 #include using namespace std; int main() { int num; int sum{0}; while (cin >> num) { sum +..

    [C++] 백준 11866. 요세푸스 문제 0

    문제 요세푸스 문제는 다음과 같다. 1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다. 예를 들어 (7, 3)-요세푸스 순열은 이다. N과 K가 주어지면 (N, K)-요세푸스 순열을 구하는 프로그램을 작성하시오. 입력 첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 1,000) 출력 예제와 같이 요세푸스 순열을 출력한다. 구상 1 가장 처음 문제를 해결했던 방식이다. 입력하는 개수만큼..

    [C++] 백준 11650. 좌표 정렬하기

    문제 2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오. 입력 첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 x와 y가 주어진다. (-100,000 ≤ x, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다. 출력 첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다. 구상 Key와 Value로 한 쌍을 묶어서 저장할 수 있는 map STL이 있다. 심지어 알아서 정렬도 해준다. 하지만 map은 중복된 키를 사용할 수 없다. multimap을 이용하면 중복된 키는 사용할 수 있지만 기본 옵션으로는 키나 값 둘 ..

    [C++] 변수를 초기화하는 세 가지 방법

    C++에서는 변수를 초기화 하는 방법이 세 가지 있다. 대입하기 (Copy Initialization) int num = 1; 대입 연산자(=)을 통해 우변의 값을 좌변에 대입하여 변수를 초기화하는 방법이다. C언어에서 사용하던 방법을 그대로 이용할 수 있다. 괄호 사용하기 (Direct Initialization) int num( 1 ); 변수 이름 다음에 바로 괄호를 사용하여 초기화할 수도 있다. 클래스와 같은 더 복잡한 객체를 효율적으로 선언할 수 있도록 해준다. 중괄호 사용하기 (Brace Initialization) int num{ 1 }; int num2 = { 2 }; int num3 {};//0으로 초기화 Uniform Initialization, List Initialization이라고도..