cyphen156

Chapter6 반복문 : for와 while 본문

프로그래밍/C언어

Chapter6 반복문 : for와 while

cyphen156 2023. 7. 12. 14:18

프로그램의 흐름

프로그램의 실행 흐름에는 순차, 선택, 반복이라는 세 가지의 구조가 있습니다.

이 중 우리는 이전 챕터에서 프로그래밍에 있어서 조건에 따른 선택이라는 흐름 구조를 배웠습니다. 

이번에 공부할 내용은 특정한 명령을 반복해서 실행시키기 위한 반복 구조입니다.

반복 구조

프로그램에서 특정한 명령을 반복해서 사용해야 할 때, 사용자의 수고로움을 줄이기 위해 개발되었습니다.

반복문에는 whilefor문이 있으며 loop문이라고도 합니다.

반복문에는 항상 반복을 제어하기 위한 변수가 존재하는데 저는 이것을  반복조건문이라고 부릅니다.

반복조건문에는 1. 초기식, 2. 조건식, 3. 증감식으로 세가지 요소가 존재합니다.

반복문은 이 세 요소중 조건식에 해당하는 내용이 false가 될 때 까지 명령을 반복합니다.

만약 이 요소들을 제대로 관리하지 않는다면 프로그램은 해당 반복문을 무한히 실행합니다. 

경우에 따라서는 일부러 프로그램을 무한반복시키고, 특정 상황이 되면 무한반복을 빠져나오도록 하는 종료 조건이라는 것 도 있습니다. 

while

반복조건문의 세 요소들을 각각 표기하여 사용하는 조건문

주로 반복 횟수가 정해져있지 않을때 사용하는 반복문 입니다.

while에는 종류가 두 가지가 있는데 1. while문, 2. do while문이 있습니다.

만약

  1. 초기식 : int = 0;
  2. 조건식 : (i < 0)
  3. 증감식 : i++;

이라고 한다면 while과 do while문은 다음과 같이 표현됩니다. 

int i = 0, sum = 0;
while(i < 10) {
    sum += i;
    i++;
}

do {
    sum += i;
    i++;
} while (i < 10)

둘의 다른점은 do(무조건 한번은 실행을 해라!)라는 의미로서 조건을 체크하지 않고 실행이 된다는 점입니다.

while 문에서 무한반복을 실행하고 싶다면 조건문에 1를 집어넣거나 선언부에서# include <stdbool.h> 라이브러리를 입력한 뒤 true 넣으면 됩니다.

반대로 무조건 반복문을 실행하고 싶지 않다면 0이나 false를 입력하면 되는데 그럴거면 그냥 해당 코드를 작성하지 않는게 좋습니다.

int i = 0, sum = 0;
while (1) {
    sum += i;
    i++;
}

for

반복조건문의 세 요소들을 하나의 괄호 안에 묶어 사용하는 조건문

반복 횟수가 정해져있을 때 사용하는 반복문입니다.

반복조건문이 while과 동일하다고 했을 때 for 문의 구조는 이렇습니다.

int sum = 0;
for (int i = 0; i < 10; i++) {
    sum += i;
}

이 반복문은 i(index)가 0부터 시작해서 10 미만일 때 까지 sum에 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9를 연산합니다.

whilefor의 매우 큰 차이점!

그런데 for문에서와 while 문에서의 차이점이 있습니다. 

바로 초기식의 선언 위치입니다. while에서는 초기식을 while문 밖에 선언했기 때문에 while반복문이 종료되어도 i라는 변수가 값을 지니고 있어서 다른 함수나 명령어에 사용할 수 있습니다.

반면에 for문은 초기식을 for 문 안에 선언했기 때문에 for 반복문이 종료가 되면 초기식에서 선언한 변수와 값이 사라진다는 것입니다. 

하지만 for문도 초기식에서 사용할 변수를 for문 밖에서 선언하고 이를 반복조건문에 사용하는 방식으로 변수를 계속해서 사용할 수 있습니다.

//i가 사라지지 않아 아래의 반복문 모두에 영향을 줍니다.
int i = 0;
while (i < 10) {
    i++;
}
printf("%d\n", i);	// >> 10

int sum = 0;
for (int j = 0; j < 10; j++) {
	sum += j;	//j는 9까지 증가하여 sum의 값은 45가 되지만 
}

printf("%d\n", j);	// <<<< 실행하면 에러가 발생합니다. 
					// j라는 변수는 메모리에서 사라졌거든요
                    
// 그런데 j 대신 i를 쓰면?
for ( ;i < 20;i++) {
    i++;
}
printf("%d\n",i); // 20

또한 주의해야할 점은 조건식이 false가 되면 반복문을 빠져나오는 것이기 때문에 초기식에서 사용한 변수의 값이 false가 되는 조건 (i == 10) or (i == 20)이 되어 있다는 것 입니다.

반복의 건너뛰기(Continue)와 종료(break)

continue;

반복 안의 continue 밑의 명령들을 실행하지 않고 건너 뛰고 다시 반복횟수를 늘려 반복하는 명령어입니다.

특정 상황이 발생했을때 예외적으로 처리하고 싶을때 사용하는것이 좋습니다.(소수 찾기 등)

break;

반복문의 실행을 종료하고 다음 코드를 실행하는 명령어입니다.

보통 이스케이프 문자 EOF와 같은 기능을 합니다.

다음 보여드릴 코드는 간단한 소수를 찾는 코드입니다.

continue문이 실행되면 노란 박스 부분의 코드를 모두 실행하지 않고 i++를 수행한 뒤 scanf명령부터 다시 실행합니다.

break문이 실행되면 초록색 박스 안의 반복문을 앞으로는 아예 수행하지 않겟다는 명령으로 반복문 밖에 존재하는 if 조건문을 수행합니다.

※goto 문

goto 문은 과거에 함수라는 개념이 존재하지 않았을 때 사용하던 반복문입니다. 

현재는 for과 while이라는 코드블럭 안에 반복해서 수행할 명령어를 넣어 코드를 작성하는데 goto문은 코드의 가독성을 저해시켜 프로그램의 실행 순서 추적을 어렵게 하므로 쓰지 않는 것이 좋습니다.

아래 코드를 보면 goto문과 함께 start:라는 문장이 있다.

i가 5가 되기 전까지 start가 존재하는 부분으로 돌아가서 코드를 다시 수행하라는 명령어입니다.

 

#include <stdio.h>

int main() {
    int i = 0;

    start:  // This is a label
    printf("%d\n", i);

    i++;
    if(i < 5)
        goto start;  // Program jumps back to the start label

    return 0;
}

 

※ ctype.h 함수

  • int isalpha() : 알파벳인지 확인하는 함수 0 or 1리턴
  • int isdigit() : 숫자인지 확인하는 함수 / 0 or 1리턴
  • islower() : 소문자인지 확인하는 함수 / 0 or 1리턴
  • isupper() : 대문자인지 확인하는 함수 / 0 or 1리턴q
  • toupper() : 대문자로 변환하는 함수 / 아스키 값(97 ~ 122) 리턴
  • tolower() : 소문자로 변환하는 함 / 아스키 값(65 ~ 90) 리턴

이 중 isalpha와 tolower함수를 구현해보겠습니다.

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

static int len;    // 전역변수 len

int sizeCalc(char s[]); // 배열 길이 계산
int isAlpha(char s);  // 문자 하나 알파벳인지 확인
int toLower(char s);  // 문자 하나 대문자 변환

int main(void) {
    char s[100] = { 0 };
    scanf("%s", s);

    sizeCalc(s);
    for (int i = 0; i < len; i++) {
        int alphabet = 0;    // 알파벳이 아니라 가정
        printf("%c\t", s[i]);
        alphabet = isAlpha(s[i]);
        if (alphabet)    // 알파벳이 맞다면 대문자로 변환
            s[i] = toLower(s[i]);
        printf("%d\t%c\n", alphabet, toLower(s[i]));
    }
    printf("Final print is this.\n%s", s);
    return 0;
}

int sizeCalc(char s[]) {
    len = 0;
    for (int i = 0; s[i] != '\0'; i++)
        len++;
    return len;
}

int isAlpha(char s) {
    if ((s >= 'a' && s <= 'z') || (s >= 'A' && s <= 'Z'))
        return 1;
    else
        return 0;
}

int toLower(char s){
    if (s >= 'A' && s <= 'Z')
        s += 32;  // 대문자를 소문자로 변환
    return s;
}

 

//모든 예제 소스는 한빛 미디어홈페이지에서 찾으실 수 있습니다.

IT CookBook, 전공자를 위한 C 언어 프로그래밍 (hanbit.co.kr)

또는 cyphen156/Work-space: Studying (github.com)에서 찾으실 수 있습니다.

 

 

 

 

'프로그래밍 > C언어' 카테고리의 다른 글

Chapter7 : 디버깅과 소프트웨어 설계  (0) 2023.08.08
Chapter6 과제  (0) 2023.08.07
Chapter5 과제  (0) 2023.06.21
Chapter5 조건문 : If와 Switch  (0) 2023.06.02
Chapter4 과제  (0) 2023.02.10