본문 바로가기
C언어/쉽게 풀어쓴 C언어 EXPRESS 개정4판

[7上] 쉽게 풀어쓴 C언어 EXPRESS 개정 4판 7장 PROGRAMMING (1~6번)

by EATSTAR 2023. 6. 24.
반응형

[ 7 ~ 12번 ]

 

[7中] 쉽게 풀어쓴 C언어 EXPRESS 개정 4판 7장 PROGRAMMING (7~12번)

[ 1 ~ 6번 ] [7上] 쉽게 풀어쓴 C언어 EXPRESS 개정 4판 7장 PROGRAMMING (1~6번) [ 7 ~ 12번 ] (준비중) [ 13 ~ 18번 ] (준비중) * 본문은 Microsoft Visual Studio 2022 버전 17.6.4를 사용하였으므로 다른 버전의 비쥬얼 스

eatstar.tistory.com

 

[ 13 ~ 21번 ]

 

[7下] 쉽게 풀어쓴 C언어 EXPRESS 개정 4판 7장 PROGRAMMING (13~21번)

* 본문은 Microsoft Visual Studio 2022 버전 17.7.4를 사용하였으므로 다른 버전의 비쥬얼 스튜디오나 다른 C언어 작동 프로그램으로 작동할 경우 오류가 생길 수 있음을 양지해주세요. 13. (1+2+3+...+n)가 100

eatstar.tistory.com

 

* 본문은 Microsoft Visual Studio 2022 버전 17.6.4를 사용하였으므로 다른 버전의 비쥬얼 스튜디오나 다른 C언어 작동 프로그램으로 작동할 경우 오류가 생길 수 있음을 양지해주세요.

1. 가끔은 일정한 시간 동안 아무 일도 하지 않으면서 시간을 지연시킬 목적으로 반복문을 사용하기도 한다. 주방 타이머를 작성해보자. 사용자에게서 하나의 수를 입력받아서 변수에 저장한다. 반복문을 사용하여 이 변수의 값을 1초에 1씩 감소시키면서 이 변수의 값이 0이 될 때까지 반복한다. 반복이 끝나면 벨소리를 낸다.  (for 루프 / MEDIUM)

카운터의 초기값을 입력하시오(단위: 초): 10
10 9 8 7 6 5 4 3 2 1
문제 의도
for문을 사용하면서 sleep함수를 이용하여 시간을 지연시키고, \a를 이용하여 벨소리를 낼 수 있는가?

 

#include <stdio.h>
#include <windows.h>

int main(void) {
	int sec, i;

	printf("카운터의 초기값을 입력하시오(단위: 초): ");
	scanf_s("%d", &sec);

	for (i = sec; i > 0; i--) {
		printf("%d ", i);
		Sleep(1000);
	}

	printf("\a");

	return 0;
}
코드 설명
Sleep 함수를 사용하기 위해 windows.h 헤더 파일을 불러오자.
카운터의 초기값을 scanf로 받고, for문으로 10(sec)부터 0까지 for문을 진행하는데,
이 때 i를 출력하게 하고 1000ms인 1초를 대기한다.
마지막으로 \a를 출력하여 벨 소리를 낸다.

 

 


2. 1부터 100 사이의 모든 3의 배수의 합을 계산하여 출력하는 프로그램을 반복 구조를 사용하여 작성하라.  (for 루프와 선택 구조/ MEDIUM)

1부터 100 사이의 모든 3의 배수의 합은 1683입니다.
문제 의도
%연사자를 이용하여 N의 배수를 판별하고, 그 배수를 for문으로 모두 더할 수 있는가?

 

#include <stdio.h>

int main(void) {
	int sum = 0;
	int i;

	for (i = 1; i <= 100; i++) {
		if (i % 3 == 0) {
			sum += i;
		}
	}

	printf("1부터 100 사이의 모든 3의 배수의 합은 %d입니다.", sum);

	return 0;
}
코드 설명
i % 3에 대입하면 이 때 0이 나오는 i값은 3의 배수(3으로 나눴는데 나머지가 없으므로)이므로 sum 변수에 더해준다. 
sum += i (sum = sum + i) 이것을 for문으로 100번 반복하고 출력한다. for의 i 범위를 통상적이지 않게 적어놨는데, 저것은 직관적이게 보이게 한 것이다.
for (i = 0; i < 100; i++) {
		if ((i+1) % 3 == 0) {
			sum += i;
		}
	}
물론 이런 식으로도 진행 가능하다.

 

 


3. 사용자가 입력한 정수 3개의 합을 계산하여 출력한다. 다만 사용자가 음수를 입력하면 이것은 합계에서 제외된다. (반복 루프에서 continue 사용/ MEDIUM)

숫자를 입력하시오: 10
숫자를 입력하시오: 20
숫자를 입력하시오: -60
숫자를 입력하시오: 30

합계는 60입니다.
문제의도
음수가 나올 때 continue를 사용하여 for 문의 i의 증감를 회피할 수 있는가?
그렇게 해서 양수만을 반복해 더할 수 있는가?

 

#include <stdio.h>

int main(void) {
	int num;
	int i;
	int sum = 0;

	for (i = 0; i < 3; i++) {
		printf("숫자를 입력하시오: ");
		scanf_s("%d", &num);
		if (num < 0) {
			i--;
			continue;
		}
		sum += num;
	}

	printf("\n합계는 %d입니다.",sum);
 
	return 0;
}
코드 설명
수를 받고 그 수(num)가 0보다 작으면 i--로 i를 1 줄이고 for문 최상단으로 보낸다. 그러면 거기서 i++로 i에 1이 더해지기 때문에 결국 i의 상태는 0으로 중화된다. 

 

while 문으로도 진행해보자!

#include <stdio.h>

int main(void) {
	int num;
	int i;
	int sum = 0;

	i = 1;

	while (i <= 3) {
		printf("숫자를 입력하시오: ");
		scanf_s("%d", &num);
        
		if (num >= 0) {
			sum += num;
			i++;
		}
		else {
			continue;
            }
	}

	printf("\n합계는 %d입니다.", sum);

	return 0;
}

 

이렇게 while 문으로도 작성 가능하다. for문에서는 0보다 작을 때 i--를 해줬지만, while문에서는 0보다 크거나 같을 때 i++을 써줘야 한다. 거기다가 while 문 외부에서 초기값 설정도 따로 필요하다. 어차피 i++나 i--는 필요한데 while 문은 외부에서 초기값 설정을 해야 하고 자동 i 증감이 없으니 실수가 일어나기 쉬워 결국 for문이 대부분의 경우에 적합하다.

 

 


4. 사용자가 입력한 정수의 모든 약수를 화면에 출력하는 프로그램을 작성하라. (for 루프와 선택 구조/ MEDIUM)

정수를 입력하시오: 60
약수: 1 2 3 4 5 6 10 12 15 20 30 60
문제 의도
%연산자를 활용해 약수를 구할 수 있는가?

 

#include <stdio.h>

int main(void) {
	int num;
	int i;

	printf("정수를 입력하시오: ");
	scanf_s("%d", &num);

	printf("약수: ");
	for (i = 1; i <= num; i++) {
		if (num % i == 0) {
			printf("%d ", i);
		}
	}

	return 0;
}
코드 설명
i가 1부터 num까지 증가한다. (num이라는 정수가 있을 때 num+1 이상의 정수가 num의 약수가 될 수 없으므로)
num%i를 해주면 num%1, num%2... num%num까지 진행되면서 약수를 구할 수 있다.

 

 


5. 실수의 거듭 제곱값을 계산하는 프로그램을 작성하여보자. 사용자로부터 하나의 실수 r과 거듭 제곱횟수를 나타내는 정수 n을 입력받아서 r^n을 구하여 화면에 출력한다. (반복 루프/ MEDIUM)

실수의 값을 입력하시오: 2
거듭 제곱 횟수를 입력하시오: 10
결과값은 1024.000000
문제 의도
for 문을 이용해 거듭 제곱 횟수만큼 반복해서 실수를 곱할 수 있는가?

 

#include <stdio.h>

int main(void) {
	double num = 0;
	double sum;
	int time = 0;
	int i;

	printf("실수의 값을 입력하시오: ");
	scanf_s("%lf", &num);
	printf("거듭 제곱 횟수를 입력하시오: ");
	scanf_s("%d", &time);

	for (i = 1, sum = 1; i <= time; i++) {
		sum *= num;
	}

	printf("결과값은 %lf", sum);

	return 0;

}
코드 설명
i와 함께 sum도 1로 정의해준다. 그리고 그 sum에 거듭 제곱 횟수 time만큼 2를 곱해준다.
그러면 거듭제곱이 완성된다. (sum *= 2는 sum = sum*2.)

 

 


6. 다음 값을 계산하여 출력해보자.

n의 값을 입력하시오: 10
계산값은 385입니다.
문제 의도
for문에서 i^i를 반복 진행하는 동시에 그 값들을 다 저장할 수 있는가?

 

#include <stdio.h>

int main(void) {
	int i, n;
	int sum = 0;

	printf("n의 값을 입력하시오: ");
	scanf_s("%d", &n);

	for (i = 1; i <= n; i++) {
		sum += i*i;
	}

	printf("계산값은 %d입니다", sum);

	return 0;
}
코드 설명
sum을 일단 0으로 정의한다. for문을 이용해서 i = 1부터 n까지 i*i를 진행하면서 그 값을 sum에 더한다.
(sum += i*i는 sum = sum + i*i.)

 

반응형