4.1 객체 포인터
객체에 대한 포인터 변수 선언 형식
Circle *p;
객체의 주소는 객체 앞에 &연산자를 사용
p = &donut; //p에 donut의 객체 주소 저장
객체에 접근하는 방식 : ->연산자 사용
d = donut.getArea(); //객체 이름으로 멤버 함수 호출
d = p->getArea(); //포인터로 객체 멤버 함수 호출
4.2 객체 배열
객체 배열 : 원소가 객체라는 점을 빼면 기본 타입의 배열을 선언하고 활용하는 방법과 동일
배열이 소멸될 때 원소 객체마다 소멸자가 호출된다.
#include <iostream>
using namespace std;
class Circle{
int radius;
public:
Circle() {radius = 1; }
Circle(int r) { radius = r;}
void setRadius(int r) {radius = r;}
double getArea();
};
double Circle::getArea(){
return 3.14*radius*radius;
}
int main() {
Circle circleArray[3];
circleArray[0].setRadius(10);
circleArray[1].setRadius(20);
circleArray[3].setRadius(30);
for (int i=0;i<3;i++){
cout << "Circle" << i << "의 면적은" << circleArray[i].getArea() << "\n";
}
Circle *p;
p = circleArray;
for (int i=0;i<3;i++){
cout << "Circle" << i << "의 면적은" << p->getArea() << "\n";
p++;
}
}
+)
객체의 주소는 객체 앞에 &연산자를 사용한다고 했는데, 왜 배열 예제에서는 사용하지 않을까 생각해봄
> 포인터를 배열의 첫 번째 자리로, 즉 객체값으로 주면 실행 가능
Circle *p;
p = &circleArray[0];
for (int i=0;i<3;i++){
cout << "Circle" << i << "의 면적은" << p->getArea() << "\n";
p++;
}
객체 배열 초기화
생성자를 사용하여 초기화 할 수 있다
Circle circleArray[3] = { Circle(10), Circle(20), Circle()};
다차원 객체 배열
2차원, 3차원 등 다차원 객체 배열 생성 가능
Circle circles[2][3]; //2행 3열의 객체 배열 생성
2차원 배열 역시 생성자를 지정하여 배열을 초기화할 수 있다
Circle circles[2][3] = { {Circle(1), Circle(2), Circle(3) },
{Circle(4), Circle(5), Circle(6) } };
circle[0][0] = 1 | circle[0][1] = 2 | circle[0][2] = 3 |
circle[1][0] = 4 | circle[1][1] = 5 | circle[1][2] = 6 |
check time 3,4 답
#include <iostream>
using namespace std;
class Sample{
int a;
public:
Sample() {a = 100; cout<<a<<' '; }
Sample(int r) { a = r; cout<<a<<' ';}
Sample(int r,int k) {a=r*k; cout<<a<<' ';}
int get() {return a;}
};
int main() {
int sum1=0;
int sum2=0;
Sample arr[3];
Sample arr2D[2][2] = {{Sample(2,3), Sample(2,4)},{Sample(5), Sample()}};
Sample *p; //3번 답
p = arr;
for (int i=0;i<3;i++){
sum1 += p->get();
i++;
}
cout << sum1;
// 4번 답
for (int i=0;i<2;i++){
for (int j=0;j<2;j++){
sum2 += arr2D[i][j].get();
}
}
cout << sum2;
}
4.3 동적 메모리 할당 및 반환
실행 중에 필요힌 만큼 메모리를 할당받고 필요 없을 때 반환하는 동적 메모리 할당/반환 메커니즘이 필요
new : heap이라는 공간으로부터 메모리를 할당 받음
delete : 할당받은 메모리를 heap으로 반환
int *pInt = new int; //int 타입의 정수 공간 할당
char *pChar = new char; // char타입의 문자 공간 할당
int *pInt2 = new int(20); //20으로 초기화 된 정수 공간 할당
if (!pInt){ //p가 NULL이면 메모리 할당 받기 실패
return 0;
}
*pInt = 5; //할당받은 정수 공간에 5 저장
int n = *pInt; //할당 받은 정수 공간에서 값 읽기, n=5
delete pInt; //할당받은 정수 공간 반환
delete pChar; //할당받은 문자 공간 반환
배열도 마찬가지
int *p = new int [5]; //정수형 배열의 동적 할당
if (!p){ //p가 NULL이면 메모리 할당 받기 실패
return 0;
}
for (int i=0;i<5;i++){
p[i] = i;
}
delete [] p; //배열 메모리 반환
- new로 배열을 동적 할당 받을 때 생성자를 통해 직접 초깃값을 지정할 수는 없다
int *pArray = new int[10](20); //error
int *pArray = new int(20)[10]; //error
int *pArray = new int[] {1,2,3,4}; //가능
int *pArray = new int[4] {1,2,3,4}; //가능
예제 4-6)
#include <iostream>
using namespace std;
int main() {
cout << "입력할 정수의 개수는? ";
int n;
cin >> n;
int *p = new int[n];
if (!p){ //p가 NULL이면 메모리 할당 받기 실패
return 0;
}
for (int i=0;i<n;i++){
cout << i+1 << "번째 정수: ";
cin >> p[i];
}
int sum = 0;
for (int i=0;i<n;i++){
sum += p[i];
}
cout<<"평균 : " << sum/n << "\n";
delete [] p; //배열 메모리 반환
}
check 문제 1-(2) 정답
#include <iostream>
using namespace std;
int main() {
int *p = new int[5];
if (!p){ //p가 NULL이면 메모리 할당 받기 실패
return 0;
}
for (int i=0;i<5;i++){
cin >> p[i];
}
int biggest = p[0];
for (int i=1; i<5; i++){
if (biggest < p[i]){
biggest = p[i];
}
}
cout << biggest;
delete [] p;
}
4.4 객체와 객체 배열의 동적 생성 및 반환
객체의 동적 생성과 생성자
Circle *p = new Circle; //기본 생성자 Circle() 호출
Circle *q = new Circle(30); //생성자 Circle(30) 호출
delete p //Circle 객체 반환
delete q //포인터 p,q는 살아있지만 메모리는 반환되었음
//delete 할 때 포인터 변수는 반드시 new를 이용하여 동적 할당 받은 메모리의 주소여야 함
예제 4-7)
#include <iostream>
using namespace std;
class Circle{
int radius;
public:
Circle() {radius = 1;
cout << "생성자 실행 radius = " << radius << "\n";
}
Circle(int r) { radius = r;
cout << "생성자 실행 radius = " << radius << "\n";
}
~Circle() {cout << "소멸자 실행 radius = " << radius << "\n"; }
void setRadius(int r) {radius = r;}
double getArea();
};
double Circle::getArea(){
return 3.14*radius*radius;
}
int main() {
Circle *p, *q;
p = new Circle;
q = new Circle(30);
cout << p->getArea() << "\n" << q->getArea() << "\n";
delete p;
delete q;
}
예제 4-8)
#include <iostream>
using namespace std;
class Circle{
int radius;
public:
Circle() {radius = 1;
cout << "생성자 실행 radius = " << radius << "\n";
}
Circle(int r) { radius = r;
cout << "생성자 실행 radius = " << radius << "\n";
}
~Circle() {cout << "소멸자 실행 radius = " << radius << "\n"; }
void setRadius(int r) {radius = r;}
double getArea();
};
double Circle::getArea(){
return 3.14*radius*radius;
}
int main() {
int radius;
while (true){
cout << "반지름을 입력>>";
cin >> radius;
if (radius < 0) {
break;
}
Circle *p;
p = new Circle(radius);
cout << "원의 면적은 : " << p->getArea() << "\n";
delete p;
}
}
객체 배열의 동적 생성 및 반환
- 객체의 동적 생성 및 반환과 동일
Circle *p = new Circle[3]; //기본 생성자 Circle() 호출
Circle *q = new Circle[3](30); //error
Circle *z = new Circle[3] {Circle(1), Circle(2), Circle(30)}; //ok
delete [] p //포인터 p는 살아있지만 배열은 반환되었음, 각 객체마다 ~Circle() 실행
//생성의 반대 순으로 삭제 일어남
- 사용
Circle *p = new Circle[3];
//1번째 방법
p[0].setRadius(10);
p[1].setRadius(10);
p[2].setRadius(10);
//2번째 방법
p->setRadius(10);
(p+1)->setRadius(20);
(p+2)->setRadius(30);
예제 4-9)
#include <iostream>
using namespace std;
class Circle{
int radius;
public:
Circle() {radius = 1;
cout << "생성자 실행 radius = " << radius << "\n";
}
Circle(int r) { radius = r;
cout << "생성자 실행 radius = " << radius << "\n";
}
~Circle() {cout << "소멸자 실행 radius = " << radius << "\n"; }
void setRadius(int r) {radius = r;}
double getArea();
};
double Circle::getArea(){
return 3.14*radius*radius;
}
int main() {
Circle *p = new Circle[3];
p[0].setRadius(10);
p[1].setRadius(20);
p[2].setRadius(30);
for (int i=0;i<3;i++){
cout << p[i].getArea() << "\n";
}
Circle *q = p;
for (int i=0;i<3;i++){
cout << q->getArea() << "\n";
q++;
}
delete [] p;
}
예제 4-10)
#include <iostream>
using namespace std;
class Circle{
int radius;
public:
Circle() {radius = 1;}
Circle(int r) { radius = r;}
~Circle();
void setRadius(int r) {radius = r;}
double getArea();
};
double Circle::getArea(){
return 3.14*radius*radius;
}
int main() {
int n, radius;
cout << "원의 개수를 입력하세요 >> ";
cin >> n;
Circle *p = new Circle[n];
for (int i=0;i<n;i++){
cout << "원" << i+1 << ": ";
cin >> radius;
p[i].setRadius(radius);
}
int result=0;
for (int i=0;i<n;i++){
cout << p[i].getArea() << " ";
if (100<=p[i].getArea() && p[i].getArea()<=200)
result++;
}
cout << "\n" << result;
delete [] p;
}
4.5 this 포인터
특징
객체 자신에 대한 포인터, 클래스의 멤버 함수 내에서만 사용, 전역변수도 아니고 지역변수도 아니다
객체마다 존재하고, 멤버 함수에 컴파일러 몰래 삽입한 매개 변수이다. static 멤버 함수에는 사용할 수 없다
각 객체 속에 this는 다른 객체 속의 this와 서로 다른 포인터
제약 조건
1. 클래스의 멤버 함수에서만 사용 가능
2. 정적 멤버 함수는 사용 불가능
class Circle{
int radius;
public:
Circle() {this->radius = 1;}
Circle(int r) { this-> radius = r;}
~Circle();
void setRadius(int r) {this->radius = r;}
double getArea();
};
this가 필요한 경우는?
1. 멤버 변수의 이름과 동일한 이름으로 매개 변수 이름을 짓고자 하는 경우
Circle(int radius) { this-> radius = radius;} //ok
Circle(int radius) { radius = radius;} //error
2. 객체의 멤버 함수에서 객체 자신의 주소를 리턴할 때
연산자 중복을 구현할 때 이런 경우가 많이 발생
class Sample{
public:
Sample *f() {
...
return this; //현재 객체의 주소 리턴
}
};
4.6 string 클래스를 이용한 문자열 사용
c-스트링은 초기에 할당받은 메모리 크기 이상의 문자열을 저장할 수 없고, string 클래스는 문자열의 크기에 맞추어 스스로 메모리 크기를 조정한다
string str;
string address("서울 성북구 삼선동 389");
string copy(address);
string *p = new string("C++");
p->append(" Great!");
cout << *p; //C++ Great! 출력
delete p;
string 객체에 문자열 입력
string name;
cin >> name; //공백 사용 불가능
getline(cin, name, '\n'); //\n을 만날 때까지 키보드로부터 문자열을 읽어 name에 저장
예제 4-12)
#include <iostream>
#include <string>
using namespace std;
int main() {
string names[5];
for (int i=0;i<5;i++){
cout << "이름 >>";
getline(cin,names[i],'\n');
}
string latter = names[0];
for (int i=1;i<5;i++){
if (latter < names[i]){
latter = names[i];
}
}
cout << "사전에서 가장 뒤에 나오는 문자열은 : " << latter << "\n";
}
문자열 비교
compare 사용, 비교 연산자도 사용 가능
string name = "kitae";
string alias = "kito";
int res = name.compare(alias); //name과 alias 비교
if (res==0) {cout << "두 문자열이 같다.";}
else if (res<0) {cout << name << "<" <<alias <<"\n"; //name이 앞에 옴
else cout<<alias<<"<"<<name<<"\n"; //name이 뒤에 옴
문자열 연결
append 사용, +, += 연산자 사용 가능
string a("i love c++");
string b(".");
string c;
a.appned(b);
c = a+b;
c += b
문자열 삽입
insert 함수
#include <iostream>
#include <string>
using namespace std;
int main() {
string a("i love c++");
a.insert(2,"really ");
cout << a; // i really love c++
a.replace(2,11,"study");
cout << a; //i study c++
}
문자열 길이
length, size
string a("i study c++");
a.insert(2,"really ");
cout << a.length; //11
cout << a.size; //11 (length()와 동일)
문자열 삭제 : erase(start, end)는 문자열의 일부분을 삭제, clear()은 전부 삭제
서브 스트링 : 문자열에서 일부분을 발췌한 문자열 얻을 수 있음
string a("i love c++");
cout << a.substr(2,4); //love 2부터 4개 문자 리턴
cout << a.substr(2); //love c++ 2부터 끝까지 리턴
문자열 검색 : find() 특정 문자나 문자열을 발견하면 첫 번째 인덱스를 리턴한다
문자열의 각 문자 : at()은 수정 불가능하고 []는 수정이 가능하다
string a("i love c++");
cout << a.at(7); //c
cout << a[7]; //c
a[2] = 'D';
cout << a; //i love D++
문자열의 숫자 변환 : stoi()
string year = "2014";
int n = stoi(year); //2014
string 은 문자열만 다루지 문자를 다룰 수는 없다, 문자를 다루는 함수는 <locale> 헤더 파일에 존재한다
#include <iostream>
#include <string>
#include <locale>
using namespace std;
int main() {
string a = "hello";
for (int i=0;i<a.length();i++){
a[i] = toupper(a[i]); //HELLO
}
if(isdigit(a[0])) cout << "숫자";
else if (isalpha(a.at(0))) cout << "문자";
}
예제 4-13)
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cout << "문자열 입력하세요 : " << "\n";
getline(cin, s, '\n');
int len = s.length();
for (int i=0;i<len;i++){
string first = s.substr(0,1);
string sub = s.substr(1,len-1);
s = sub+first;
cout << s << "\n";
}
}
예제 4-14)*
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cout << "식 입력하세요 : " << "\n";
getline(cin, s, '\n');
int sum = 0;
int startIndex = 0;
while(true){
int findIndex = s.find("+", startIndex);
if (findIndex == -1){
string part = s.substr(startIndex);
cout << part << "\n";
sum += stoi(part);
break;
}
int count = findIndex - startIndex;
string part = s.substr(startIndex, count);
cout << part << "\n";
sum += stoi(part);
startIndex = findIndex+1;
}
cout << "숫자들의 합은 "<<sum;
}
예제 4-15)
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cout << "문자열 입력하세요 : " << "\n";
getline(cin, s, '&');
cin.ignore(); //주의
string f, r;
cout << "find : ";
getline(cin,f,'\n');
cout << "replace : ";
getline(cin,r,'\n');
int startIndex = 0;
while(true){
int findIndex = s.find(f, startIndex);
if (findIndex == -1) break;
s.replace(findIndex,f.length(),r);
startIndex = findIndex+r.length();
}
cout << s << "\n";
}
openchallenge
#include <iostream>
#include <string>
using namespace std;
class Player{
string name;
public:
void setName(string name) { this->name = name; }
string getName() { return name; }
};
class WordGame{
Player *p;
int num;
public:
WordGame(int num){this->num=num;
p = new Player[num];
}
void start();
};
void WordGame::start() {
string s;
for (int i=0;i<num;++i){
cout << "참가자의 이름을 입력하세요. 빈칸없이>>";
cin >> s;
p[i].setName(s);
}
cout << "\n" << "시작하는 단어는 아버지입니다" << "\n";
string a = "아버지";
string b;
int index = 0;
for (;;) {
cout << p[index%num].getName() << ">>";
cin >> b;
int j = a.size();
if (a.at(j - 2) == b.at(0) && a.at(j - 1) == b.at(1)) {
a = b;
}
else {
cout << p[index%num].getName() << "탈락"<<"\n";
break;
}
++index;
}
}
int main() {
int num;
cout << "끝말 잇기 게임을 시작합니다" << "\n";
cout << "게임에 참가하는 인원은 몇명입니까?";
cin >> num;
WordGame wordgame(num);
wordgame.start();
}
실습
1
#include <iostream>
using namespace std;
class Color{
int red, green, blue;
public:
Color(){
red = green = blue = 0;
}
Color (int r, int g, int b){
red = r; green = g; blue = b;
}
void setColor(int r, int g, int b){
red = r; green = g; blue = b;
}
void show(){
cout<<red<<' '<<green<< ' '<<blue<<"\n";
}
};
int main() {
Color screenColor(255,0,0);
Color *p;
p = &screenColor; //(1)
p->show(); //(2)
Color colors[3]; // (3)
p = colors; //(4)
p[0].setColor(255, 0, 0); //(5)
p[1].setColor(0, 255, 0);
p[2].setColor(0, 0, 255);
for (int i=0;i<3;i++){
p[i].show();
}
}
2
#include <iostream>
using namespace std;
int main() {
int *arr = new int[5];
cout << "정수 5개 입력>>";
for (int i = 0; i < 5; i++) {
cin >> arr[i];
}
int sum = 0;
for (int i=0 ; i< 5; i++){
sum+=arr[i];
}
cout << "평균 : " <<sum/5.0;
}
3
#include <iostream>
using namespace std;
class Color{
int red, green, blue;
public:
Color(){
red = green = blue = 0;
}
Color (int r, int g, int b){
red = r; green = g; blue = b;
}
void setColor(int r, int g, int b){
red = r; green = g; blue = b;
}
void show(){
cout<<red<<' '<<green<< ' '<<blue<<"\n";
}
};
int main() {
string s;
cout << "문자열 입력>>";
getline(cin,s,'\n');
int len = s.length();
int count = 0;
for (int i=0;i<len;i++){
if (s[i]=='a'){
count++;
}
}
cout << "문자 a는 " << count<<"개 있습니다.\n";
int index = 0;
cout << "a의 인덱스: ";
while ((index = s.find('a', index)) != -1) {
cout << index << ' ';
index++;
}
}
4
#include <iostream>
using namespace std;
class Sample{
int *p;
int size;
public:
Sample(int n){
size = n; p = new int[n];
}
void read(){
for (int i=0;i<size;i++){
cin >> p[i];
}
}
void write(){
for (int i = 0; i < size; i++) {
cout << p[i] << ' ';
}
cout << endl;
}
int big(){
int biggest = p[0];
for (int i=1;i<size;i++){
if (biggest<p[i]){
biggest = p[i];
}
}
return biggest;
};
~Sample(){
delete[] p;
};
};
int main() {
Sample s(10);
s.read();
s.write();
cout << "가장 큰 수는 " << s.big() << "\n";
}
5
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
using namespace std;
int main() {
string s;
srand((unsigned)time(0));
while (true){
cout << "아래에 한 줄을 입력하세요.(exit를 입력하면 종료합니다)\n";
cout << ">>";
getline(cin, s, '\n');
if (s == "exit")
break;
int n = rand() % s.length();
char alpha = rand() % 26 + 'a';
s[n] = alpha;
cout << s << endl;
}
}
6
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
while (true){
cout << "아래에 한 줄을 입력하세요.(exit를 입력하면 종료합니다)\n";
cout << ">>";
getline(cin, s, '\n');
if (s == "exit")
break;
for (int i=(s.length()-1);i<s.length();i--){
cout << s[i];
}
cout << "\n";
}
}
7
#include <iostream>
#include <string>
using namespace std;
class Circle{
int radius;
public:
void setRadius(int radius){
this->radius = radius;
}
double getArea(){
return 3.14*radius*radius;
}
};
int main() {
int radius;
Circle array[3];
for (int i=0;i<3;i++){
cout << "원 "<<i+1<<"의 반지름 >> ";
cin >>radius;
array[i].setRadius(radius);
}
int count = 0;
for (int i=0;i<3;i++){
if (array[i].getArea()>100){
count++;
}
}
cout << "면적이 100보다 큰 원은 " << count <<"개 입니다.\n";
}
8
#include <iostream>
#include <string>
using namespace std;
class Circle{
int radius;
public:
void setRadius(int radius){
this->radius = radius;
}
double getArea(){
return 3.14*radius*radius;
}
};
int main() {
int n;
cout << "원의 개수 >> ";
cin >> n;
int radius;
Circle array[n];
for (int i=0;i<n;i++){
cout << "원 "<<i+1<<"의 반지름 >> ";
cin >>radius;
array[i].setRadius(radius);
}
int count = 0;
for (int i=0;i<n;i++){
if (array[i].getArea()>100){
count++;
}
}
cout << "면적이 100보다 큰 원은 " << count <<"개 입니다.\n";
}
9
#include <iostream>
#include <string>
using namespace std;
class Person{
string name;
string tel;
public:
string getName(){
return name;
}
string getTel(){
return tel;
}
void set(string name, string tel){
this->name=name;
this->tel=tel;
}
};
int main() {
cout << "이름과 전화번호를 입력해주세요\n";
Person array[3];
string name, tel;
for (int i=0;i<3;i++){
cout << "사람 "<<i+1<<">> ";
cin >> name >> tel;
array[i].set(name,tel);
}
cout << "모든 사람의 이름은 ";
for (int i=0;i<3;i++){
cout << array[i].getName();
}
cout << "\n";
string find;
cout << "전화번호 검색합니다. 이름을 입력하세요>>";
cin >> find;
for (int i=0;i<3;i++){
if (array[i].getName()==find){
cout << "전화번호는 " << array[i].getTel() << "\n";
}
}
}
10
#include <iostream>
#include <string>
using namespace std;
class Person{
string name;
public:
Person(){
}
Person(string name) {
this->name=name;
}
string getName(){
return name;
}
void setName(string name){
this->name=name;
}
};
class Family{
Person *p;
int size;
string name;
int num;
public:
Family();
Family(string name, int size){
this->name = name;
this->size = size;
p = new Person[size];
}
void show(){
cout << "Simpson 가족은 다음과 같이 3명 입니다\n";
for (int i=0;i<size;i++){
cout << p[i].getName()<<"\t";
}
cout << "\n";
}
~Family(){
delete []p;
};
void setName(int num, string name) {
p[num].setName(name);
}
};
int main() {
Family *simpson = new Family("simpson", 3);
simpson->setName(0,"Mr. Simpson");
simpson->setName(1,"Mrs. Simpson");
simpson->setName(2,"Bart Simpson");
simpson->show();
delete simpson;
}
11
#include <iostream>
#include <string>
using namespace std;
class Container {
int size;
public:
Container() { size = 10; }
void fill() {size = 10;}
void consume() { size = size - 1;}
int getSize(){return size;}
};
class CoffeeVendingMachine {
Container tong[3];
void fill(){
for (int i=0;i<3;i++){
tong[i].fill();
}
show();
};
void selectEspresso(){
tong[0].consume();
tong[1].consume();
cout << "에스프레소 드세요 \n";
}
void selectAmericano(){
tong[0].consume();
tong[1].consume();
tong[1].consume();
cout << "아메리카노 드세요 \n";
}
void selectSugarCoffee(){
tong[0].consume();
tong[1].consume();
tong[1].consume();
tong[2].consume();
cout << "설탕커피 드세요 \n";
}
void show(){
cout << "커피 " << tong[0].getSize() << ", 물 " << tong[1].getSize() << ", 설탕 " << tong[2].getSize() << "\n";
}
public:
void run(){
cout << "***** 커피자판기를 작동합니다. *****" << endl;
int choice;
while (true) {
cout << "메뉴를 눌러주세요(1: 에스프레소, 2:아메리카노, 3:설탕커피, 4:잔량보기, 5:채우기)>> ";
cin >> choice;
switch (choice) {
case 1:
selectEspresso();
break;
case 2:
selectAmericano();
break;
case 3:
selectSugarCoffee();
break;
case 4:
show();
break;
case 5:
fill();
break;
}
}
}
};
int main(void){
CoffeeVendingMachine machine;
machine.run();
}
12
#include <iostream>
#include <string>
using namespace std;
class Circle{
int radius;
string name;
public:
void setCircle(string name,int radius){
this->name=name;
this->radius = radius;
}
double getArea(){
return 3.14*radius*radius;
}
string getName(){
return name;
}
};
class CircleManager{
Circle *p;
int size;
public:
CircleManager(int size){
this->size=size;
p = new Circle[size];
string name;
int radius;
for (int i = 0; i < size; i++) {
cout << "원 " << i + 1 << "의 이름과 반지름 >> ";
cin >> name >> radius;
p[i].setCircle(name, radius);
}
}
~CircleManager(){
delete [] p;
}
void searchByName(){
string find;
cout << "검색하고자 하는 원의 이름 >> ";
cin >> find;
for (int i=0;i<size;i++){
if (p[i].getName()==find){
cout << find << "의 면적은 " << p[i].getArea();
}
}
cout << "\n";
}
void searchByArea(){
int target;
cout << "최소 면적을 정수로 입력하세요 >> ";
cin >> target;
cout << target << "보다 큰 원을 검색합니다.\n";
for (int i=0;i<size;i++){
if (p[i].getArea()>target){
cout << p[i].getName()<<"의 면적은 " << p[i].getArea()<<",";
}
}
cout << "\n";
}
};
int main (void){
int size;
cout << "원의 개수>> ";
cin >> size;
CircleManager p(size);
p.searchByName();
p.searchByArea();
}
13
#include <iostream>
#include <string>
using namespace std;
class Histogram{
string str;
public:
Histogram(string str){
this->str=str;
}
void put(string str){
this->str += '\n' + str;
}
void putc(char ch) {
this->str += ch;
}
void print(){
int alpha=0;
int alphaNum[26] = { 0, };
cout << str << "\n";
for (int i=0;i<str.size();i++){
if (isalpha(str[i])){
alpha++;
alphaNum[tolower(str[i]) - 'a'] += 1;
}
}
cout << "총 알파벳 수 : " << alpha << "\n";
for (int i=0;i<26;i++){
char c = 'a' + i;
cout << c << " (" << alphaNum[i] << ")\t: ";
for (int j = 0; j < alphaNum[i]; j++) {
cout << "*";
}
cout << "\n";
}
}
};
int main (void){
Histogram elvisHisto("Wise men say, only fools rush in But I can't help, ");
elvisHisto.put("falling in love with you");
elvisHisto.putc('-');
elvisHisto.put("Elvis Presley");
elvisHisto.print();
}
14
#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
using namespace std;
class Player{
string name;
public:
void setName(string name) { this->name = name; }
string getName() { return name; }
};
class GamblingGame{
Player p[2];
public:
void start();
bool turn(string name);
~GamblingGame() {
cout << "게임을 종료합니다." << endl;
}
};
void GamblingGame::start() {
srand((unsigned)time(0));
string name;
cout << "***** 갬블링 게임을 시작합니다. *****\n";
cout << "첫번째 선수 이름>>";
cin >> name;
p[0].setName(name);
cout << "두번째 선수 이름>>";
cin >> name;
p[1].setName(name);
cin.ignore();
int end = 0;
while (true) {
for (int i = 0; i < 2; i++) {
if (turn(p[i].getName())) {
cout << p[i].getName() << "님 승리!!!" << "\n";
end = 1;
break;
}else
cout << "아쉽군요!" << "\n";
}
if (end == 1)
break;
}
}
bool GamblingGame::turn(string name){
string enter;
cout << name << "<Enter>";
while (true) {
char ch;
cin.get(ch);
if (ch == '\n')
break;
}
int random[3] = { 0, };
for (int i = 0; i < 3; i++) {
random[i] = rand() % 3;
}
cout << "\t" << random[0] << "\t" << random[1] << "\t"<< random[2] << "\t";
if (random[0] == random[1] && random[1] == random[2])
return true;
else
return false;
}
int main (void){
GamblingGame game;
game.start();
}
'명품 C++' 카테고리의 다른 글
[명품 C++] 7. 프렌드와 연산자 중복 (0) | 2023.01.06 |
---|---|
[명품 C++] 6. 함수 중복과 static 멤버 (0) | 2023.01.04 |
[명품 C++] 5. 함수와 참조, 복사 생성자 (0) | 2023.01.02 |
[명품 C++] 3. 클래스와 객체 (0) | 2022.12.27 |
[명품 C++] 2.C++ 프로그래밍의 기본 (0) | 2022.12.26 |