티스토리 뷰
7-1 반복문이란?
"Hello World!" 메시지를 열 번 출력하고 싶다. 이럴 때 printf를 열 번 사용하면 된다. 하지만 이것은 효율적이지 못하다.
따라서 printf로 "Hello World!"를 한 번 사용하고, 열 번 반복해달라고 하는 방법이 있을 것이다.
이러한 형태의 명령을 내리기 위해서 사용하는 것이 반복문 혹은 루프(loop)문이다.
C언어는 세 가지 형태의 반복문을 지니고 있다.
while문 , do~while문 , for문 이 그 세가지이다.
7-2 while문에 의한 문장의 반복
while문은 반복을 위한 문장이다.
while문의 기본원리는 특정 조건을 주고 그 조건이 만족될 때까지 계속해서 반복을 시키는 것이다.
#include<stdio.h>
int main(void)
{
int i=0;
while(i<10)
{
printf("Hello World! \n");
i++;
}
}
위의 예제를 실행해보면 "Hello World!"가 열 번이 출력되는 것을 확인할 수 있다.
연두색 글배경색이 있는 곳이 '반복의 조건'을 나타내고,
하늘색 글배경색이 있는 곳이 '반복 내용'을 나타낸다.
즉, i<10을 만족할때까지는 중괄호 안에 있는 내용을 반복하라는 의미인 것이다.
처음에 i=0이었고, i++에 의해 1씩 증가가 되어서 10이 되는 순간에 루프를 빠져나오게 됨으로써
i가 0부터 9까지, 즉 10번 반복 실행이 일어나게 되는 것이다.
이래도 잘 모르겠다면... 다시 읽어보면서 돌려보시길.^^;;
만약에 while문 안에 i++라는 문장이 없다면 계속해서 반복 루프를 실행하게 될 텐데,
이를 '무한 루프에 빠졌다'라고 표현하다.
이러한 무한 루프에 빠지지 않기 위해서 반복의 조건이 어느 시점에 무너질 수 있도록 반복문을 적절히 구성해야 한다.
들여쓰기 - 코드의 가독성을 높이기 위해서, 좌측 여백으로부터 어느 정도 건너 띄어 쓰는 것을 말함
들여쓰기는 선택이 아니라 필수이다.
코드가 복잡해지면 질수록 가독성이 큰 문제가 되는데 이를 막기 위해 적절한 들여쓰기가 필요하다.
while문의 중괄호는 둘 이상의 문장을 묶기 위해 사용된다.
반복하고자 하는 문장이 하나인 경우에는 중괄호를 써도 그만, 안 써도 그만이다.
while(i<10)
printf("Hello World! \n"),i++;
예를 들어 이렇게 표현할 수 있는데, 코드의 라인 수는 줄었지만 가독성이 상대적으로 떨어지므로 적절한 경우가 아니면
줄여쓰는 것도 하지 않는 것이 좋다.
while문의 이해와 무한 루프
while(1)
{
printf("Hello World! \n");
i++;
}
만일 반복의 조건자리에 1을 넣으면 어떻게 될까?
컴퓨터에서 0이 아닌 수는 모두 true로 인식하기 때문에 무한 루프에 빠지게 될 것이다.
확인해보도록.
순서도(flow chart) - 시간적 흐름의 관점에서 프로그램의 구성을 디자인할 때 사용하는 약속된 기호
연습문제 7-1
문제 1
문제 2
문제 3
!= 을 사용하는 것이 포인트!
sum 초기값을 0으로 지정해 주는 것도 포인트!
val의 초기값을 0이 아닌 걸로 지정해주는 것도 포인트!
문제 4
문제 5
여러번 실수 끝에 성공...ㅠ
마지막에 sum 값을 float형으로 명시적 형 변환을 해주는 것을 잊지말자. 만일 이를 해주지 않으면 정수/정수가 되어 나눗셈의
결과도 정수가 되어 소수 부분이 잘려나가게 된다.
sum에 초기값을 주어야 한다.
i++를 잊지 말자.
while문의 중첩
#include<stdio.h>
int main(void)
{
int i=2;
int j=0;
while(i<10)
{
j=1;
while(j<10)
{
printf("%d*%d=%d \n",i,j,i*j);
j++;
}
i++;
}
return 0;
}
위의 예시는 구구단을 2단부터 9단까지 순서대로 출력하는 프로그램이다.
while문의 중첩을 사용함으로써 상당히 짧게 구현하였다.
연습문제 7-2
문제 1
아이디어 접근까진 비슷하였으나, 루프에 num=0을 추가하는 것을 생각하지 못해 엄청나게 헤맸다.^^;;;;;
아직 부족한 부분이 많구나.
문제 2
1번을 풀자마자 상승기세를 이용해서 풀어서 그런지. 생각보다 쉽게 해결할 수 있었다.
아이디어가 문제.
7-3 do~while문에 의한 문장의 반복
보통은 do~while문보다 while문을 많이 사용한다.
do~while문의 처리는 while문로도 가능하고, while문의 처리는 do~while문으로도 가능하다.
while문과 do~while문의 차이점
while문은 반복의 조건 검사를 앞에서 하지만, do~while문은 반복의 조건 검사를 뒤에서 한다.
따라서, while문은 조건이 만족되지 않으면 루프를 한번도 실행하지 않게 되지만, do~while문은 반드시 한번은 루프를 실행하게 되어 있다.
do{
반복 내용
}while(반복의 조건); //일단 루프를 한번 실행 후, "반복의 조건"이 만족되는 동안 "반복 내용"을 반복 실행하라
형태로 만들어진다.
#include<stdio.h>
int main(void){
int total=0;
int val=0;
do{
printf("숫자 입력 (0 to quit): ");
scanf("%d", &val);
total+=val;
}while(val!=0);
printf("Total : %d \n", total);
return 0;
}
위의 코드는 사용자가 입력하는 수를 계속 더하다가 0을 입력받으면 종료되는 프로그램이다.
이 프로그램은 사용자로부터 숫자를 입력받고 난 다음에야 비로소 계속 진행을 할 것인지 말 것인지를 결정하게 된다. 따라서 루프를 최소한 한번은 실행해야 한다. 이러한 경우에는 do~while문을 사용하는 것이 while문을 사용하는 것보다 자연스럽다.
연습문제 7-3
문제 1
방법 1
방법 2
문제 2
문제 3
7-2 for문에 의한 문장의 반복
while, do~while문은 기본적으로 반복 조건 검사 문장만을 포함하지만, for문은 이것 외에도 변수의 초기화 연산과 증가 및 감소를 실행할 수 있는 두 개의 문장을 더 포함한다. 그래서 "for문은 초기문, 조건문, 증감문 이렇게 총 3개의 문장을 기본적으로 포함하고 있다."라고 표현한다.
초기문이란? while문과 같은 반복문에 들어가기 전에 필요로 하는 초기화 문장을 의미
증감문이란? 루프를 빠져 나오기 위해서 반복의 조건을 무너뜨리기 위한 문장을 의미
for(초기문 ; 조건문 ; 증감문){
반복하고자 하는 내용
}
형태로 만들어진다.
int i;
for(i=0 ; i<10 ; i++){
printf("Hello World \n");
}
위의 코드는 "Hello World"를 10번 출력하는 코드이다.
i의 초기값이 0일때 한번, 1일때 한번, ,,, ,9일때 한번 돌고 10이 되면 조건을 만족하지 못해 빠져나오게 되어
0~9까지 10번 출력하게 된다.
(직접 돌려보면 이해가 더 쉬울 것!^^)
for문은 필요에 따라
for( ; input<=0.0 ; ){
}
for( ; ; ; ){
}
자리를 비우고 사용할 수 있는데,
첫번째의 경우 반복의 조건에 관련된 문장이 필요없을 때, 조건만을 따지려고 할 때 사용하고,
두번째의 경우는 조건문을 비워 무한루프를 돌리고자 할 때 사용한다.
(자리가 비었다고 오류가 나는 것이 아니니 꼭 알고 있을 것!)
연습문제 7-4
문제 1
if문을 사용하면 첫 번째 수가 반드시 크지 않더라도 구현이 가능할 것이다. 하지만 조금 귀찮다^^;;;
문제 2
팩토리얼을 구현하는데 상당한 실수가 많았다. 무한루프를 구현함에 있어서는 별 문제가 없었지만, 한번 연산 후에 total을 0으로 다시 놓는다거나
i의 형을 지정을 안해준다던가 하는 사소한 실수들을 많이 하다가 성공했다. 자주 안하니까 실수가 많다;;
이번 장에서 공부한 내용 정리
1. while문, do~while문, for문에 대해서 살펴보았다.
2. 세 가지 형태의 반복문이 중첩될 수 있음을 살펴보았다. 이 책에서는 중첩되는 반복문의 종류를 동일하게 하였지만, 서로 다른 반복문이 중첩될 수도 있다. 즉 for문이 while문을 중첩시킨다거나, do~while문이 for문을 중첩시킨다거나 하는 것도 가능하다.
'Programming > C' 카테고리의 다른 글
[C언어] 열형강의 C 프로그래밍 [6장 - printf와 scanf 함수에 대한 고찰] (0) | 2020.06.09 |
---|---|
[C언어] 열형강의 C 프로그래밍 [5장 - 상수와 기본 자료형] (0) | 2020.06.09 |
[C언어] 열형강의 C 프로그래밍 [4장 - 데이터 표현 방식의 이해] (0) | 2020.06.09 |
[C언어] 열형강의 C 프로그래밍 [3장 - 변수와 연산자] (0) | 2020.06.09 |
[C언어] 열형강의 C 프로그래밍 [2장 - 프로그램의 기본 구성] (0) | 2020.06.09 |
- Total
- Today
- Yesterday
- 자료구조
- 특징
- 파일 스토리지
- 문자체크
- 블록 스토리지
- Kubernetes
- 코딩
- Framework
- Java
- anyframe
- Spring
- 도커
- 정규식
- C
- 쿠버네티스
- 오브젝트 스토리지
- docker
- 전자정부프레임워크
- object storage
- 자바
- 개념
- OSI7layer
- 열혈강의 프로그래밍
- RDB
- block storage
- 숫자체크
- file storage
- C언어
- M2E
- 열혈강의
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |