2022. 2. 8. 16:38ㆍIoT Embeded 강의
이번에는 프로그램 제어문 중 반복문에 대해 정리하겠습니다. 반복문은 비슷한 일을 여러 번 바르게 반복하는 일을 합니다. 반복문에는 for문, while문, do~while 문이 있습니다.
1. for문
기본적인 구조는 다음과 같습니다.
for(초기화; 조건식; 증감식;)
{
반복 수행할 명령어;
}
먼저 초기화 부분입니다. 초기화란 변수에 특정한 값을 초기값으로 대입해주는 것입니다. for문에서 초기화 부분에 값을 바꿔주면 이는 마치 반복작업을 수행하는 시작점을 바꿔주는 것과 같습니다. 예를 들어 숫자 버튼을 1부터 10까지 1씩 커지는 방향으로 누르는 일이 있다고 합시다. for 문을 아래와 같이하면 그 의미는 다음과 같습니다.
for (int i =1 ; i <=10; i++) : 1번부터 시작하여 10번까지 1씩 커지면서 버튼을 누른다.
변수 'i'에 대입되는 값 : '1 2 3 4 5 6 7 8 9'
초기화 부분이 버튼 시작점이고 중간에 조건식 부분에서 반복횟수를 관계연산자로 지정합니다(i 가 10보다 작거나 같을때까지). 마지막으로 증감식에서 i++ 은 i에 1씩 더해간다는 의미로 1씩 커지는 방향으로 버튼을 누르라는 의미와 같습니다.
이제 for 문을 다양하게 변경하면서 각각의 의미를 이해하도록 해보겠습니다.
for (int i =10 ; i >=1; i--) : 10 9 8 7 6 5 4 3 2 1
for (int i =1 ; i <=5; i++) : 1 2 3 4 5
for (int i =2 ; i <=5; i++) : 2 3 4 5
for (int i =1 ; i <=10; i += 2) : 1 3 5 7 9
for (int i =2 ; i <=10; i += 2) : 2 4 6 8 10
이와 같이 for문의 초기화, 조건식, 증감식을 바꾸면서 i에 차례로 대입되는 값을 변경할 수 있습니다. 이제 이 변수 'i'를 for문 내에 명령어에 사용하여 반복 수행을 할 수 있습니다. 물론 i를 사용하지 않은 명령어를 작성해도 반복되는 것은 마찬가지 입니다.
2.while, do~while
기본적인 구조는 다음과 같습니다.
초기화;
while(조건식)
{
반복 수행할 명령어;
증감식;
}
초기화, 조건식, 증감식을 갖는 것은 for문과 큰 차이가 없지만 두 반복문의 사용 용도에 대해서는 차이점이 있습니다. 먼저 '10회 반복하겠다'는 식의 특정한 반복 횟수가 중요한 상황에는 for문이 적절합니다. 반면에 '수의 합이 100을 넘어가면 반복을 멈춘다'라는 식의 어떤 특정 조건이 중요한 상황에는 while문이 적절합니다. while 문을 이용해 1부터 n까지 의 합을 구하는 기능을 만들겠습니다.
먼저 num 변수를 사용자로부터 입력받은 뒤 while의 loop라는 변수가 1부터 시작해서 num변수보다 작거나 같을때까지만 반복되면서 while내의 명령어를 수행합니다. 여기서 초기화는 int loop =1; 조건식은 loop <= num; 증감식은 loop++; 입니다. loop변수의 값이 10보다 커지게 되는 순간 반복을 멈춥니다. loop의 값과 sum의 값을 표로 정리해보겠습니다.
반복 횟수 | loop | sum |
1 | 1 | 1 |
2 | 2 | 1+2 |
3 | 3 | 1+2+3 |
4 | 4 | 1+2+3+4 |
5 | 5 | 1+2+3+4+5 |
6 | 6 | 1+2+3+4+5+6 |
7 | 7 | 1+2+3+4+5+6+7 |
8 | 8 | 1+2+3+4+5+6+7+8 |
9 | 9 | 1+2+3+4+5+6+7+8+9 |
for문도 위와 같이 표로 정리해보시면 반복문의 흐름을 이해하는데 도움이 됩니다. 위의 표는 반복횟수 10번째까지 있어야 합니다. 10번째는 한번 스스로 생각해보시면 도움이 됩니다.
3. do~while
구조는 다음과 같습니다.
초기화;
do
{
반복 수행할 명령어;
증감식;
}while(조건식);
큰 흐름으로는 while 문과 차이가 거의 없습니다. 다만, do~while 은 먼저 명령어를 실행한 후에 while 내의 조건식을 보고 조건판별을 한다는 것입니다. 때문에 무조건 한번은 수행이 되고 수행된 이후 조건식에 맞으면 반복수행을 진행합니다. 아래는 while, do~while 을 이용해 1~10까지의 값을 출력하고 합계를 구하는 프로그램입니다.
while | do~while | ||||||
조건 판별 | 반복 횟수 | sum1 | loop1++ | 반복 횟수 | sum2 | loop2++ | 조건 판별 |
1<=10 | 1 | 1 | 2 | 1 | 1 | 2 | 2<=10 |
2<=10 | 2 | 1+2 | 3 | 2 | 1+2 | 3 | 3<=10 |
3<=10 | 3 | 1+2+3 | 4 | 3 | 1+2+3 | 4 | 4<=10 |
4<=10 | 4 | 1+2+3+4 | 5 | 4 | 1+2+3+4 | 5 | 5<=10 |
5<=10 | 5 | 1+2+3+4+5 | 6 | 5 | 1+2+3+4+5 | 6 | 6<=10 |
위의 표에서 while 과 do~ while 의 흐름을 표현했습니다. 결과는 같지만 내부에서 작동하는 방식은 차이점이 있음을 기억해야 합니다.
while, do~while 같은 경우는 (조건식) 내의 값이 참 (=1)이면 반복수행을 하기 때문에 while(1)로 작성하게 되면 이는 멈추지 않고 무한 반복을 합니다. 무한 반복을 하기 보다는 반복하고 있는 도중에 사용자의 입력에 따라 중단하는 프로그램을 만들때 사용하게 됩니다. while문과 if문을 조합하여 다음과 같이 '0'을 입력하면 프로그램을 종료하도록 만들 수 있습니다. 여기서 break와 continue에 대해서도 정리하겠습니다.
4. break , continue
/**/로 주석처리된 부분을 제외하고 위의 부분을 먼저 보겠습니다. while(1)문을 이용해 사용자로부터 input2값을 계속해서 입력받도록 했습니다. if 문에서 input2를 2로 나눈 나머지가 0이면(짝수) 이를 Evensum 변수에 계속해서 더해가도록 했고 input2 가 만일 '0'이라면 break;명령어를 실행하도록 했습니다. break; 가 실행이 되면 무한 반복되는 while(1)문을 빠져나와 가장 밑단의 printf함수가 실행이 됩니다. 즉, 반복에서 빠져나오는 명령어 입니다. 이처럼 조건문에 break를 넣어 사용자가 특정한 값을 입력하면 반복을 중단할 수 있습니다. break를 이용해 반복문을 빠져나오는 것은 break문이 속해 있는 반복문에만 해당됩니다. 만일 중첩 반복문(반복문 안에 반복문이 있는 경우)의 가장 안쪽 반복문에서 break문이 실행된다면 그 안에서만 반복을 중단하고 밖의 반복문은 그대로 진행됩니다.
이제 주석처리된 부분을 보겠습니다. 주석처리된 부분을 위의 2개의 if문과 바꿔도 결과는 같습니다. 먼저 if와 break가 조합된 부분은 앞서 말한 내용과 같습니다. 주석처리된 2번째 if문을 보면 if(input2 %2)라고 적혀 있습니다. input2 % 2의 계산결과가 '1'이라면 (input2가 홀수인 경우) if문이 작동하게 됩니다. if문도 (조건식)내부의 값이 참(=1)이면 작동하는 구조이기 때문입니다. 홀수일 경우 continue; 명령어가 작동합니다. 원래라면 아래 Evensum에 input2가 더해지는 명령어가 수행되어야 하지만 continue 명령어에 의해 다시 while문의 초반부(상단부)부터 다시 명령이 시행됩니다. 따라서 input2가 짝수인 경우에만 Evensum에 더해지게 됩니다.
break와 continue를 이용해 단순한 반복이 아닌 조건에 맞춰 반복을 수행할 수 있게 됩니다.
'IoT Embeded 강의' 카테고리의 다른 글
변수, 자료형, 식별자, 전역/지역 변수 (0) | 2022.02.09 |
---|---|
Over flow (오버플로우)와 Under flow(언더플로우) (0) | 2022.02.08 |
조건문의 기본 문법 (0) | 2022.02.07 |
C언어 에러 종류 (0) | 2022.02.04 |
컴퓨터의 구조와 CPU동작 원리 (0) | 2022.02.04 |