1. 문제

 

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

 

 

2. 결과

 

 

3. 코드

#include <iostream>
using namespace std;

class Tower {
	int high;
public :
	Tower() { high = 1; }
	Tower(int h ) { high = h; }
	int getHeight() { return high ;}
};

int main() {
	Tower myTower;
	Tower seoulTower(100);
	cout << "높이는 " << myTower.getHeight() << "미터" << endl;
	cout << "높이는 " << seoulTower.getHeight() << "미터" << endl;
}

 

4. 설명

 

매개변수가 없는 생상자는 high를 1로 초기화 하도록 만들고, int형 매개변수 하나가 있는 생성자는 입력 받은 매개변수로 high를 초기화 하도록 만듭니다.

그리고 높이를 return하는 getHeight()함수를 만들었습니다. int형을 return함으로써 int getHeight()로 만드셔야 합니다.

 

 

 

※ public : 위치에 선언해야 main()에서 이용가능 합니다. 

디폴트 값은 private로서 변수 high는 private로서 main에서 접근할 수 없습니다.

 

 

 

1. 문제

 

두 사람이 하는 가위, 바위, 보 게임을 만들어보자. 두 사람의 이름은 '사또'와 처녀 귀신 '아랑'으로 한다. 먼저 "사또>>"를 출력하고 '사또'로부터 "가위", "바위", "보" 중 하나의 문자열을 입력받고, 다시 "아랑>>"을 출력하고 '아랑'으로부터 "가위", "바위", "보" 중 하나의 문자열을 입력받는다. 누가 이겼는지 판단하여 승자를 출력한다. 비기게 되면 "비겼습니다"라고 출력하고 프로그램을 종료한다.

 

 

2. 결과

 

 

 

3. 코드

 

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

int main()
{
	string s,o;
	cout << "가위 바위 보 게임을 합니다. 가위, 바위, 보 중에서 입력하세요." << endl;
	cout << "사또>>" ;
	getline(cin, s);
	cout << "아랑>>";
	getline(cin, o);

	if( s == "바위" ) {
		if( o == "바위" ) cout << "비겼습니다." << endl;
		else if( o == "가위" ) cout << "사또가 이겼습니다." << endl;
		else if( o == "보" ) cout << "아랑이 이겼습니다." << endl;
	}
	else if ( s == "가위" ) {
		if( o == "가위" ) cout << "비겼습니다." << endl;
		else if( o == "보" ) cout << "사또가 이겼습니다." << endl;
		else if( o == "바위" ) cout << "아랑이 이겼습니다." << endl;
	}
	else if ( s == "보" ) {
		if( o == "보" ) cout << "비겼습니다." << endl;
		else if( o == "바위" ) cout << "사또가 이겼습니다." << endl;
		else if( o == "가위" ) cout << "아랑이 이겼습니다." << endl;
	}
}

 

 

4. 설명

 

string 변수를 사용하여서 간단하게 해결하실 수 있습니다.

 

 

문자열 변수는 저장된 문자가 같은지 검사할려면 strcmp()함수를 사용해야 했지만 string 변수는 "=="(비교연산자)로 비교가 가능합니다.

 

※ 이 상황에서 else문을 사용하시면 안됩니다. else문을 사용하시면 가위 바위 보가 아닌 아무거나 입력하여도 참으로 처리되어서 진행되기 때문 입니다.

 

 

1. 문제

 

14. 영문 텍스트를 입력받아 알파벳 히스토그램을 그리는 프로그램을 작성하라. 대문자는 모두 소문자로 집계하며, 텍스트 입력의 끝은 ';' 문자로 한다.

 

 

2. 결과

 

 

 

3. 코드

 

#include <iostream>
using namespace std;

int main() 
{
	char histo[10000];
	int alpha[26];
	int len=0;
	
	for(int n=0; n<26; n++)
		alpha[n] = 0;

	cout << "영문 텍스트를 입력하세요. 히스토그램을 그립니다." << endl;
	cout << "텍스트의 끝은 ; 입니다. 10000개까지 가능합니다." << endl;

	cin.getline( histo, 10000, ';');
	for( int i=0; i< strlen(histo); i++) {
		if( isalpha( histo[i] ) ) {
			if( histo[i] >= 65 && histo[i] <=90 ) histo[i] = tolower(histo[i] );
			alpha[ histo[i]-97 ]++;
			len++;
		}
	}
	cout << "총 알파벳 수 " << len << endl << endl;

	for(int i=97; i<=122; i++) {
		cout << (char)i << " (" << alpha[i-97] << ")\t:  ";
		for(int k=0; k< alpha[i-97]; k++)
			cout << "*";
		cout << endl;
	}
}

 

 

4. 설명

 

1. 영문 텍스트를 최대 10000개까지 입력받을 수 있으므로 char histo[10000];로 크기를 설정합니다.

 

 

2. 텍스트의 끝은 ';'이므로 cin.getline( histo, 10000, ';')로 하여서 ';'가 나오기 전까지의 문자열을 저장합니다.

 

3. 입력된 문자열 histo[]를 인덱스 0부터 histo의 길이인 strlen(histo)만큼 반복하는 for문을 만듭니다.

 

4. isalpha()로 알파벳인지 검사하고 참이면 if문을 실행하고 아니면 다음 인덱스로 넘어갑니다.

 

5. if문에 들어가면 우선 if문을 하나 더 사용해서 histo[i] >=65 && histo[i] <=90일 경우 즉, 대문자일 경우 tolower()함수를 사용하여서 소문자로 고쳐줍니다. 문자열을 다시 출력해야할 필요가 없으므로 바로 histo[i]그 곳에 저장합니다.

 

6. int alpha[26] 배열은 각 알파벳에 개수를 저장하는 함수로서 처음에 for문을 이용하여서 모든 원소를 0으로 초기화 해주셔야 합니다.

=>[ histo[i]-97 ] : if문으로 인하여 histo[i]는 소문자 알파벳 입니다. 즉 97~123 사이에 수 입니다. 여기의 -97을 해주므로서 0~25인 범위가 됩니다.

예를들어 histo[i]= 'a'이면 97로서 97-97=0 이고 alpha[0]++;이 됩니다. 이렇게 순서대로 갯수를 저장할 수 있습니다.

 

7. 그 다음 알파벳의 갯수를 저장하는 변수 len++을 해줍니다.

 

8. 이제 결과를 출력하는데 for( i=97; i<=122; i++ )을 이용하여서 각 줄의 알파벳을 for(int k=0; k< alpha[i-97]; k++)을 이용하여서 갯수만큼 '*'을 출력합니다.

 

※ (char)i : i가 97일 경우 'a'가 출력됩니다.

 

 

1. 문제

 

13. 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/), 나머지(%)의 정수 5칙 연산을 할 수 있는 프로그램을 작성하라. 식은 다음과 같은 형식으로 입력된다. 정수와 연산자는 하나의 빈칸으로 분리된다.

 

 

2. 결과

 

 

 

3. 코드

 

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

int cal(int a, char* p, int b);

int main() 
{
	char s[30];
	int a; char *p = NULL; int b;

	while(1) {
		cout << "? ";
		cin.getline( s, 30 );
		a = atoi( strtok( s, " ") );
		p = strtok( NULL, " ");
		b = atoi( strtok( NULL, " ") );

		cout << a << " " << p << " " << b << " = " << cal(a,p,b) << endl;
	}
}

int cal(int a, char* p, int b)
{
	if( strcmp( p, "+") == 0 ) return a+b;
	else if( strcmp( p, "-") == 0) return a-b;
	else if( strcmp( p, "*") == 0) return a*b;
	else if( strcmp( p, "/") == 0) return a/b;
	else if( strcmp( p, "%") == 0) return a%b;
	else {
		cout << "잘못입력 하셨습니다.\n";
		exit(1);
	}	
}

 

4. 설명

 

각 문자열을 구분하는 구분자가 ' '(공백)이므로 공백을 입력 받으면 입력이 끝나는 cin을 사용하여서

cin >> a >> p >> b;이렇게 하시면 2개의 정수와 하나의 연산자를 입력받을 수도 있습니다.

 

하지만 밑 힌트를 보면 문자->숫자로 바꾸는 함수가 나와있어서 하나의 문자열로 입력받은 후 분리하여 계산하는 것이 이 문제의 의도라 생각하여 이렇게 해결하였습니다.

 

 

strtok()함수는 처음부터 어느 문자가 나올 때까지의 문자열을 잘라 리턴해주는 함수입니다.
atoi()는 문자->정수형으로 바꾸어 줍니다.

strcmp()함수는 두 문자를 비교하여서 같으면 0을 리턴하는 함수 입니다.

 

※ strtok(NULL, " ") : 위에서 첫 " "(공백)을 찾은 후 첫 " "(공백)부터 그 다음 " "까지의 문자열을 잘라서 리턴해줍니다.

 

 

1. 문제

 

12. 다음 C 프로그램을 C++ 프로그램으로 수정하여 실행하라. 이 프로그램의 실행 결과는 연습문제 11과 같다.

 

 

2. 결과

 

 

 

3. 코드

 

#include <iostream>
using namespace std;

int sum(int a, int b);

int main() 
{
	int n=0;
	cout << "끝 수를 입력하세요>>";
	cin >> n;
	cout << "1에서 " << n << "까지의 합은 " << sum(1, n) << " 입니다." << endl;
}

int sum( int a, int b) {
	int k, res=0;
	for( k=a; k<=b; k++) {
		res += k;
	}
	return res;
}

 

4. 설명

 

1. int sum() -> int sum( int a, int b) 로 함수 선언부를 수정해야 합니다. C와 달리 매개변수까지 다 입력해야 되는 이유는 C++에서는 함수 중복이 가능해서 같은 이름을 가진 함수여도 매개변수에 따라 다른 함수가 되기 때문 입니다.

 

2. printf -> cout

3. scanf -> cin 으로 각각 수정하시면 됩니다.

 

 

 

1. 문제

 

11. 다음 C 프로그램을 C++ 프로그램으로 수정하여 실행하라.

 

 

2. 결과

 

 

3. 코드

 

#include <iostream>
using namespace std;

int main() 
{
	int k, n=0;
	int sum=0;
	cout << "끝 수를 입력하세요>>";
	cin >> n;
	for( k=1; k<=n; k++) {
		sum += k;
	}
	cout << "1에서 " << n << "까지의 합은 " << sum << "입니다." << endl;

	return 0;
}

 

4. 설명

 

1. #include <stdio.h> -> #include <iostream>

2. using namespace std; 추가

3. printf -> cout

4. scanf -> cin

로 각각 수정하시면 됩니다.

 

 

 

1. 문제

 

10. 문자열을 하나 입력받고 문자열의 부분 문자열을 다음과 같이 출력하는 프로그램을 작성하라. 예시는 다음과 같다.

 

 

2. 결과

 

 

3. 코드

 

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

int main() 
{
	char a[10];

	cout << "문자열 입력>>";
	cin.getline( a, 10);
	
	for(int i=1; i<=strlen(a); i++)
	{
		for(int j=0; j<i; j++)
			cout << a[j] ;
		cout << endl;
	}
}

 

4. 설명

 

문자열 배열 변수 a를 선언한 후 cin.getline()함수로 문자열을 입력 받습니다.

 

그 후 for문 2개를 사용하여서 출력합니다.

 

 

첫 번째 for문에서 i=1로 초기화 한 후 i <=strlen(a)까지 한 후, j<i로 1글자 2글자 3글자 이렇게 출력되도록 하였습니다.

 

 

 

1. 문제

 

9. 이름, 주소, 나이를 입력받아 다시 출력하는 프로그램을 작성하라. 실행 예시는 다음과 같다.

 

 

 

2. 결과

 

 

 

3. 코드

 

#include <iostream>
#include <string>

using namespace std;

int main() 
{
	string name, add, age;

	cout << "이름은?";
	getline( cin, name);
	cout << "주소는?";
	getline( cin, add);
	cout << "나이는?";
	getline( cin, age);
	
	cout << name << ", " << add << ", " << age << "세" << endl;
}

 

 

4. 설명

 

string 변수 name, add, age 3개를 선언합니다.

 

 

getline()함수를 이용하여서 각각 값들을 변수에 저장합니다.

 

그 후 저장된 값들을 출력합니다.

 

※ 문자열 배열을 선언한 후 cin.getline()으로 입력 받아도 됩니다.

+ Recent posts