ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C언어/Day3] C언어 수업정리 - 배열 기초 (정보처리기사, 실기)
    Backend 2019. 5. 22. 22:00

    좁은 서울 땅 덩어리에 미국처럼 단독주택만 짓는다면 어떨지 상상해보자. 집 짓는 데 시간도 오래 걸리고 효율도 매우 떨어질 것이다. 그런데 여러 명을 한 번에 수용할 수 있는 아파트를 지어서 방 한 칸에 1가구 씩 배정한다면 훨씬 효과적으로 주택 공급을 할 수 있을 것이다.

     

    만약에 배열이 없었다면 어떤 데이터 100개를 처리할 때 100개의 변수를 만들고, 그 변수에 100개의 데이터를 각각 할당하여 처리를 해야만 했을 것이다. 얘기만 들어도 비효율적이고 끔찍하다. 그래서 우리는 배열이란 걸 만들어냈는데, 일종의 아파트를 만든 것이다. 그리고 아파트 칸마다 순차적으로 방번호를 부여하고 하나의 데이터를 부여한 것이다. 그리고 우리는 반복문을 사용하여 각각의 방에 든 데이터를 가지고 같은 작업을 여러 번 반복해서 처리할 수 있다.

     

     


     

    1. 배열 만들기

    #include<stdio.h>
    #define NUM 5
    int main(void) {
    	int array[NUM] = { 87, 99, 80 };	// array[0] = 87, array[1] = 99, array[2] = 80, array[3] = 0, array[4] = 0;
    	int cnt;
    
    	for (cnt = 0; cnt < NUM; cnt++) {
    		printf("array[%d]=%3d \n", cnt, array[cnt]);
    	}
    
    	printf("\n");
    	system("pause");
    	return 0;
    }

     

    C언어에서 배열의 선언은 arrayName[5] 이런 식으로 한다.

    arrayName은 말 그대로 배열의 이름을 쓰면 되고,

    숫자는 배열 방의 개수라고 생각하면 된다.

     

    array[5]라고 하면 5개의 빈 방이 생겨나는 셈이다.

     

    동적 언어인 자바스크립트와 다르게 정적 언어인 C언어는

    배열을 선언할 때, 방의 개수를 이렇게 미리 지정해준다.

    (자바스크립트에서는 그냥 var arr = []; 이렇게 빈 배열만 선언하고

    배열에 들어갈 요소의 개수는 지정하지 않는다.)

     

     

    위 코드에서는 array라는 배열에 빈 방을 5개를 만들었고, 초기값으로는 87, 99, 80을 할당하였다.

    그러면 값이 할당되지 않은 나머지 빈 방은 0이 출력된다.

     

     

    주의할 점은 배열의 방 번호는 0번부터 시작한다.

    Flow chart와 같은 알고리즘 세계에서는 1번부터 카운트하기 때문에 헷갈리면 안된다.

     

    그러니까 위 array[5]의 방 개수는 5개이지만 방 번호는 0번부터 4번까지 존재하게 된다.

     

    즉, array[5] = { 87, 99, 80 };은 

    array[0] = 87, array[1] = 99, array[2] = 80, array[3] = 0, array[4] = 0;이라고 선언한 것과 같다.

     

     

    실행결과

     

     

    2. 배열의 초기값을 0으로 설정하기

    #include<stdio.h>
    #define NUM 5
    int main(void) {
    	int array1[5] = { 0 };
    	int array2[5];
    	int cnt;
    
    	for (cnt = 0; cnt < NUM; cnt++) {
    		array2[cnt] = 0;
    		printf("array1[%d]=%3d \n", cnt, array1[cnt]);
    	}
    
    	printf("\n");
    
    	for (cnt = 0; cnt < NUM; cnt++) {
    		array2[cnt] = 0;
    		printf("array2[%d]=%3d \n", cnt, array2[cnt]);
    	}
    
    	printf("\n");
    	system("pause");
    	return 0;
    }

     

    배열을 처음 선언할 때는 int arrayName[num] = { 0 }; 이라고 주로 쓴다.

    그러면 arrayName이라는 배열이 선언되고, 그 배열의 방의 개수는 num이고

    각 배열 방에는 0이라는 값이 할당되어 초기화된다.

     

    위 코드를 보면 int array2[5]; 라고 배열만 일단 선언한 다음에

    for문 안에서 array2 각각의 빈 방에 0이란 값을 할당해도 초기화가 된다.

     

     

    실행결과

     

     

    3. 배열의 값들로 총점과 평균 구하기

    #include<stdio.h>
    #define NUM 5
    int main(void) {
    	int array[NUM] = { 87,99,80 };
    	int total = 0, cnt;
    	double avg;
    
    	for (cnt = 0; cnt < NUM; cnt++) {
    		printf("array[%d]=%3d \n", cnt, array[cnt]);
    	}
    	printf("\n");
    	for (cnt = 0; cnt < NUM; cnt++) {
    		total = total + array[cnt];
    	}
    	printf("----------반복문 종료-------------\n");
    	printf("총점은 %d 이고 \n", total);
    	avg = (double)total / NUM;
    	printf("평균은 %.2lf 입니다\n", avg);
    	system("pause");
    	return 0;
    }

     

    이제 배열의 값들을 반복문을 사용하여 total이란 변수에 누적해서 더한 후, 평균값을 구해서 출력하였다.

     

    평균값을 출력할 때, %.2lf라고 표기하면 소수점 2자리수까지만 표현하라는 의미이다.

    %.2f라고 표현할 수도 있는데, f라고 표기하면 소수점을 5~6자리까지만 연산한다.

    lf라고 표기하면 그 이상의 소수점까지 연산한다.

     

     

    실행결과

     

     

    4. 배열과 반복문으로 사각형 출력하기 (2차원 배열)

    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

     

    그러니까 이렇게 생긴 사각형을 출력해보려고 한다.

    #include <stdio.h>
    int main() {
    	int row, col, i, j, k = 0;
    	int arr1[5][5] = { 0 };
    	//사각형 도형 채우기
    	printf("-----------------------\n");
    	for (row = 0; row < 5; row++) {
    		for (col = 0; col < 5; col++) {
    			k = k + 1;
    			arr1[row][col] = k;
    		}
    	}
    	for (i = 0; i < 5; i++) {
    		for (j = 0; j < 5; j++) {
    			printf("%3d", arr1[i][j]);
    		}
    		printf("\n");
    	}
    	printf("-----------------------\n");
    	system("pause");
    	return 0;
    }

     

    이제 행과 열이 필요하므로 2차원 배열을 사용해서 출력할 수밖에 없다.

    각각의 행이 하나의 배열을 이루고 그 행들이 모여 또 하나의 배열을 이루는 형태가 된다.

     

    arr1[5][5] = { 0 }; 이라고 선언하면 5개의 행과 5개의 열이 생겨난다.

    그 행열에 이중 반복문을 사용하여 숫자를 채워넣어준다.

    출력할 때, 하나의 행 출력이 끝나면 줄바꿈을 해주어야 한다.

     

     

    #include <stdio.h>
    #define NUM 5
    int main() {
    	int row, col, i, j, k = 0;
    	int arr1[NUM][NUM] = { 0 };
    	//사각형 도형 채우기
    	printf("-----------------------\n");
    	row = 0;
    	while (row < NUM) {
    		col = 0;
    		while (col < NUM) {
    			k = k + 1;
    			arr1[row][col] = k;
    			col++;
    		}
    		row++;
    	}
    
    	i = 0;
    	while (i < NUM) {
    		j = 0;
    		while (j < NUM) {
    			printf("%3d", arr1[i][j]);
    			j++;
    		}
    		printf("\n");
    		i++;
    	}
    
    	printf("-----------------------\n");
    	system("pause");
    	return 0;
    }

     

    똑같은 코드를 while문으로 표현하면 이렇게 된다.

    for문보다 길이는 길지만 원리는 같다.

     

     

    #include <stdio.h>
    #define NUM 5
    int main() {
    	int row, col, i, j, k = 0;
    	int arr1[NUM][NUM] = { 0 };
    	//사각형 도형 채우기
    	printf("-----------------------\n");
    	row = 0;
    	do {
    		col = 0;
    		do {
    			k = k + 1;
    			arr1[row][col] = k;
    			col++;
    		} while (col < NUM);
    		row++;
    	} while (row < NUM);
    
    	i = 0;
    	while (i < NUM) {
    		j = 0;
    		while (j < NUM) {
    			printf("%3d", arr1[i][j]);
    			j++;
    		}
    		printf("\n");
    		i++;
    	}
    
    	printf("-----------------------\n");
    	system("pause");
    	return 0;
    }

     

    이 코드는 do-while문으로 작성한 코드이다.

     

     

    실행결과

     

     

    5. 배열과 반복문으로 사각형 출력하기 (2차원 배열) _ (2)

    1   6   11   16   21

    2   7   12   17   22

     8   13   18   23

    4   9   14   19   24

    5   10  15   20  25

     

    이번엔 새로 방향으로 수를 출력해보자.

    #include <stdio.h>
    int main() {
    	int row, col, i, j, k = 0;
    	int arr1[5][5] = { 0 };
    	//사각형 도형 채우기
    	printf("-----------------------\n");
    	for (row = 0; row < 5; row++) {
    		for (col = 0; col < 5; col++) {
    			k = k + 1;
    			arr1[col][row] = k;
    		}
    	}
    	for (i = 0; i < 5; i++) {
    		for (j = 0; j < 5; j++) {
    			printf("%3d", arr1[i][j]);
    		}
    		printf("\n");
    	}
    	printf("-----------------------\n");
    	system("pause");
    	return 0;
    }

     

    col과 row의 위치만 바꿔주면 간단하게 바꿀 수 있다.

     

    실행결과

     

     

     

    6. 배열과 반복문으로 사각형 출력하기 (2차원 배열) _ (3)

    1   0   0   0   0

    0   2   0   0   0

    0   0   3   0   0

    0   0   0   4   0

    0   0   0   0   5

     

    모두 0을 출력하고 대각선으로 1 2 3 4 5를 출력하는 방법은 다음과 같다.

    #include <stdio.h>
    int main() {
    	int row, col, i, j, k = 0;
    	int arr1[5][5] = { 0 };
    	//사각형 도형 채우기
    	printf("-----------------------\n");
    	for (row = 0; row < 5; row++) {
    		for (col = 0; col < 5; col++) {
    			if (row == col) {
    				k = k + 1;
    				arr1[row][col] = k;
    			}
    		}
    	}
    	for (i = 0; i < 5; i++) {
    		for (j = 0; j < 5; j++) {
    			printf("%3d", arr1[i][j]);
    		}
    		printf("\n");
    	}
    	printf("-----------------------\n");
    	system("pause");
    	return 0;
    }

     

    대각선은 row와 col의 인덱스 번호가 같아질 경우이므로

    if (row == col) 조건을 주면 대각선에만 번호가 할당된다.

     

    #include <stdio.h>
    int main() {
    	int row, col, i, j, k = 0;
    	int arr1[5][5] = { 0 };
    	//사각형 도형 채우기
    	printf("-----------------------\n");
    	for (row = 0; row < 5; row++) {
    		for (col = 0; col < 5; col++) {
    			if (row != col) {
    				continue;
    			}
    			else {
    				k = k + 1;
    				arr1[row][col] = k;
    			}
    		}
    	}
    	for (i = 0; i < 5; i++) {
    		for (j = 0; j < 5; j++) {
    			printf("%3d", arr1[i][j]);
    		}
    		printf("\n");
    	}
    	printf("-----------------------\n");
    	system("pause");
    	return 0;
    }

     

    위 코드는 continue문을 사용하여 이렇게도 표현 가능하다.

    (물론 위의 코드가 더 짧고 간결하다.)

     

     

    실행결과

     

     

     

    반응형

    COMMENT