새소식

C, C++/C Basic

# C언어 예제, 과제 3 (정답)

  • -

 순서도 논리 구조

② 순서도 기호

반복 구조의 예시

1부터 5까지의 수를 sum에 더하는 절차는 다음과 같다.

소스코드를 작성하는데 큰 문제가 없다. 그러나 만약 1부터 10000까지의 수를 sum에 더하는 절차를 위와 같이 나타낸다면 동작을 반복해 해결하는 것이 바람직하다.

 

반복 구조란 특정한 부분을 반복해서 실행되게 하는 구조를 의미한다.

 

 

③.① while형 반복 구조

조건이 참이면 문장을 실행하고 다시조건이 참인지 판단하여 조건이 참인 동안 문장을 반복해서 실행한다.

다음은 반복 구조를 이용해서 *을 다섯 번 출력하는 순서도와 C 프로그램이다.

*을 출력하는 문장을 count 변수 값이 5 이하인 동안 반복해서 실행한다.

결국 *을 출력하는 문장이 다섯 번 실행된다.

while 조건식이 참인 동안 실행되어야 할 문장이 여러 개라면 중괄호({, })로 묶어줘야 한다.

 

③.② for형 반복 구조

i가 1로 시작해서 1씩 증가하며 10이 될 때까지 문장을 반복해서 실행한다. 

즉 문장을 10번 반복해서 실행하게 된다.
++는 값을 1 증가시키는 증가연산자로 i++는 i 값을 1 증가시킨다.

 

 

다음은 “*”을 다섯 번 출력하는 순서도와 C 프로그램이다.

 

 

③.③ 중첩 반복 구조

: 다음과 같이 반복 구조 안에 또 다른 반복 구조가 포함된 구조를 중첩 반복 구조라 한다.

다음은 반복할 때마다의 i 값과 j 값을 출력하는 순서도와 C 프로그램이다.


예제

 

예제17

1부터 10까지 출력하기(1)

1로 시작되는 i를 1씩 증가하면서 i 값이 10보다 작거나 같은 동안 반복하며 i 값을 출력한다.

#include <stdio.h>

int main()
{
	int i = 1;
	while (i <= 10) { // i<=10이 참인 동안 반복해서 실행한다.
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

 

예제18

1부터 10까지 출력하기(2)

i가 1부터 1씩 증가하며 10이 될 때까지 반복하며 i 값을 출력한다.

#include <stdio.h>

int main()
{
	int i;
	for (i = 1; i <= 10; i++) { // i 값이 1부터 1씩 증가하며 10이 될 때까지 반복해서 실행한다. i++는 i 값을 1 증가시킨다.
		printf("%d ", i);
	}
	return 0;
}

 

예제19

10부터 1까지 출력하기

i가 10부터 1씩 감소하며 1이 될 때까지 반복하며 i 값을 출력한다.

#include <stdio.h>

int main()
{
	int i;
	for (i = 10; i >= 1; i--) {
		printf("%d ", i);
	}
	return 0;
}

 

예제20

1부터 100까지의 합 구하기

0으로 초기화되어 있는 변수 sum에 1부터 100까지 1씩 증가하는 변수 i 값을 더해 1부터 100까지의 합을 구한다.

#include <stdio.h>

int main()
{
	int i, sum = 0;
	for (i = 1; i <= 100; i++) { //i 값이 1부터 1씩 증가하며 100이 될 때까지 06을 반복해서 실행한다.
		sum = sum + i; 
	}
	printf("%d\n", sum);
	return 0;
}

 

예제21

1부터 100까지의 수 중 짝수의 합 구하기(1)

i가 2부터 2씩 증가하며 100이 될 때까지 반복하며 sum에 i 값을 더한다.

#include <stdio.h>

int main()
{
	int i, sum = 0;
	for (i = 2; i <= 100; i = i + 2) {
		sum = sum + i;
	}
	printf("%d ", sum);
	return 0;
}

 

예제22

1부터 100까지의 수 중 짝수의 합 구하기(2)

i가 1부터 100까지 1씩 증가하면서 i가 짝수인 경우 sum에 i를 누적한다.

#include <stdio.h>

int main()
{
	int i, sum = 0;
	for (i = 1; i <= 100; i++) {
		if (i % 2 == 0) {    // i를 2로 나눈 나머지가 0이면 07을 실행한다.
			sum = sum + i;
		}
	}
	printf("%d\n", sum);
	return 0;
}

 

 

예제23

1, -2, 3, -4, ..., 99, -100의 합 구하기

i가 1부터 1씩 증가하며 100이 될 때까지 반복하며 i가 홀수면 sum에 i 값을 더하고, i가 짝수면 sum에서 i 값을 뺀다.

#include <stdio.h>

int main()
{
	int i, sum = 0;
	for (i = 1; i <= 100; i++) {
		if (i % 2 == 0)
			sum = sum - i; // i를 2로 나눈 나머지가 0이면 sum에서 i 값을 뺀다.
		else
			sum = sum + i; // 그렇지 않으면 sum에 i 값을 더한다.
	}
	printf("%d ", sum);
	return 0;
}

 

 

예제24

계승 구하기

계승이란 1부터 임의의 양의 정수 n까지의 수를 모두 곱한 것을 말하며 n!로 나타낸다.

예를 들어 5의 계승은 5!로 표시하며 1*2*3*4*5 이다. 그런데, 여기서 0!은 1로 정의한다.

#include <stdio.h>

int main()
{
	int i, fact = 1;
	for (i = 5; i >= 1; i--) { //i 값이 5부터 1씩 감소하며 1이 될 때까지 06을 반복해서 실행한다.
		fact = fact * i;
	}
	printf("%d\n", fact);
	return 0;
}

 

 

예제25

약수 구하기

임의의 수를 나누었을 때 나누어떨어지게 하는 수를 임의의 수의 약수라 한다.

즉, n의 약수는 1부터 n까지의 수 중 n을 나누어떨어지게 하는 수가 된다. 

예를 들면, 10의 약수는 1부터 10까지 수들로 10을 나누었을 때 나머지가 0이 되게 하는 수, 즉 1, 2, 5, 10이 된다.

#include <stdio.h>

int main()
{
	int n, i;
	printf("정수: ");
	scanf("%d", &n);
	printf("약수: ");

	for (i = 1; i <= n; i++) {
		if (n % i == 0) {
			printf("%d ", i);
		}
	}
	return 0;
}

 

 

예제26

약수 구하기

공약수란 0이 아닌 두 정수의 공통되는 약수를 말한다. 즉, 두 정수를 나누어떨어지게 하는 공통의 수를 의미한다.
n1과 n2의 공약수는 1부터 n1까지 1씩 증가하는 i로 n1과 n2 모두를 나누어떨어지게 하는수가 된다. 

단, n1이 n2보다 작다고 가정한다.

#include <stdio.h>

int main()
{
	int i;
	int n1, n2;
	printf("정수(2개) : ");
	scanf("%d %d", &n1, &n2);
	for (i = 1; i <= n1; i++) {
		if (n1 % i == 0 && n2 % i == 0)
			printf("%d ", i);  // n1을 i로 나눈 나머지가 0이고 n2를 i로 나눈 나머지도 0이면 공약수인 i 값을 출력한다.
	}
	return 0;
}

 

예제27

최대공약수 구하기

두 정수의 공약수 중 가장 큰 것을 최대공약수라 한다. 

그러므로 n1과 n2의 최대공약수는 n1부터 1까지 1씩 감소하는 i로 n1과 n2 모두를 나누어떨어지게 하는 첫 번째 수가 된다. 단, n1이 n2보다 작다고 가정한다.

#include <stdio.h>

int main()
{
	int i;
	int n1, n2;
	printf("정수(2개) : ");
	scanf("%d %d", &n1, &n2);

	for (i = n1; i >= 1; i--) {
		if (n1 % i == 0 && n2 % i == 0) {
			printf("%d ", i);
			break;  // n1을 i로 나눈 나머지가 0이고 n2를 i로 나눈 나머지도 0이면 최대공약수인 i 값을 출력하고 break에 의해 반복 구조를 빠져나온다.
		}
	}
	return 0;
}

 

예제28

소수 판별하기

소수란 2, 3, 5, 7 …과 같이 1과 자기 자신 이외의 양의 약수를 가지지 않는 1보다 큰 자연수를 말한다.

임의의 수를 2부터 자기 자신보다 1 작은 수까지의 수로 차례로 나누어서 나누어떨어지는 경우가 생기면 소수가 아니고, 나누어떨어지는 경우가 생기지 않으면 소수이다.

#include <stdio.h>

int main()
{
	int n, i, chk = 1;
	printf("정수 : ");
	scanf("%d", &n);
	for (i = 2; i <= n - 1; i++) {
		if (n % i == 0) {
			chk = 0;
			break;  //n을 i로 나눈 나머지가 0이면 chk에 0을 저장하고 break에 의해 반복 구조를 빠
			져나온다.
		}
	}
	if (chk == 1) {
		printf("소수임\n");
	}
	else {
		printf("소수아님\n");
	}
	return 0;
}

 

예제29

피보나치수열 구하기

다음과 같은 수열이 있다.

이 수열의 두 번째 항 이후의 항들은 이전의 두 항을 더해 구해진다. 즉, 첫 번째 항과 두번째 항을 더한 값이 세 번째 항이 되고, 두 번째 항과 세 번째 항을 더한 값이 네 번째 항이 된다. 이와 같은 수열을 피보나치수열이라 한다.

피보나치수열을 구하는 과정은 다음과 같다.
전전 항을 저장하는 변수를 a, 전 항을 저장하는 변수를 b, 현재 항을 저장하는 변수를 c라 하고, a에 첫 번째 항인 1을, b에 두 번째 항인 1을 저장하고 시작한다. 현재 항 c는 a 값과 b 값을 더한 값이 된다. 그 후 전 항 b값을 a에, 현재 항 c 값을 b 저장하고 현재 항 c를 새롭게 구하는 과정을 반복하며 피보나치수열을 구한다.

#include <stdio.h>

int main()
{
	int a = 1, b = 1, c, i;
	printf("%d %d ", a, b); // 첫 번째 항과 두 번째 항을 출력한다.
	for (i = 3; i <= 20; i++) {
		c = a + b;          // 전전항 a와 전항 b를 더한 값을 현재항 c에 저장한다.
		printf("%d ", c);
		a = b;              // 전항 b 값을 a에 저장하고 현재항 c 값을 b에 저장한다.
		b = c;
	}
	return 0;
}

 

 

예제30

최댓값 구하기

max 값과 새롭게 입력받은 a 값을 비교하여 큰 값을 max에 저장하는 동작을 반복해 최댓값을 구한다.

#include <stdio.h>

int main()
{
	int a, max;
	printf("정수 : ");
	scanf("%d", &a);
	max = a;
	while (a != 0) {  // a가 0이 아닌 동안 반복해서 실행한다.
		if (a > max)  // a가 max보다 크면 a 값을 max에 저장한다. max은 최댓값을 저장하는 변수이다.
			max = a;
		printf("정수 : ");
		scanf("%d", &a);
	}
	printf("최댓값: %d", max);
	return 0;
}

 

 

예제31

직각 삼각형 모양으로 수 출력하기

바깥쪽 반복문은 i 값을 1부터 5까지 반복하고, 안쪽 반복문은 j 값을 1부터 i까지 반복하며 j 값을 출력하면 다음과 같이 된다. 단, 안쪽 반복문을 마치면 “\n”을 이용해서 다음줄로 넘긴다.

#include <stdio.h>

int main()
{
	int i, j;
	for (i = 1; i <= 5; i++) {  // i 값이 1부터 1씩 증가하며 5가 될 때까지 반복해서 실행한다.
		for (j = 1; j <= i; j++) // j 값이 1부터 1씩 증가하며 i가 될 때까지 반복해서 실행한다.
			printf("%d ", j);
		printf("\n");  //다음 줄로 넘긴다.
	}
	return 0;
}

 

 

예제32

1부터 10까지의 정수에 대한 약수 구하기

1부터 10까지의 정수에 대한 약수를 구한다.

#include <stdio.h>

int main()
{
	int i, j;
	for (i = 1; i <= 10; i++) {  //i 값이 1부터 1씩 증가하며 10이 될 때까지 06~11을 반복해서 실행한다.
		printf("%d의 약수: ", i);
		for (j = 1; j <= i; j++) { //j 값이 1부터 1씩 증가하며 i가 될 때까지 08~09를 반복해서 실행한다.
			if (i % j == 0)
				printf("%d ", j);
		}
		printf("\n");
	}
	return 0;
}

 

예제33

2부터 100까지의 소수 구하기

i가 2부터 1씩 증가하며 100이 될 때까지 반복하며 각 i 값이 소수인지 판별한다. 소수를 판별하는 방법은 예제 28에서 살펴보았다.

#include <stdio.h>

int main()
{
	int i, j, chk;
	for (i = 2; i <= 100; i++) { // i 값이 2부터 1씩 증가하며 100이 될 때까지 06~15를 반복해서 실행한다.
		chk = 1;
		for (j = 2; j < i; j++) { // j 값이 1부터 1씩 증가하며 i-1이 될 때까지 08~11을 반복해서 실행한다.
			if (i % j == 0) { // i를 j로 나눈 나머지가 0이면 chk에 0을 저장하고 break에 의해 안쪽 반복 구조를빠져 나와 13행으로 이동한다.
				chk = 0;
				break;
			}
		}
		if (chk == 1) {
			printf("%d ", i);
		}
	}
	return 0;
}

 

 

예제34

2부터 100까지의 소수 구하기

1, (1+2), (1+2+3), …, (1+2+…+10)의 합 구하기

i가 1부터 1씩 증가하며 10이 될 때까지 반복하며 n은 i 값을 누적하고, sum은 n 값을 누적하면서 원하는 값을 구한다.

#include <stdio.h>

int main()
{
	int i, n = 0, sum = 0;
	for (i = 1; i <= 10; i++) {
		n = n + i;
		sum = sum + n;
	}
	printf("%d", sum);
	return 0;
}

 

 

예제34

구구단

다음과 같은 형식으로 출력되는 구구단 순서도와 프로그램을 작성한다.

단에 해당하는 2부터 9까지의 수는 변수 i로, 곱하여지는 수 1부터 9까지는 변수 j로, 곱한 결과는 j*j로 나타낸다.

#include <stdio.h>

int main()
{
	int i, j;
	for (i = 2; i <= 9; i++) { // i 값이 2부터 1씩 증가하며 9가 될 때까지 반복해서 실행한다.
		for (j = 1; j <= 9; j++) { // j 값이 2부터 1씩 증가하며 9가 될 때까지 반복해서 실행한다.
			printf("%d*%d=%2d ", i, j, i * j);
		}
		printf("\n"); // 다음 줄로 넘긴다.
	}
	return 0;
}

 

 

 

 

 

 

 

 

 


과제

 

과제16

1부터 10까지 출력하는 다음 순서도의 ①과 ②를 채우고 C 프로그램을 작성하여라.

 

 

 

과제17

5부터 15까지 출력하는 순서도와 C 프로그램을 작성하여라.

 

 

과제18

5부터 15까지 과제 출력하는 순서도와 C 프로그램을 작성하여라.

 

 

과제19

while형 반복 구조를 이용해서 10부터 1까지 출력하는 순서도와 C 프로그램을 작성하여라.

 

 

과제20

while형 반복 구조를 이용해서 1부터 100까지의 합을 구해 출력하는 순서도와 C 프로그램을 작성하여라.

 

 

과제21

1부터 입력받은 수까지의 합을 출력하는 순서도와 C 프로그램을 작성하여라.

 

 

과제22

while형 반복 구조를 이용해서 1부터 100까지의 수 중 짝수의 합을 구해 출력하는 순서도와 C 프로그램을 작성하여라.

 

 

과제23

1부터 100까지의 수 중 3의 배수의 합을 구해 출력하는 순서도와 C 프로그램을 작성하여라.

 

 

과제24

1부터 100까지의 수 중 3의 배수의 합을 출력하는 순서도와 C 프로그램을 작성하여라.

 


과제25

while형 반복 구조를 이용해서 1, -2, 3, -4, ..., 99, -100의 합을 구해 출력하는 순서도와 C 프로그램을 작성하여라.

 

 

과제26

1, 2, -3, 4, 5, -6, ..., -99, 100의 합을 구해 출력하는 순서도와 C 프로그램을 작성하여라.

 

 

과제27

while형 반복 구조를 이용해서 계승을 구하는 순서도와 C 프로그램 작성하여라.

 

과제28

약수와 약수의 개수를 출 과제 력하는 순서도와 C 프로그램을 작성하여라.

 

 

과제29

세 수의 공약수를 출 과제 력하는 순서도와 C 프로그램을 작성하여라.


과제30

1부터 자기 자신까지의 수로 차례로 나누어서 나누어떨어지는 경우 2번 발생하면 이 수는 소수이고, 그렇지 않으면 소수가 아니다. 이 방법을 이용해서 소수를 판별하는 순서도와 C 프로그램을 작성하여라.

 

 

과제31

피보나치수열의 20번째 항까지의 합을 구하는 순서도와 C 프로그램을 작성하여라.

 

 

과제32

최솟값을 구하는 순서도와 C 프로그램을 작성하여라.

 

 

과제33

다음과 같이 과제 출력하는 순서도와 C 프로그램을 각각 작성하여라.

 

 

과제34

1!, 2!, 3!, 4!, 5!의 합을 출 과제 력하는 순서도와 C 프로그램을 작성하여라.

 

 

과제35

다음과 같은 형식으로 출력되는 구구단 순서도와 C 프로그램을 작성하여라.

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.