본문 바로가기
C언어 공부

07. 반복문

by 나노다 2024. 10. 15.

for 문

[기본 구조]

#include <stdio.h>
int main() {
	int i;
    for (i=0; i<20; i++) {
    	printf("%d ", i);
    }
	return 0;
}

// for (초기식; 조건식; 증감식) { 명령들 }
  • 초기식 : 제어변수를 초기화시키는 부분.
  • 조건식 : 특정 조건을 만족할 때(조건식의 값이 1일 때) 동안만 명령을 반복함.
  • 증감식 : 한 번 실행할 때마다 제어변수의 값을 어떻게 변화시킬 지에 대한 부분.
  • 실행과정 : for문 입장 → 초기식 확인 → (조건식 확인 → 참이면 명령 실행, 거짓이면 for문 퇴장  → 증감식 적용 → 조건식 확인의 반복)

[break 문]

#include <stdio.h>
int main() {
	int i;
    for (;;) {
		scanf("숫자 맞추기 : %d", &i);
        if (i==3) {
    		printf("정답!");
           	break;   // for문 즉시 탈출
        } else {
    		printf("오답!");
        }
    }
	return 0;
}
  • for(;;) : 초기식, 조건식, 증감식이 없어도 for문은 작동함. 이 경우 조건값을 항상 참으로 여기며 무한 반복.
  • break : for문에서 조건식에 상관 없이 break 명령이 실행되는 순간 for문을 탈출함.

[continue 문]

#include <stdio.h>
int main() {
	int i;
    for (i=0; i<20; i++) {
    	if (i%5==0) continue; // 이번 루프에서 이후의 명령을 스킵하고 다음 루프로 이동
        printf("%d ", i);
    }
    return 0;
}
  • continue : continue 명령이 실행되는 순간 이후 명령을 무시하고 바로 증감식을 거쳐 조건 확인 단계로 넘어감. 

 

while 문

[기본 구조]

while (i<=100) {
	sum += 1;
   	i++;
}
// while (조건식) { 명령들 }

 

[do-while 문]

do {
	sum += i;
   	i++;
} while (i<100);
// do { 명령들 } while (조건식)
  • 명령을 먼저 실행하고 조건식을 확인하기 때문에, 조건식이 거짓이어도 최소 한 번의 명령은 실행됨.

 

생각해보기

N 줄인 삼각형을 출력한다. 단, 사용자로 부터 임의의 N 을 입력 받는다.

#include <stdio.h>
int main() {
	int n, space, star, N = 0;
	printf("N : ");
	scanf_s("%d", &N);

	for (n = 1; n <= N; n++) {
		for (space = N-1; space >= n; space--) {
			printf(" ");
		}
		for (star = 1; star <= n*2-1; star++) {
			printf("*");
		}
		printf("\n");
	}
	return 0;
}
  • 반복문이 필요한 것은 두 번, "*"을 출력하는 반복과, N번의 줄바꿈 반복이었음. 코드 구현 보다도 조건의 방정식을 생각해내는 게 오래 걸렸다.... 수학 잘 했었는데...
  • "2n-1"이라 써놓고 왜 안 되는 지 한참을 헤맸는데, 컴퓨터는 저러면 못 알아듣는다는 걸 겨우 깨달았다. "n*2"처럼 곱하기를 한다는 걸 잘 알려주자.

 

위와 동일한 형태를 취하되, 역 삼각형을 출력한다. 

#include <stdio.h>
int main() {
	int n, space, star, N = 0;
	printf("N : ");
	scanf_s("%d", &N);

	for (n = 1; n <= N; n++) {
		for (space = 1; space <= n-1; space++) {
			printf(" ");
		}
		for (star = 1; star <= N*2-(n*2-1); star++) {
			printf("*");
		}
		printf("\n");
	}
	return 0;
}
  • 구조가 같으니 금방 풀었는데, 역시 조건의 방정식 생각하는 게 좀 걸렸다... 언어가 아니고 산수를 공부해야 하나

 

1000 이하의 3 또는 5 의 배수인 자연수들의 합을 구한다.

#include <stdio.h>
int main() {
	int n, sum = 0;
	for (n = 1; n <= 1000; n++) {
		if (n % 3 == 0) {
			sum = sum + n;
		}
		else if (n % 5 == 0) {
			sum = sum + n;
		}
		else {
			continue;
		}
	}
	printf("%d", sum);
	return 0;
}
  • 처음엔 3의 배수 합과 5의 배수 합을 구한 뒤 15의 배수 합을 빼줘야하나 생각했는데, CLE가 생각나서 이렇게 구성.
  • 먼저 3의 배수인지 확인한 후 맞으면 더하고, else if를 활용해 3의 배수가 아닐 때만 5의 배수인지 확인하도록 했음
  • 그리고 둘다 아닌 경우엔 continue를 해서 더하지 않고 넘어가도록 구성을 했는데...
  • 검산할 겸 찾아보는데 그냥 논리 합 ||을 활용해서 if문 한번으로 묶어버리고 continue도 안 써도 되나 보더라. 234168로 결과가 같게 나오긴 하는데, 머쓱했다...

 

1000000 이하의 피보나치 수열 ( N 번째 항이 N - 1 번째 항과 N - 2 번째 항으로 표현되는 수열, 시작은 1,1,2,3,5,8,...) 의 짝수 항들의 합을 구한다

 

 

사용자로 부터 N 값을 입력 받고 1 부터 N 까지의 곱을 출력한다.

int main() {
	int N, n, mult = 1;
	printf("N : ");
	scanf_s("%d", &N);
	for (n = 1; n <= N; n++) {
		mult = mult * n;
	}
	printf("mult : %d", mult);
	return 0;
}
  • 합을 구할 때와 달리 곱이기 때문에 초기 값을 1로 설정해줘야 했음
  • 서식문자는 "%"...
  • 입력을 받을 땐 꼭 변수 앞에 &붙여주자

 

다음 식을 만족하는 자연수 a,b,c 의 개수를 구하여라

 

임의의 자연수 N 을 입력 받아 N 을 소인수 분해 한 결과를 출력하여라. 예를 들어서 N = 18 일 경우

 

문제들이 일단 수학 개념원리를 다시 공부해야 술술 풀릴 것 같아서 일단 멈춤...