C-C++/명품 C++ Programming

[(개정판) 명품 C++ programming] 11장 실습 문제

최옥구 2023. 1. 8. 07:00
반응형

1. int.getline()함수를ㅇ 이용하여 키보드로부터 한 라인을 읽고 'a'가 몇개인지 출력하는 프로그램을 작성하라.

[결과]

[소스 코드]

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

int main() {
	int ch;
	int count{};
	cout << "a를 입력하세요 >> ";
	while((ch = cin.get()) != EOF) {
		if (ch == '\n')
			break;
		else if(ch == 'a')
			count++;
	}
	cout << count;
}

 


 

2. istream& get(char& ch) 함수를 이용하여 한 라인을 읽고 빈칸(' ')이 몇 개인지 출력하는 프로그램을 작성하라.

[결과]

[소스 코드]

#include <iostream>
using namespace std;

int main() {
	cout << "빈칸의 개수를 출력하는 프로그램입니다. 문자열을 입력하세요 >> ";
	char ch;
	int count{};
	while (true) {
		cin.get(ch);
		if (cin.eof())
			break;
		else if (ch == ' ')
			count++;
		else if (ch == '\n')
			break;
	}
	cout << count;
}

 


 

3. 한 줄에 '영어문장 ; 한글문장' 형식으로 키 입력될 때 cin.ignore()을 이용하여 ';' 이후에 입력된 문자열을 화면에 출력하는 프로그램을 작성하라. 아래에서 ^z 키는 입력 종료를 나타내는 키이며, cin.get()EOF를 리턴한다.

[결과]

[소스 코드]

#include <iostream>
using namespace std;

int main() {
	char ch;
	cout << "문자열을 입력해주세요, ;가 기준입니다. " << endl;
	cin.ignore(100, ';');
	while ((ch = cin.get()) != EOF) {
		cout.put(ch);
		if (ch == '\n')
			cin.ignore(100, ';'); 
	}
}

 


 

4. 한 줄에 '영어문장;한글문자' 형식으로 키 입력될 때 cin.ignore()를 이용하여 ';'이전에 입력된 문자열만 출력하는 프로그램을 작성하라. 아래에서 ^z 키는 입력 종료를 나타내는 키이며, cin.get()EOF를 리턴한다.

[결과]

[소스 코드]

#include <iostream>
using namespace std;

int main() {
	char ch;
	cout << "문자열을 입력해주세요, ;가 기준입니다. " << endl;
    while ((ch = cin.get()) != EOF) {
        if (ch == ';') {
            cout.put('\n');
            cin.ignore(100, '\n');
        }
        else
            cout.put(ch);
    }
}

 


 

5. 다음 프로그램은 예제 11-3의 코드이다. 아래 코드에서 char[] 대신 string을 이용하여 문자열을 다루도ㅓ록 프로그램을 재작성하라.

[결과]

[소스 코드]

#include <iostream>
#include<string>

using namespace std;

int main() {
	string cmd;
	cout << "getline()으로 문자열을 읽습니다. " << endl;
	while (true) {
		cout << "종료하려면 exit를 입력하세요 >> ";
		getline(cin, cmd);
		if (cmd  == "exit") {
			cout << "프로그램을 종료합니다. --- ";
			return 0;
		}
	}
}

 


 

6. 다음과 같이 정수, 제곱, 제곱근의 값을 형식에 맞추어 출력하는 프로그램을 작성ㅎ라라. 필드의 간격은 총 15칸이고 제곱근의 유효 숫자 거리는 총 3자리로 한다. 빈칸은 모두 underline(_) 문자로 한다.

[결과]

[소스 코드]

#include <iostream>
#include <iomanip>
#include<cmath>

using namespace std;

int main() {
	cout.setf(ios::left);
	cout << setw(15) << "Number";
	cout << setw(15)  << "Square";
	cout << setw(15) << "Square Root";
	cout << endl;
	for (int i = 0; i <= 45; i += 5)
	{
		cout << setw(15) << setfill('_') << i;
		cout << setw(15) << setfill('_') << pow(i, 2);
		double j = sqrt(i);
		cout.precision(4);
		cout << setw(15) << setfill('_') << j;
		cout << endl;
	}
}

 


 

7. 0에서 127까지 ASKII 코드와 해당 문자를 다음과 같이 출력하ㅣ는 프로그램을 작성하라. 화면에 출력가능하지 않는 ASKII 코드는 '.'으로 출력하라.

[결과]

[소스 코드]

#include <iostream>
#include <iomanip>
#include <cctype>
#include<cmath>

using namespace std;
int main() {
	cout.setf(ios::left);

	for (int i = 0; i < 4; i++) {
		cout << setw(10) << "dec";
		cout << setw(10) << "hexa";
		cout << setw(10) << "char";
		
	}
	cout << endl;
	for (int i = 0; i < 4; i++) {
		cout << setw(10) << "___";
		cout << setw(10) << "____";
		cout << setw(10) << "____";
	}
	cout << endl;
	char c;
	for (int i = 0; i < 128; i++){
		for (int j = 0; j < 4; j++) {
			cout << setw(10) << setfill(' ') << dec << i;
			cout << setw(10) << setfill(' ') << hex << i;
			if (isprint(i))
				c = (char)i;
			else c = '.';
			cout << setw(10) << setfill(' ') << c;
		}
		cout << endl;
	}
}

 


8. Circle 클래스는 다음과 같다. . . . Circle 클래스의 객체를 입출력하는 다음 코드와 실행 결과를 참조하여 <<, >> 여연산자를 작성하고, Circle 클래스를 수정하는 등 프로그램을 완성하라.

[결과]

[소스 코드]

#include <iostream>
#include <iomanip>
#include <cctype>
#include<cmath>
#include <string>
using namespace std;

class Circle {
	string name;
	int radius;
public:
	Circle(int radius = 1, string name = " ") {
		this->radius = radius; this->name = name;
	}
	friend istream& operator >> (istream& stream, Circle &p);
	friend ostream& operator << (ostream& stream, Circle &p);
};

istream &operator >> (istream &stream, Circle &p) {
	cout << "반지름 > ";
	cin >> p.radius;
	cin.ignore();
	cout << "이름 > ";
	getline(cin, p.name);
	return stream;
}

ostream& operator << (ostream& stream, Circle &p) {
	cout << "반지름이 " << p.radius << "인 " <<  p.name;
	return stream;
}

int main() {

	Circle d, w;
	cin >> d >> w;
	cout << d << w << endl;
}

 


 

9. 다음은 Phone 클래스이다. . . Phone 클래스의 객체를 입출력하는 아래 코드와 실행 결과를 참조하여 <<, >> 연산자를 작성하고 Phone 클래스를 수정하는 등 프로그램을 완성하라.

[결과]

[소스 코드]

#include <iostream>
#include <iomanip>
#include <cctype>
#include<cmath>
#include <string>
using namespace std;

class Phone {
	string name;
	string telnum;
	string address;
public:
	Phone(string name = " ", string telnum = " ", string address = " ") {
		this->name = name;
		this->telnum = telnum;
		this->address = address;
	}
	friend istream& operator >> (istream& stream, Phone& p);
	friend ostream& operator << (ostream& stream, Phone& p);
};

istream &operator >> (istream &stream, Phone &p) {
	cout << "이름 : ";
	cin >> p.name;
	cout << "전화번호 : ";
	cin >> p.telnum;
	cin.ignore();
	cout << "주소 : ";
	getline(cin, p.address);
	return stream;
}

ostream& operator << (ostream& stream, Phone &p) {
	cout << "(" << p.name << ", " << p.telnum << ", " << p.address << ")";
	return stream;
}

int main() {
	Phone girl, boy;
	cin >> girl >> boy;
	cout << girl << endl << boy << endl;
}

 


 

10. 다음은 프로그램과 실행 결과를 보여준다 prompt 조작자를 작성하여 프로그램을 완성하라.

[결과]

[소스 코드]

#include <iostream>
#include <iomanip>
#include <cctype>
#include<cmath>
#include <string>
using namespace std;

istream &prompt(istream& ins) {
	cout << "암호 ? ";
	return ins;
}

int main() {
	string password;
	while (true) {
		cin >> prompt >> password;
		if (password == "C++"){
			cout << "Login success!" << endl;
			break;
		}
		else 
			cout << "Login failed!" << endl;
	}
}

 


 

11. 다음은 프로그램과 실행 결과를 보여준다. pos 조작자를 작성하라.

[결과]

[소스 코드]

#include <iostream>
#include <iomanip>
#include <cctype>
#include<cmath>
#include <string>
using namespace std;

istream& pos(istream& ins) {
	cout << "위치는 ? ";
	return ins;
}

int main() {
	int x, y;
	cin >> pos >> x;
	cin >> pos >> y;
	cout << x << ',' << y << endl;
}

 


 

12. 커피 자판기 시뮬레이터를 C++로 작성해보자. 실행 사례는 다음과 같다. 자판기는 보통 커피, 설탕 커피, 블랙 커피의 3종류만 판매한다. 단순화를 위해 실행 사례에는 총 3인분의 재료만 가지도록 하였다. 커피 메뉴에 따라 필요한 재료들이 하나씩 없어진다. 객체 지향 구조ㅓ에 따라 필요한 클래스를 작성하여 프로그램을 완성하라.

[결과]

정해진 규칙이 없기 때문에 다양한 형식의 답안이 나올 수 있습니다.&nbsp; 가령 모든 요소를 클래스 객체로 만들 수도 있고, 연산자나 조작자를 사용할 수도 있겠네요.

[소스 코드]

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

class CoffeeMachine {
protected:
	int coffeeLeft{};
	int coffeeList[5];
public:
	CoffeeMachine();
	void show();
	bool inputChoice();
	void refill();
};

CoffeeMachine::CoffeeMachine() {
	cout << "명품 커피 자판기를 켭니다." << endl;
	for (int i = 0; i < 5; i++)
		coffeeList[i] = 5;
}
	

void CoffeeMachine::refill() {
	cout << "모든 통을 채웁니다~" << endl;
	for (int i = 0; i < 5; i++)
		coffeeList[i] = 5;
}

bool CoffeeMachine::inputChoice() {
	int choice;
	cin >> choice;
	switch (choice) {
	case 0:// 커피
		cout << "맛있는 보통 커피 나왔습니다~~ " << endl;
		coffeeList[0]--; 
		coffeeList[3]--;
		coffeeList[4]--;
		break;
	case 1:// 설탕
		cout << "맛있는 설탕 커피 나왔습니다~~ " << endl;
		coffeeList[0]--;
		coffeeList[1]--; 
		coffeeList[3]--;
		coffeeList[4]--;
		break;
	case 2: // 블랙
		cout << "맛있는 블랙 커피 나왔습니다~~ " << endl;
		coffeeList[0] -= 2;
		coffeeList[3]--;
		coffeeList[4]--;
		break;
	case 3: // 모두 채우기
		refill();
		break;
	case 4: // 종료 
		return false;
		break;
	default:
		cout << "입력이 잘못되었습니다." << endl;
		break;
	}
}

void CoffeeMachine::show() {
	int kind{ };
	cout << "Coffee" << "\t";
	for (int i = 0; i <= coffeeList[kind]; i++) {
		cout << "*";
	}
	kind++;
	cout << endl;
	cout << "Sugar" << "\t";
	for (int i = 0; i <= coffeeList[kind]; i++) {
		cout << "*";
	}
	cout << endl;
	kind++;
	cout << "CREAM" << "\t";
	for (int i = 0; i <= coffeeList[kind]; i++) {
		cout << "*";
	}
	cout << endl;
	kind++;
	cout << "Water" << "\t";
	for (int i = 0; i <= coffeeList[kind]; i++) {
		cout << "*";
	}
	cout << endl;
	kind++;
	cout << "Cup" << "\t";
	for (int i = 0; i <= coffeeList[kind]; i++) {
		cout << "*";
	}
	cout << endl;
}

static void run() {
	CoffeeMachine coffeMachine;
	while (true) {
		cout << "보통 커피 : 0, 설탕 커피 : 1, 블랙 커피 : 2, 채우기 : 3, 종료 : 4 >> ";
		if (!coffeMachine.inputChoice())
			break;
		coffeMachine.show();
	}
}

int main() {
	run();
}

 


 

책에서 나오는 힌트나 조건들의 일부는 저작자 존중을 위해 일부러 작성하지 않았습니다. 

개인 공부용으로 올리는 만큼 풀이에 대한 지적 감사하겠습니다.

반응형