본문 바로가기
문제풀이/문제풀이 중심의 C 언어 연습

[C] [문제풀이 중심의 C 언어 연습] 6장 실습 문제 Part 1

by 민됴리 2020. 8. 16.
반응형

1999년 9월 1일에 발행된

김용일, 강문설 저자의

문제풀이 중심의 C언어 연습

6장 실습 문제 Part 1입니다.

6장은 문제가 특별히 많아서

Part 1과 Part 2로 나눠서 작성했습니다.

 

Part 1은 1번부터 20번까지

Part 2는 21번부터 34번까지

포함돼있습니다.

 

책에 오타나 오류가 있는 부분이적지 않게 있는데

그런 부분에 대해서는 언급해 드리겠습니다.

 

궁금한 점은 댓글로 남겨주세요.

 


 

6-1. 주어진 코드를 while문 do while문을 사용해서 나타내도록 수정

//while문 사용
#include <stdio.h>

int main(void) {

	int i = 0;

	do {
		printf("%d\n", i);
		i++;
	} while (i < 10);

	return 0;
}
//do while문 사용
#include <stdio.h>

int main(void) {

	int i = 0;

	while (i < 10) {
		printf("%d\n", i);
		i++;
	}

	return 0;
}

 

6-2. 주어진 코드를 break문을 사용하지 않도록 수정

#include <stdio.h>

int main(void) {

	int count = 0;
	char ch = 'a';

	while ((ch = getchar()) && (ch != 'Q')) {
		count++;
		putchar(ch);
	}

	return 0;
}

 

6-3. 주어진 코드를 continue문을 사용하지 않도록 수정

#include <stdio.h>

int main(void) {
	
	int i = -10;
	int n = 20;
	int total = 0;

	while (i < n) {
		++i;
		if (i != 0) {
			total += i;
			printf("%d %d\n", i, total);
		}
	}

	return 0;
}

 

6-4. 주어진 두 코드의 차이점 설명하기

주어진 두 코드를 눈으로 보면 for문 안의 증감식이 다르게 써져있다는 것을 볼 수 있습니다.

첫 번째 코드는 i++이고 두 번째 코드는 ++i입니다.

증감연산자의 위치가 다르지만 단독으로 사용되기 때문에 코드를 실행하면 결과는 같습니다.

 

6-5. 1에서 100까지 합 구하기(for문 사용)

#include <stdio.h>

int main(void) {

	int total = 0;
	
	for (int i = 0; i <= 100; i++) {
		total += i;
	}
	printf("합: %d", total);

	return 0;
}

 

6-6. 1부터 10까지의 합 구하기(for문 사용)

#include <stdio.h>

int main(void) {

	int total = 0;

	for (int i = 0; i <= 10; i++) {
		total += i;
		printf("%2d  %2d\n", i, total);
	}

	return 0;
}

 

6-7. 1 부터 100까지의 홀수의 합 구하기 (while문 사용)

#include <stdio.h>

int main(void) {

	int total = 0;
	int i = 0;

	while (1) {
		i++;
		if (i > 100)
			break;
		if (i % 2 == 0)
			continue;
		total += i;
	}
	printf("홀수의 합: %d", total);

	return 0;
}

 

6-8. 0에서 360도까지 10도 간격으로 라디안 출력

#include <stdio.h>
#define PI 3.14159

int main(void) {

	int degree;
	double radian;

	printf(" 도   라디안\n");
	printf("--------------\n");
	for (int degree = 0; degree <= 360; degree += 10) {
		radian = ((double)degree / 180) * PI;
		printf("%3d   %.3f\n", degree, radian);
	}

	return 0;
}

 

6-9. 1부터 100 사이의 자연수 n을 입력받아서 1부터 n까지의 합 구하기 (do while문 사용)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	int total = 0;
	int i = 0;
	int n; //입력받은 값

	printf("10 이상의 자연수를 입력하세요: ");
	scanf("%d", &n);
	if ((n > 100) || (n < 0)) {
		printf("잘못된 값 입력");
		return 0;
	}
	if ((n >= 1) && (n <= 10))
		return 0;

	do {
		i++;
		total += i;
	} while (i < n);
    
	printf("%d까지의 합: %d", n, total);

	return 0;
}

 

6-10.  50에서 100까지의 홀수의 개수와 홀수의 합 구하기 (do while문 사용)

#include <stdio.h>

int main(void) {

	int i = 50;
	int count = 0; //개수
	int total = 0; //합

	do {
		if (i % 2 == 1) {
			total += i;
			count++;
		}
		i++;
	} while (i <= 100);

	printf("홀수의 개수: %d\n", count);
	printf("홀수의 합: %d", total);

	return 0;
}

 

6-11. 2에서 10 사이의 임의의 정수(n)과, 배수의 합(sum)을 입력받아서 1에서 100 사이의 n의 배수의 합이 sum보다 작을 때의 배수와 합 구하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	int n;
	int sum;
	int n1 = 0;
	int sum1 = 0;

	printf("정수 입력: ");
	scanf(" %d", &n);
	printf("배수의 합: ");
	scanf(" %d", &sum);

	while (sum1 + n1 < sum) {
		n1 += n;
		sum1 += n1;
	}

	printf("배수: %d,  합: %d", n1, sum1);

	return 0;
}

 

6-12. 1에서 10사이의 양의 정수(n)를 입력받아서 n! 구하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	int n;
	int result = 1;
	
	printf("구하고자 하는 factorial 값: ");
	scanf(" %d", &n);
	if ((n < 1) || (n > 10)) {
		printf("잘못된 값 입력");
		return 0;
	}

	printf("%d! = ", n);
	for (int i = n; i > 1; i--) {
		printf("%d * ", i);
		result *= i;
	}
	printf("1 = %d", result);

	return 0;
}

교재의 출력 예시에는 4! 이 36이라고 나와있지만, 4! 은 24가 맞습니다.

 

6-13. 임의의 문자를 입력받아서 입력한 문자를 반복 출력. Q가 입력되면 프로그램 종료.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	char ch;

	while (1) {
		printf("한 문자 입력: ");
		scanf(" %c", &ch);
		if (ch == 'Q')
			return 0;
		printf("입력한 문자: %c\n", ch);
	}

	return 0;
}

scanf 함수를 사용해서 문자를 입력받을 때 큰 따옴표와 서식 지정자 사이에 띄어쓰기의 유무에 따른 출력 결과

제가 지금까지 적었던 코드를 보면 아시겠지만, 저는 scanf를 사용할 때 'scanf(" %c", &ch);'와 같이 큰따옴표(") 다음에 한 칸을 띄우고 서식 지정자(%c)를 적었습니다. 만약 띄어쓰기를 하지 않는다면 상단 좌측의 그림과 같이 의도치 않았던 출력 결과가 발생할 수 있기 때문입니다.

 

6-14. 0이 입력될 때까지 입력한 정수들의 합과 평균 구하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	int count = 0;
	int total = 0;
	int num;
	int avg;

	while (1) {
		printf("숫자 입력: ");
		scanf(" %d", &num);
		if (num == 0)
			break;
		total += num;
		count++;
	}
	
	avg = total / count;

	printf("합: %d,  평균: %d", total, avg);

	return 0;
}

교재의 예시대로 값을 입력하면 출력 결과가 합이 202, 평균이 67이라고 나왔지만, 실제로는 합이 231 평균이 77입니다.

 

6-15. 개행 문자('\n') 입력 전까지 입력한 문자의 개수와 공백 문자의 개수 구하기

#include <stdio.h>

int main(void) {

	char ch;
	int countChr = 0;
	int countBlank = 0;
	

	printf("입력문자열: ");
	while (1) {
		ch = getchar();
		if (ch == '\n')
			break;
		if (ch == ' ')
			countBlank++;
		countChr++;
	}

	printf("입력받은 문자의 개수: %d\n", countChr);
	printf("공백문자의 개수: %d", countBlank);

	return 0;
}

 

6-16. 개행문자('\n') 입력 전까지 입력한 문자의 개수와 모음 문자의 개수 구하기

#include <stdio.h>

int main(void) {

	char ch;
	int countChr = 0;
	int countBla = 0;
	int countA = 0;
	int countE = 0;
	int countI = 0;
	int countO = 0;
	int countU = 0;

	printf("입력문자열: ");
	while (1) {
		ch = getchar();
		if (ch == '\n')
			break;
		countChr++;

		switch (ch) {
		case 'a':
		case 'A':
			countA++;
			break;
		case 'e':
		case 'E':
			countE++;
			break;
		case 'i':
		case 'I':
			countI++;
			break;
		case 'o':
		case 'O':
			countO++;
			break;
		case 'u':
		case 'U':
			countE++;
			break;
		}
	}

	printf("입력받은 문자의 개수: %d\n", countChr);
	printf("모음 (a): %d\n", countA);
	printf("모음 (e): %d\n", countE);
	printf("모음 (i): %d\n", countI);
	printf("모음 (o): %d\n", countO);
	printf("모음 (u): %d\n", countU);

	return 0;
}

 

6-17. 입력받은 높이에서 떨어지는 물체의 높이를 초당 출력

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define G 9.80665

int main(void) {

	double height;
	double time = 0;

	printf("탑의 높이: ");
	scanf(" %lf", &height);

	printf("시간    높이\n");
	printf("---------------\n");
	do {
		printf("%3.2f    %4.2f\n", time, height);
		time++;
		height -= 0.5 * G * time * time;
	} while (height >= 0);

	return 0;
}

 

6-18. 1 - 2 + 3 - 4 + ... + 99 - 100 구하기

#include <stdio.h>

int main(void) {

	int total = 0;

	for (int i = 1; i <= 100; i++) {
		if (i % 2 == 0)
			total -= i;
		else
			total += i;
	}

	printf("합 (1 - 2 + 3 - 4 + ... + 99 - 100) : %d", total);

	return 0;
}

 

6-19. 1 - 2 + 3 - 4 + ... + 99 - 100의 중간 과정과 결과 출력(while문 사용)

#include <stdio.h>

int main(void) {

	int total = 0;
	int count = 1;

	while (count <= 100) {
		printf("1 ");
		for (int i = 2; i <= count; i++) {
			if (i % 2 == 0) {
				printf("- %d ", i);
			}
			else {
				printf("+ %d ", i);
			}
		}

		if (count % 2 == 0)
			total -= count;
		else
			total += count;

		printf("= %d\n", total);
		count++;
	}

	printf("합 (1 - 2 + 3 - 4 + ... + 99 - 100) : %d", total);

	return 0;
}

 

6-20. 1 + (1 + 2) + (1 + 2 + 3) + ... + (1 + 2 + 3 + ... + 9 + 10)를 구해라

#include <stdio.h>

int main(void) {

	int total = 0;

	for (int i = 1; i <= 10; i++) {
		for (int j = 1; j <= i; j++) {
			total += j;
		}
	}

	printf("1 + (1 + 2) + (1 + 2 + 3) + ... + (1 + 2 + 3 + ... + 9 + 10) = %d", total);

	return 0;
}

 

반응형