대학교 수업/C++ 프로그래밍

[C++] 명품 C++ 프로그래밍 10장

Jongung 2022. 6. 9. 20:09

1번

#include <iostream>
#include <string>
using namespace std;

template <class T>
T biggest(T arr[], int n) {
	T max = arr[0];
	for (int i = 1; i < n; i++) {
		if (arr[i] > max) max = arr[i];
	}
	return max;
}

int main() {
	int x[] = { 1, 10, 100, 5, 4 };
	cout << biggest(x, 5) << endl;
}

 

2번

#include <iostream>
using namespace std;

template <class T>
bool equalArrays(T a[], T b[], int n){
	for(int i=0;i<n;i++)
		if (a[i]!=b[i]) return false;
	return true;
}
int main(){
	int x[]={1,10,100,5,4};
	int y[]={1,10,100,5,4};
	
	double a[]={1.1, 2.3};
	double b[]={3.3, 2.3};
	  
	if(equalArrays(x,y,5)) cout<<"같다"<<endl;
	else cout<<"다르다"<<endl;
	
	if(equalArrays(a,b,5)) cout<<"같다"<<endl;
	else cout<<"다르다"<<endl;
}

 

3번

#include <iostream>
using namespace std;

template <class T>
void reverseArray(T arr[], int n) {
	for (int i = 0; i < n / 2; i++) {
		T tmp = arr[i];
		arr[i] = arr[n - i - 1];
		arr[n - i - 1] = tmp;
	}
}
int main() {
	int x[] = { 1,10,100,5,4 };
	for (int i = 0; i < 5; i++) cout << x[i] << ' ';
	cout << endl;

	reverseArray(x, 5);
	for (int i = 0; i < 5; i++) cout << x[i] << ' ';
}

 

4번

#include <iostream>
using namespace std;

template <class T>
bool search(T target, T arr[], int n){
	for(int i=0;i<n;i++)
		if(arr[i]==target) return true;
	return false;
}
int main(){
	int x[]={1,10,100,5,4};
	
	if(search(100,x,5)) cout<<"100이 x에 포함되어 있다"<<endl;
	else cout<<"100이 배열 x에 포함되어 있지 않다"<<endl;
	
	if(search(3,x,5)) cout<<"3이 x에 포함되어 있다"<<endl;
	else cout<<"3이 배열 x에 포함되어 있지 않다"<<endl;
}

 

5번

#include <iostream>
using namespace std;

template <class T>
T* concat(T a[], int sizea, T b[], int sizeb) {
	T* p = new T[sizea + sizeb];
	for (int i = 0; i < sizea; i++)
		p[i] = a[i];
	for (int i = 0; i < sizeb; i++)
		p[i + sizea] = b[i];
	return p;
}

int main() {
	double x[] = { 1.1,2.2,3.3,4.4,5.5 };
	double y[] = { -1, -2, -3, -4 };

	double* p = concat(x, 5, y, 4);
	for (int i = 0; i < 9; i++) cout << p[i] << ' ';
	cout << endl;

	delete[]p;
}

 

 

6번

#include <iostream>
using namespace std;

template <class T>
T* remove(T src[], int sizeSrc, T minus[], int sizeMinus, int& retSize) {
	T* tmp = new T[sizeSrc + sizeMinus];
	int size = 0, i, j;

	for (i = 0; i < sizeSrc; i++) {
		for (j = 0; j < sizeMinus; j++)
			if (src[i] == minus[j]) break;
		if (j == sizeMinus) tmp[retSize++] = src[i];
	}

	return tmp;
}

int main() {
	double x[] = { 1.1,2.2,3.3,4.4,5.5 };
	double y[] = { 2.2,3.3 };
	int retSize = 0;

	double* p = remove(x, 5, y, 2, retSize);
	for (int i = 0; i < retSize; i++) cout << p[i] << ' ';
	cout << endl;
}

 

7번

#include <iostream>
using namespace std;

class Circle{
	int radius;
public:
	Circle(int radius=1){this->radius=radius;}
	int getRadius(){return radius;}
};

template <class T>
T bigger(T a, T b){return a>b?a:b;}

Circle bigger(Circle a, Circle b){
	if(a.getRadius()>b.getRadius())	return a;
	else return b;
}
int main(){
	int a=20, b=50, c;
	c=bigger(a,b);
	cout<<"20과 50 중 큰 값은 "<<c<<endl;
	
	Circle waffle(10), pizza(30), y;
	y=bigger(waffle, pizza);
	cout<<"waffle(10)과 pizza(30) 중 큰 것의 반지름은 "<<y.getRadius()<<endl;
}

 

8번

#include <iostream>
using namespace std;

class Comparable {
public:
    virtual bool operator > (Comparable& op2) = 0; 
    virtual bool operator < (Comparable& op2) = 0;
    virtual bool operator == (Comparable& op2) = 0; 
};

class Circle : public Comparable {
    int radius;
public:
    Circle(int radius = 1) { this->radius = radius; }
    int getRadius() { return radius; }
    bool operator > (Comparable& op2) {
        Circle* c;
        c = (Circle*)&op2;
        if (this->radius > c->getRadius())
            return true;
        return false;
    }
    bool operator < (Comparable& op2) {
        Circle* c;
        c = (Circle*)&op2;
        if (this->radius < c->getRadius())
            return true;
        return false;
    }
    bool operator == (Comparable& op2) {
        Circle* c;
        c = (Circle*)&op2;
        if (this->radius == c->getRadius())
            return true;
        return false;
    }
};

template <class T>
T bigger(T a, T b) {
    if (a > b) return a;
    else return b;
}

int main() {
    int a = 20, b = 50, c;
    c = bigger(a, b);
    cout << "20과 50중 큰 값은 " << c << endl;
    Circle waffle(10), pizza(20), y;
    y = bigger(waffle, pizza);
    cout << "waffle과 pizza 중 큰 것의 반지름은 " << y.getRadius() << endl;
}

 

9번

#include <iostream>
#include <vector>
using namespace std;

int main() {
	vector<int> v;

	while (true) {
		int n, sum = 0;
		cout << "정수를 입력하세요(0을 입력하면 종료) >> ";
		cin >> n;
		if (n == 0) break;
		v.push_back(n);

		for (int i = 0; i < v.size(); i++) {
			cout << v[i] << ' ';
			sum += v[i];
		}
		cout << endl << "평균 = " << sum / v.size() << endl;
	}
}

 

10번

#include <iostream>
#include <vector>
#include <stdlib.h>
#include <time.h> 
using namespace std;

class Nation{
	string nation;
	string capital;
public:
	Nation(string n, string c){
		nation=n;capital=c;
	}
	string getNation(){return nation;}
	string getCapital(){return capital;}
};

int main(){
	Nation Kor("대한민국", "서울"), US("미국", "워싱턴"), Japan("일본", "도쿄");
	vector<Nation> v;
	v.push_back(Kor);
	v.push_back(US);
	v.push_back(Japan);
	
	cout<<"***** 나라의 수도 맞추기 게임을 시작합니다. *****"<<endl;
	
	while(true){
		int get;
		cout<<endl<<"정보 입력: 1, 퀴즈: 2, 전체 출력 : 3, 종료: 4 >> ";
		cin>>get;
		if(get==4) break;
		
		if(get==1){			
			cout<<"현재 "<<v.size()<<"개의 나라가 입력되어 있습니다."<<endl;
			cout<<"나라와 수도를 입력하세요(no no 이면 입력끝)"<<endl;
			cin.ignore(1, '\n');
			
			while(true){
				string nation,capital;
				int check=0;
				
				cout<<v.size()+1<<">>";
				getline(cin, nation, ' ');
				getline(cin, capital);
				if(nation=="no" && capital=="no") break;

				for(int i=0;i<v.size();i++){
					if(nation==v[i].getNation()){
						cout<<"already exists !!"<<endl;
						check=1;
						break;
					}
				}
				if(check==0){
					Nation p(nation, capital);
					v.push_back(p);
				}
			}
		}
		if(get==2){
			while(true){
				string capital;
				srand(time(NULL));
				int ran=rand()%v.size();
				
				cout<<v[ran].getNation()<<"의 수도는?(종료는 exit) >> ";
				cin>>capital;
				if(capital=="exit") break;
				
				if(capital==v[ran].getCapital()) cout<<"Correct !!"<<endl;
				else cout<<"NO !!"<<endl;
			}
		}
		if(get==3){
			for(int i=0;i<v.size();i++)
				cout<<i<<" : "<<v[i].getNation()<<" "<<v[i].getCapital()<<endl;
		}
	}
}