c 9. 배열

 c 9. 배열



1. 배열의 개요


- 배열(array)의 개념

같은 종류의 자료형을 선언하기 위해 구성된 데이터의 집합

서로 연관된 데이터를 변수에 별도로 표현하지 않고 하나의 묶음으로 표현

-> 소스코드를 쉽게 관리할 수 있음



- 배열을 사용하는 이유

처리해야 할 데이터가 많은 경우 변수를 일일이 선언해서 하기 보다는 많은 데이터를 저장할 수 있는 메모리 공간과 데이터를 손쉽게 처리할 방법이 필요 -> 배열 사용

변수의 메모리 주소는 무작위이지만 배열은 할당된 크기만큼 연속된 메모리를 할당 받아 index를 이용해서 옮겨 다닐 수 있다.



- 배열에서 데이터 접근

배열은 인덱스와 같은 번호에 대응하는 데이터로 이루어진 자료구조

전체 그룹에 대한 이름을 부여하고 0부터 시작하는 숫자로 구성된 인덱스로 데이터에 접근





2. 배열의 선언과 초기화


- 배열의 선언

배열을 사용하기 위해선 연속된 메모리 저장공간 필요

배열 선언에 필요한 4가지 요소 : 배열의 자료형, 배열의 이름, 배열의 크기, 배열의 요소













* 배열의 자료형

배열의 구성 요소에 따라 결정

변수의 자료형과 비슷함

정수형 : int, long

실수형 : float, double

문자형 : char



* 배열의 이름

배열에는 각각의 배열 요소를 대표할 이름이 필요함

배열의 이름은 해당 배열의 대표 이름이면서 동시에 메모리에 연속해서 배치된 배열의 시작 주소 의미

변수 이름과 마찬가지로 배열의 이름에도 예약어를 사용할 수 없음



* 배열의 크기

배열의 요소의 개수를 지정해 줘야함 (필수는 아님)

배열의 크기에는 정수값만 허용

변수 이름이나 음의 정수, 실수값 등을 지정하면 에러 발생

int a[b];    // 변수의 이름으로 선언해서 에러

int c[-3];    // 음의 정수값으로 선언해서 에러

int d[0];    // 0으로 선언해서 에러

int e[3.5];    // 실수값으로 선언해서 에러



배열의 크기는 한 번 선언하면 변할 수 없기 때문에 값이 변할 수 있는 정수는 사용할 수 없고 정수형 상수나 '#define'으로 선언한 상수만 사용할 수 있음

#define a 3;

int b[a];



배열의 크기를 지정하지 않으면 배열 요소의 개수만큼 크기가 자동으로 설정됨

int a[3] = { 1, 2, 3 };

int b[] = { 1, 2, 3 };

// a와 b의 크기는 같음



배열의 크기는 배열의 요소의 개수와 일치하도록 선언해야 함

배열의 요소보다 많게 배열의 크기를 선언하면 남는 배열의 크기에 0 이 자동으로 채워지고 작게 선언하면 에러 발생



* 배열의 요소(array element)

배열을 구성하는 각각의 요소

배열의 크기만큼 배열의 요소로 초기화

중괄호 ({   }) 안에 요소들을 콤마(,) 로 구분해서 선언

배열의 크기보다 적게 선언하면 빈 인덱스는 자동으로 0으로 채워지고 많게 선언하면 에러 발생





- 배열의 초기화

배열을 초기화 & 특정 인덱스만 초기화


* 배열을 초기화

배열도 변수의 일종이기 때문에 선언과 동시에 초기화할 수 있음

(자료형) (배열이름)[(배열크기)] = {(배열요소)};

int a[3] = {1, 2, 3};



*배열을 초기화하는 두 가지 방법

(1) 중괄호({  }) 안에 각 배열의 요소의 초깃값을 콤마로 구분하여 한꺼번에 지정

(2) 배열 요소의 인덱스에 해당하는 값을 각각 대입하여 초기화

int a[3] = { 1, 2, 3 }; // (1)


int b[3];               // (2)

b[0] = 1;

b[1] = 2;

b[2] = 3;



* 배열의 특정 인덱스만 초기화

배열을 선언한 수 특정 인덱스만 초기화

나머지 인덱스는 모두 0으로 자동으로 초기화됨

int a[3];

a[1] = 3;

// a = {0, 3, 0}





* 배열 사용 시 주의 사항














3. 배열의 활용


- 배열과 반복문

배열은 반복문을 위해서 탄생한 것이라고 봐도 과언이 아님

반복문에서는 배열의 각 인덱스에 간편하게 접근할 수 있음


* 예시 - for 문을 사용해 배열 초기화

int a[3];

a[0] = 1;

a[1] = 2;

a[2] = 3;

 ->

int a[3];

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

    a[i] = i+1


인덱스는 0부터 시작하기 때문에 배열의 크기에서 -1 을 한 값 까지 반복해야 함




* for 문으로 배열의 요소를 차례대로 출력

#include <stdio.h>


int main(void) {

    int score[5] = {87, 78, 94, 83, 98};


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

        printf("score[%d] : %d\n\n", i, score[i]);

    }

}













* 배열을 사용해서 3개 과목의 총점과 평균 출력

#include <stdio.h>

#define DT 3


int main(void) {

    int score[DT];

    int sum = 0;

    float avg = 0;


    for (int i = 0; i < 3; i++) {

        printf("과목%d 점수 : ", i + 1);

        scanf_s("%d", &score[i]);

    }


    // 합계 계산

    for (int i = 0; i < 3; i++) {

        sum += score[i];

    }

    // 평균 계산

    avg = (float)sum / DT;


    printf("총점 : %d\n", sum);

    printf("평균 점수 : %.2f\n", avg);

}











* 배열 요소의 값을 랜덤하게 출력

#include <stdio.h>

#include <stdlib.h> // rand()

#include <time.h>    // time()

#define PT 7  // 배열의 크기


int main(void) {


    int ex[PT];


    printf("1~300 사이의 숫자를 랜덤 출력\n");

    srand((unsigned)time(NULL)); // 시간 차별화


    for (int i = 0; i < PT; i++) {

        ex[i] = 1 + (rand() % 300); //1~300 사이의 난수

    }

    for (int i = 0; i < PT; i++) { //배열을 순차적으로 출력

        printf("ex[%d] : %d\n", i, ex[i]);

    }

}









(rand() 함수 사용 방법은 'c 7. 함수' 에 나와있음)





- 배열 요소의 개수 구하기

'sizeof()' 함수 사용

'배열 요소 개수' = sizeof(배열이름) / sizeof(배열이름[0])

'sizeof()' 함수는 ()의 값의 메모리 크기를 반환하기 때문에 전체 배열의 메모리 크기를 한 요소의 메모리 크기로 나누면 배열의 요소의 개수를 구할 수 있음


* 예시 - 배열의 요소 개수를 파악해서 출력

#include <stdio.h>


int main(void) {


    int point[] = {23, 55, 76, 87, 34, 96};

    int size;


    printf("point[] = {23, 55, 76, 87, 34, 96}\n");

    // 배열의 요소 개수 구하기

    size = sizeof(point) / sizeof(point[0]);

    printf("point[] 배열 요소의 개수 : %d개\n", size);


    return 0;

}








* 예시 - 배열을 사용해서 자동차를 예약 관리하는 프로그램 만들기 

중복된 예약을 할 수 없도록 하기

#include <stdio.h>

# define CP 10


int main(void) {

   char yn; //시작과 종류 문자 변수

   int choice; // 모델 번호

   int car[10] = { 0 }; // 배열의 요소를 모두 0으로 초기화

   do

   {

      printf("자동차 모델을 선택하시겠습니까 ? : (Y or N)\n");

      scanf_s(" %c", &yn); // 형식 지정자 앞에 공백을 한 칸 줘서 엔터키 값 지워줌


      if (yn == 'n' || yn == 'N') {

          break;;

      }

      else {

         printf("\n자동차 모델 번호 : 1 2 3 4 5 6 7 8 9 10\n");

         printf("자동차 예약 현황 : ");

         for (int i = 0; i < CP; i++) {

            printf("%d ", car[i]);

         }

         printf("\n");

      re_input:

         printf("\n자동차 모델 선택 (1~10) : ");

         scanf_s(" %d", &choice);


         if (choice < 11 && choice > 0) {

            if (car[choice - 1] == 0) {

               car[choice - 1] = 1; // 예약

               printf("\n예약 완료\n");

            }

            else {

               printf("[No.%d]모델은 이미 예약 되었습니다\n", choice);

               goto re_input;

            }

         }

         else {

            printf("잘못된 값을 입력했습니다. 다시 입력하시오\n\n");

            goto re_input;

         }

      }

   } while (1);

}


















* 무한 반복문에서 scanf_s() 함수를 사용할 경우 getchars() 함수를 사용해서 엔터키 값을 지워줘야 한다. 지워주지 않으면 엔터키 값이 적용되어 프로그램이 정상적으로 실행되지 않는다.

또 다른 방법으로는 scanf_s() 함수에서 형식 지정자 앞에 공백을 주면 ( ex - " %c") 마찬가지로 값을 입력할 때마다 엔터키 값을 메모리에서 지워준다.





- 배열과 문자열

C언어에는 문자열을 처리하는 자료형이 따로 없기때문에 문자형 배열을 선언해 문자열을 표현


* 문자와 문자열 초기화

문자 : 작은 따옴표('  ') 로 묶어줌. 아스키코드값 1바이트 크기.

문자열 : 큰 따옴표("  ") 로 묶어줌. 문자가 한 글자여도 큰따옴표로 묶으면 문자열로 인식. 아스키코드값 + NULL 값 크기.



* 배열 선언과 문자열 초기화

배열로 문자열을 처리할 때는 반드시 문자열+1 로 크기를 선언해야 함

문자열 마지막에 NULL 문자가 저장되기 때문

char a[6] = "hello";

// 문자 5개로 이루어 졌지만 NULL 값 포함해서 크기를 6으로 선언


배열 자체에 문자열을 저장하는 표현은 C언어에서는 사용하지 않음

char a[6];

char a = "hello";

// 컴파일 에러



* 문자열 배열의 크기 설정

 배열의 크기를 문자열 크기 + 1 보다 크게 선언하면 필요없는 메모리를 낭비하게 됨

배열의 크기를 문자열 크기보다 작게 선언하면 컴파일 에러 발생

항상 배열의 크기를 문자열 크기 + 1 로 선언해야함



* 예시 - 배열의 크기를 문자열 크기만큼만 했을때와 문자열 크기 + 1 만큼 했을 때

#include <stdio.h>


int main(void) {

   char str1[6] = "apple";

   char str2[5] = "apple";

   printf("배열 크기 6 : %s\n", str1);

   printf("배열 크기 5 : %s\n", str2);

}





배열의 크기를 문자열의 크기 만큼만 하면 문자열의 끝을 알리는 NULL 문자가 들어가지 않아서 문자열이 비정상적으로 출력됨

반그시 문장려의 끝을 알리는 NULL 문자가 들어갈 메모리 공간을 확보해줘야 함




* 예시 - 입력한 문자열의 길이 구하기

#include <stdio.h>


int main(void) {

   char str[20];

   int length = 0;

    

   printf("20자 이내의 문자열을 입력하시오 : ");

   scanf_s("%s", str, sizeof(str));

   for (int i = 0; str[i] != '\0'; i++) {

      length++;

   }

   printf("\n입력한 문자열의 길이 : %d\n", length);

}




'scanf_s()' 함수에서 %s 로 문자열을 입력받을 때에는 배열 그 자체가 메모리 주소와 같은 역할을 수행하기 때문에 '&'를 생략할 수 있다.




- 배열과 함수

함수에서도 배열 사용 가능

함수를 호출하는 쪽은 인수를 전달하고 호출되는 쪽은 매개변수를 선언해서 인수와 일대일 대응 관계로 값을 받음

배열은 선언하는 것 자체가 주소를 활용하는 것이기 때문에 배열을 사용하여 함수를 호출할 때에는 배열의 주소를 인수로 넘김










* 예시 - 배열로 5개 과목의 점수를 선언해서 사용자정의 함수를 통해 총점과 평균을 구하는 코드

#include <stdio.h>

#define DT 5 // 과목 개수


int add(int score[], int size); // 사용자 정의 함수 선언


int main(void) {

   int score[5] = { 87, 95, 100, 83, 98 }; // 5개 과목 점수

   int sum = 0;

   float avg;

    

   sum = add(score, DT); // 사용자 정의 함수 호출 (베열을 인수로 전달)

   avg = (float)sum / DT;

   printf("총점 : %d\n", sum);

   printf("평군 : %.2f\n", avg);

   return 0;

}

int add(int score[], int size) { // 사용자 정의 함수 정의

   int total = 0;

   printf("사용자 정의 함수로 총점 계산\n");

   

   for (int i = 0; i < size; i++) {

      total += score[i];

   }

   return total;

}





add() 함수를 호출해서 score 배열이름과 기호 상수 DT를 인수로 전달하고 add() 함수에서는 매개변수를 score[], size 로 선언



* 배열 원본 유지하기

호출되는 함수 안에서 배열 요소의 값을 변경할 수 있음

배열로 함수를 호출할 때 원본 배열의 요소의 값을 유지하려면 매개변수의 배열명 앞에 'const' 키워드 선언


* 예시 - 'const' 키워드로 선언된 매개변수의 배열을 수정하려고 하는 경우

void func(const int array[]){

    array[0] = 0; // 컴파일 오류 발생

}




* 배열 요소를 인수로 전달

배열 자체가 아닌 배열 요소를 인수로 전달할 수도 있음

배열 요소를 인수로 전달하면 복사된 배열 요소가 전달되기 때문에 원본 배열에는 아무런 영향을 미치지 않음


* 예시 - 제곱값을 반환하는 함수의 배열의 요소를 전달했을 때 원본 배열을 확인하는 코드

#include <stdio.h>


int gob(int a);// 사용자 정의 함수 선언


int main(void) {

    int a[5] = { 1, 2, 3, 4, 5 };

    int result = gob(a[2]); // 사용자 정의 함수에 배열의 요소를 인수로 전달해서 호출

    

    printf("gob(a[3]) 의 결과 : %d\n", result);

    printf("함수 실행 후 a[3]의 값 : %d\n", a[2]);

    return 0;

}

int gob(int a) { // 인수의 제곱값을 반환하는 사용자 정의 함수

    int pow = a * a;

    return pow;

}





함수에 배열의 요소를 인수로 전달해도 원본 배열에는 영향을 끼치지 않음






4. 배열을 활용한 정렬과 탐색


- 선택 정렬

정렬되지 않은 배열 요소의 데이터 값에서 가장 작은 값을 찾아 맨 앞의 데이터와 교환해 가면서 정렬하는 방식

맨 앞의 요소 부터 자신을 제외한 가장 작은 수와 위치를 바꿈














* 예시 - 선택정렬 코드

#include <stdio.h>


int main(void) {

    int s_list [5] = {5, 3, 2, 4, 1};

    int a, b, temp, sort;

    

    printf("초기 > 배열 요소 : 5 3 2 4 1\n");

    printf("\n[for 문으로 선택 정렬 수행]\n");

    

    for (a = 0; a < 4; a++){ // 자신과 비교할 인덱스 제외(5 - 1)

        

        sort = a;                // 배열 요소 4개 반복 대입

        

        for (b = a+1; b < 5; b++){  // 자신과 비교한 인덱스 제외

            if(s_list[b] < s_list[sort]){ // 정렬되지 않은 요소 중 가장 작은 값 찾는 과정

                sort = b;

            }         

        }

         // 선택 정렬을 통해 값 치환

        temp = s_list[a]; // 임시 저장소 temp를 활용해서 값 치환

        s_list[a] = s_list[sort];

        s_list[sort] = temp;

    }

    

    printf("결과 > 배열 요소 : ");

    for(a = 0; a < 5; a++){

        printf("%d ", s_list[a]);

    }

    printf("\n");

    

    return 0;    

}









- 순차 탐색

배열 요소의 데이터 값을 처음부터 순서대로 하나씩 꺼내서 원하는 요소를 찾을 때 까지 탐색

배열의 모든 요소를 처음부터 끝까지 탐색하기 때문에 다소 시간이 소요됨

비교적 간단한 탐색 방식












* 예시 - 1~7 사이의 값을 입력 받아 배열에서 탐색해서 해당 인덱스를 반환하는 코드

#include <stdio.h>

#define AL 7


int main(void) {

    int s_list[7] = { 3, 6, 1, 4, 7, 5, 2 };

    int input, cnt;

    char yn;


    while(1) {

        printf("1~7중에 하나를 입력하시오 => ");

        scanf_s(" %d", &input);

        if (input > 7 || input < 1) {

            printf("숫자를 잘못 입력했습니다.\n");

            continue;

        }

        // 입력값과 배열의 요소를 순차적으로 비교

        for (cnt = 0; cnt < AL; cnt++) {

            if (input == s_list[cnt]) {

                printf("순차 탐색 횟수 : %d\n", cnt+1);

                printf("탐색 성공 인덱스 : %d\n", cnt);

            }

        }

        re_yn:

            printf("프로그램 재실행 여부 (y/n) => ");

            scanf_s(" %c", &yn, sizeof(yn));

            if (yn == 'y' || yn == 'Y') {

                continue;

            }

            else if (yn == 'n' || yn == 'N') {

                break;

            }

            else {

                printf("다시 입력하시오\n");

                goto re_yn;

            }

    }

    return 0;

}















- 이진 탐색

찾고자 하는 값을 배열의 중앙에서부터 탐색하는 방법

배열의 중앙을 기준으로 두 분으로 나누어 값의 크기를 기준으로 탐색할 방향 선정

배열이 미리 순서대로 정렬되어 있어야 사용이 가능 - 정렬되지 않았다면 먼저 정렬을 진행한 후 진행






















* 예시 - 1~8 사이의 값을 입력 받아 배열에서 이진 탐색을 수행하는 코드

#include <stdio.h>

#define AL 8

int b_s(int list[], int n, int input); //사용자정의함수 선언


int main(void) {

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

    int input, search;

    char yn;


    while (1) {

        printf("1~8중에 하나를 입력하시오 => ");

        scanf(" %d", &input);

        if (input > 8 || input < 1) {

            printf("숫자를 잘못 입력했습니다.\n");

            continue;

        }

        search = b_s(sno, AL, input); // 이진 탐색 함수 호출

        printf("탐색 성공 인덱스 : [%2d]\n", search);

    re_yn:

        printf("프로그램 재실행 여부 (y/n) => ");

        scanf(" %c", &yn, sizeof(yn));

        if (yn == 'y' || yn == 'Y') {

            continue;

        }

        else if (yn == 'n' || yn == 'N') {

            break;

        }

        else {

            printf("다시 입력하시오\n");

            goto re_yn;

        }

    }

    return 0;

}

// 이진 탐색 함수

int b_s(int list[], int n, int input) {

    int low = 0; // 하한값

    int high = n - 1; // 상한값

    int md, cnt = 1; // 중간값, 카운트 변수

    

    while (low <= high) {

        //중간값 위치 산출

        md = (low + high) / 2;


        // 하한과 상한 출력

        printf("%d회 이진 탐색 : [%d %d] (md : %d)\n", cnt, low, high, md);

        if (input == list[md]) {

            return md; // 값을 찾으면 요소의 인덱스 값 반환

        }

        else if (input > list[md]){

            low = md + 1;

        }

        else if (input < list[md]){

            high = md - 1;

        }

        cnt++;

    }

}

















5. 다차원 배열


- 다차원 배열의 개념

배열의 크기를 지정하는 부분([ ])이 2개 이상인 배열

3차원 배열은 '배열명'[면][행][열] 형식으로 선언 





- 2차원 배열

배열의 크기를 선언하는 부분이 두 개인 배열


*  2차원 배열의 선언 형식

자료형 '배열명'[행][열] 형식으로 선언

예) int arr[3][2];



* 2차원 배열 요소의 참조

인덱스 2개 필요

앞에 선언하는 인덱스는 행, 뒤에 선언하는 인덱스는 열을 의미

인덱스는 0부터 시작

예) arr[0][1];

 


* 2차원 배열의 초기화

1차원 배열과 마찬가지로 정수형, 실수형, 문자형 배열을 사용할 수 있음

2차원 배열을 초기화하는 3가지 방법


(1) 초깃값 나열

배열 요소의 초깃값을 나열해서 표현 

2차원 배열 요소의 행과 열 구분이 쉽지 않아 권장하지 않음

예) int arr[2][3] = {1,2,3,4,5,6};


(2) 행별로 초깃값 구분

중괄호 ({ })를 사용하여 초깃값을 행별로 묶어서 구분

2차원 배열 요소를 쉽게 파악할 수 있음

예) int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};


(3) 행별로 초깃값 구분 후 열별로 구분

가장 많이 사용하는 방식

중괄호({ })를 사용하여 행별로 초깃값을 구분한 뒤 다시 열별로 구분

가독성이 가장 좋음

예) int arr[2][3] = {

{1, 2, 3},

{4, 5, 6}};




- 2차원 배열의 사용


* 예시 - 3 명의 환자의 5일치 혈압 자료로 개인별 평균 혈압 산출 

#include <stdio.h>

#define R 3 // 환자 수

#define C 5 // 혈압 측정 횟수


int main(void) {

   int cnt, total;

   float avg;

   int bd[R][C+1] = { // 환자 번호, 1~5일치 혈압 기록

      {220601, 135, 148, 150, 153, 161},

      {220603, 115, 120, 113, 122, 124},

      {220607, 134, 128, 134, 130, 129}};


   printf(">> 고혈압 판정 기준 : 수축기 혈압 140 초과\n");


   for (cnt = 0; cnt < R; cnt++) {

      total = 0;

      for(int i = 1; i <= C; i++){

         total += bd[cnt][i];

      }

      avg = total / 5.0;

      printf("\n환자 %d의 수축기 평균 혈압 및 판정\n", cnt+1);

      printf("번호 : %d\n", bd[cnt][0]);

      printf("평균 혈압 : %.2f\n", avg);

      // 혈압 판정

      if (avg > 140)

         printf("판정 : 고혈압\n");

      else

         printf("판정 : 정상\n");

   }

}














* 예시 - 2차원 배열로 학생 2명의 이름과 3개 과목의 점수를 입력받아 총점과 평균 산출

#include <stdio.h>

#define N 20 // 학생 이름 수

#define R 2 // 학생 수

#define C 3 // 과목 수


int main(void) {

   int row, col, total;

   float avg;

   char name[N]; // 이름 저장 배열

   int st[R][C]; // 점수 저장 배열


   for (row = 0; row < R; row++) {

      printf("> 학생 %d의 이름과 3개 과목 점수 입력\n", row + 1);

      printf("%d. 이름 : ", row + 1);

      scanf_s("%s", name, sizeof(name));

      total = 0;

      for (col = 0; col < C; col++) {

         printf("과목%d 점수 : ", col + 1);

         scanf_s("%d", &st[row][col]);

         total += st[row][col];

      }

      printf("\n");

      avg = total / 3.0;


      printf("%s의 성적 현황 \n", name);

      printf("총점 : %d\n", total);

      printf("평균 : %.2f\n\n\n", avg);

   }

}



















* 2차원 배열을 이용한 틱택토 게임 구현

#include <stdio.h>

# define R 3 // 가로 좌표 개수

# define C 3 // 세로 좌표 개수


void grid(int tic[R][C]); // 게임판 출력 사용자정의 함수 선언


int main(void) {

   int tic[R][C];

   int row, col, p, g; // p : 플레이 횟수


   printf("게임 실행 횟수 제한 : 총 9회\n\n");

   

   // 게임판 초기화

   for (row = 0; row < R; row++) {

      for (col = 0; col < C; col++) {

         tic[row][col] = ' ';

      }

   }

   grid(tic); // 게임판 출력하는 사용자 정의 함수


   // 사용자에게 위치 입력받기

   printf("게임 요령 -> 허용 범위 : 0~2 로 x, y 좌표를 입력\n");


   for (p = 0; p < 9; p++) {

      re_play:

         if (p % 2 == 0)

            printf("1번 플레이어 입력 : ");

         else

            printf("2번 플레이어 입력 : ");

      

         scanf("%d %d", &row, &col);

         if (row < 0 || row>2 || col < 0 || col>2) {

            printf("입력 오류...다시 입력하시오\n");

            goto re_play;

         } // 플레이어 별로 다르게 화면에 표시

         tic[row][col] = (p % 2 == 0) ? 'O' : 'X';

         grid(tic);

   }

   printf("\n\n게임 종료\n");

   printf("게임 결과\n");

   grid(tic);

}

void grid(int tic[R][C]) { // 게임판 출력 함수 정의

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

   printf("| %c | %c | %c |\n", tic[0][0], tic[0][1], tic[0][2]);

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

   printf("| %c | %c | %c |\n", tic[1][0], tic[1][1], tic[1][2]);

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

   printf("| %c | %c | %c |\n", tic[2][0], tic[2][1], tic[2][2]);

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

}
















* 2차원 배열을 함수의 인수로 전달 

2차원 배열도 함수를 호출할 때 인수로 사용할 수 있음

배열 요소의 원본 값이 전달되므로 원본이 변경되지 않게 하려면 인수로 전달하는 배열 이름 앞에 'const' 키워드 사용 


* 예시 - 5개 품목에 대한 3년간의 매출액 데이터의 총 합을 구하는 함수

#include <stdio.h>

# define Y 3 // 년도 수

# define P 5 // 제품 수


int sum(int sale[Y][P]); // 매출액 함계를 구하는 사용자 정의 함수


int main(void) {

    int row, col, total = 0;

    // 5가지 제품에 대한 3년 동안의 판매 기록

    int sale[Y][P] = {{202, 353, 127, 85, 786},

                    {203, 375, 147, 95, 764},

                    {207, 367, 174, 76, 758}};

    printf("제품별 판매액\n");

    printf("A   B   C   D   E\n");

    for (row = 0; row < Y; row++){

        for(col = 0; col < P; col++){

            printf("%d\t", sale[row][col]);

        }

        printf("\n");

    }

    total = sum(sale); // 사용자 정의 함수 호출

    printf("3년간 총 매출액 : %d만원\n", total);

}

int sum(int sale[Y][P]) { // 2차원 배열을 인수로 전달받아 합계를 구하는 사용자 정의 함수

    int row, col, total = 0;

    for(row = 0; row < Y; row++){

        for(col = 0; col < P; col++){

            total += sale[row][col];

        }

    }

    return total;

}












- 3차원 배열


* 3차원 배열의 선언 형식

2차원 배열 앞에 [면]에 해당하는 배열의 크기가 추가

[면][행][열] 순서로 배열을 선언

3차원 배열의 기본 특징징과 처리방법은 2차원배열과 비슷

예) int arr[3][2][2];



* 3차원 배열의 초기화

[면]에 해당하는 인덱스가 가장 먼저 확보되고 차례대로 [행], [열]에 해당하는 인덱스가 확보

2차원 배열과 마찬가지로 중괄호({ })를 구분자로 사용해서 초깃값 선언

배열 요소의 개수가 많아지므로 중괄호({ })로 묶어서 초깃값을 선언하는것 권장

예) int arr[2][2][2] ={{{1,2},{3,4}}

                                    {{5,6}, {7,8}}};




* 예시 - 3차원 배열을 사용하여 인덱스 출력

#include <stdio.h>

# define P 2 // 면

# define R 2 // 행

# define C 2 // 열


int main(void) {

    int pg, row, col;   // 면, 행, 열의 변수

    int index[2][2][2] = {{{1,2},{3,4}},

                        {{5,6}, {7,8}}};

    

    for (pg = 0; pg < P; pg++){ // 면 출력

        printf("[%d면 출력]\n", pg);

        for (row = 0; row < R; row++){  // 행 출력

            printf("%d행 출력 => ", row);

            for (col = 0; col < C; col++){  // 열 출력

                printf("%2d", index[pg][row][col]);

                printf("[%d][%d][%d] ", pg, row, col);

            }

            printf("\n"); // 열을 모두 출력하면 줄 바꿈

        }

    }

}













댓글

이 블로그의 인기 게시물

Spring Boot 6. 계시판 프로젝트

Spring Boot 2. Maria 데이터베이스 & Spring Data JPA

Django 10. DB 연동