햄깅이의 C언어

[햄깅이의 C언어] Chapter 7 / 반복

chohaeminn 2024. 7. 19. 01:42

본 포스팅은 Perfect C, C언어로 배우는 프로그래밍 기초 책을 기반으로 공부한 자료입니다.
다른 포스팅을 참고한 자료는 모두 출처를 남겨놓았습니다

6.1 반복 개요

 

반복의 개념과 구문 종류

 

우리의 주위에는 생각보다 반복되는 현상이나 작업이 많다.

반복은 말 그대로 같거나 비슷한 일을 여러 번 수행하는 작업이다.
C언어는 while, do while, for 세 가지 종류의 반복구문을 제공하며
반복 조건을 만족하면 일정하게 반복되는 블록을 반복몸체라고 한다. 

while문

 

반복문 while은 반복 구문을 실행하기 전에 조건을 검사하는 반복문으로, 조건식이 반복몸체 앞에 위치한다.


do while문

제일 나중에 반복 조건을 검사하여 반복을 수행하는 do while 구문은 while 구문과는 반대로
조건식이 반복몸체 뒤에 위치한다.
따라서 무조건 한번 실행한 후, 조건을 검사하고 이후 조건식이 참이면 반복을 다시 실행한다.


for문

 

반복문 for 구문은 초기화와 반복조건, 그리고 증감연산의 세 부분으로 나누어 일정한 횟수의 반복에 적합한 반복구문이다. for 구문은 명시적으로 반복횟수를 정해놓은 반복에 주로 사용한다.


반복구문의 필요성

 

 C프로그래밍을 하면서 단순한 문장의 반복을 코딩한 경험이 있을 것이다.

즉 동일하거나 또는 약간 다른 출력을 위해 함수 printf() 호출을 여러 번 반복하는 작업을 하면서 다른 대안이 있을 것이라고 생각했을 것이다.

 

연산자에서 배운 섭씨 온도와 화씨 온도의 관계인 다음 식을 활용하여, 여러 섭씨 온도에 해당하는 화씨온도를 다음과 같이 출력해보자. 다음 소스와 같이 함수 printf()를 3번 반복 호출하면서, 섭씨온도는 12.46도에서 10씩 2번 증가하면 각각의 화씨 온도를 출력할 수 있을 것이다. 이러한 소스도 뭔가 반복을 지원하는 간편한 구문이 있으면 훨씬 손쉽게 해결될 것으로 보인다. 

 

 

다음은 3개의 섭씨 온도를 화씨온도로 변환하는 실습예제이다.


반복이 필요한 다른 예를 알아보자

 

비트 AND 연산자인 &를 이용하면 한 정수의 n번째 비트 값을 알 수 있다.

 

이런원리로??

 

따라서 비트 AND 연산자 &를 사용하면 정수의 32비트 모두를 알 수 있으며,

효율성은 떨어지지만 32번의 printf()출력으로 정수의 내부 비트 값을 표현할 수 있다. 

 

아래는 정수 오른쪽 8개의 비트를 출력하는 예제이다. 

 


while 문장

 

while 문 구조와 제어흐름

while 문은 단순한 숫자의 반복이 아니라 반복할 때마다 조건을 따지는 반복문이다.

 

주의할 것은 조건식이 반복몸체 앞에 있다는 것이다.

즉 단순한 반복이 아니라, 조건식을 만족할 때 반복이 실행된다는 것이다.

위의 그림을 보면 문장 while(cond) stmt;는 반복 조건인 cond를 평가하여 0이 아니면 반복몸체인 stmd를 실행하도 다시 반복 조건 cond를 평가하여 while 문 종료시까지 반복한다.

 

- 이 반복은 cond가 0이 될때까지 수행한다.
- 반복이 실행되는 stmt를 반복몸체라고 부르며, 필요하면 블록으로 구성될 수 있다.
- while문은 for나 do while 반복 구문보다 간단하며, 모든 반복 기능을 수행할 수 있다. 

 

또한 반복횟수를 제어하는 제어변수가 있다. 

 

위의 실행과정을 보면, 처음 반복에서는 count 변수가 1이고 while(1<=3)이 만족하므로, 반복몸체가 실행된다. 

2.3.도 동일하게 가다가 3회의 반복에서 count는 4가 되고 다시 while(<=3)을 실행하는데 조건식이 거직이 되므로 반복몸체는 실행하지 못하고 while문이 종료된다.
그러므로 반복몸체인 printf("C언어 재미있네")문은 3번 실행된다.
그러나 조건식 (counr5=3)은 4번 실행되며, 제어변수 count는 4이다. 

 

다음은 특정문자열을 여러번 반복해 출력하는 예제이다.

 

 

다음은 while 반복으로 표준입력 실수를 모두 더하는 예제이다.

 

다음은 놀이공원에서 키가 130cm 이하인 정원 채우기 예제이다. 

이렇게 완료된다!

 


7.2 do while 문

 

do while 문

 

while문은 반복 전에 반복 조건을 평가한다.

이와 다르게 do while 문은 반복몸체 수행 후에, 반복조건을 검사한다.

그러므로 do while문은 반복조건을 나중에 검사해야하는 반복에 적합하다.

특히 반복횟수가 정해지지 않고 입력받은 자료 값에 따라 반복 수행의 여부를 결정하는 구문에 유용하다. 

문장 do stmt; while(cond);는 가장 먼저 stmt를 실행한 이후 반복조건인 cond를 평가하여 0이 아니면 다시 반복몸체인 stmt;를 실행하고 0이면 do while문을 종료한다. 

 


센티널 값 검사에 유용한 do while

 

표준입력으로 받은 정수가 양수 또는 음수이면 계속 입력을 반복하고, 입력한 수가 0이면 프로그램이 종료되는 프로그램을 작성해보자. 이 프로그램은 입력 후에 반복 검사를 진행하는 처리과정으로 do while 문에 적합하다.

 

이와 같이 반복의 종료를 알리는 특정한 자료 값을 센티널 값이라고 한다. 

 

센티널 값은 가능한 한 처리를 하는 자료 값과 다르게 잘 발생하지 않는 값으로 정하는 것이 좋다.

 

아래는 메뉴주문 반복의 예시코드이다.

 


for문 구조와 제어흐름

 

지금까지 살펴본 while과 do while 구문은 단순하게 조건식에 따라 반복을 구현했다면,

for 반복문은 반복에 대한 제어변수의 초기화와 증감을 일정한 영역에서 코딩하도록 지원한다.

 

반복문 for (init; cond; inc)에서 init에서는 주로 초기화가 이루어지며,
cond에서는 반복 조건을 검사하고, inic에서는 주로 반복을 결정하는 제어 변수의 증감을 수행한다. 

- for(;;)문의 괄호 내부에서 세미콜론으로 구분되는 항목은 모두 생략될 수 있다.
- 그러나 2개의 세미클론은 반드시 필요하다.
- 반복조건 cond를 아예 제거하면 반복은 무한히 계속된다.
- 반복할 문장인 반복몸체 stmd가 여러개라면 반드시 블록으로 묶어야한다. 

 

다음 그림에서 for문은 반복몸체를 10번 실행한 후, i는 11이 되고 다시 조건식을 검사한 후 0이 되어 반복을 종료한다. 

 

다음은 for 구문으로 일정 횟수를 반복하는 예제이다.

 

 

반복조건에서의 주의
반복 조건에서 등호나 부등호의 ==나 != 또는 대입연산자 =의 사용은 주의를 필요로한다.
비교연산자 ==와 !=에서피연산자로 실수는 가급적 사용하지 않도록 하자.

 

아래는 정수의 32비트 이진수를 출력하는 예제이다.

 

 


fot문 활용; for문의 합 구하기

 

for문을 이용해서 1부터 10까지 합을 구하는 모듈을 작성하려면, 제어변수 i를 이용해서 1부터 10까지 순회해야한다.

순회하는 제어변수 i 값을 계속 합쳐서 변수 sum에 누적시키면 된다. 

 

다음은 1에서 10까지의 합을 구하는 다양한 for 구문의 예시이다. 

 

다음은 1에서부터 표준입력한 양수까지의 합을 구하는 for와 while이다.

 

 

다음은 백단위 정수의 세 개의 각 자릿수를 출력하는 LAB이다.


7.3 분기문
분기문이란? 정해진 부분으로 바로 실행을 이동하는 기능을 수행한다.
C가 지원하는 분기문으로는 break, continue, goto, return이 있다.


 

 

반복의 중단, break

 

반복 내부에서 반복을 종료하려면 break 문장을 사용한다.

 

만일 반복이 중첩되어 있다면 break를 포함하는 가장 근접한 내부반복을 종료하고 반복문 다음 문장을 실행한다. switch에서 보았듯이 break는 반복의 종료뿐만 아니라 switch문의 종료에도 이용된다.

 

다음은 반복된 정수의 16진수 변환과 break로 종료하는 예제이다.

 


반복의 계속 continue

 

continue 문은 continue 문이 위치한 이후의 반복몸체의 나머지 부분을 실행하지 않고
다음 반복을 계속 유지하는 문장이다. 
- while 문은 앞쪽 조건문으로,
- do while 문은 뒤쪽 조건문으로
- for 문은 증감부분으로 이동한다. 

-또한 continue 이후의 문장은 실행되지 않고 뛰어넘어간다. 

 

 

다음 예제는 continue 문을 이용하여 1에서 15까지 정수 중에서 3으로 나누어 떨어지지 않는 정수를 출력하는 프로그램이다.

 


goto와 무한반복

goto문은 레이블이 위치한 다음 문장으로 실행순서를 이동하는 문장이다. 

 

 

레이블은 식별자와 콜론(:)을 이용하여 지정한다. goto문을 적절히 이용하면 반복문처럼 이용할 수 있으나, goto문은 프로그램을 어렵고 복잡하게 만들 수 있으므로 잘 안쓴다. 

 

다음 예제는 goto문을 이용해 1에서 10까지 출력하는 프로그램이다.

 

 


무한반복

 

반복문에서 무한히 반복이 계속되는 것을 무한반복이라고 한다. 
의도치 않은 무한반복은 ctrl+c를 누르면 된다. 

- while과 dowhile은 반복조건이 아예 없으면 오류가 발생한다.
-for문에서는 반복조건에 (init;;inc)처럼 아무것도 없으면 오류없이 무한반복이 실행된다. 

 

다음은 반복된 정수의 8진수와 16진수진수 변환과 break로 종료하는 예시이다.

 

 

다음은 양의 정수의 소수여부를 판단해 출력하는 LAB이다.

 


7.4 중첩된 for 문

 

외부반복과 내부반복: 반복내부에 반복이 또 있는 구문을 중첩된 반복이라 한다. 

 

 

 

다음은 외부반복에서 1에서 5까지 내부반복에서 1에서 7까지 반복하면서 각각의 변수 값을 출력하는 예제 프로그램이다.

내부 반복에서 출력되는 변수 n은 1에서 7까지 한 행에 출력되도록 구현하였다. 

 


내부 반복이 외부 반복에 의존

 

다음 소스는 *을 삼각형 모양으로 출력하는 소스이다.

소스를 살펴보면 외부 반복에서 변수 i는 1에서 5까지 반복한다. 내부 반복에서 제어변수 j는 1에서 외부 반복의 제어 변수 i까지 반복하도록 한다. 

 

 

 

다음은 별을 삼각형 모양으로 출력하는 코드이다. 


삼중중첩 반복

 

다음모듈은 1에서 입력된 정수까지의 합을 구하는 모듈이다.

 

 

oh... 난이도가 확 올라가네욤...

살려죠 ...

 

다음은 구구단 출력 LAB 문제이다.

 


 

이렇게 7강도 끝이 났다..

너무 길다 !!!!

 

1학년 떄 여기 코딩이 너무 힘들어서 적당히 포기한 기억이 있는데, 

뒤에 예제 풀 생각에 너무 손이 떨린다.. 흑흑

 

하지만 나는 하기 싫은 걸 해야하는 어른 ..

 

잘 해내고 오게써...

 

그럼 앙뇽...