본문 바로가기
작업/Programming

Perfect C 프로그래밍 연습 9장 1, 2, 3번 해결

 

문제 1.

 

 

배열의 크기를 계산

 

//문제1
    double degree[] = {-5.34, 3.67, 19.76, 28.76, 35.63};

    int size = sizeof(degree) / sizeof(degree[0]) ;
    //배열 전체 바이트 수 / 배열 공간 하나의 바이트 수 = 배열 크기

    for(int i=0; i<size; i++){
        printf("배열 degree[%d]의 원소 값 = %.2f\n", i, degree[i]);
    }

 

배열의 공간의 크기는 자료형에 맞게 정해집니다. (int 4byte, double 8byte)

 

 

sizeof(배열 이름) = 배열이 가지고 있는 전체 크기 (원소 개수 * 자료형 byte)

sizeof(배열 이름[x]) = x 위치의 공간 크기. 배열 공간 하나의 크기와 같음. (자료형 byte)

 

 

 

1차원 배열 B에 대해

sizeof(B) / sizeof(B[0]) = 원소 개수 * n byte / n byte = B의 전체 원소 개수

 

 

 

2차원 배열인 경우

sizeof(배열 이름) = 1차원 배열과 동일

 

sizeof(배열 이름[x]) = sizeof(배열 이름[x][0])과 같으며 행의 공간의 크기

= 행에 포함되어있는 원소들의 크기 (3x2 행렬이면 2 * n byte)  <- 1개의 행에 2개 원소 있음

 

sizeof(배열 이름[][x]) = 원소 1개의 공간의 크기.

 

 

 

따라서 2차원 배열 A에 대해

sizeof(A) / sizeof(A[0]) = A의 행의 개수

sizeof(A[0]) / sizeof(A[][0]) = A의 행이 가지고 있는 원소의 개수

sizeof(A) / sizeof(A[][0]) = A의 전체 원소의 개수 

 

 


문제 2.

 

 

포인터를 사용한 배열의 공간 참조

 

//문제2
    int data[] = {3, 21, 35, 57, 24, 82, 8};
    
    int size = sizeof(data) / sizeof(data[0]); //배열 크기 저장

    for(int i=0; i<size; i++){ //배열 원소들 10씩 저장
        *(data+i) += 10;
    }

    for(int i=0; i<size; i++){ //배열 원소값 출력
       printf("배열 data[%d]의 원소 값 = %d\n", i, data[i]);
    }

 

 

배열은 data[0] 형식으로 값에 접근할 수 있습니다.

따라서 'data+i'는 +i가 배열의 공간 [i]를 의미한다고 생각하면 됩니다.

 

 

data+i가 전체적으로 주소를 나타내기 때문에 이에 대한 값을 보려면 * 연산을 사용합니다.

 

 


문제 3.

 

 

//문제3
    int a[] = {32, 56, 7, 8, 24};
    int b[] = {3, 21, 35, 57, 24, 82, 8};
    int c[12] = {0};
  
    //변수 두 개에 배열 a와 b의 원소 수 저장
    int countA = sizeof(a) / sizeof(a[0]);
    int countB = sizeof(b) / sizeof(b[0]);

    for(int i=0; i<countA; i++){
        c[i] = a[i];
    }
    

    for(int j=countA; j<countA+countB; j++){
          c[j] = b[j-countA];
     }


    for(int k=0; k<sizeof(c)/sizeof(c[0]); k++){
        printf("c[%d]의 원소 = %d\n", k, c[k]);
    }

 

 

a와 b의 원소 크기를 모두 알고 있다고 가정하여  c의 배열 크기를 지정하였습니다.

 

 

a의 원소는 반복문의 i를 0부터 시작해서 집어넣기만 하면 됩니다.

 

 

b의 원소의 경우에는 a의 원소가 들어간 공간 다음부터 추가가 되어야 합니다.

그렇기 때문에 반복문의 j의 시작을 a의 원소 크기(countA)로 합니다.

 

 

a의 원소는 0 ~ countA-1의 공간에 들어있을 것입니다. 따라서 countA부터 시작하고,

c의 원소의 개수는 countA + countB와 같기 때문에 반복 종료 조건으로 사용합니다.

 

 

-끝-