C/C 정리

반복문 for, while문과 배열

무면허 개발자 2022. 9. 2. 18:16

( 본 게시글은 작성자가 메모용으로 사용하는 용도임을 밝힙니다. 정보가 불확실할 수 있으니 참고 부탁드립니다 )

 

 

while : ~하는 동안이라는 뜻의 반복문으로써, 일정 조건식이 true라면 반복해서 루프 본체 및 증감변화식을 실행시키고, 조건이 false가 되면 본체로부터 탈출하여 다음 코드로 넘어간다.

 

int i = 0;

 

while (조건식)

{

반복할 코드;

증감 및 변화식;

}

 

의 형태를 가진다 ( 여러가지로 수정 가능 ). 이때 조건을 1, true 혹은 영원히 참으로 설정해 둔다면 while의 반복문은 무한히 실행되어 무한 루프가 된다. 무한루프는 메모리 최대치가 넘어갈때까지 실행되고, 메모리 한계치가 넘어가면 오버플로우 현상이 일어난다. 이 무한루프에서 벗어나려면 실행할때마다 i++와 같은 증감연산자를 사용하고, i==100과 같은 조건을 추가, 뒤에 break를 사용하여 i가 100이 될때 break, 즉 제어가 되어 반복문을 끝낼 수 있다.

여기서 ++이란 --와 함께 증감 연산자로 불리는 개념으로, 이때 증감 연산자를 변수의 앞이냐, 뒤에 두느냐에 따라서 개념이 달라진다.

 

++a : 전위 증가 연산자

a++ : 후위 증가 연산자

--a : 전위 감소 연산자

a-- : 후위 감소 연산자

 

위와 같이 사용 가능한데, 가령 예를 들면 b = a++이라면 a가 먼저 b에 할당되고, 그 다음 a의 값이 1 증가한다.

반대로 b = ++a이라면 a의 값이 먼저 1이 증가하고, 그 다음 증가된 a의 값이 b에 할당된다. 감소 연산자 또한 마찬가지이므로, 순서에 따라 차이가 생기니 주의해야 한다.

 

============================================================================

 

위의 while문을 예제로 들어보자면

 

int i = 0;

 

while (true)

{

printf("%d\n, i);

 

i++;

 

if (i == 100)

break;

}

 

이런식으로 0~99까지 반복하여 출력할 수 있다. 또한 while 밖에 코드를 작성하여 while이 false가 되어 탈출했을때 해당 코드를 실행시킬 수 있다. ( false가 될때 false가 되었다는 표시 가능 )

while과 비슷하게 do while이라는 반복문도 있다.

 

do

{

반복문;

증감 및 변화식;

} while ( 조건식 );

 

do while은 while과 다르게 일단 조건과 상관없이 최소 1번은 반복문을 먼저 실행시킨 후 조건식을 검사하여 반복한다. 이때의 while 조건식 뒤에는 ;을 붙인다.

while을 이중으로 사용하여 이중 반복문도 만들 수 있다.

 

int i = 1;

int j = 0;

 

while (j <= 10)

{

j = 0;

while (j < i)

{

printf("*");

++j;

}

printf("\n");

 

++i;

}

 

위를 통해 *을 각줄마다 1개부터 10개까지 나오게 출력할 수 있다 ( j가 i보다 작다면 계속 *이 출력되다가 i와 j가 같다면 탈출하여 \n을 통해 다음줄로 넘어가는 형식 ).

 

============================================================================

 

while이 간단한 반복을 하고싶을때 사용한다면, 조금 더 디테일을 주고싶을때는 주로 for문을 많이 사용한다.

for문은 for (초기식; 조건식; 증감 및 변화식) 의 형태를 지닌다.

 

for (초기식; 조건식; 증감 및 변화식)

{

반복문;

}

 

여기서 코드 실행의 순서를 보자면 초기값 -> 조건식 검사 = 참 -> 몸체 실행 -> 증감 및 변화식 실행 -> 조건식 검사 ... 의 순서로 실행되고 조건식이 거짓으로 평가된다면 , 몸체가 실행되지 않고 다음 코드로 넘어간다.

 

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

{

printf("C가 루프를 실행합니다\n");

}

printf("C가 루프를 언제 종료할지 알고 있습니다.\n");

 

위를 살펴보면 int i = 0;이라는 초기식을 통해 i가 먼저 선언되었고, i < 5이라는 조건식을 검사하여 참이라면 아래의 C가 루프를 실행합니다가 출력되고, i++을 통해 값이 1 증가한다. i가 5가 될때까지 해당 코드를 반복실행하고, 만약 조건이 거짓으로 평가된다면 for문을 탈출하여 마지막 줄의 C가 루프를 언제 종료할지 알고 있습니다가 출력되는 것을 확인할 수 있다.

for문도 이중 반복문을 만들 수 있다.

 

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

{

for (int j = 0; j < i; j++)

{

printf("*");

}

printf("\n");

}

 

위의 이중 for문을 통하여 *을 각줄마다 1개부터 5개까지 증감하여 출력되게 만들 수 있다.

 

============================================================================

 

for문과 헤더파일 time.h, stdlib.h을 통해 난수 생성하기

 

무작위로 난수를 생성하려면 srand,rand,time 함수가 필요하다. 따라서 해당 함수가 선언돼있는 헤더파일 stdlib.h와 time.h를 먼저 포함시켜줘야 한다.

 

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

 

위처럼 헤더파일을 먼저 실행시켜주고

 

srand(time(NULL));

 

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

{

printf("%d ", (rand() % 100));

}

printf("\n");

 

위와 같이 설정 후 컴파일하면 100 미만의 정수가 9개씩 매 컴파일마다 랜덤하게 출력되는 것을 확인할 수 있다.

for문의 조건식 i < 10을 통해 정수가 9개 나오는것을 조정할 수 있고, for문 위의 srand는 현재의 시간값 time을 시드로 설정하는 함수이다.

 

============================================================================

 

배열 Array

 

배열 : 여러가지 임의의 변수를 저장 가능하므로, 100개, 1000개 이상의 값을 수작업으로 하는거보다 손쉽게 처리할 수 있다. 배열에는 동적 배열과 정적 배열로 볼 수 있다.

 

int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 3열 선택3열 다음에 열 추가
  • 4열 선택4열 다음에 열 추가
  • 5열 선택5열 다음에 열 추가
  • 6열 선택6열 다음에 열 추가
  • 7열 선택7열 다음에 열 추가
  • 8열 선택8열 다음에 열 추가
  • 9열 선택9열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
셀 전체 선택
열 너비 조절
행 높이 조절
1
2
3
4
5
6
7
8
9
10
  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

위는 크기가 10인 int형 배열을 선언하는 뜻이다. 크기가 10이므로 10개의 공간이 생겼고, 각 공간마다 값이 하나씩 할당되었다. 여기서 저장된 이 공간을 원소, 요소 ( element) 라고 한다. 또한 각 원소는 [ ]을 통해 인덱스를 지정할 수 있다. 가령 arr[0]은 첫번째 원소이자, 인덱스 0이라고 할 수 있고, arr[5]는 여섯번째 원소이자, 인덱스 5라고 할 수 있다.

 

배열을 선언하는 방법은 여러가지가 있다.

 

1. int arr[3] = { 1, 2, 3 }; // 배열의 크기만큼 값을 순서대로 하나씩 할당한다.

2. int arr[3] = { }; // 모든 원소를 0으로 초기화한다. ( 3개의 메모리가 할당되고, 모두 0으로 초기화 )

3. int arr[3] = {1}; // 첫번째 원소만 1로 할당, 나머지 원소는 0으로 초기화된다.

4. int arr[ ] = { 1, 2 }; // index의 갯수만큼 원소의 크기를 초기화한다. 이 경우 자동으로 크기가 2로 잡힌다. 직관성, 가독성 면에서 좋지 않기 때문에 지양해야 한다.

5. int arr[5]; // 배열의 크기가 5로 선언된다. 이 경우는 컴파일 경고가 뜨면서 쓰레기 값이 나올 수 있기 때문에, 원소별로 값을 초기화시켜줘야 한다.

 

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

{

printf("배열의 값 출력 : %d\n", arr[i]);

}

 

위에서 배운 for문을 통해 원소별로 할당되어 있는 값을 출력시킬 수 있다. 처음 시행시 i가 0이므로 첫번째 줄에는 배열의 값 출력 : arr[0] 즉 배열의 값 출력 : 1이 출력될 것이다.

이처럼 값의 갯수만큼 변수를 선언하지 않아도 배열을 통해 쉽게 값을 할당하여 사용할 수 있다.