C언어 공부

다차원 배열

Bordercolli 2023. 7. 21. 10:16
728x90
#include <stdio.h>

int main(void)
{  
    // 다차원 배열 multidimentional array
    int arr4[3][3][3]; // 배열 3개 인데, 행이 3, 열이 3임
    // □□□  // □□□  // □□□
    // □□□  // □□□  // □□□
    // □□□  // □□□  // □□□
    int arr2[2][5]= {
        {1,2,3,4,5},
        {1,2,3,4,5}
        };  // 위에서 만든 모형과 비슷한 것을 확인할 수 있다.
    int arr3[4][2]= {{1, 2}, {1, 2},{1, 2}, {1, 2}};
    int arr4[3][3][3]= {
        {
            {1,2,3},
            {1,2,3},
            {1,2,3}},

            {{1,2,3},
            {1,2,3},
            {1,2,3}},

            {{1,2,3},
            {1,2,3},
            {1,2,3}}}
            ;

    return 0;
}

3차원 배열은 이런 방식으로 나간다. 3차원도 이렇게 어려운데 차원이 증가할 수록 더 어려워질 것 같다. 

 

2차원 배열 접근하기

#include <stdio.h>

int main(void){
    int arr3[4][2]={
        {1,2},
        {1,2},
        {1,2},
        {1,2}
    };

    for (int i=0; i<4; i++){
        for (int j=0; j<2; j++)
        {
            printf("2차원 배열 (%d %d)의 값: %d\n", i, j, arr3[i][j]);
        }
        printf("\n");
    }


}

끝에 숫자만 보고 매우 헷갈려다 강사랑 왜 같은 타이핑을 햇는데 왜 난 다른 결과가 나올까 햇는데 첫번째 출력에서 

\n을 하지 않음...

3차원 배열 접근하기

#include <stdio.h>

int main(void){
    int arr[3][3][3]={
        {   {1,2,3},
            {1,2,3},
            {1,2,3}},
        {
            {1,2,3},
            {1,2,3},
            {1,2,3}},
        {
            {1,2,3},
            {1,2,3},
            {1,2,3}
        }

    };

    for (int i=0; i<3; i++)
    {
        for (int j=0; j<3; j++)
        {
            for (int k=0; k<3; k++)
            {
                printf("3차원 배열 (%d,%d,%d)의 값은: %d\n", i, j, k, arr[i][j][k]);
            }
            printf("\n");
        }
        printf("\n");
    }

    return 0;



}

같은 방식으로 k만 덧붙여주면 된다.

빨리 c#으로 넘어가고 싶다...

#include <stdio.h>

int main(void){
    int arr[3][3][3]={
        {   {1,2,3},
            {4,5,6},
            {7,8,9}},
        {
            {11,12,13},
            {14,15,16},
            {17,18,19}},
        {
            {21,22,23},
            {24,25,26},
            {27,28,29}
        }

    };

    for (int i=0; i<3; i++)
    {
        for (int j=0; j<3; j++)
        {
            for (int k=0; k<3; k++)
            {
                printf("3차원 배열 (%d,%d,%d)의 값은: %d\n", i, j, k, arr[i][j][k]);
            }
            printf("\n");
        }
        printf("\n");
    }

    return 0;



}

// 다차원 배열 프로젝트

 

동물뒤집기 프로젝트 미완성 

#include <stdio.h>
#include <time.h>

int arrayAnimal[4][5];  // 동물 배열을 만들어준다. 카드지도라고 보면 된다. (20장카드)
char * strAnimal[10];  // 동물들 이름, string 배열로 만든다. 10개의 공간을 만드는데 거기에 들어가는 데이터들이
// character포인터 형이다.
char * cPtr="테스트"; // character포인터는 이 테스트라는 글자가 메모리 공간상에 만들어진다.
/*어떤 메모리 공간속에 그 동물 이름이 저장된 주소가 있는데, 그 주소를 가지고 있는 것
얘는 바로바로 쉽게 접근할 수 있다.*/

void initAnimalArray();
void initAnimalName();
int getEmptyPosition();
int conv_pos_x(int x);
int conv_pos_y(int y)

int main(void){

    srand(time(NULL));  // 카드를 랜덤으로 뽑을 거니까
    initAnimalArray();   // 동물 배열 만들기    
    initAnimalName();// 동물들 이름
   
    shuffleAnimal();//동물을 맵에 섞어본다.


    return 0;

}


void initAnimalArray()
{
    for(int i=0;i<4; i++)
    {  
         for(int j=0;j<5; j++)
         {
            arrayAnimal[i][j]=-1;
         }

    }
}

void initAnimalName()
{
    strAnimal[0]="원숭이";
    strAnimal[1]="하마";
    strAnimal[2]="강아지";
    strAnimal[3]="고양이";
    strAnimal[4]="돼지";
    strAnimal[5]="코끼리";
    strAnimal[6]="기린";
    strAnimal[7]="낙타";
    strAnimal[8]="타조";
    strAnimal[]9="호랑이";

}

void shuffleAnimal(){
// 역할: 우리가 만들 지도에다가 어떻게 이 동물들을 집어넣을지 배치할지를 정한다.
    for(int i=0; i<10; i++)
    {
        for (int j=0; j<2; j++)
        {  
            int pos=getEmptyPosition(); // 비어있는 위치를 반환해줘
            int x= conv_pos_x(pos);
            int y= conv_pos_y(pos);

            arrayAnimal[x][y]=i;
            //위에서 어떤 값을 반환했을텐데 반환을 햇다하면 반환한 값을 x, y로 변경을 해줘야한다.
            /*이렇게 우리가 가져온 빈공간의 좌표를 우리가 convert해서 한 번 조정을 해서
            x,y좌표를 구했으면 우리가 만든 지도(arraynimal)에 i라는 값을 집어넣으면 된다.
            i는 0부터 10보다 작을때까지니까, 10마리 포지션과 같게 된다.*/

        }
    }}

// 좌표에서 빈 공간 찾기
/*앞에서 x, y를 했는데, 왜 아래에서 random position만 보내고 getemptypostion를 호출하느냐???
반복작업을 줄이기 위해서 정수형 자료 말고, 포인트라는 구조체 등등을 사용할 수 있다.
우리가 아직 안배워서 int로 넘긴다.*/
int getEmptyPosition()
{
        // □□□□□ 0 1 2 3 4 -> 얘들을 5로 나누면 몫은 0
        // □□□□□ 5 6 7 8 9 -> 얘들을 5로 나누면 몫은 1
        // □□□□□ 10 11 12 13 14 -> 얘들을 5로 나누면 몫은 2
        // □□□□□ 15 16 17 18 19 -> 얘들을 5로 나누면 몫은 3

    while(1){
        int randPos=rand()%20; // 20개 공간이니까 20개 공간에서 한 개가 나와야한다. (0~19사이 숫자반환)
        /*만약 19가 나왔으면??
        19는 실제로 3,4좌표에 있는 숫자이다. 그래야 좌표에 접근을 할 수 있다.
        그래서 우리가 19라는 값을 조정해서 ?, ?이라고 바꾸는 작업을 해야한다.*/
        int x=conv_pos_x(randPos);
        int y=conv_pos_y(randPos);

        // 이렇게 조정을 하면 이제 3,4 위치를 알게 되었으니까

        if (arrayAnimal[x][y]==-1)
        {
            //초기화할떄 -1로 지정했기 떄문에 만약 -1이 나올경우 이는 비어있음을 의미한다.
            //만약 -1이 아니라면 비어있지 않은 것이므로 또 다시 좌표를 찾고, 비었는지 확인
            return randPos;

        }
   
        //무한 루프를 돌면서
    }
    return 0;


}


int conv_pos_x(int x)
{

/*역할: 랜덤으로 받은 값을 xy좌표로 바꾸어 주는 것
만약 19였다고 하면 3,4로 바꿔야한다. 19를 5로 나눠보는 것은 어떨까????*/
        return x/5;
}

int conv_pos_y(int x)
{




   
}
   


    /* 의도: 우리가 동물이 4x5이런 형태로 카드가 만들어질텐데 10마리의 동물이 한 쌍씩 만들어진 상태
    여기서 할려는 동작은 일단 이 맵에서 비어있는 위치를 랜덤으로 두개의 공간을 찾는다.
    그러고 그 두 공간에 같은 동물의 이름을 집어넣는다. 이렇게 10번의 작업을 하고나면
    한 번할떄마다 두 번씩 동물이름이 들어가야 하니까 10x2=20번 해서 끝나게 된다.
    이렇게 해서 맵에다가 랜덤으로 동물을 배치를 한다.
    그렇게 하기 위해서 10x2를 위해 이중for문을 만들었다. */


/* 프로젝트 설명
10마리의 서로 다른 동물(각 카드 2장씩)
사용자로부터 두 개의 입력값을 받아서 같은 동물을 찾으면 카드를 뒤집은 상태로 두고 틀리면 원상복귀
모든 동물쌍을 찾으면 게임 종료
총 실패횟수 알려주기
*/

'C언어 공부' 카테고리의 다른 글

구조체  (0) 2023.07.24
다차원배열  (0) 2023.07.24
포인터2  (0) 2023.07.18
C언어 포인터 다시 공부  (0) 2023.07.17
VSCode에서 c언어 시작하기1  (0) 2023.07.17