관리 메뉴

공부 기록장 💻

명품 C++ Programming 4장 실습 문제 - 동적 메모리 할당, 객체 동적 생성, 객체 배열, string 문자열 객체 본문

# Language & Tools/C++

명품 C++ Programming 4장 실습 문제 - 동적 메모리 할당, 객체 동적 생성, 객체 배열, string 문자열 객체

dream_for 2021. 4. 19. 16:34

(명품 C++ 프로그래밍 4장)

 

1.

#include <iostream>
using namespace std;

class Color {
	int red, blue, green;
public:
	Color() { red = blue = green = 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 << endl; }
};

int main() {
	Color screenColor(255, 0, 0);
	Color* p = &screenColor;
	p->show();

	Color colors[3];
	p = colors;

	p[0].setColor(255, 0, 0);
	p[1].setColor(0, 255, 0);
	p[2].setColor(0, 0, 255);

	for (int i = 0;i < 3;i++)
		p[i].show();
	cout << endl;
}

 

 

2. 

 

#include <iostream>
using namespace std;

int main() {
	int n, sum = 0;

	cout << "정수의 개수 몇 개? >> ";
	cin >> n;

	int* arr = new int[n];
	cout << "정수 " << n << "개 입력>> ";
	for (int i = 0;i < n;i++) {
		cin >> arr[i];
		sum += arr[i];
	}

	cout << "평균 " << (double)sum / n << endl;
}

 

 

3. 

 

(1) 문자열에서 특정한 값 탐색 (at(), []이용)

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

int main() {
	string s;
	char c;
	int cnt = 0;

	cout << "문자열 입력 >> ";
	getline(cin, s);

	cout << "검색할 문자 >> ";
	cin >> c;

	// s.length(), s.size()
	for (int i = 0;i < s.length();i++) {
		if (s[i] == c)cnt++;
		//if (s.at(i) == c) cnt++;
	}
	cout << "문자 " << c << "는 " << s << "에 " << cnt << "개 있습니다." << endl;
}

 

 

 

(2) 문자열에서 특정한 값 찾아 인덱스를 리턴하는 find 함수 이용

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

int main() {
	string s;
	char c;
	int index = 0;

	cout << "문자열 입력 >> ";
	getline(cin, s);

	cout << "검색할 문자 >> ";
	cin >> c;

	index = s.find('a'); // 문자열의 시작부터 a 찾아 index 
	while (index>0) {
		cout << index << "번째에서 a 발견" << endl;
		index = s.find('a', index+1);
	}
}

 

 

 

4. 

 

#include <iostream>
using namespace std;

class Sample {
	int* p;
	int size;
public:
	Sample(int n) { size = n;p = new int[n]; }
	void read() {
		cout << size<< "개 입력 >> ";
		for (int i = 0;i < size;i++) cin >> p[i];
	}
	void write() {
		for (int i = 0;i < size;i++)cout << p[i] << " ";
	}
	int big() {
		int big = p[0];
		for (int i = 1;i < size;i++)if (p[i] > big)big = p[i];
		return big;
	}
	~Sample() {
		if (p)delete[]p;
	}
};

int main() {
	Sample s(10);
	s.read();
	s.write();
	cout << endl<<"가장 큰 수는 " << s.big() << endl;
}

 

 

5.

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

int main() {
	srand((unsigned)time(NULL));

	string s;
	string alpha("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");

	while (true) {
		cout << "아래에 한 줄을 입력하세요.(exit이면 종료)" <<endl<< ">>";
		getline(cin, s);
		if (s == "exit")break;

		int n = rand() % s.length(); // 문자열의 인덱스 중 하나(변경될 문자에 해당하는 랜덤 인덱스 값)

		s[rand()%n] = alpha[rand() % alpha.size()];
		cout << s << endl << endl;
	}
}

 

문자열을 입력 받아 글자 하나를 랜덤하게 수정하여 출력한다.

여러가지 방법이 있겠지만, 나는 직접 string alpha 객체를 생성하여 

알파벳 소문자/대문자 전체로 문자열을 초기화하였다.

 

 

 

아스키 코드값을 이용하여 변경하기 위해선 다음과 같은 방법을 사용하였다.

 

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

int main() {
	string s;
	cout << "아래에 한 줄을 입력하세요.(exit를 입력하면 종료합니다)" << endl;
	while (true) {
		cout << endl << ">>";
		getline(cin, s);
		if (s == "exit")break;

		// s.length() 내에서 변경할 문자 하나 선택
		srand((unsigned)time(NULL));
		int n = rand() % s.length();

		// a~z 까지 하나로 선택
		char alphaN = rand() % 26 + 97;

		// 만약 이전과 동일한 문자면 소문자로
		if (s[n] == alphaN)alphaN = rand () % 26 + 65;

		// 문자 변경
		s[n] = alphaN;

		// 변경된 문자열 출력
		cout << s;
	}
}

 

 

 

6. 문자열 거꾸로 출력

 

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

int main() {
	string s;
	cout << "아래에 한 줄을 입력하세요.(exit를 입력하면 종료합니다)" << endl;
	while (true) {
		cout << endl << ">>";
		getline(cin, s);
		if (s == "exit")break;

		for (int i = s.length();i >= 0;i--)
			cout << s[i];
		cout << endl;
	}
}

 

 

7. 

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

class Circle {
	int radius;
public:
	void setRadius(int r) { radius = r; }
	double getArea() {
		return 3.14 * radius * radius;
	}
};

int main() {
	Circle circle[3];
	int temp;
	int cnt = 0;

	for (int i = 0;i < 3;i++) {
		cout << "원 " << i+1 << "의 반지름 >> ";
		cin >> temp;
		circle[i].setRadius(temp);
		if (circle[i].getArea() > 100)cnt++;
	}
	cout << "면적이 100보다 큰 원은 " << cnt << "개 입니다."<<endl;
}

 

 

 

8. 

 

7 번 문제에서 수정

 

int main() {
	int n;
	cout << "원의 개수 >> ";
	cin >> n;
	Circle* circle = new Circle[n];

	int temp;
	int cnt = 0;

	for (int i = 0;i < n;i++) {
		cout << "원 " << i+1 << "의 반지름 >> ";
		cin >> temp;
		circle[i].setRadius(temp);
		if (circle[i].getArea() > 100)cnt++;
	}
	cout << "면적이 100보다 큰 원은 " << cnt << "개 입니다."<<endl;
}

 

 

 

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() {
	int n;
	cout << "몇 명의 번호를 저장하시겠습니까 ? >> ";
	cin >> n;

	Person* person = new Person[n];
	cout << "이름과 전화 번호를 입력해 주세요" << endl;
	
	string name, tel;
	for (int i = 0;i < n;i++) {
		cout << "사람 " << i + 1 << " >> ";
		cin >> name >> tel;
		person[i].set(name, tel);
	}

	cout << endl << "---------정보 출력---------" << endl;
	for (int i = 0;i < n;i++) {
		cout << "사람 " << i + 1 << " >> " <<person[i].getName() << " " << endl;
	}

	cout << endl << "검색할 사람의 이름 >> ";
	cin >> name;

	for (int i = 0;i < n;i++)
		if (person[i].getName() == name)
			cout << "전화 번호는 " << person[i].getTel() << endl;	
}

 

 

 

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; // Person 배열에 대한 포인터
	int size; // Family 클래스에서 생성될 배열 객체 개수
	string name; // Family 이름
public:
	// Family 생성자
	Family(string name, int size) {
		p = new Person[size]; // 입력 받은 size에 대해서 Person 객체 포인터 생성
		this->name = name; // Family 이름
		this->size = size; // Family 멤버수
	}
	void setName(int n, string name) {
		p[n].setName(name); // 가족 멤버의 이름 설정
	}
	void show() {
		cout << name << "가족은 다음과 같이 " << size << "명 입니다." << endl;
		for (int i = 0;i < size;i++)
			cout << p[i].getName() << '\t';
		cout << endl;
	}
	~Family() { delete[]p; }
};
int main() {
	Family* simpson = new Family("Simpson", 3);
	simpson->setName(0, "Mr.Simpson");
	simpson->setName(1, "Mr.Simpson");
	simpson->setName(2, "Mr.Simpson");
	simpson->show();
	delete simpson;
}

 

 

 

11. 

#include <iostream>
using namespace std;


class Container {
	int size;
public:
	Container() { size = 10; }
	void fill() { size = 10; }
	void consume() { size--; }
	int getSize() { return size; }
};

class CoffeeVendingMachine {
	Container tong[3];
	void fill();
	void selectEspresso();
	void selectAmericano();
	void selectSugarCoffee();
	void show();
public:
	void run();
};

void CoffeeVendingMachine::fill() {
	for (int i = 0;i < 3;i++)
		tong[i].fill();
}
void CoffeeVendingMachine::selectEspresso() {
	for (int i = 0;i < 2;i++) {
		if (tong[i].getSize() == 0) {
			cout << "원료가 부족합니다" << endl;
			run();
		}
	}
	tong[0].consume(); tong[1].consume();
	cout << "에스프레소 드세요" << endl;
}
void CoffeeVendingMachine::selectAmericano() {
	for (int i = 0;i < 2;i++) {
		if (tong[i].getSize() == 0) {
			cout << "원료가 부족합니다" << endl;
			run();
		}
	}
	tong[0].consume(); for (int i = 0;i < 2;i++)tong[1].consume();
	cout << "아메리카노 드세요" << endl;
}
void CoffeeVendingMachine::selectSugarCoffee() {
	for (int i = 0;i < 3;i++) {
		if (tong[i].getSize() == 0) {
			cout << "원료가 부족합니다" << endl;
			run();
		}
	}

	tong[0].consume();
	tong[1].consume();tong[1].consume();
	tong[2].consume();tong[2].consume();
	cout << "설탕커피 드세요" << endl;
}
void CoffeeVendingMachine::show() {
	cout << "커피 " << tong[0].getSize() << ", 물 " << tong[1].getSize() << ", 설탕 " << tong[2].getSize() << endl;
}

void CoffeeVendingMachine::run()
{
	int menu;
	while (1) {
		cout << "메뉴를 눌러주세요(1: 에스프레소, 2: 아메리카노, 3: 설탕커피, 4 : 잔량보기, 5: 채우기) >> ";
		cin >> menu;
		switch (menu) {
		case 1:selectEspresso();break;
		case 2:selectAmericano();break;
		case 3:selectSugarCoffee();
		case 4:show();break;
		case 5:fill();break;
		}
	}
}
int main() {
	CoffeeVendingMachine *machine=new CoffeeVendingMachine;

	cout << "***** 커피 자판기를 작동합니다. *****" << endl;
	machine->run();
	delete machine;
}

 

 

 

12. 

728x90
반응형
Comments