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()으로 입력 받아도 됩니다.

 

 

1. 문제

 

8. 한 라인에 ';'으로 5개의 이름을 구분하여 입력받아, 각 이름을 끊어내어 화면에 출력하고 가장 긴 이름을 판별하라.

 

 

2. 결과

 

 

 

3. 코드

 


#include <iostream>
#include <cstring>

using namespace std;

int main()
{
	char a[50];
	char *name[5], *temp;
	int i;

	cout << "5 명의 이름을 ';'으로 구분하여 입력하세요" << endl << ">>";
	cin.getline(a, 50);

	name[0] = strtok_s(a, ";", &temp);

	
	for (i = 1; i< 5; i++)
	{
		name[i] = strtok_s(NULL, ";", &temp);
	}
	
	for (i = 0; i<5; i++)
		cout << i + 1 << " : " << name[i] << endl;

	int max = strlen(name[0]); int n = 0;
	for (i = 1; i<5; i++)
	{
		if (strlen(name[i]) > max) { n = i; break; }
	}
	cout << "가장 긴 이름은 " << name[n] << endl;
}

 

 

4. 설명

 

string 변수를 사용하여서 string에 등록되어 있는 함수를 이용하여 해결할 수도 있지만 아직 교재에 나오지 않았으므로 문자열 배열을 사용하였습니다.

 

 

이 문제를 해결하려면 우선 처음 입력받을 때 ';'을 구분하여 입력받는 것이 아니라 하나의 문자열로 입력 받은 후 그 문자열에서 ';'를 구분하여서 문자열을 나눠야 한다는 것을 알아야 합니다.

 

그러면 우선 문자열 배열 a에 문자열 하나를 입력 받았습니다.

 

그 후 strtok()함수를 사용하여서 ';'을 기준으로 이름들을 나눈 후 char *name[5]배열 요소들로 저장합니다.

 

그 다음 strlen()함수를 이용하여서 가장 긴 이름을 가진 사람을 구합니다.

 

※ strtok(a, ";") : 처음부터 첫 ";"가 나올 때까지의 문자열을 리턴 합니다.

그 다음에 있는 strtok(NULL, ";")는 처음 ";"찾은 후에 문자부터 그 다음 ";"가 나올 때 까지의 문자열을 리턴 합니다.

 

 

1. 문제

 

7. 다음과 같이 "yes"가 입력될 때까지 종료하지 않는 프로그램을 작성하라. 사용자로부터의 입력은 cin.getline() 함수를 사용하라.

 

 

2. 결과

 

 

 

3. 코드

 

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

int main() 
{
	char a[20];

	while(1)
	{
		cout << "종료하고싶으면 yes를 입력하세요>>";
		cin.getline( a, 20 );
			
		if( strcmp(a, "yes") == 0 ) break;
	}
	cout << "종료합니다...\n";
	
}

 

 

4. 설명

 

cin.getline() 함수로 입력받으라 하였으므로 문자열 배열을 하나 선언합니다.

 

 

그 후 cin.getline()으로 입력 받은 후 strcmp()함수를 사용하여서 "yes"인지 비교한 후 맞으면 종료합니다.
 
strcmp()는 두 개의 매개변수를 가지며 첫번째 매개변수 > 두번째 매개변수 이면 양수를
첫번째 매개변수 = 두번째 매개변수 이면 0을
첫번째 매개변수 < 두번째 매개변수 이면 음수를 return 합니다.
 
그래서 입력받은 문자열이 yes와 같은 경우 0을 리턴하고 0일 경우 break;를 사용하여서 무한루프를 도는 while문을 종료하도록 하였습니다.

 

+ Recent posts