Language/C

C - 1, 2차원 배열 포인터 & 함수

ShinyOcean 2021. 1. 27. 12:04

C언어를 주제로 한  여섯번째 포스팅은 다차원 배열과 포인터, 함수에 대하여 다루어보겠습니다.

 

 

지금까지는 1차원배열과 그 배열에 포인터를 링크하여 주소에 접근하는 것을 위주로 스터디 하였습니다.

이번 포스팅에서는 1차원배열들이 모여 만들어진 2차원배열과 그 배열의 주소에 접근하는 포인터와 간단한 함수의 선언과 사용에 대하여 다루어보겠습니다.

 

먼저 일차원 배열과 함수를 활용한 예제문제를 통하여 함수와 배열을 연습해보겠습니다.

 

C 예제문제 7번 -  50에서 99사이의 값을 20개 만들어 1차원배열을 초기화하고 가장큰값과 그값의 인덱스를

                         리턴해주는 프로그램을 작성하시오

 

해결 과정)

Step1) 50~99 사이의 난수만들어서 1차원 배열에 초기화하기

srand((long)time(NULL));

        int arr[20];

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

                 arr[i]= rand() % 50 + 50;

        }

사이즈가 20인 배열을 선언 하여 50~99까지의 난수를 배열의 각원소에 초기화 하였습니다.

이때 사용되는 srand()함수 time()함수 rand()함수는 time.h, stdlib.h 헤더파일 두가지를 포함시키고 사용하여야합니다

 

Step2) 배열을 매개변수로 불러 들여 가장큰 원소의 값을 돌려주는 함수를 선언하기

        int maxFider(int size , int arr[]) {

        int max=0;

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

        {

                 if (max < *(arr + i)) {

                         max = *(arr + i);

                 }

        }

        return max;}

 

저는 maxFinder라는 이름으로 배열의 사이즈와 배열을 불러와서 사이즈만큼의 포루프를 돌리고 가장큰 값을 찾아내는 함수를 코딩하였습니다. max값의 초기화와 조건검사는 *(arr + i)이런식으로 배열을 포인터로 취급하여 연산을 진행 하였습니다.

 

Step3) 배열을 매개변수로 불러 들여 가장큰 값이 들어있는 원소의 인덱스를 돌려주는 함수 선언하기

int maxIndexFider(int size, int arr[]) {

        int max = 0;

        int maxIndex=0;

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

        {

                 if (max < *(arr + i)) {

                         max = *(arr + i);

                         maxIndex = i;

                 }

        }

        return maxIndex;}

함수의 이름은 maxIndexFinder라고 선언하였고 배열과 배열의 사이즈를 불러오게 하였습니다. Step2maxFinder함수를 응용하여 max값이 변경될때마다 그 인덱스 i값을 maxindex라는 변수에 저장하고 리턴하였습니다.

 

Step4) 마지막으로 선언해둔 함수들을 메인 함수에서 사용하여 결과를 출력하였습니다.

 

전체 코드)

#include <stdio.h>

#include<stdlib.h>

#include<time.h>

 

int maxFider(int size , int arr[]) {

          int max=0;

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

          {

                   if (max < *(arr + i)) {

                             max = *(arr + i);

                   }

          }

          return max;

}

int maxIndexFider(int size, int arr[]) {

          int max = 0;

          int maxIndex=0;

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

          {

                   if (max < *(arr + i)) {

                             max = *(arr + i);

                             maxIndex = i;

                   }

          }

          return maxIndex;

}

int main(void) {

 

          printf("<1번 문제>\n\n");

          srand((long)time(NULL));

          int arr[20];

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

                   arr[i]= rand() % 50 + 50;

          }

          for (int i = 0 ; i < sizeof(arr)/sizeof(arr[0]) ; i++)

          {

 

                   printf("%d ", *(arr +i));

                   if (i== 9) {

                             printf("\n");

                   }

          }

          printf("\n\nmax : %d\n",maxFider(sizeof(arr)/sizeof(arr[0]),arr));

          printf("maxIndex : arr[%d]\n", maxIndexFider(sizeof(arr) / sizeof(arr[0]), arr));

 

          return 0;

}

 

결과 콘솔)

 

다음은 2차원배열과 함수를 사용한 예제문제를 해결하며 다차원배열과 함수의 사용을 알아보겠습니다.

 

C 예제문제 7번 - 다음의 조건에 알맞은 프로그램을 작성하시오

1)  50 ~ 99 사이의 값을 20개 만드는데 --> 2차원 [4][5] 배열에 넣기
2) 2
번 문제의 2차원 배열에서 함수4는 가장 작은 값의 위치 (i, j) 찾아 주기.
   
함수2에서는 그 배열을 2차원 배열로 받아서  ([4][5] 짜리 배열)
   
전체 중 가장 작은 값을 찾아서 돌려주기.

 

해결 과정)

Step1) 50~99 사이의 난수만들어서 2차원 배열에 초기화하기

 

        srand((long)time(NULL));

        int arr[4][5];

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

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

                         arr[i][j]= rand() % 50 + 50;

                 }

        }

이번에는 2차원배열의 원소값을 난수로 초기화 해주기위해 행과열의 사이즈만큼의 포루프를 돌려서 각원소에 값을 초기화 해주었습니다. 이번에도 역시 50~90사이의 난수이기 때문에 초기화 하는 값은 rand() % 50 + 50로 코딩하였습니다.

 

Step2) 2차원 배열을 매개변수로 하여 최소값을 리턴하는 함수 작성하기

 

int minFider(int arr[4][5]) {

        int min = 90;

 

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

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

                         printf("%d ", *(arr[i] + j));

                         if (min > *(arr[i] + j)) {

                                 min = *(arr[i] + j);

                         }

                 }

                 printf("\n");

        }

        return min;}

함수의 이름은 minFinder로 하였고 2차원배열을 입력 받아 화면에 출력하고 최소값을 돌려주게 코딩하였습니다. 이번에도 값의 초기화는 행과열의 포인터를 이용하여 *(arr[i] + j)값을 증가시키면서 초기화를 진행하였습니다

 

Step3) 2차원 배열을 매개변수로 하여 최소값이 들어있는 원소의 인덱스를 출력하는 함수 작성

void minIndexPrinter(int arr[4][5]) {

        int min = 90;

        int col, row;

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

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

                         if (min > *(arr[i] + j)) {

                                 min = *(arr[i] + j);

                                 row = i;

                                 col = j;

                         }

                 }

        }

        printf("minindex : arr[%d][%d]", row, col);

        return 0;

}

void형의 minIndexFinder라는 이름으로 함수를 선언하였습니다.

Step2의 최소값을 찾는 과정을 반복하고 최소값이 초기화될때마다 그때의 행과열의 값을 초기화 해주는 함수를 작성하였습니다. 처음에는 I,j두개의 변수를 리턴해주는 함수를 만들고싶었지만 성공하지 못하였고 I,j값을 리턴해주는 함수를 따로따로 선언하려고 했습니다만 코딩라인이 너무 길어지는 것 같아서 void형의 값을 직접 출력해주는 함수로 선언하였습니다.

 

 

Step4) 마지막으로 선언해둔 함수들을 메인 함수에서 사용하여 결과를 출력하였습니다.

 

전체 코드)

#include <stdio.h>

#include<stdlib.h>

#include<time.h>

int minFider(int arr[4][5]) {

          int min = 90;

 

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

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

                             printf("%d ", *(arr[i] + j));

                             if (min > *(arr[i] + j)) {

                                      min = *(arr[i] + j);

                             }

                   }

                   printf("\n");

          }

 

          return min;

}

 

void minIndexPrinter(int arr[4][5]) {

          int min = 90;

          int col, row;

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

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

                             if (min > *(arr[i] + j)) {

                                      min = *(arr[i] + j);

                                      row = i;

                                      col = j;

                             }

                   }

          }

          printf("minindex : arr[%d][%d]", row, col);

          return 0;

}

int main(void) {

 

          printf("<2번 문제>\n\n");

         

          srand((long)time(NULL));

         

          int arr[4][5];

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

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

                             arr[i][j]= rand() % 50 + 50;

                   }

          }

 

          printf("\nmin : %d\n", minFider(arr));

 

          minIndexPrinter(arr);

 

          return 0;

}

 

결과 콘솔)