Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

Trivia

6강.반복문 본문

C언어/C프로그래밍 기초(1학기)

6강.반복문

Vloom 2019. 1. 25. 16:59

6.1 반복의 개념 이해


▶반복문


Q. 반복구조는 왜 필요한가?

A. 같은 처리 과정을 되풀이하는 것이 필요하기 때문

     (ex.학생 30명의 평균 성적을 구하려면 같은 과정을 30번 반복)


▶프로그램의 흐름을 제어하는 방법


순차 구조: 차례대로 실행

선택 구조: 조건을 검사하여 여러 개의 실행 경로 중에서 하나를 선택

반복 구조: 조건이 만족될 때까지 반복


▶반복문의 종류


while: 미리 반복 횟수를 알 수 없는 경우에 사용

for정해진 횟수 만큼 반복하는 경우에 사용


※중간 점검※


Q1. 프로그램에 반복 구조가 필요한 이유는 무엇인가?

A1. 같은 처리 과정을 되풀이하는 것이 필요하기 때문


Q2. 반복문에는 ____________, ____________문이 있다.

A2. while, for


6.2 while


while문: "주어진 조건이 만족되는 동안" 문장들을 반복 실행 (조건제어반복)


while( 조건식 )

{

문장(들);        //반복 문장이 하나면 중괄호 생략 가능

}


ex) 예제 프로그램: while문을 이용한 구구단 출력

//while문을 이용한 구구단 출력 프로그램


#include <stdio.h>


int main()

{

int n;

int i = 1;


printf("구구단 중에서 출력하고 싶은 단을 입력하시오: ");

scanf("%d", &n);


while(i <= 9)

{

printf("%d * %d = %d \n", n, i, n * i);

i++;

}


return 0;

}


구구단 중에서 출력하고 싶은 단을 입력하시오: 3

3 * 1 = 3

3 * 2 = 6

3 * 3 = 9

3 * 4 = 12

3 * 5 = 15

3 * 6 = 18

3 * 7 = 21

3 * 8 = 24

3 * 9 = 27


ex) 예제 프로그램: while문을 이용한 합 계산 예제

//while문을 이용하여 1부터 100까지의 합을 계산하는 프로그램


#include <stdio.h>


int main()

{

int i, sum;

i = 1;

sum = 0;


while(i <= 100)

{

sum += i;

i++;

}


printf("1부터 100까지의 합은 %d입니다.", sum);


return 0;

}


1부터 100까지의 합은 5050입니다.


ex) 예제 프로그램: while문을 이용한 최대 공약수 구하기 (유클리드 알고리즘)

//while 문을 이용하여 두 수의 최대 공약수 구하는 프로그램


#include <stdio.h>


int main()

{

int x, y, r;


printf("두 개의 정수를 입력하시오(큰 수, 작은 수): ");

scanf("%d %d", &x, &y);


while(y != 0)

{

r = x % y;   

x = y;

y = r;

}


printf("최대 공약수는 %d입니다.\n", x);


return 0;

}


두 개의 정수를 입력하시오(큰 수, 작은 수): 7 3

최대 공약수는 1입니다.


두 개의 정수를 입력하시오(큰 수, 작은 수): 12 3

최대 공약수는 3입니다.


※중간 점검※


Q1. if문과 while문을 비교하여 보라. 똑같은 조건이라면 어떻게 동작하는가?

A1. if문은 조건 만족 시 한번만 실행

     while문은 조건 만족 시 여러 번 반복 실행


Q2. while루프를 이용하여 무한 루프를 만들어 보라.

A2. while(1)


Q3. 다음 코드의 출력을 쓰시오.

int n = 10;

while (n > 0)

{

    printf("%d\n", n);

    n = n - 3;

}

A3. 10

       7

4

1


▶sentinel(보초값의 이용): 입력되는 데이터의 끝을 알리는 특수한 값


ex) 예제 프로그램: while문을 이용한 성적의 평균 구하기

//while 문을 이용하여 성적의 평균을 구하는 프로그램


#include <stdio.h>


int main()

{

int grade, n;                //grade: 각 학생의 성적, n: 총 학생 수

float sum, average;     //sum: 모든 성적의 합, average: 성적의 평균


n = 0;            //필요한 변수들 초기화

sum = 0;

grade = 0;


printf("성적 입력을 종료하려면 음수를 입력하세요\n");

printf("----------------------------------------------\n");


while(grade >= 0)        //성적을 입력받아서 합계를 구하고 학생 수를 계산

{

printf("성적을 입력하세요: ");

scanf("%d", &grade);


sum += grade;

n++;

}


sum = sum - grade;     //-1 데이터를 제거 (합계 조정)

n--;                            //마지막 데이터 제거 (개수 조정)

average = sum / n;    //평균 계산


printf("성적의 평균은 %f입니다.\n", average);


return 0;

}


성적 입력을 종료하려면 음수를 입력하세요

----------------------------------------------

성적을 입력하세요: 10

성적을 입력하세요: 20

성적을 입력하세요: 30

성적을 입력하세요: 40

성적을 입력하세요: 50

성적을 입력하세요: -1

성적의 평균은 30.000000입니다.


▶if문과 while문의 비교


if문은 조건이 만족되면 한번만 실행

while문은 조건이 만족되면 여러 번 반복 실행

if문은 while문으로 while문으로 if문으로 변경 가능


▶while문에서 주의할 점


예시1: 변수 증가가 아닌 감소인 경우

int i = 1;


while(i < 10)

{

printf("반복중입니다.\n");

i--;

}


예시2: 반복 루프에 포함되어 있지 않은 경우 (무한루핑)

int i = 0;


while(i < 3)

printf("반복중입니다.\n");

i++;


예시3: 조건 뒤에 ;이 있는 경우

int i = 0;


while(i < 3);

{

printf("반복중입니다.\n");

i++;

}


6.3 do-while


▶do...while문: 일단 문장을 실행한 후에 조건을 검사하여 반복 여부를 결정


do

문장;

while ( 조건식 );


ex) 예제 프로그램: do...while문을 이용하여 메뉴 만들기

//do...while문을 이용한 메뉴


#include <stdio.h>


int main()

{

int n = 0;


do

{

printf("하나를 선택하세요.\n");

printf("1.파일 새로만들기\n");

printf("2.파일 열기\n");

scanf("%d", &n);

} while(n < 1 || n >2);


printf("선택된 메뉴 = %d\n", n);


return 0;

}


하나를 선택하세요.

1. 파일 새로만들기

2.파일 열기

1

선택된 메뉴 = 1


ex) 예제 프로그램: do...while문을 이용한 숫자 게임 예제

//do...while문을 이용한 숫자 게임


#include <stdio.h>


int main()

{

int answer = 39;    //정답

int guess;

int tries = 0;         //시도 횟


do

{

printf("정답을 추측해보세요(정수): ");

scanf("%d", &guess);


tries++;


if(guess > answer)        //사용자가 입력한 정수가 정답보다 높을 시

printf("제시한 정수가 정답보다 높습니다.\n");

if(guess < answer)        //사용자가 입력한 정수가 정답보다 낮을 시

printf("제시한 정수가 정답보다 낮습니다.\n");

} while(guess != answer);


printf("정답입니다.\n시도횟수 = %d\n", tries);


return 0;

}


정답을 추측해보세요(정수): 10

제시한 정수가 정답보다 낮습니다.

정답을 추측해보세요(정수): 30

제시한 정수가 정답보다 낮습니다.

정답을 추측해보세요(정수): 40

제시한 정수가 정답보다 높습니다.

정답을 추측해보세요(정수): 39

정답입니다.

시도횟수 = 4


※중간 점검※


Q. 다음 코드의 출력을 쓰시오.

     int n = 0;

     do

     {

     printf("%d\n", n);

     n = n + 3;

     } while(n < 10);


A. 0

    3

    6

    9


6.4 for


▶for 루프: 정해진 횟수만큼 반복하는 구조 (횟수 제어 반복)


▶for문의 구조


for( 초기식; 조건식; 증감식 )

문장들;


int i;


for(i = 0; i < 10; i++)

printf("Hello World!\n");


ex) 예제 프로그램: for문을 이용한 정수의 합 구하기

//for문을 이용하여 정수의 합을 구하는 프로그램


#include <stdio.h>


int main()

{

int i, sum=0;


for(i = 0; i < 10; i++)

sum += i;            //sum = sum + i;


printf("1부터 10까지의 정수의 합은 %d입니다.\n", sum);


return 0;

}


1부터 10까지의 정수의 합은 55


ex) 예제 프로그램: for문을 이용한 네모 그리기

//for문을 이용한 네모 그리기


#include <stdio.h>


int main()

{

int i;


printf("********\n");


for(i = 0; i < 5; i++)

printf("*           *\n");


printf("********\n");


return 0;

}


********

*           *

*           *

*           *

*           *

*           *

********


ex) 예제 프로그램: for문을 이용한 팩토리얼 구하기

//for문을 이용하여 팩토리얼 구하는 프로그램


#include <stdio.h>


int main()

{

int i, n, fact=1;


printf("정수를 입력하세요: ");

scanf("%d", &n);


for(i = 0; i <=n; i++)

fact = fact * i;


printf("%d!은 %d입니다.\n", n, fact);


return 0;

}


정수를 입력하세요: 5

5!은 120입니다.


▶다양한 증감수식의 형태


뺄셈을 사용하는 형태

for(i = 10; i > 0; i--)

printf("Hello World!\n");


2씩 증가하는 형태

for(i = 0; i < 10; i += 2)

printf("Hello World!\n");


2를 곱하는 형태

for(i = 1; i < 10; i *= 2)

printf("Hello World!\n");


어떤 수식이라도 가능

for(i = 0; i < 100; i = (i * i) + 2)

printf("Hello World!\n");


한부분이 없을 수도 있음

for( ; i < 100; i++)

printf("Hello World!\n");


2개 이상의 변수 초기화

for(i = 0, k = 0; i < 100; i++)

printf("Hello World!\n");


어떤 수식도 가능2

for(printf("반복시작"), i = 0; i < 100; i++)

printf("Hello World!\n");


※중간 점검※


Q1. 다음 코드의 출력을 쓰시오.

 for(i = 1; i < 5; i++)

     printf("%d ", 2 * i);


A1. 2 4 6 8


Q2. 다음 코드의 출력을 쓰시오.

 for(i = 10; i > 0; i = i - 2)

     printf("Student%d\n", i);


A2. Student10

      Student8

      Student6

      Student4

      Student2


▶중첩 반복문: 반복문 안에 다른 반복문이 위치


ex) 예제 프로그램: 중첩 for문을 이용하여 *기호를 사각형 모양으로 출력하기

//중첩 for문을 이용하여 사각형 모양 출력하는 프로그램


#include <stdio.h>


int main()

{

int x, y;


for(y = 0; y < 3; y++)

{

for(x = 0; x < 8; x++)

printf("*");

printf("\n");

}


return 0;

}


********

********
********

********


ex) 예제 프로그램: 중첩 for문을 이용하여 *기호를 직각삼각형 모양으로 출력하기

//중첩 for문을 이용하여 사각형 모양 출력하는 프로그램


#include <stdio.h>


int main()

{

int x, y;


for(y = 1; y <= 5; y++)

{

for(x = 0; x < y; x++)

printf("*");

printf("\n");

}


return 0;

}


*

**

***

****

*****


※중간 점검※


Q. 다음 코드의 출력을 쓰시오.

     for(i = 1; i < 6; i++)

         for(j = 5; j >= 1; j--)

             printf("%d * %d는 %d\n", i, j, i*j);


A. 1 * 5 = 5

    1 * 4 = 4

    1 * 3 = 3

    1 * 2 = 2

    1 * 1 = 1

    2 * 5 = 10

    2 * 4 = 8

    ...

    5 * 3 = 15

    5 * 2 = 10

    5 * 1 = 5


6.5 Break와 continue문


▶break문: 반복 루프를 빠져 나오는데 사용


int i;


for(i = 1; i < 100; i++)

{

printf("%d\n", i);


if(i == 5)         

break;        //i가 5가 되면 반복 루프를 빠져나옴

}


return 0;        //1~5까지만 출력되고 프로그램 종료


ex) 예제 프로그램: break문을 이용한 무한루프 탈출 예제

//break문을 이용하여 무한루프를 탈출하는 예제


#include <stdio.h>


int main()

{

double grade, sum = 0.0, average;        //성적,  성적의 합, 평균

int n = 0;        //학생 수 


while(1)        //무한루프

{

printf("성적을 입력하세요: ");

scanf("%lf", &grade);


if(grade < 0.0)        //성적이 음수일 시 무한루프 탈출

break;

 

n++;

sum += grade;

}


average = sum / n;

printf("학생들의 성적의 평균은 %lf입니다.\n", average);


return 0;

}


학생 성적을 입력하세요: 95

학생 성적을 입력하세요: 80

학생 성적을 입력하세요: 75

학생 성적을 입력하세요: 70

학생 성적을 입력하세요: -1

학생들의 성적의 평균은 80.000000입니다.


▶중첩 반복의 경우에는 goto로 탈출


▶continue문: 현재의 반복을 중단하고 다음 반복을 시작하게 함


while(i < 10)

{

if(i % 2 == 1)

{

i++;

continue;

}


i++;

}


ex) 예제 프로그램: continue문을 이용하여 대문자 변환하기

//continue문을 이용하여 소문자를 대문자로 변환하는 프로그램


#include <stdio.h>


int main()

{

char letter;


while(1)

{

printf("소문자를 입력하세요: ");

scanf("%c", &letter);


if(letter >= 'A' || letter <= 'Z')      //입력한 값이 대문자일 시 무한 루프 탈출

break;

if(letter < 'a' || letter > 'z')        //입력한 값이 소문자 이외에 문자일 시 다음 반복 시작

continue;


letter -= 32;


printf("변환된 대문자는 %c입니다.\n", letter);

}


return 0;

}


소문자를 입력하세요: j

변환된 대문자는 J입니다.

소문자를 입력하세요: K


소문자를 입력하세요: s

변환된 대문자는 S입니다.

소문자를 입력하세요: G


※중간 점검※


Q1. ________문이 반복문에서 실행되면 현재의 반복을 중단하고 다음번 반복 처리가 시작된다.

A1. continue


Q2. ________문이 반복문에서 실행되면 반복문을 빠져 나온다.

A2. break


Q3. 다음 코드의 출력을 쓰시오.

int i;

for(i = 1; i < 10; i++)

{

    if(i % 3 == 0)

        break;

    printf("%d\n", i);

}


A3. 1

      2 


'C언어 > C프로그래밍 기초(1학기)' 카테고리의 다른 글

7강.배열  (0) 2019.01.29
5강.조건문  (0) 2019.01.23
4강.수식과 연산자  (0) 2019.01.15
3강.변수와 자료형  (0) 2019.01.14
2강.C언어 기초(2)  (0) 2019.01.14