[중간대비] ch04 Control Flow

2022. 10. 27. 08:35언어(Language)/c++

[Exercise 4-1 switch문 사용하기]

입력된 문자들 중 'a'/'A','b'/'B'나 다른 문자들의 개수를 count하는 프로그램을 작성하시오.

+)사용자로부터 문자들을 입력받아, a/A, b/B 문자 개수를 헤아리는 프로그램이다. 반복문과 함께 분기문(switch 문장)을 적절히 사용하자. 사용자가 입력하는 문자를 하나씩 읽어 들이는 코드는 다음과 같다.

int ch;
while((ch=cin.get()) != '\n')
{
	...
}

실행 예)

내 코드) 

#include <iostream>
using namespace std;
int main() {
	int ch, aCount = 0, bCount = 0, otherCount = 0;

	while ((ch = cin.get()) != '\n') { //사용자가 입력하는 문자를 하나씩 읽어 들이는 코드
		switch (ch) {
		case 'a': {
			aCount += 1; break;
		}
		case 'A': {
			aCount += 1; break;
		}
		case 'b': {
			bCount += 1; break;
		}
		case 'B': {
			bCount += 1; break;
		}
		default: {
			otherCount += 1; break;
		}
		}
	}
	cout << endl;
	cout << "a or A's count : " << aCount << endl;
	cout << "b or B's count : " << bCount << endl;
	cout << "other char count : " << otherCount << endl;
}

 

 

[Exercise 4-2  정수를 문자열로 변환하기]

atoi()와 반대되는 itoa()를 만드시오

-char *itoa(int value)

-내부에 static char buff[100]을 두고, 이에 변환된 string을 저장하여 결과값으로 돌려줌

-사용)

char *itoa(int i) {
	static char buff[100];
    ...
}
int main() {
	char *ptr=itoa(100);
    cout<<ptr; //"100"출력
    return 0;
}

앞에서 문자열을 정수로 변환하는 atoi() 함수 구현 예를 살펴보았다. 여기에서는 그 반대 기능의 itoa() 함수를 구현해보자. 슬라이드에 보이는 바와 같이 itoa() 함수는 정수(예:123)를 입력받아 문자열("123")로 변환한다. 변환된 문자열은 itoa() 내부에 있는 char buff[100]에 저장되며, itoa() 함수는 buff 주소 값을 반환한다. itoa()가 반환된 후에도 buff에 저장된 문자열이 유효하게 만들기 위하여 buff는 static으로 선언된다.

힌트를 주자면 입력된 정수의 아랫자리부터 하나씩 문자로 변환하여 buff[]에 저장한 다음, 최종적으로 buff엥 저장된 문자열을 역순으로 바꾸면 된다. 예롤 123을 입력받으면 가장 아랫자리부터 3, 2, 1 순으로 차례대로 문자 '3', '2', '1'로 변환하여 buff에 저장한다. 변환이 끝나면 buff에는 "321"이 저장되어 있을 것이다. 이를 역순으로 바꾸면 "123"이 된다.

//숫자에서 문자로 만드는 함수 구현
//힌트 : 뒷자리부터 하기
//3->'3'으로 만드는 방법(숫자->문자열) : 3 + '0' -> '3'
//reverse하기
//태블릿으로 찍은 사진 참조
#include <iostream>
using namespace std;
char* itoa(int n) {
	static char buff[100]; //이에 변환된 string을 저장하여 결과값으로 돌려줌
	int i;
	for (i = 0; n > 0; ++i, n = n / 10) {
		buff[i] = n % 10 + '0';
		buff[i--] = 0; //buff=="321"
		for (int k = 0; k < i; ++k, --i) {
			char temp = buff[k];
			buff[k] = buff[i];
			buff[i] = temp;
		}
		return buff;
	}
}
int main() {
	char* ptr = itoa(123);
	cout << ptr; //"100"출력
	return 0;
}

 

 

 

[Exercise 4-3 이중 순환문 작성하기]

다음과 같이 화면에 출력하는 프로그램을 작성하라.(use nested-for)

[실행 예]

제어 흐름에서 많이 사용되는 기법 중에 하나가 이중 순환문(nested for)이다. 이는 이차원적인 반복이 필요할 때 사용하는 것으로 본 연습문제에서 요구하는 기능을 구현하는데 적합하다. 즉, ABCDE처럼 1줄 출력은 일차원 순환문으로 구현할 수 있는 반면 이런 1줄 출력이 여러 줄에 걸쳐 이루어져야 되므로 이차원 순환문이 필요하다.

이중순환문을 사용하여 여러 줄에 걸쳐 "ABCDE"를 출력하는 코드는 다음과 같다. 이 코드를 일부 수정함으로써 연습문제에서 원하는 기능을 수행하는 코드를 작성할 수 있다.

for(int i=0;i<5;++i) {
	for(int j=0;j<5;++j)
    	cout<<char('A'+j);
    cout<<endl;
}

 

[내 답]

#include <iostream>
using namespace std;
int main() {
	for (char j = 'E'; j >= 'A'; j--) {
		for (char i = 'A'; i <= j; i++) {
			cout << i;
		}
		cout << endl;
	}
	return 0;
}