C

C기초 플러스 chap.6 C의 제어문: 루프

Barbarian developer 2024. 8. 9.

6장에서는 다음과 같은 사항을 배운다!

  • 키워드 : for, while, do while(C의 세 가지 루프 구조)
  • 함수 : fabs()
  • 연산자 : <, >, >=, <=, !=, ==, +=, *=, -=, /=, %=
  • 관계 연산자를 사용하여 루프 제어 표현식 만들기
  • 그 밖의 연산자 
  • 루프와 함께 사용한는 배열
  • 리턴값이 있는 함수 만들기

저번 시간에 간단하게 while에 대해 배웠다!

오늘은 심화과정이다! 간다아아아아아아아!!

나라라 바바리아아아아아안!!}


C의 세가지 루프구조

  • while : 반복횟수가 정해져 있지 않는 반복을 할 때 주로 쓰임.
  • for : 반복횟수가 정해져 있는 반복을 할때 주로 쓰임.
  • do while : 반복문에 들어가기 전에 먼저 내용을 한번 실행한 뒤 쓰임.

while반복문

while이란?

  • while 반복문에 대해 알아보겠습니다.
  • while 반복문은 괄호 안에 조건식만 들어가고, 초기식은 반복문 바깥에 있습니다. 그리고 중괄호 안에 반복할 코드와 변화식이 함께 들어갑니다.
초기식
while (조건식) // ← 루프 선언문(loop statement)
{
    반복할 코드
    변화식
}
// ↑ 루프 본체(loop body) 및 변화식
  • 다음은 while 반복문의 실행 과정입니다. 먼저 초기식부터 시작하여 조건식을 판별합니다. 여기서 조건식이 참이면 반복할 코드와 변화식을 함께 수행합니다. 그리고 다시 조건식을 판별하여 참이면 코드를 계속 반복하고, 거짓이면 반복문을 끝낸 뒤 다음 코드를 실행합니다.

while 반복문의 동작 과정 

  • 여기서는 조건식 → 루프 본체 및 변화식 → 조건식으로 순환하는 부분이 루프(loop)입니다.
  • 먼저 반복문에 사용할 변수 i를 선언한 뒤 0으로 초기화 합니다. 그리고 while에는 조건식만 지정하면 됩니다. 여기서 while 반복문은 반드시 { } (중괄호) 안에 변화식을 지정해야 합니다. 만약 조건식만 지정하고 중괄호 안에서 변화식을 생략하면 반복이 끝나지 않고 계속 실행(무한 루프)되므로 주의해야 합니다.

 while 반복문의 기본 형태

  • i < 100과 같이 조건식을 지정하여 i가 100 미만일 때만 반복하고, i가 100이 되면 반복을 끝내도록 만들었습니다. 그리고 중괄호 안에서는 반복할 코드를 작성한 뒤 i++로 i를 1씩 증가시켰으므로 i가 0부터 99까지 증가하면서 100번 반복하게 됩니다.

scanf()를 이용한 반복문 활용하기.

//6_1
// summing.c -대화식으로 입력한 정수들의 합을 구한다.
#include<stdio.h>
int main(void)
{
long num;
long sum = 0L; //sum을 0으로 초기화한다.
int status;

printf("합을 구할 정수를 하나 입력하시오");
printf("(끝내려면 q)");
status = scanf("%ld", &num);
while(status==1) //조건 검사 
{
sum = sum +num;
printf("다음 정수를 입력하시오(끝내려면 q):");
status = scanf("%ld", &num);

}
printf("입력된 정수들의 합은 %ld입니다.\n",sum);

return 0;
}
  • 먼저 반복문에 들어가기에 앞서, long sum에 쓰레기 값을 빼내게 위해 0으로 초기화한다.
  • 그 뒤에 while을 시작하는 조건 검사부터 봐라! status의 값이 1이라면, while은 계속해서 값을 입력 받는 것을 반복한다.
  • status변수에 scanf()를 저장하면, scanf에 입력되는 정수는 하나이기 때문에 status의 리턴값은 1이다.
  • while이 반복될때 마다 sum은 sum+num의 값을 저장한다.

루프 탈출하기.

//when.c -- 루프는 언제 끝나는가
#include<stdio.h>
int main(void)
{
int n =5;
while (n<7) 조건검사
{
printf("n=%d\n", n);
n++;
printf("이제 n= %d\n",n);
}
printf("루프끝났다.\n");
 
return 0;
}
  • while의 조건검사에서 거짓이 될때까지 반복되면 루프에서 탈출한다.
  • 이 전의 예제 같이 scanf()함수를 이용할 때는 입력값을 조건검사에서 거짓이 되도록 입력하면 루프에서 탈출한다.

while문의 유의점(1)

//while1.c --중괄호를 빼먹지마라.
//무한루프 주의
#include<stdio.h>
int main(void)
{
int n = 0;
 
while(n<3)
printf("n은 %d\n", n);
n++;
printf("프로그램이 한 일은 이게 전부다.\n");

return 0;
 
}
 
  • while조건문에 중괄호를 빼면 무한루프에 걸리게 된다.

 


while문의 유의점(2)

//while2.c --세미콜론에 주의하라.
#include<stdio.h>
int main(void)
{
int n = 0;
 
while(n++<3);
printf("n은 %d\n", n);
printf("프로그램이 한 일은 이게 전부다.\n");

return 0;
 
}
 
  • while문을 쓸 때는 조건 검사문에 세미콜론(;)을 찍지 않는다.

while문에서의 참과 거짓

//truth.c--어떤 값들이 참인가?
#include<stdio.h>
int main(void)
{
int n=3;

while(n)
printf("%2d: 참\n", n--);
printf("%2d: 거짓\n",n);

n=-3;
while(n)
printf("%2d: 참\n",n++);
printf("%2d: 거짓\n",n);

return 0;
}
  • 첫번째 루프는 3,2,1일 때 실행되고 n이 0일 때, 끝난다. 
  • 두번째 루프 역시 -3,-2,-1일 때 실행되고 n이 0일 때, 끝난다.
  • 0이 아닌 모든 값은 '참'으로 인식되고, 오직 0만 '거짓'으로 인식된다.

while문에서의 카운팅 루프

//sweetie1.c —카운팅 루프
#include<stdio.h>
int main(void)
{
const int NUMBER = 22;
int count =1; //초기화

while (count <= NUMBER) //검사
{
printf("달콤한 나의 발렌타인!\n"); //실행
count++; //카운터 갱신.

}

return 0;
}
  • 미리 확정된 반복 횟수만큼 루프를 실행시키는 카운팅 루프
  • 1. 카운터 초기화 2. 카운터를 정해진 어떤 값과 비교한다. 3. 루프를 실행할 때 마다 카운터를 갱신한다.
  • 현재 예제는 카운터의 초기화가 반복문 밖에서 이루어 진다.

for 반복문

for반복문이란?

C 언어의 for 반복문은 다음과 같이 괄호 안에 초기식, 조건식, 변화식을 지정하며 이 부분을 루프 선언문(loop statement)이라고 부릅니다. 그리고 중괄호 안에 반복할 코드를 작성하는데 이 부분을 루프 본체(loop body)라고 부릅니다

for (초기식; 조건식; 변화식) // ← 루프 선언문(loop statement)
{
    반복할 코드
}
// ↑ 루프 본체(loop body)

다음은 for 반복문의 실행 과정입니다. 먼저 초기식부터 시작하여 조건식을 판별하는데 여기서 조건식이 참이면 반복할 코드(루프 본체)를 실행하고, 변화식을 수행합니다. 그리고 다시 조건식을 판별하여 참이면 코드를 계속 반복하고, 거짓이면 반복문을 끝낸 뒤 다음 코드를 실행합니다.


 for 반복문의 동작 과정

  • 초기식: 반복문을 시작할 때 초기식입니다. 보통 정수형 변수를 선언한 뒤 0을 할당합니다(이 변수를 루프 인덱스라고도 부르며 index의 첫 머리글자를 따서 i를 주로 사용합니다). 반복에 사용할 변수는 초기식 부분에서 선언해도 되고, for 반복문 바깥에서 선언해도 됩니다.
  • 조건식: 반복될 조건입니다. 조건식이 참이면 계속 반복하며, 거짓이 되면 반복문을 끝냅니다.
  • 변화식: 반복문이 한 번 실행될 때마다 수행할 식입니다. 보통 증가 연산자 ++를 사용하여 변수의 값을 1씩 증가시킵니다.

for문을 이용한 카운팅 루프

//sweetie2.c —for를 사용하는 카운팅 루프
#include<stdio.h>
int main(void)
{
const int NUMBER = 22; //NUMBER에 22를 상수화
int count; //count에 인트 데이터형 선언.

for (count =1; count<= NUMBER; count++) //count =1은 반복 전 초기화. 처음 한번만 씀. 두번째는 검사조건. 세번째는 표현식 변경 또는 갱신, 루프의 끝에서 갱신
printf("달콤한 나의 발렌타인!\n"); //세개의 표현식은 각각 완전 표현식임.

return 0;
}
  • 각각의 초기식과 조건식, 변화식은 완전 표현식이다.
  • count를 반복전에 초기화하여 쓰레기 값을 덜어내고, 두번째는 조건식을 적고, 세번째는 표현식 갱신을 진행한다.

for문을 이용한 중첩 루프

//rows1.c —중첩 루프를 사용한다.
#include<stdio.h>
#define ROWS 6
#define CHARS 10

int main(void)
{
int row;
char ch;

for (row =0; row < ROWS; row=row+1) //외부루프
{
for(ch='A'; ch<('A' + CHARS); ch=ch+1) //내부루프
printf("%c", ch);
printf("\n");
}

return 0;
}
  • 중첩 for문은 외부루프와 다른 내부루프가 존재한다.
  • 외부 루프는 0값을 가지는 row로 부터 시작해서 row가 6에 도달했을 때 끝난다. 그러므로, 외부 루프는 0에서 5까지 변하는 row를 가지고 6사이클을 돈다. 각 사이클에서의 첫 문장이 내부 for 루프다.
  • 이 루프는 10사이클을 돌면서 문자 A에서 J까지 같은 라인에 출력한다.
  • 외부 루프의 두번째 문장에 printf("\n")을 하게 되면 다음 문장을 반복 할 때, 새 라인에서 시작하게 한다.

함수의 리턴값을 사용하는 루프변형 중첩루프

#include<stdio.h>

int main(void)
{
const int ROWS = 6;
const int CHARS = 6;

int row;
char ch;

for(row=0;row<ROWS;row=row+1) //외부루프
{
for(ch=('A'+row); ch<('A'+CHARS); ch=ch+1) //내부루프
printf("%c", ch);
printf("\n");
}
return 0;
}
  • 외부 루프의 각 사이클이 실행 될 때마다 row가 'A'에 더해지기 때문에 각각의 행에서 ch는 다음 알파벳 문자로 초기화 됨.
  • 그러나 검사 조건은 변경되지 않으므로, 각 행은 여전히 F에서 끝남.
  • 결과적으로, 각 행마다 출력되는 문자가 하나씩 줄어들게 만든다.

배열에 for루프 사용하기

//scores_in.c —배열 처리에 루프를 사용한다.
#include<stdio.h>
#define SIZE 10
#define PAR 72
int main(void)
{
int index, score[SIZE];
int sum = 0;
float average;

printf("%d개의 골프 스코어를 입력하시오:\n", SIZE);
for (index=0; index<SIZE; index=index+1)
scanf("%d", &score[index]); //10개의 골프 스코어를 읽는다.
printf("읽은 스코어들은 다음과 같다:\n");
for (index = 0; index < SIZE; index=index+1)
printf("%5d", score[index]); //입력을 검증한다.
printf("\n");
for(index = 0; index<SIZE; index=index+1)
sum=sum+score[index]; // 모두 더한다.
average=(float) sum/SIZE; //평균을 구한다.
printf("스코어의 합 = %d, 평균=%.2f\n", sum, average);
printf("핸디캡이 %.0f이다.\n", average -PAR);
 
return 0;
}
  • 앞의 실행에서 10개의 골프 스코어를 입력하라 했지만 더 많은 수를 입력해도 10개 까지 나온다.
  • scanf()는 화이트스페이스를 건너뛰기 때문에 10개의 수를 한 라인에 모두 입력할 수도 있고, 각의 수를 한 라인씩 입력할 수 도 있다.

Do while

Do while이란?

while 반복문은 조건식이 만족하지 않으면 반복을 하지 않고 넘어갑니다. 이번에는 코드를 최소 한 번은 실행하는 do while을 알아보겠습니다.

do while 반복문은 초기식이 반복문 바깥에 있습니다. 그리고 do로 시작하여 중괄호 안에 반복할 코드와 변화식이 함께 들어가며 중괄호가 끝나는 부분에 조건식을 지정해줍니다.

초기식
do // ↓ 루프 본체(loop body) 및 변화식
{
    반복할 코드
    변화식
} while (조건식);
//   ↑ 루프 선언문(loop statement)

다음은 do while반복문의 실행 과정입니다. 먼저 초기식의 값과는 상관 없이 do { } 부분의 코드와 변화식을 무조건 실행합니다. 그다음 조건식을 판별하여 참이면 코드를 계속 반복하고 거짓이면 반복문을 끝낸 뒤 다음 코드를 실행합니다.

do while 반복문의 동작 과정

여기서는 루프 본체 및 변화식 → 조건식으로 순환하는 부분이 루프(loop)입니다.


Do while 반복문 사용하기

먼저 반복문에 사용할 변수를 선언한 뒤 0으로 초기화합니다. 그리고 do 아래에 중괄호를 열고 반복할 코드와 변화식을 넣습니다. 마지막으로 중괄호를 닫은 뒤 while에 조건식을 지정하고 세미콜론을 붙여주면 됩니다.▼ 그림 29‑2 do while 반복문의 기본 형태

do 다음에 오는 코드는 조건식과 상관없이 무조건 한 번은 실행됩니다. 따라서 printf가 한 번 실행되고, i++도 실행되어 i가 1 증가합니다. 이 상태로 조건식에서 i가 100보다 작은지 검사하게 됩니다. 아직은 i가 100보다 작으므로 계속 반복하다가 i가 100이 되면 i < 100은 거짓이 되므로 반복을 끝냅니다.

do while 반복문도 반드시 { } (중괄호) 안에 변화식을 지정해야 합니다. 만약 조건식만 지정하고 중괄호 안에서 변화식을 생략하면 반복이 끝나지 않고 계속 실행(무한 루프)되므로 주의해야 합니다.

do while while로만 표현하면 다음과 같습니다.

while.c

#include <stdio.h>

int main()
{
    int i = 0;

    // do에 해당하는 부분
    printf("Hello, world! %d\n", i);    // 처음 한 번은 실행
    i++;                                // 처음 한 번은 실행

    while (i < 100)    // i가 100보다 작을 때 반복. 0부터 99까지 증가하면서 100번 반복
    {
        printf("Hello, world! %d\n", i);    // Hello, world!와 i의 값을 함께 출력
        i++;                                // i를 1씩 증가시킴
    }

    return 0;
}

실행 결과

Hello, world! 0
Hello, world! 1
... (생략)
Hello, world! 97
Hello, world! 98
Hello, world! 99

while 반복문을 실행하기 전에 printf로 문자열을 출력하고 i++ i를 1 증가시켰습니다. 이 부분은 do while에서 처음 한 번은 조건문과 상관없이 실행되는 점과 같습니다. 이처럼 do while은 처음 한 번은 실행해야 하며 그 이후에는 조건에 따라 반복해야 하는 코드를 간단하게 표현할 수 있습니다.

실전 예제

함수의 리턴값을 사용하는 루프

//power.c --어떤 수의 정수 멱승을 구한다.
#include<stdio.h>

double power(double n, int p); //ANSI프로토타입
int main(void)
{
double x, xpow;
int exp;

printf("어떤 수와, 원하는 양의 정수 거듭제곱수를");
printf(" 입력하시오.\n끝내려면 q를");
printf(" 입력하시오.\n");
while (scanf("%lf%d",&x,&exp) ==2)
{
xpow=power(x,exp); //함수호출
printf("%.3g%d승은 %.5g입니다.\n",x, exp, xpow);
printf("두 수를 입력하시오. 끝내려면 q를 입력하시오.\n");
}
 
printf("거듭제곱 구하기가 재미 있었나요? -- 안녕!\n");

return 0;
}
 
double power(double n, int p) //함수 정의
{
double pow =1;
int i;

for(i=1; i<=p; i=i+1)
pow = pow * n;

return pow; //pow의 값을 리턴한다.
}
  • 본문 아래에 for문을 이용한 함수를 정의 한 후, 함수에서 원하는 변수를 리턴한다.
  • 그 후 본문의 시작을 알리는 int main(void)위에 함수를 선언한다.
  • 반복횟수를 정해놓고 하지 않는 while문에 for문을 이용한 함수를 대입하여 출력한다.

댓글