2011년6월8일_C과제8(코드오류수정(배열), 2차원배열연습, 짝수 검색, 2의 배수/3의 배수 검색, swap(문자교체))

 

 

C과제8


1. 잘못된 부분을 찾아서 고치고, 이유를 설명하세요.

1) int Num[];
   
int pNum = &Num;

답: int Num[10]; //10개의 저장공간
    int *pNum = Num; //포인터변수 pNum에 배열Num의 주소를 넣음.

    배열의 크기를 지정하지 않으면 메모리에 얼마나 예약해야 되는지 모르니 다음과 같은 에러가 난다.
    clip_image002

    일반변수에 주소를 넣으면 다음과 같은 경고가 난다.

    clip_image004

    주소를 담는 변수는 포인터변수이고 일반변수는 주소를 담아도 쓸 수 없다. 주소는 주소일 뿐...



2) char test[4] = {a, b, c, d};

답: char test[4] = {‘a’, ‘b’, ‘c’, ‘d’};
    a~d는 상수가 아닌 변수이다. a~d를 문자상수로 바꾸어 대입.
    다르게…
    배열 선언 전에 변수 a~d를 선언하지 않았다. a~d를 선언해 주면 된다.
    test[0]에는 a의 값, test[1]에는 b의 값, test[2]에는 c의 값, test[3]에는 d의 값이 들어간다.



3) int Arr1[] = {1, 2, 3, 4};
   int Arr2[][] = {1, 2, 3, 4, 5, 6, 7};

답: int Arr2[][7] = {1, 2, 3, 4, 5, 6, 7};
    배열의 첫 번째 색인은 생략이 가능하나 두 번째 색인부터는 꼭 명시해야 함.



4) int N1 = 3, N2 = 5;
   int* const pN1 = &N1;
   pN1 = &N2;

답: const int *pN1 = &N1;

pN1이 const(상수)형이라 pN1 초기화 시에 한 번 값을 넣으면 다시 변경할 수 없다.
const를 int앞에 붙이면 포인터pN1이 가리키는 곳의 값이 상수형이라는 뜻이니 pN1에 주소를 다시 넣을 수 있다. 그렇지만 가리키는 곳이 상수니 *pN1에 값을 대입하는 것은 불가능하다.




5) int N1 = 3, N2 = 5;
   const int* pN1 = &N1;
   pN1 = &N2;

답: 포인터변수 pN1은 N1과 N2 두 변수의 주소값을 참조하여 읽을 순 있으나 쓸 수 없다.



2. 그림을 보고 2차원 배열 선언 및 초기화를 작성해보세요.

1)

4

1

2

3

7

8

9

답: int aArr[3][4] = {{4},
                       {1, 2, 3},
                       {7, 8, 9}};


2)

5

1

2

3

1

7

9

8

8

답: int aArr[5][4] = {{5},
                       {1, 2, 3},
                       {1, 7, 9},
                       {8, 8}};



3) for문 사용

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

답:

   1:  #include <stdio.h>
   2:   
   3:  #define ROW        4            //행
   4:  #define COL        5            //열
   5:   
   6:  int main()
   7:  {
   8:      int aArr[ROW][COL];        // 4 by 5 배열 선언
   9:      int i;                    // 반복제어변수 (행)
  10:      int j;                    // 반복제어변수 (열)
  11:   
  12:      //배열에 값을 대입.
  13:      for(i = 0 ; ROW > i ; ++i)
  14:      {
  15:          for(j = 0 ; COL > j ; ++j)
  16:          {
  17:              aArr[i][j] = (i * 5) + (j + 3);
  18:          }
  19:      }
  20:   
  21:      //배열에 있는 값들을 출력
  22:      for(i = 0 ; ROW > i ; ++i)
  23:      {
  24:          for(j = 0 ; COL > j ; ++j)
  25:          {
  26:              printf("%-3d", aArr[i][j]);    //좌측정렬3자리
  27:          }
  28:          
  29:          printf("\n");
  30:      }
  31:      
  32:      return 0;
  33:  }



image






3. 다음과 같은 2차원 배열이 있을 때 다음 물음에 답하세요.

0

3

6

9

12

30

15

18

21

24

27

105

30

33

36

39

42

180

45

54

63

72

81

315

1) 짝수를 모두 출력하세요.

   1:  /*
   2:      3. 다음과 같은 2차원 배열이 있을 때 다음 물음에 답하세요.
   3:      0    3    6    9    12    30
   4:      15    18    21    24    27    105
   5:      30    33    36    39    42    180
   6:      45    54    63    72    81    315
   7:      1) 짝수를 모두 출력하세요.
   8:       
   9:      2) 2의 배수이면서 3의 배수인 숫자의 합계는 얼마입니까?
  10:       
  11:      3) 전체 합계와 평균 출력(평균은 소수점 두 자리까지).
  12:  
  13:  */
  14:   
  15:  //1) 짝수
  16:  #include <stdio.h>
  17:   
  18:  int main()
  19:  {
  20:      int aArr[4][6] = {{0, 3, 6, 9, 12, 30},
  21:                      {15, 18, 21, 24, 27, 105},
  22:                      {30, 33, 36, 39, 42, 180},
  23:                      {45, 54, 63, 72, 81, 315}};
  24:      int iRow;
  25:      int iCol;
  26:   
  27:      for(iRow = 0 ; 4 > iRow ; ++iRow)
  28:      {
  29:          for(iCol = 0 ; 6 > iCol ; ++iCol)
  30:          {
  31:              if(0 == (aArr[iRow][iCol] % 2))
  32:              {
  33:                  printf("%5d", aArr[iRow][iCol]);                
  34:              }
  35:          }
  36:      }    
  37:      
  38:      return 0;
  39:  }



clip_image002[5]

 

 

2) 2의 배수이면서 3의 배수인 숫자의 합계는 얼마입니까?


   1:  /*
   2:      3. 다음과 같은 2차원 배열이 있을 때 다음 물음에 답하세요.
   3:      0    3    6    9    12    30
   4:      15    18    21    24    27    105
   5:      30    33    36    39    42    180
   6:      45    54    63    72    81    315
   7:      1) 짝수를 모두 출력하세요.
   8:       
   9:      2) 2의 배수이면서 3의 배수인 숫자의 합계는 얼마입니까?
  10:       
  11:      3) 전체 합계와 평균 출력(평균은 소수점 두 자리까지).
  12:  
  13:  */
  14:   
  15:  //2의 배수이면서 3의 배수인 숫자의 합계
  16:   
  17:  #include <stdio.h>
  18:   
  19:  int main()
  20:  {
  21:      int aArr[4][6] = {{0, 3, 6, 9, 12, 30},
  22:                      {15, 18, 21, 24, 27, 105},
  23:                      {30, 33, 36, 39, 42, 180},
  24:                      {45, 54, 63, 72, 81, 315}};
  25:      int iRow;
  26:      int iCol;
  27:      int iSum = 0;
  28:   
  29:      for(iRow = 0 ; 4 > iRow ; ++iRow)
  30:      {
  31:          for(iCol = 0 ; 6 > iCol ; ++iCol)
  32:          {
  33:              if(0 == (aArr[iRow][iCol] % 2) && 0 == (aArr[iRow][iCol] % 3))
  34:              {
  35:                  iSum = iSum + aArr[iRow][iCol];
  36:              }
  37:          }
  38:      }    
  39:      
  40:      printf("2의 배수이면서 3의 배수인 숫자의 합은 %d입니다.\n", iSum);
  41:      
  42:      return 0;
  43:  }




clip_image002[7]


 

3) 전체 합계와 평균 출력(평균은 소수점 두 자리까지).

   1:  /*
   2:      3. 다음과 같은 2차원 배열이 있을 때 다음 물음에 답하세요.
   3:      0    3    6    9    12    30
   4:      15    18    21    24    27    105
   5:      30    33    36    39    42    180
   6:      45    54    63    72    81    315
   7:      1) 짝수를 모두 출력하세요.
   8:       
   9:      2) 2의 배수이면서 3의 배수인 숫자의 합계는 얼마입니까?
  10:       
  11:      3) 전체 합계와 평균 출력(평균은 소수점 두 자리까지).
  12:  
  13:  */
  14:   
  15:  //전체 합계와 평균 출력
  16:  #include <stdio.h>
  17:   
  18:  int main()
  19:  {
  20:      int aArr[4][6] = {{0, 3, 6, 9, 12, 30},
  21:                      {15, 18, 21, 24, 27, 105},
  22:                      {30, 33, 36, 39, 42, 180},
  23:                      {45, 54, 63, 72, 81, 315}};
  24:      int iRow;
  25:      int iCol;
  26:      int iSum = 0;
  27:      float fAvg;
  28:   
  29:      for(iRow = 0 ; 4 > iRow ; ++iRow)
  30:      {
  31:          for(iCol = 0 ; 6 > iCol ; ++iCol)
  32:          {
  33:              iSum = iSum + aArr[iRow][iCol];
  34:          }
  35:      }
  36:   
  37:      fAvg = iSum / (float)(iRow * iCol);
  38:      
  39:      printf("배열의 전체 합은 %d이고,\n", iSum);
  40:      printf("배열의 원소들의 평균은 %.2f입니다.\n", fAvg);
  41:      
  42:      return 0;
  43:  }




clip_image002[9]

 


 

4. 입력받은 char형 데이터 두 개를 서로 바꾸는 swap 함수를 만들어 다음과 같은 프로그램을 구현하세요.

출력) 문자 입력 ch1 : A
       문자 입력 ch2 : C
       swap 전 : ch1=A, ch2=C
       swap 후 : ch1=C, ch2=A

      문자 입력 ch1 : D
      문자 입력 ch2 : E
      swap 전 : ch1=D, ch2=E
      swap 후 : ch1=E, ch2=D

   1:  /*******************************************************************
   2:  
   3:      4. 입력받은 char형 데이터 두 개를 서로 바꾸는 swap 함수를 
   4:         만들어 다음과 같은 프로그램을 구현하세요.
   5:  
   6:      출력)    문자 입력 ch1 : A
   7:              문자 입력 ch2 : C
   8:              swap 전  :  ch1=A, ch2=C
   9:              swap 후  :  ch1=C, ch2=A
  10:  
  11:              문자 입력 ch1 : D
  12:              문자 입력 ch2 : E
  13:              swap 전  :  ch1=D, ch2=E
  14:              swap 후  :  ch1=E, ch2=D
  15:  
  16:  
  17:      작성자: 김수만
  18:      작성일자: 2011년 6월 7일
  19:  
  20:  *******************************************************************/
  21:  #include <stdio.h>
  22:   
  23:  void SwapChar(char *, char *);
  24:   
  25:   
  26:  int main()
  27:  {
  28:      char cCh1;
  29:      char cCh2;
  30:      
  31:      printf("문자 입력 ch1 : ");
  32:      scanf(" %c", &cCh1);
  33:      
  34:      printf("문자 입력 ch2 : ");
  35:      scanf(" %c", &cCh2);
  36:      
  37:      
  38:      printf("   swap전 : ch1 = %c, ch2 = %c\n", cCh1, cCh2);
  39:      
  40:      SwapChar(&cCh1, &cCh2);        //ch1과 ch2를 서로 바꿈.
  41:      
  42:      printf("   swap후 : ch1 = %c, ch2 = %c\n", cCh1, cCh2);
  43:   
  44:      return 0;
  45:  }
  46:   
  47:  //1Byte자료형의 데이터를 교환하는 함수.
  48:  void SwapChar(char *pCh1, char *pCh2)
  49:  {
  50:      char cTemp;
  51:      
  52:      cTemp = *pCh1;        //임시저장.
  53:      *pCh1 = *pCh2;        //2를 1으로 
  54:      *pCh2 = cTemp;        //1을 2로 바꿈.
  55:   
  56:      return ;
  57:  }

clip_image002[11]





 

C과제8풀이



1. 잘못된 부분을 찾아서 고치고, 이유를 설명하세요.

   

1) int Num[];
   
int pNum = &Num;

    Num배열의 크기가 없음. Num[3]; 또는 Num[] = {1, 2, 3};
    주소를 저장하는 변수는 포인터.   int *pNum = Num;    (배열이름 자체가 주소)



2) char test[4] = {a, b, c, d};

   문자를 넣으려면 작은 따옴표로 둘러싸야함. char test[4] = {‘a’,  ‘b’, ‘c’, ‘d’};



3) int Arr1[] = {1, 2, 3, 4};
   int Arr2[][] = {1, 2, 3, 4, 5, 6, 7};

   Arr2배열의 열 사이즈가 없다. 
   Arr2[][3] = {{1, 2, 3},
                 {4, 5, 6},
                 {7}};           이 때 행의 크기는 자동으로 3이 된다.

★ 배열의 초기화가 없으면 사이즈를 기입해야 하고 초기화 했으면 사이즈는 자동으로 컴파일러가 계산해 준다.



4) int N1 = 3, N2 = 5;
    int* const pN1 = &N1;
   pN1 = &N2;

   const를 앞에 붙이면 상수라는 의미. pN1이라는 포인터변수자체가 상수가 되어 한 번 초기화되면 다시 쓰는 행위를 할 수 없다.
   const를 빼면 pN1은 읽기와 쓰기 모두 가능하다.

const
    int const a=3;
    a=b;   <- 에러!!
   a라는 const로 선언되어 초기화 후에는 읽기만 가능함.
   const double pi = 3.14;   
   pi에 대입하면 컴파일단계에서 에러가 나니 프로그래머의 실수를 알기 쉽다. (π와 같이 읽기만 원하는 변수에 적용)



5) int N1 = 3, N2 = 5;
    const int* pN1 = &N1;
    pN1 = &N2;

   int*앞에 const가 붙어 pN1이라는 변수가 가리키는 곳(변수)의 값이 상수이다.
   상기의 코드는 아무 문제가 없으나 포인터변수pN1를 이용해 N1이나 N2의 주소를 참조하여 쓰면 에러.

   image image

  N1 = 4; (가능)
  *pN1 = 4; (불가능)  (N2의 주소를 참조하여 쓰기)
  변수 = *pN1;   (읽기는 가능.)

  const int N1 = 3;
  N1 = 4;   (에러)
  int N1 = 3;
  N1 = 4;  (읽기/쓰기 모두 가능)
  const int *pN = &N1;   (포인터 접근시 읽기만 가능)
  
★ 읽기만 해야 할 변수 접근시 const로 선언하면 안전.

 



2. 그림을 보고 2차원 배열 선언 및 초기화를 작성해보세요.

1)과 2)는 생략.

3) for문 사용
   int num = 3;
  중첩for문 내에 arr3[i][j] = num ++;

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

 

 

 

3. 다음과 같은 2차원 배열이 있을 때 다음 물음에 답하세요.

 

0

3

6

9

12

30

15

18

21

24

27

105

30

33

36

39

42

180

45

54

63

72

81

315

 

1) 짝수만 필터
  if((a[i][j] % 2) == 0)

 

2) 2의 배수이면서 3의 배수
  if((a[i][j] % 2) == 0 && (a[i][j] % 3) == 0)


3) 합과 평균
  sum += a[i][j];
  평균은 너무 빨리 지나가서 보지 못 하였으나 평균식대로 하면...
  avg = sum / 원소의 갯수(60);

★3번 문제는 하나의 프로그램으로 만들 것. 함수사용.

 

 

4. 입력받은 char형 데이터 두 개를 서로 바꾸는 swap 함수를 만들어 다음과 같은 프로그램을 구현하세요.

int형 swap( )의 변형 char형으로 바꿈.

N1와 N2의 주소를 *N1과 *N2에 담아…
temp = *N1;
*N1 = *N2;
*N2 = temp;