1. 문제

 

3. string 클래스를 이용하여 사용자가 입력한 영문 한 줄을 입력받고 글자 하나만 랜덤하게 수정하여 출력하는 프로그램을 작성하라.

 

 

2. 결과

 

 

3. 코드

 

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

int main() {

	string s;
	int num, dnum;
	srand( (unsigned)time(0) );
	string aa[26]={ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
					"l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
					"w", "x", "y", "z" }; 
	

	cout << "아래에 한 줄을 입력하세요.(exit를 입력하면 종료합니다)" << endl;
	while( 1 ) {
		cout << ">>";
		getline( cin, s);
		if( s == "exit" ) break;
		num = rand() % s.size();
		while( !isalpha( s.at(num) ) ) num = rand() % s.size();

		dnum = rand() % 26;
		s.replace( num, 1 , aa[dnum]  );
		cout << s << endl;
	}
}

 

4. 설명

 

string의 저장된 멤버 함수들을 이용하여서 문제를 해결합니다.

 

srand( (unsigned)time(0) );을 실행하여서 실행할 때 마다 랜덤한 값을 얻을 수 있도록 합니다.

 

코드를 쉽게 하기 위하여 a~z까지 저장하고 있는 string 배열 aa를 만들었습니다.

 

num = rand() % s.size();로 문자열 s에서 무작위 인덱스 값을 num에 저장합니다.

 

dnum = rand() % rand()로 0~25 중 랜덤한 수를 구합니다.

 

그 후 입력 받은 문자열 중에서 랜덤한 위치에 있는 것이 문자가 맞다면 s.replace( num, 1, aa[num] )으로 num번째 부터 1글자를 aa[num]과 바꿉니다.

 

 

 

1. 문제

 

2. 다음과 같은 Sample 클래스가 있다.

다음 main() 함수가 실행되도록 Sample 클래스를 완성하라.

 

 

2. 결과

 

 

 

3. 코드

 

#include <iostream>
using namespace std;

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

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

 

4. 설명

 

생성자에서 매개변수로 입력받은 크기만큼 int형 배열을 동적으로 생성 합니다.

 

 

각 원소를 입력 받는 read함수와 저장된 값들을 출력하는 write함수를 각각 구현 합니다.

 

big 멤버 함수는 저장된 값들을 비교하여서 가장 큰 값을 구합니다.

 

 

1. 문제

 

1. 다음은 색의 3요소인 red, green, blue로 색을 추상화한 Color 클래스를 선언하고 활용하는 코드이다. 빈칸을 채워라. red, green, blue는 0~255의 값만 가진다.

 

 

2. 결과

 

 

 

3. 코드

 

#include <iostream>
using namespace std;

class Color {
	int red, green, blue;
public :
	Color() { red = green = blue = 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;
	p = &screenColor;	//(1)
	p->show();			//(2)
	Color colors[3];	//(3)
	p = colors;			//(4)

	p->setColor( 255, 0, 0 );		//(5)
	(p+1)->setColor( 0, 255, 0 );
	(p+2)->setColor( 0, 0, 255 );

	for(int i=0; i<3; i++)			//(6)
		(p+i)->show();
}

 

4. 설명

 

주석처리로 각 문제의 해당하는 위치를 표시 하였습니다.

 

변수 p는 포인트형 변수로서 클래스의 멤버함수의 접근하기 위해서는 '->'를 사용하셔야 합니다.

 

배열인 경우 포인터 변수의 저장할 시 &를 붙이지 않습니다.

 

 

 

1. 문제

 

실수의 지수 표현을 클래스 Exp로 작성하라. Exp를 이용하는 main() 함수와 실행 결과는 다음과 같다. 클래스 Exp를 Exp.h 헤더 파일과 Exp.cpp 파일로 분리하여 작성하라.

 

 

2. 결과

 

 

 

3. 코드

 

// main 파일

#include <iostream>
using namespace std;

#include "Exp.h"

int main() {
	Exp a(3, 2);
	Exp b(9);
	Exp c;

	cout << a.getValue() << ' ' << b.getValue() << ' ' << c.getValue() << endl;
	cout << "a의 베이스 " << a.getBase() << ',' << "지수 " << a.getExp() << endl;

	if( a.equals(b) )
		cout << "same" << endl;
	else 
		cout << "not same" << endl;
}
//  Exp.cpp 파일

#include "Exp.h"

Exp::Exp() {  base = 1; jisu = 1; } 
	
Exp::Exp(int a) { base = a; jisu = 1; }

Exp::Exp(int a, int b) { base = a; jisu = b; }

int Exp::getValue() { 
	int result = base;
	for( int i=1; i<jisu; i++ )
		result *= base;
	return result;
}

int Exp::getBase() {
	return base;
}
int Exp::getExp() {
	return jisu;
}
bool Exp::equals( Exp b) {
	if( getValue() == b.getValue() ) return true;
	else return false;
}
// Exp.h 파일

class Exp {
	int base;
	int jisu;
public :
	Exp(); 
	Exp(int a);
	Exp(int a, int b);
	int getValue();
	int getBase();
	int getExp();
	bool equals( Exp b);
};

 

 

4. 설명

 

클래스 함수를 선언부와 구현부를 각 파일에 알맞게 나눠서 작성할 수 있는지를 확인하는 문제입니다.

 

 

선언부를 Exp.h 헤더 파일에다가 구현부를 Exp.cpp 파일에다가 구현합니다. 
 
main파일에는 main()함수만 있어야 합니다.

 

클래스 멤버함수들의 이름은 힌트의 있는 이름을 사용하였습니다.

 

 

1. 문제

 

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

다음 main() 함수는 100 번지에 20을 저장하고, 101 번지에 30을 저장한 후, 100 번진와 101 번지의 값을 읽고 더하여 102번지에 저장하는 코드이다.

실행 결과를 참고하여 Ram.h, Ram.cpp, main.cpp로 헤더 파일과 cpp 파일을 분리하여 프로그램을 완성하라.

 

 

2. 결과

 

 

 

3. 코드

 

//	Ram.h

class Ram {
	char mem[100*1024];
	int size;
public :
	Ram();
	~Ram();
	char read(int address);
	void write(int address, char value);
};
//	Ram.cpp

#include <iostream>
using namespace std;
#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() {
	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;
}

 

4. 설명

 

생성자에서 for문을 이용하여서 멤버들을 초기화 해주고, size에 크기를 저장합니다.

 

소멸자 함수의 cout << "메모리 제거됨" << endl;을 작성하여서 객체가 소멸할 때 실행되도록 합니다.

 

read(int address)로 입력 받은 매개변수의 해당하는 주소의 저장된 값을 return 합니다.

 

write(int address, char value)함수는 주소와 값을 매개변수로 받은 다음 해당하는 주소에 값을 저장합니다.

 

 

 

1. 문제

 

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

 

 

2. 결과

 

 

 

3. 코드

 

// main.cpp

#include <iostream>
using namespace std;
#include "Box.h"

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

#include <iostream>
using namespace std;
#include "Box.h"

Box::Box(int w, int h) {
	setSize(w, h);
	fill = '*';
}
void Box::setFill( char f) {
	fill = f;
}
void Box::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;
	}
}
// 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();
};

 

4. 설명

 

클래스의 선언부는 Box.h 헤더파일에 작성하고, 구현부는 Box.cpp 파일에 작성하고 main()은 main.cpp파일에 각각 작성합니다.

 
setFill( char f)함수는 입력받은 매개변수의 단어로 바꿉니다.
setSize(int w, int h)함수는 줄의 갯수와 한 줄에 출력할 단어의 갯수를 매개변수로 입력받습니다.

 

 

main파일에는 main함수만 있어야 합니다.

 

 

 

1. 문제

 

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

 

 

2. 결과

 

 

3. 코드

 

// main.cpp

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

#include "Calculator.h"

int main() {

	char cal[10]; char *p;
	int x, y; 

	while(1) { 
		cout << "두 정수와 연산자를 입력하세요>>";
		cin.getline( cal, 20);
		x = stoi( strtok( cal, " ") );
		y = stoi( strtok( NULL, " ") );
		p = strtok( NULL, "");
		if( strcmp( p, "+") == 0 ) {  
			Add a; 
			a.setValue(x, y); 
			cout << a.calculate() << endl; }
		else if( strcmp( p, "-") == 0 ) {
			Sub s;
			s.setValue(x, y);
			cout << s.calculate() << endl; }
		else if( strcmp( p, "*") == 0 ) {
			Mul m;
			m.setValue(x, y);
			cout << m.calculate() << endl; }
		else if( strcmp( p, "/") == 0 ) {
			Div d;
			d.setValue(x, y);
			cout << d.calculate() << endl; }
	}
}
// Calculator.cpp

#include "Calculator.h"

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

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

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

}void Div::setValue(int x, int y) {
	a = x; b = y;
}
int Div::calculate() {
	return a/b;
}
// Calculator.h

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

 

4. 설명

 

클래스의 선언부를 Calculator.h 헤더파일에 구현부는 Calculator.cpp 파일에 각각 나누어서 작성합니다.

 

 

main파일에는 main함수만 있도록 만드셔야 합니다.
 
※ 사용자가 만든 헤더 파일에 include하기 위해서는 #include "Claculator.h" 이처럼 ""을 사용하셔야 합니다.

 

 

 

1. 문제

 

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

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

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

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

 

 main() 함수는 Add, Sub, Mul, Div 클래스 타입의 객체 a, s, m, d를 생성하고, 아래와 같이 키보드로부터 두 개의 정수와 연산자를 입력받고, a, s, m, d 객체 중에서 연산을 처리할 객체의 setValue() 함수를 호출한 후, calculate()를 호출하여 결과를 화면에 출력한다. 프로그램은 무한 루프를 돈다.

 

 

2. 결과

 

 

 

3. 코드

 

//	Calculator.cpp

#include <iostream>
#include <string>

using namespace std;

class Add {
	int a;
	int b;
public :
	void setValue(int x, int y);
	int calculate();
};
class Sub {
	int a;
	int b;
public :
	void setValue(int x, int y);
	int calculate();
};
class Mul {
	int a;
	int b;
public :
	void setValue(int x, int y);
	int calculate();
};
class Div {
	int a;
	int b;
public :
	void setValue(int x, int y);
	int calculate();
};
void Add::setValue(int x, int y) {
	a = x; b = y;
}
int Add::calculate() {
	return a+b;
}

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

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

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

int main() {

	char cal[10]; char *p;
	int x, y; 

	while(1) { 
		cout << "두 정수와 연산자를 입력하세요>>";
		cin.getline( cal, 20);
		x = stoi( strtok( cal, " ") );
		y = stoi( strtok( NULL, " ") );
		p = strtok( NULL, "");
		if( strcmp( p, "+") == 0 ) {  
			Add a; 
			a.setValue(x, y); 
			cout << a.calculate() << endl; }
		else if( strcmp( p, "-") == 0 ) {
			Sub s;
			s.setValue(x, y);
			cout << s.calculate() << endl; }
		else if( strcmp( p, "*") == 0 ) {
			Mul m;
			m.setValue(x, y);
			cout << m.calculate() << endl; }
		else if( strcmp( p, "/") == 0 ) {
			Div d;
			d.setValue(x, y);
			cout << d.calculate() << endl; }
	}
}

 

 

4. 설명

 

strtok()를 이용하여서 두 수를 int형 변수에 저장한 후 연산자도 char*형 변수 p에 저장한 후 p에 따라 해당하는 사칙연산 클래스  변수를 생성하고 사칙연산이 실행되도록 구현하였습니다.

 

(2)번 때문에 구현부가 짧은 멤버함수도 선언부와 구현부를 나누어 작성하였습니다.

 

※ 이 문제는 띄어쓰기를 기준으로 3값을 구분하므로 cin >> x >> y >> p로 입력을 받으셔도 굳이 strtok()함수를 사용하지 않으셔도 원하는 결과를 얻을 수 있습니다.

 

+ Recent posts