for
while 문와 같은 반복 기능을 한다. while 문은 조건반복에 많이 쓰이며, for 문은 단순반복에 많이 쓰인다.
[문법]
for (초기치; 조건문; 증감)
{
문장;
}
예1)
for (int i = 0; i < 10; ++i)
{
printf("%d ", i);
}
결과를 추론해보자
예2)
for (int i = 1; i < 10; i = i*2)
{
printf("%d ", i);
}
결과를 추론해보자
예2)
for (int i = 9; i > 0; i = i/3)
{
printf("%d ", i);
}
결과를 추론해보자
<유의점>
for (int i = 0; i < 10; ++i);
{
printf("%d ", i);
}
과연 어디가 틀렸을까?
<for 문의 실행순서>
1. int i = 0; 으로 초기화 한다.
for (int i = 0; i < 2; ++i)
{
printf("%d ", i);
}
2. i < 2 조건을 판단한다.
2.1 참이면 3을 이동
2.2 거짓이면 루프를 탈출한다.
for (int i = 0; i < 2; ++i)
{
printf("%d ", i);
}
3. 블록{} 안의 문장을 실행한다.
for (int i = 0; i < 2; ++i)
{
printf("%d ", i);
}
4. ++i 실행하며, 1씩 증가된다. 2번으로 이동
for (int i = 0; i < 2; ++i)
{
printf("%d ", i);
}
<특이한 for 문>
#include <stdio.h>
void main()
{
for (int i = 0, j = 10; i <= 10 && j >= 0; ++i, --j)
{
printf("%2d %2d\n", i, j);
}
}
//-----------------------------------------
#include <stdio.h>
void main()
{
int iNum;
scanf("%d", &iNum);
for (int i = 0, j = iNum; i < j; ++i, --j)
{
printf("%2d %2d\n", i, j);
}
puts("------");
for (int i = 0, int j = iNum; i <= iNum/2 + iNum%2 -1; ++i, --j)
{
printf("%2d %2d\n", i, j);
}
puts("------");
for (int i = 0, int j = iNum; i <= iNum/2 + iNum%2 -1; ++i)
{
j = iNum - i;
printf("%2d %2d\n", i, j);
}
}
<실습>
1 + 2 + ... + 100 = ?
1 ~ 100 까지 홀수의 합은?
<실습>
10 ! = 10 * 9 * ... * 2 * 1 (Factorial) 을 구하시오!
<다중 For문>
for 문 안에 중첩(nested)해서 또 다른 for 문을 넣을 수 있다.
for 문 안에 있는 변수가 특정한 의미를 가지고 있지 않다면, 전통적으로 i, j, k 순으로 쓴다.
-> 이중 For 문
for (int i = 0; i < 2; ++i)
{
for (int j = 0; j < 2; ++j)
{
printf("i = %d, j = %d\n", i , j);
}
}
<결과>
i = 0, j = 0
i = 0, j = 1
i = 1, j = 0
i = 1, j = 1
Press any key to continue
-> 삼중 For 문
for (int i = 0; i < 2; ++i)
{
for (int j = 0; j < 2; ++j)
{
for (int k= 0; k< 2; ++k)
{
printf("i = %d, j = %d, k = %d\n"), i , j);
}
}
}
<결과>
i = 0, j = 0, k = 0
i = 0, j = 0, k = 1
i = 0, j = 1, k = 0
i = 0, j = 1, k = 1
i = 1, j = 0, k = 0
i = 1, j = 0, k = 1
i = 1, j = 1, k = 0
i = 1, j = 1, k = 1
Press any key to continue
<유의점>
for (int i = 0; i < 2; ++i)
{
for (int j = 0; i < 2; ++j)
{
printf("i = %d, j = %d\n", i , j);
}
}
과연 어디가 틀렸을까?
기대하는 결과는 아래와 같지만
i = 0, j = 0
i = 0, j = 1
i = 1, j = 0
i = 1, j = 1
Press any key to continue
실행해보면 결과는 i = 0이며 j 의 값은 무한정 올라간다.
<실습>
구구단 만들기 (아래와 같이 출력하시오)
---2단---
2 * 1 = 2
2 * 2 = 4
...
2 * 9 = 18
---3단---
3 * 1 = 3
...
...
...
9 * 9 = 81
<실습>
1^1 + 2^2+ 3^3 + 4^4 + 5^5 = ?
1 + 2*2 + 3*3*3 + 4*4*4*4+ 5*5*5*5*5 = ?
실행결과
1^1 = 1, sum = 1
2^2 = 4, sum = 5
3^3 = 27, sum = 32
4^4 = 256, sum = 288
5^5 = 3125, sum = 3413
1^1 + 2^2+ 3^3 + 4^4 + 5^5 = 3413
Press any key to continue
<과제>
2~100 까지 소수 구하는 프로그램 만들기
출력결과
2 3 5 7 ...
특정한 수 n(2 이상)을 2에서 부터 n 까지 나누었을때
나머지가 0인 것이 n 자기 자신 밖에 없는 수를 소수라고 한다.
알고리즘
만약 n == 7 이라면
7 % 2, 7 % 3, 7 % 4, 7 % 5, 7 % 6 로 연산해서 나머지가 0인 경우가 한번도 없을 경우
7은 바로 소수가 된다.
효율적인 방법으로는 sqrt(square root) 즉 루트16을 2 부터 15 까지 조사를 하는 것 보다
루트16 의 값은 4이니깐 4부터 조사를 하면 된다고 수학적으로 알려져 있다.
특정한 수 n의 경우 루트n 값으로 부터 시작하면 된다.
<참고> 참고만 하세요! 게임프로그래머 입사 시험에 단골로 등장합니다.
문자열 뒤집어 출력하기
<방법1>
#include <stdio.h>
#include <string.h>
void main()
{
char text[1024], temp;
scanf("%s", text);
for (int i = 0, j = strlen(text)-1; i < j; ++i, --j)
{
temp = text[i];
text[i] = text[j];
text[j] = temp;
}
printf("%s", text);
}
<방법2>
#include <stdio.h>
#include <string.h>
void main()
{
char text[1024], temp;
scanf("%s", text);
int i, j = strlen(text)-1;
for (i = 0; i < j; ++i)
{
temp = text[i];
text[i] = text[j];
text[j--] = temp;
}
printf("%s", text);
}
<방법3>
#include <stdio.h>
#include <string.h>
void main()
{
char text[1024], temp;
scanf("%s", text);
iNum = strlen(text)-1;
for (int i = 0, int j = iNum; i <= iNum/2 + iNum%2 -1; ++i, --j)
{
temp = text[i];
text[i] = text[j];
text[j] = temp;
}
printf("%s", text);
}
<방법4>
#include <stdio.h>
#include <string.h>
void main()
{
char text[1024], temp;
scanf("%s", text);
iNum = strlen(text)-1;
for (int i = 0, int j = iNum; i <= iNum/2 + iNum%2 -1; ++i) {
j = iNum - i;
temp = text[i];
text[i] = text[j];
text[j] = temp;
}
printf("%s", text);
}
생각의 차이에 따라 여러가지 프로그램이 나올 수 있다.
가장 효율적인 방법을 찾고 추구해야하는 것이
" 바로 프로그래머의 몫인 것이다. "