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 일 경우
문제들이 일단 수학 개념원리를 다시 공부해야 술술 풀릴 것 같아서 일단 멈춤...
'C언어 공부' 카테고리의 다른 글
06. 조건문, 논리연산자, 관계연산자 (0) | 2024.10.14 |
---|---|
05. 문자형, 입력함수 (0) | 2024.10.14 |
04. 산술연산자, 대입연산자, 비트연산자, 오버플로우 (0) | 2024.10.13 |
03. 변수 선언, 정수형, 실수형, 서식문자(변환문자) (5) | 2024.10.13 |
02. Hello, World! 분석하기 (0) | 2024.10.12 |