본문 바로가기
교재 및 CS공부/명품C++Programming

[명품C++Programming] 3장 실습문제

by veganwithbacon 2023. 4. 21.
반응형

1. main()의 실행 결과가 다음과 같도록 Tower클래스를 작성하라.

#include <iostream>
using namespace std;

int main(){
	Tower myTower; //1미터
    Tower seoulTower(100);
    cout << "높이는 " <<myTower.getHeight << "미터"<< endl;
    cout << "높이는 " <<seoulTower.getHeight << "미터"<< endl;
}
class Tower{
    private:
        int height;
    public:
    	Tower();
        Tower(int a);
        getHeight();
};

Tower::Tower(){
	height=1;
}
Tower::Tower(int a){
	height=a;
}

int Tower::getHeight(){
    return height;
}

 

2. 날짜를 다루는 Date클래스를 작성하고자 한다. Date를 이용하는 main()과 실행 결과는 다음과 같다. 클래스 Date를 작성해 아래 프로그램에 추가해라.

#include <iostream>
using namesapce std;

class Date{
	int year;
	int month;
	int day;
    public :
           Date(int a, int b, int c);
           Date(string x);
           void show();
           int getYear();
		   int getMonth();
		   int getDay();
}

Date::Date(int a, int b, int c){
		year = a;
        month = b;
        day = c;
}
Date::Date(string x){
	year = stoi(x);
    month = stoi(x.substr(5,6));
    day = stoi(x.substr(7,9));
}

int Date::getYear(){
	return year;
}
int Date::getMonth(){
	return month;
}
int Date::getDay(){
	return day;
}
void Date::show(){
cout << year() << "년"<< month() <<"월"<< day()<<"일"<<endl;
}


int main(){
	Date birth(2014, 3, 20);
	Date independenceDay("1945/8/15");
	independenceDay.show();
	cout << birth.getYear() << ',' << birth.getMonth() << ',' << birth.getDay() << endl;
}

실행겸 바로 적었다.

 

3. 은행에서 사용하는 프로그램을 작성하기 위해, 은행 계좌 하나를 표현하는 클래스 Account가 필요하다. 계좌 정보는 계좌의 주인, 계좌 번호, 잔액을 나타내는 3 멤버 변수로 이뤄진다. main() 함수의 실행 결과가 다음과 같도록 Account 클래스를 작성하라.

int main(){
	Account a("kitae", 1, 5000);
	a.deposit(50000);
    cout << a.getOwner() << "의 잔액은 " << a.inquiry() << endl;
    int money = a.withdraw(20000);
	cout << a.getOwner() << "의 잔액은 "<<a.inquiry() << endl;
}
class Account{
	private :
    	string name;
		int id;
		int balance;
    public :
    	Account(string a, int b, int c);
        deposit(int a);
        getOwner();
        withdraw(int a);
}

Account::Account(string  a, int b, int c){
name = a;
id = b;
balance = c;
}

void Account::deposit(int a){
	money += a;
}
int Account::withdraw(int a){
	money -= a;
	return money;
}
string Account::getOwner(){
	return name;
}
int Account::inquiry(){
	return money;
}

 

4. Coffee머신 문제

int main(){
CoffeeMachine java(5,10,3); //커피량:5, 물량:10, 설탕:6으로 초기화
java.drinkEspresso(); //커피1, 물1 소비
java.show(); // 현재 커피 머신의 상태 출력
java.drinkAmericano(); //커피1, 물2 소비
java.show(); // 현재 커피 머신의 상태 출력
java.drinkSugarCoffe();// 커피1, 물2, 설탕 1 소비
java.show(); // 현재 커피 머신의 상태 출력
java.fill(); // 커피 10, 물 10, 설탕 10으로 채우기
java.show(); // 현재 커피 머신의 상태 출력
}
class CoffeeMachine{
	private: 
			int coffee;
			int water;
			int sugar;
	public :
    		CoffeeMachine(int a, int b, int c);
			drinkEspresso();
			drinkAmericano();
			drinkSugarCoffee();
			show();
			fill();
}

CoffeeMachine::CoffeeMachine(int a, int b, int c){
coffee = a;
water = b;
sugar = c;
}

CoffeeMachine::drinkEspresso(){
coffee=coffee-1;
water=water-1
}

CoffeeMachine::drinkAmericano(){
coffee=coffee-1;
water=water-2
}

CoffeeMachine::drinkSugarCoffee(){
coffee=coffee-1;
water=water-2;
sugar=sugar-1;
}

void CoffeeMachine::show(){
cout<<"커피 마신 상태, 커피:"<< coffee << " 물:"<<water<<" 설탕:"<<sugar<<endl;
}

void CoffeeMachine::fill(){
coffee = 10;
water = 10;
sugar = 10;
}

 

5. 난수 발생 Random클래스

int main(){
	Random=r;
    cout <<"--0에서" << RAND_MAX<<"가지의 랜덤 정수 10--개"<<end;
    for(int i=0;, i<10; i++){
    	int n = r.next();
        cout<<n<< '  ';
    }
    cout << endl<<endl<<"--2에서 "<<"4까지의 랜덤정수 10개 --"<<endl;
	for(int i=0; i<10; i++){
    	int n=r.nextInRange(2,4); //2에서 4사이의 랜덤한 정수
        cout << n << '  ';
    }
    cout<<endl;
}

 

class Random {
public:
    Random();
    int next();
    int nextInRange(int x, int y);
};
Random::Random() {
    srand((unsigned)time(0));
}
int Random::next() {
    return rand();
}
int Random::nextInRange(int x,int y) {
    return rand() % (y - x+1) + x;
}

중간에 안적은 문제들은 비슷한 유형에 라이브러리 함수를 많이써서 생략함

 

9. Oval 클래스는 주어진 사각형에 내접하는 타원을 추상화한 클래스다. Oval클래스의 멤버는 다음과 같다

Oval클래스를 선언부/구현부로 나눠작성하라.

#include <iostream>
using namespace std;

int main() {
	Oval a, b(3, 4);
    a.set(10, 20);
	a.show();
	cout << b.getWidth() << "," << b.getHeight() << endl;
}
class Oval{
	private:
    		int width;
			int height;
	public:
			Oval();
			Oval(int x, int y);
            ~Oval();
            getWidth();
            getHeight();
            void set(int w,int h);
            void show();
};

Oval::Oval(){
width = 1;
height = 1;
}

Oval::Oval(int x, int y){
width = x;
height = y;
}

Oval::~Oval(){
cout <<"Oval 소멸 : width = " << width<< ", height = "<< height << endl;
}

Oval::getWidth(){
return width;
}

Oval::getHeight(){
return height;
}

void Oval::set(int w, int h){
width = w;
height = h;
}

void Oval::show(){
	cout << "width = " << width << ", height = " << height << endl;
}

 

 

10. 다수의 클래스를 선언하고 활용하는 간단한 문제이다. 더하기(+), 빼기(-), 곱하기(*), 나누기(/)를 수행하는 4개의 클래스 Add, Sub, Mul, Div를 만들고자 한다. 이들은 모두 공통으로 다음 멤버를 가진다.

- int 타입 변수 a, b : 피연산자

- void setValue(int x, int y) 함수 : 매개 변수 x,y를 멤버 a,b에 복사

- int calculate() 함수 : 연산을 실행하고 결과 리턴

 

(1)클래스의 선언부와 구현부를 분리하고, 모든 코드를 Calculator.cpp 파일에 작성

#include <iostream>
using namespace std;


class Add{
	int a;
	int b;
public :
	void setValue(int x,int y);
	calculate();
};

void Add::setValue(int x, int y){
	a = x;
    b = y;
}

int Add::calculate(){
return a+b;
}

class Sub{
	int a;
	int b;
public :
	void setValue(int x, int y);
	calculate();
};

void Sub::setValue(int x, int y){
	a = x;
	b = y;
}

int Sub::calculate(){
return a-b;
}

class Mul{
	int a;
	int b;
public :
	void setValue(int x, int y);
	calculate();
};

void Mul::setValue(int x, int y){
	a = x;
	b = y;
}

int Mul::calculate(){
return a*b;
}

class Div{
	int a;
	int b;
public :
	void setValue(int x, int y);
	calculate();
};

void Div::setValue(int x, int y){
	a = x;
	b = y;
}

int Div::calculate(){
return a/b;
}

 

(2)클래스의 선언부와 구현부를 헤더 파일과 cpp 파일로 나누어 프로그램을 작성해라

 

나머지 3개도 형식은 아래랑 같다. 덧셈만 구현했으니 뺄셈 나눗셈 곱셈은 구현해보자.

//Add.h
#ifndef ADD_H
#define ADD_H

class Add {
	int a;
	int b;
public:
	void setValue(int x, int y);
	int calculate();
};

#endif
//Add.cpp
#include "Add.h"

void Add::setValue(int x, int y) {
	a = x;
	b = y;
}

int Add::calculate() {
	return a + b;
}
//main.cpp
#include <iostream>
using namespace std;

#include "Add.h"
#include "Sub.h"
#include "Mul.h"
#include "Div.h"

int main(void) {

	Add a;
	Sub s;
	Mul m;
	Div d;

	int num1, num2;
	char sign;

	while (true) {
		cout << "두 정수와 연산자를 입력하세요>>";
		cin >> num1 >> num2 >> oper;
		switch (sign) {
		case '+':
			a.setValue(num1, num2);
			cout << a.calculate() << endl;
			break;
		case '-':
			s.setValue(num1, num2);
			cout << s.calculate() << endl;
			break;
		case '*':
			m.setValue(num1, num2);
			cout << m.calculate() << endl;
			break;
		case '/':
			d.setValue(num1, num2);
			cout << d.calculate() << endl;
			break;
		}
	}

	return 0;
}

 

11. 다음 코드에서 Box 클래스의 선언부와 구현부를 Box.h, Box.cpp파일로 분리하고 main()함수 부분을 main.cpp로 분리하여 전체 프로그램을 완성해라.

//Box.h
#ifndef BOX_H
#define BOX_H

class Box{
	int width, height;
	char fill;
public : 
	Box(int w, int h);
    void setFill(char f);
    void setSize(int w, int h);
    void draw();
};
#include<Box.h>

Box::Box(int w, int h){
	setSize(w, h);
	fill = '*';
}

void Box::setFill(char f){
	fill = f;
}

void setSize(int w, int h){
	width = w;
	height = h;
}
void Box::draw(){
	for(int n=0; n<height; n++){
    	for(int m=0; m<width; m++){
        	cout << fill;
            }
        cout << endl;
    }
}
#include <iostream>
using namespace std;

int main(){
	Box b(10,2);
    b.draw();
    cout << endl;
    b.setSize(7, 4);
    b.setFill('^);
    b.draw();
}

12. 컴퓨터의 주기억장치를 모델링하는 클래스 Ram을 구현하려고 한다. Ram클래스는 데이터가 기록될 메모리 공간과 크기 정보를 가지고, 주어진 주소에 데이터를 기록하고(write), 주어진 주소로부터 데이터를 읽어 온다(read). Ram클래스는 다음과 같이 선언된다.

class Ram{
	char mem[100*1024]; //100kb 메모리. 한 번지는 한 바이트로 char타입 사용
	int size;
public:
	Ram(); // mem 배열을 0으로 초기화하고 size를 100*1024로 초기화
  	~Ram();  // "메모리 제거됨" 문자열 출력
	char rea(int address); // address 주소의 메모리 바이트 리턴
	void write(int address, cchar value); //address 주소에 한 바이트로 value 저장
};

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

//Ram.h
#ifndef RAM_H
#define RAM_H

class Ram{
	char mem[100*1024]; //100kb 메모리. 한 번지는 한 바이트로 char타입 사용
	int size;
public:
	Ram(); // mem 배열을 0으로 초기화하고 size를 100*1024로 초기화
  	~Ram();  // "메모리 제거됨" 문자열 출력
	char rea(int address); // address 주소의 메모리 바이트 리턴
	void write(int address, cchar value); //address 주소에 한 바이트로 value 저장
};
//Ram.cpp

#include Ram.h

Ram::Ram(){
	for(int i=0;i<100*1024;i++){
    	mem[i]=0;
    }    
	size = 100*1024;
}

Ram::~Ram(){
	cout << "메모리 제거됨" << endl;
}

char Ram::read(int address){
	return mem[address];
}

void Ram::write(int address, char value){
	mem[address] = value;
}
//main.cpp
#include <iostream>
using namespace std;

#include "Ram.h"

int main(void) {
	Ram ram;
	ram.write(100, 20);
	ram.write(101, 30);
	char res = ram.read(100) + ram.read(101);
	ram.write(102, res);
	cout << "102 번지의 값 = " << (int)ram.read(102) << endl;
	return 0;
}
반응형

댓글