관리 메뉴

공부 기록장 💻

명품 C++ Programming 10장 실습 문제 - 템플릿 함수, 제네릭 클래스, STL vector/map 본문

# Language & Tools/C++

명품 C++ Programming 10장 실습 문제 - 템플릿 함수, 제네릭 클래스, STL vector/map

dream_for 2021. 6. 1. 00:57

(명품 C++ Programming 10장)

 

 

1.

#include <iostream>
using namespace std;

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

 int main(){
 	int x[]={1,10,100,5,4};
 	cout<<biggest(x,5)<<endl;
 	
 	double d[]={3.5, 2.4, 5.5, 9.1, -2.3};
 	cout<<biggest(d,5)<<endl;
 	
 	string str[]={"hello", "wow", "every", "apple"};
 	cout<<biggest(str,4)<<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];
		// 1 2 3 4 5
		// 1(i==0) <-> 5(i==5-0+-1)
		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[]={-1, 3.3, 5.5, -4};
	int retSize=0;
	
	double *p=remove(x,5,y,4, retSize);
	for(int i=0;i<retSize;i++) cout<<p[i]<<' ';
	cout<<endl;
	
	delete []p;
}

 

 

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.

 

 

 

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<<"평균 = "<<(double)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;
		}
	}
}

 

cin.ignore(1, '\n') 적절히 사용하기 !

 

 

 

11.

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

class Book{
	string title, author;
	int year;
public:
	Book(string t, string a, int y){
		title=t;author=a;year=y;
	}
	string getAuthor(){return author;}
	string getTitle(){return title;}
	int getYear(){return year;}
};

int main(){
	vector<Book> v;
	
	cout<<"입고할 책을 입력하세요. 년도에 -1을 입력하면 입고를 종료합니다"<<endl;
	while(true){
		int year;
		string title, author;
		
		cout<<"년도>>";
		cin>>year;
		if(year==-1) break;
		cin.ignore(1, '\n');
		
		cout<<"책이름>>";
		getline(cin, title);
		cout<<"저자>>";
		getline(cin, author);
		
		Book b(title, author, year);
		v.push_back(b);		
	}
	cin.ignore(1, '\n');
	cout<<"총 입고된 책은 "<<v.size()<<"권 입니다."<<endl;
	
	string author;
	cout<<"검색하고자 하는 저자이름을 입력하세요>>";
	getline(cin, author);
	
	for(int i=0;i<v.size();i++){
		if(author==v[i].getAuthor())
			cout<<v[i].getYear()<<"년도, "<<v[i].getTitle()<<", "<<v[i].getAuthor()<<endl;
	}
	
	int year;
	cout<<"검색하고자 하는 년도를 입력하세요>>";
	cin>>year;
	
	for(int i=0;i<v.size();i++){
		if(year==v[i].getYear())
			cout<<v[i].getYear()<<"년도, "<<v[i].getTitle()<<", "<<v[i].getAuthor()<<endl;
	}
} 

 

 

 

12.

Open Challenge 수정

영어 어휘 테스트 프로그램

 

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

class Word{
	string eng;
	string kor;
public:
	Word(string eng, string kor){
		this->eng=eng;this->kor=kor;
	}
	string getEng(){return eng;}
	string getKor(){return kor;}
};

int main(){
	vector<Word> v;
	
	// 미리 몇 개의 단어 뭉치들을 벡터에 삽입한다 
	Word bunch[5]={Word("stock", "주식"), Word("bear", "곰"), Word("doll", "인형"),
		Word("honey", "자기"), Word("painting", "그림")};
	for(int i=0;i<5;i++)
		v.push_back(bunch[i]);
	
	cout << "***** 영어 어휘 테스트를 시작합니다. ******" << endl;
	while(true){
		int choice;
		cout << endl<< "1. 어휘 삽입 / 2. 어휘 테스트 / 3. 단어장 출력 / 그 외 키 : 프로그램 종료 >> ";
		cin >> choice;
		
		if(choice==1){
			string english, korean;
			cout<<"영어 단어에 exit을 입력하면 입력 끝"<<endl<<endl;
			
			while(true){ 
				cout<<"영어 >> ";
				cin >> english;
				if(english=="exit") break;
				cout<<"한글 >> ";
				cin >> korean;
				
				Word new_word(english, korean);
				v.push_back(new_word);
			}
		}
		
		else if(choice==2){
			cout<<"영어 어휘 테스트를 시작합니다. 1~4 외 ㄷ른 입력시 종료."<<endl<<endl;
			srand(time(0));
			
			while(true){
				int eng=rand()%v.size(); // 벡터의 '인덱스'를 랜덤으로 추출 
				cout<<v[eng].getEng()<<"?"<<endl; // 해당 인덱스의 영어 단어를 출력 
				
				int answer=rand()%4; // eng 인덱스 번호에 해당하는 kor의 정답은 answer 번째에 나타날 것
				 
				int kor[4]; // 총 4개의 선택지(한국어) 
				for(int i=0;i<4;i++){
					if(i==answer){ // answer번째 i가 나오면 skip 
						kor[i]=eng;
						continue;
					}
					kor[i]=rand()%v.size(); // kor[i]에 벡터의 인덱스 랜덤으로 저장
					if(kor[i] == eng) kor[i]=rand()%v.size(); // answer과 동일하다면 다시 한번 시도 
				}
				
				// 랜덤으로 뽑은 인덱스에 해당하는 한글 단어 출력 0
				for(int i=0;i<4;i++) cout<<"("<<i+1<<")"<<" "<<v[kor[i]].getKor()<<" ";
				cout<<":>";
				
				int num; // 1, 2, 3, 4 중 입력 받기 
				cin>>num; // num에 해당하는 v[kor[num]].getEng() 과 v[eng].getEng()과 같아야함
				if(!(num==1||num==2||num==3||num==4)) break;
				 
				if(v[eng].getEng()==v[kor[num-1]].getEng()) cout<<"Excellent !! "<<endl<<endl;
				else cout<<"No. !!"<<endl<<endl;
			}
		}
		
		else if (choice==3){
			for(int i=0;i<v.size();i++){
				cout<<"[ "<<v[i].getEng()<<" : "<<v[i].getKor()<<" ] "<<endl;
			}
		}
		else break;
	}
}

 

 

함수로 구현:

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

class Word{
	string eng;
	string kor;
public:
	Word(string eng, string kor){
		this->eng=eng;this->kor=kor;
	}
	string getEng(){return eng;}
	string getKor(){return kor;}
};

void createList(vector<Word>& v){
	// 미리 몇 개의 단어 뭉치들을 벡터에 삽입한다 
	Word bunch[5]={Word("stock", "주식"), Word("bear", "곰"), Word("doll", "인형"),
		Word("honey", "자기"), Word("painting", "그림")};
		
	for(int i=0;i<5;i++)
		v.push_back(bunch[i]);
} 
void addList(vector<Word>& v){
	string english, korean;
	cout<<"영어 단어에 exit을 입력하면 입력 끝"<<endl<<endl;
		
	while(true){ 
		cout<<"영어 >> ";
		cin >> english;
		if(english=="exit") break;
		cout<<"한글 >> ";
		cin >> korean;
		
		Word new_word(english, korean);
		v.push_back(new_word);
	}
}

void Test(vector<Word>& v){
	cout<<"영어 어휘 테스트를 시작합니다. 1~4 외 다른 입력시 종료."<<endl<<endl;
			
	while(true){
		srand(time(0));
		int eng=rand()%v.size(); // 벡터의 '인덱스'를 랜덤으로 추출 
		cout<<v[eng].getEng()<<"?"<<endl; // 해당 인덱스의 영어 단어를 출력 
				
		int answer=rand()%4; // eng 인덱스 번호에 해당하는 kor의 정답은 answer 번째에 나타날 것	 
		int kor[4]; // 총 4개의 선택지(한국어) 
		
		for(int i=0;i<4;i++){
			if(i==answer){ // answer번째 i가 나오면 skip 
				kor[i]=eng;
				continue;
			}
			kor[i]=rand()%v.size(); // kor[i]에 벡터의 인덱스 랜덤으로 저장
			if(kor[i] == eng) kor[i]=rand()%v.size(); // answer과 동일하다면 다시 한번 시도 
		}
				
		// 랜덤으로 뽑은 인덱스에 해당하는 한글 단어 출력 0
		for(int i=0;i<4;i++) cout<<"("<<i+1<<")"<<" "<<v[kor[i]].getKor()<<" ";
		cout<<":>";
				
		int num; // 1, 2, 3, 4 중 입력 받기 
		cin>>num; // num에 해당하는 v[kor[num]].getEng() 과 v[eng].getEng()과 같아야함
		if(!(num==1||num==2||num==3||num==4)) break;
				 
		if(v[eng].getEng()==v[kor[num-1]].getEng()) cout<<"Excellent !! "<<endl<<endl;
		else cout<<"No. !!"<<endl<<endl;
	}
} 

void printList(vector<Word>& v){
	for(int i=0;i<v.size();i++)
		cout<<"[ "<<v[i].getEng()<<" : "<<v[i].getKor()<<" ] "<<endl;
} 

int main(){
	vector<Word> v;
	createList(v);
	
	cout << "***** 영어 어휘 테스트를 시작합니다. ******" << endl;
	while(true){
		int choice;
		cout << endl<< "1. 어휘 삽입 / 2. 어휘 테스트 / 3. 단어장 출력 / 그 외 키 : 프로그램 종료 >> ";
		cin >> choice;
		
		if(choice==1) addList(v);
		else if(choice==2) Test(v); 
		else if (choice==3)	printList(v);
		else break;
	}
}

 

 

 

728x90
반응형
Comments