개발이야기/윤성우 열혈 C

윤성우 열혈 C 프로그래밍 15장, 도전! 프로그래밍 2 문제 풀이

같이 갑시다 ~ 2022. 1. 4. 09:04

문제 1.

길이가 10인 배열을 선언하고 총 10개의 정수를 입력 받아서, 홀수와 짝수를 구분 지어 출력하는 프로그램을 작성해 보자. 일단 홀수부터 출력하고 나서 짝수를 출력하도록 하자. 단, 10개의 정수는 main 함수 내에서 입력 받도록 하고, 배열 내에 존재하는 홀수만 출력하는 함수와 배열 내에 존재하는 짝수만 출력하는 함수를 각각 정의해서 이 두 함수를 호출하는 방식으로 프로그램을 완성하자.

더보기
#include <stdio.h> // 15-1
void odd(int* arr, int len)
{
	for (int i = 0; i < len; i++)
	{
		if (arr[i] % 2 == 1)
			printf("%d", arr[i]);
	}
}

void even(int*arr, int len)
{
	for (int i = 0; i < len; i++)
	{
		if (arr[i] % 2 == 0)
			printf("%d", arr[i]);
	}
}

int main(void)
{
	int arr[10];
	for (int i = 0; i < 10; i++)
	{
		printf("Input: ");
		scanf_s("%d", &arr[i]);
	}

	printf("Odd num: ");
	odd(arr, sizeof(arr) / sizeof(int));
	printf("\n");
	printf("Even num: ");
	even(arr, sizeof(arr) / sizeof(int));
	return 0;
}
컴파일 결과

문제 2.

프로그램 사용자로부터 10진수 형태로 정수를 하나 입력 받은 다음, 이를 2진수로 변환해서 출력하는 프로그램을 작성해 보자.

 

재귀함수 Version.

더보기
#include <stdio.h> // 15-2 -- 재귀함수 버전.
int TentoTwo(int n)
{
	int result = n % 2;
	n /= 2; // n = n/2 (n을 2 값으로 나눈 몫) 
	if (n > 0) // ex) 1 /= 2 --> 몫(n) = 0, n>0 조건 만족 X --> 조건문 빠져나오게 됨. 
		TentoTwo(n); // 재귀함수
	printf("%d", result);
	return 0;
}

int main(void)
{
	int num;
	printf("10진수 입력: ");
	scanf_s("%d", &num);

	TentoTwo(num);
	return 0;
}
컴파일 결과

반복문 Version.

더보기
#include <stdio.h> // 15-2 -- 반복문 버전 
int main(void)
{
	int num;
	int bin[100]; 
	int i = 0;

	printf("10진수 입력: ");
	scanf_s("%d", &num);

	while (num != 0)
	{
		bin[i] = num % 2;
		num /= 2;
		i++;
	}
	for (int j = i - 1; j >= 0; j--)
		printf("%d", bin[j]);

	return 0;
}

숫자 12를 넣었을 때,

bin 에는 0,0,1,1 이 쌓여있고,

j = 3부터 시작하니까 bin[3], bin[2], bin[1], bin[0] 순으로 씌여짐.

즉 1100이 나옴.

&nbsp;

 

디버깅하면서 조사식 확인하기

원하는 변수 마우스 우클릭 --&amp;gt; 조사식 추가. (중단점은 원하는 위치에 설정후 F11 누르면 한단계씩 코드 실행)

 

문제 3. 

길이가 10인 배열을 선언하고 총 10개의 정수를 입력 받는다. 단, 입력 받은 숫자가 홀수이면 배열의 앞에서부터 채워나가고, 짝수이면 뒤에서부터 채워나가는 형식을 취하기로 하자. 따라서 사용자가 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]을 입력했다면, 배열에는 [1, 3, 5, 7, 9, 10, 8, 6, 4, 2]의 순으로 저장이 되어야 한다.

더보기
#include <stdio.h> // 15-3. 
int main(void)
{
	int arr[10];
	int num;
	int oddcnt = 9;
	int evencnt = 0;

	for (int i = 0; i < 10; i++)
	{
		printf("Input: ");
		scanf_s("%d", &num);

		if (num % 2 == 0) // 짝수면 뒤에서부터 나열하도록 
		{
			arr[oddcnt] = num;
			oddcnt--;
		}
		else // 홀수면 앞에서부터 나열하도록
		{
			arr[evencnt] = num;
			evencnt++;
		}
	}

	printf("배열 요소 출력: ");

	for (int i = 0; i < 10; i++)
		printf("%d \n", arr[i]);

	return 0;
}

 

문제 4.

회문(Palindrome)은 앞으로 읽으나 뒤로 읽으나 차이가 없는 단어들을 뜻한다. 예를 들어서 level, bob과 같은 단어들은 회문에 속한다. 이에 우리는 인자로 전달되는 영단어가 회문인지 아닌지를 판단해서 그 결과를 출력하는 기능의 함수를 정의하고, 이에 적절한 main 함수를 정의해 보고자 한다. 단 구현의 편의를 위해서 대소문자까지 일치해야 회문으로 인정하기로 하겠다(이는 어디까지나 구현의 편의를 고려한 제약사항일 뿐이다).

더보기
#include <stdio.h> // 15-4
#include <string.h> // string 의 len을 자동 계산하는 함수가 있는 헤더파일

void findword(char* param)
{
	int len = strlen(param) / 2; // ex)madam 쓰면, len = 2
	int last = strlen(param) - 1; // last = 4
	int start = 0;

	for (int i = 0; i < len / 2; i++) 
	{
		if (param[start] != param[last])
		{
			printf("회문이 아닙니다.");
			break;
		}
		start++;
		last--;
		
		printf("회문입니다."); // 이 문장이 for 문 밖에 있으면 'mada'를 썼을경우 회문입니다와 아닙니다가 전부 같이 나옴. 
	}
	
}

int main(void)
{
	char word[100];
	
	printf("Input only character: ");
	scanf_s("%s", word, sizeof(word)); // word 만 넣어주면 충분한 인자를 전달하지 않았다고 나옴. word 의 배열 크기도 전달해주어야 함. 
	findword(word);
	return 0;
}