제6장 객체배열과 벡터 객체 배열을 이해한다. 벡터(vector) 클래스를 사용할 수 있다.

Slides:



Advertisements
Similar presentations
3. C++와 객체지향 C++ 코딩 방법 객체 단위로 2 개의 파일 인터페이스 파일 구현파일
Advertisements

Vision System Lab, Sang-Hun Han
2007 1학기 12 배열.
명품 C++ 프로그래밍 3장. 클래스와 객체.
명품 C++ 8장 상속.
명품 C++ 4장. 객체 포인터와 객체 배열, 객체의 동적 생성.
Power C++ 제6장 포인터와 문자열.
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제1장 기초 사항.
C++ Espresso 제2장 제어문과 함수.
강좌명 : C++프로그래밍 (C++ Programming)
실전 프로젝트 2 : 숫자야구 숫자 야구를 구현해보자.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
명품 C++ 13장 예외 처리와 C 언어와의 링크 지정.
C++ Exspresso 제5장 클래스의 기초.
16강. 자바 빈 빈 이란? 빈 만들기 빈 관련 액션 태그(useBean, getProperty, setProperty)
8. 객체와 클래스 (기본).
C 11장. 포인터의 활용 #include <stdio.h> int main(void) { int num;
제12장 다형성과 가상함수 다형성의 개념을 이해한다. 상향 형변환의 개념을 이해한다. 가상 함수의 개념을 이해한다.
C++ Espresso 제9장 다형성.
10장 템플릿과 표준 템플릿 라이브러리(STL)
배열, 포인터, 참조 배열은 같은 형을 가지는 변수들의 묶음이다..
명품 C++ 8장 상속.
제15장 STL과 람다식 STL의 개념을 이해하고 사용할 수 있다. 람다식을 이해하고 사용할 수 있다.
C++ Espresso 제6장 생성자와 소멸자.
명품 JAVA Essential.
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
동적메모리와 연결리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
명품 Java Programming.
제13장 파일처리 스트림의 개념을 이해한다. 객체 지향적인 방법을 사용하여 파일 입출력을 할 수 있다.
7장 클래스.
명품 C++ 7장 프렌드와 연산자 중복.
Data structures 01.2: C++ classes 동의대학교 멀티미디어공학과 이광의교수.
18장. 헤더 파일과 구현 파일 01_ 헤더 파일과 구현 파일의 사용.
14장. 함수 1 01_ 함수의 기본 02_ 인자의 전달.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C ++ 프로그래밍 시작.
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
제4장 클래스와 객체 객체 지향 기법을 이해한다. 클래스를 작성할 수 있다. 클래스에서 객체를 생성할 수 있다.
쉽게 풀어쓴 C언어 Express 제10장 배열 C Express.
스택(Stack) 김진수
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
개정판 누구나 즐기는 C언어 콘서트 제6장 반복문 출처: pixabay.
추상 데이터 타입 정의하기 Defining abstract data types
제5장 생성자와 접근제어 객체 지향 기법을 이해한다. 클래스를 작성할 수 있다. 클래스에서 객체를 생성할 수 있다.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
가상함수와 추상 클래스.
Chapter 1 C와는 다른 C++. 최호성.
제2장 제어구조와 배열 if-else 문에 대하여 학습한다. 중첩 if-else 문에 대하여 학습한다.
4. 고급변수 사용 : 포인터와 관련하여 메모리 바라보기
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
제 4장. 객체 지향 프로그래밍 시작하기 학기 프로그래밍언어및실습 (C++).
3장. 클래스의 기본.
루프와 카운트 Looping and counting
멤버 함수인 operator+()가 실행, 또는 전역 함수인 operator+()가 실행 Point p3 = p1+p2; 에서
제8장 포인터와 동적객체 생성 포인터의 개념을 이해한다. 포인터와 관련된 연산을 이해한다.
5. 논리적 자료표현 : 구조체.
제 11장. 템플릿과 STL 학기 프로그래밍언어및실습 (C++).
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
C++ Espresso 제13장 입출력과 파일처리.
자바 5.0 프로그래밍.
포인터와 배열 조 병 규 한 국 교 통 대 학 교 SQ Lab..
Ch16_표준 템플릿 라이브러리.
10장 템플릿과 표준 템플릿 라이브러리(STL)
새로운 타입 정의하기 Defining new types
실습과제 1번 /* 1. 멤버 변수로 반경 radius를 갖고, 그 값을 모니터에 출력하는
어서와 C언어는 처음이지 제16장.
개정판 누구나 즐기는 C언어 콘서트 제10장 문자열 출처: pixabay.
Presentation transcript:

제6장 객체배열과 벡터 객체 배열을 이해한다. 벡터(vector) 클래스를 사용할 수 있다.

이번 장에서 만들어볼 프로그램

객체 배열 원을 나타내는 객체를 여러 개 생성하여서 화면에 그려보 는 프로그램을 작성하고자 한다. Circle c1; ...

객체 배열

예제 #include <iostream> using namespace std; class Circle { public: int x, y; int radius; Circle() : x{ 0 }, y{ 0 }, radius{ 0 } { } Circle(int x, int y, int r) : x{ x }, y{ y }, radius{ r } { } void print() { cout << "반지름: " << radius << " @(" << x << ", " << y <<")" << endl; } };

예제 #include <iostream> using namespace std; class Pizza { public: Pizza(int s) : size(s) { } int size; // 단위: 인치 }; Pizza createPizza() { Pizza p(10); return p; } int main() { Pizza pizza = createPizza(); cout << pizza.size << "인치 피자" << endl; return 0;

예제 int main(void) { Circle objArray[10]; for (Circle& c: objArray) { c.x = rand()%500; c.y = rand()%300; c.radius = rand()%100; } for (Circle c: objArray) c.print(); return 0; 예제

객체 배열의 초기화 Circle objArray[10] = { Circle(100, 100, 30), ... };

Lab: 책들을 저장해보자. 여러 권의 책을 저장할 수 있는 객체 배열 books를 생성 하여 보자.

Solution #include <iostream> #include <string> using namespace std; class Book { string title; int price; public: Book(string name, int price) : title{ name }, price{ price } { } void print() { cout << "제목:" << title << ", 가격:" << price << endl; } };

Solution int main(void) { Book books[2] = { Book("어서와 C++", 25000), }; cout << "소장하고 있는 책 정보" << endl; cout << "======================" << endl; for (Book& b : books) b.print(); return 0; }

Lab: 원들을 저장해보자. 10개의 원을 저장할 수 있는 배열을 선언하고 사용자가 키 ‘c'를 누르면 각각의 원의 위치와 반지름을 난수로 초 기화한 후에 화면에 그린다. 사용자가 키 ‘q'를 누르면 프 로그램을 종료한다.

Solution #include <windows.h> #include <conio.h> #include <iostream> using namespace std; class Circle { public: int x, y; int radius; Circle() : x{ 0 }, y{ 0 }, radius{ 0 } { } Circle(int x, int y, int r) : x{ x }, y{ y }, radius{ r } { } void draw() { int r = radius/2; HDC hdc = GetWindowDC(GetForegroundWindow()); Ellipse(hdc, x-r, y-r, x+r, y+r); } };

Solution int main(void) { Circle objArray[10]; while(true){ for (Circle& c: objArray) { c.x = rand()%500; c.y = rand()%300; c.radius = rand()%100; c.draw(); } char ch = getch(); if (ch == 'q') break; return 0;

벡터 벡터(vector)는 동적 배열이다. 컴파일 시간에 배열의 크기를 미리 결정할 필요가 없다.

벡터의 선언

벡터의 사용 #include <vector> #include <iostream> using namespace std; int main(void) { vector<int> fibonacci { 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 }; for (auto& number : fibonacci) cout << number << ' '; cout << endl; return 0; }

push_back()과 pop_back()

벡터의 사용 #include <vector> #include <iostream> using namespace std; int main(void) { vector<int> v1; v1.push_back(10); v1.push_back(20); v1.push_back(30); v1.push_back(40); v1.push_back(50); cout << "v1 = "; for (auto& e : v1) { cout << e << " "; } cout << endl; return 0;

실행결과

벡터의 사용 #include <vector> #include <iostream> using namespace std; int main(void) { vector<int> v; for (int i = 0; i < 10; ++i) { v.push_back(i); } cout << "현재의 v = "; for (auto& e : v) cout << e << " "; cout << endl; cout << "삭제 요소 = "; // 벡터가 공백이 될 때까지 pop_back() 호출 while (v.empty() != true) { cout << v.back() << " "; v.pop_back(); 벡터의 사용

실행결과

벡터에서 요소의 위치 벡터에서 요소의 위치는 반복자(iterator)를 이용하여 표 시한다. for (auto p = v.begin(); p != v.end(); ++p) cout << *p << endl;

벡터의 중간에서 삭제 v.erase(v.begin()+i);

벡터와 연산자 #include <vector> #include <iostream> using namespace std; int main(void) { vector<int> v1{ 1, 2, 3, 4, 5 }; vector<int> v2(v1); if (v1 == v2) { cout << "2개의 벡터가 일치합니다. " << endl; } return 0;

벡터에 문자열 저장 #include <iostream> #include <vector> #include <string> using namespace std; int main(void) { vector<string> vec; // 벡터를 생성한다. vec.push_back("MILK"); // 벡터의 끝에 자료를 저장한다. vec.push_back("BREAD"); vec.push_back("BUTTER"); for (auto e : vec) { cout << " " << e; } cout << endl; return 0;

벡터에 Circle 객체를 저장 #include <iostream> #include <vector> using namespace std; class Circle { public: int x, y; int radius; Circle() : x{ 0 }, y{ 0 }, radius{ 0 } { } Circle(int x, int y, int r) : x{ x }, y{ y }, radius{ r } { } void print() { cout << "반지름: " << radius << " @(" << x << ", " << y <<")" << endl; } };

벡터에 Circle 객체를 저장 int main(void) { vector<Circle> objArray; for (int i = 0; i < 10; i++) { Circle obj{ rand()%300, rand()%300, rand()%100 }; objArray.push_back(obj); } for (Circle c : objArray) c.print(); return 0;

실행결과

벡터와 알고리즘 #include <iostream> #include <algorithm> #include <vector> #include <string> using namespace std; class Person { private: string name; int age; public: Person::Person(string n, int a) { name = n; age = a; } string get_name() { return name; } int get_age() { return age; } void print() { cout << name << " " << age << endl; };

벡터와 알고리즘 bool compare(Person &p, Person &q) { return p.get_age() < q.get_age(); } int main() vector<Person> list; list.push_back(Person("Kim", 30)); list.push_back(Person("Park", 22)); list.push_back(Person("Lee", 26)); sort(list.begin(), list.end(), compare); for (auto& e : list) { e.print(); return 0;

실행결과

Lab: 성적평균 계산하기 학생들의 평균 성적을 계산하는 예제에서 학생이 몇 명인 지 알 수 없다고 하자. 동적 배열인 벡터를 이용하여서 작 성해보자.

Solution #include <iostream> #include <vector> using namespace std; int main() { vector<int> scores; // int 동적 배열을 생성한다. int i, sum = 0; while (true) { int score; cout << "성적을 입력하시오(종료는 -1) : "; cin >> score; if (score == -1) break; scores.push_back(score); } for (auto& value : scores) { sum += value; double avg = (double)sum / scores.size(); cout << "성적 평균=" << avg << endl; return 0; Solution

Lab: 영화정보 저장 벡터를 이용하여 영화에 대한 정보를 저장했다가 출력하 는 프로그램을 작성해보자.

Solution #include <iostream> #include <string> #include <vector> using namespace std; class Movie { private: string title; double rating; public: Movie(string t = "", double r = 0.0) { title = t; rating = r; } void print_movie() { cout << title << ": " << rating << endl; } };

Solution int main(void) { vector<Movie> movies; movies.push_back(Movie("titinic", 9.9)); movies.push_back(Movie("gone with the wind", 9.6)); movies.push_back(Movie("terminator", 9.7)); for (auto& e : movies) e.print_movie(); return 0; }

array 클래스 vector는 생성과 소멸을 하는데 상당한 시간이 소요된다. 따라서 vector의 장점이 많지만 성능 때문에 기존의 배열 을 사용하는 경우도 많다. 이 문제를 해결하기 위해 C++11에서는 std::array를 새롭 게 제시하였다. array 클래스를 사용하면 벡터의 장점과 기존 배열의 성능을 동시에 누릴 수 있다.

예제 #include <iostream> #include <array> using namespace std; int main() { array<int, 3> list{ 1, 2, 3 }; for (int i = 0; i<list.size(); ++i) ++list[i]; for (auto& elem : list) cout << elem << " "; cout << endl; return 0; }

Q & A