2011년6월10일_C과제10(배열을 가리키는 포인터 변수, 함수포인터, 과제8-3/과제9-1의 주요부분을 함수로 만들어 인자는 배열의 주소를 넘겨 처리 및 출력)

 

 

일요일(6/12) 시험이라 편집하지 않고 대충 올립니다.

 

C과제10



1. 다음 배열을 가리킬 수 있는 포인터 변수를 선언 및 초기화 하세요.

1) int C[9];
답: int *pC = C;

2) char B[20];
답: char *pB = B;

3) double A[10][10];
답: double (*pA)[10] = A;

4) int D[5][7];
답: int (*pD)[7] = D;

5) char E[4][5];
답: char (*pE)[5] = E;



2. 함수의 선언은 다음과 같습니다. 이 함수를 가리킬 수 있는 포인터 변수를 선언 및 초기화 하세요.

1) char IntToChar(int num);

답: char (*pfn_IntToChar)(int); //함수 포인터 선언
    Pfn_IntToChar = IntToChar; // IntToChar( )의 주소값으로 초기화
    또는…
    char (*pfn_IntToChar)(int) = IntToChar; //함수 포인터 선언과 동시에 초기화


2) void MaxNum(int N1, int N2);

답: void (*pfn_MaxNum)(int, int); //함수 포인터 선언
    pfn_MaxNum = MaxNum; //MaxNum( )의 주소값으로 초기화
    또는…
    void (*pfn_MaxNum)(int, int) = MaxNum; //함수 포인터 선언과 동시에 초기화

3) int OutputIDnum(char* name, int pwd);

답: int (*pfn_OutputIDnum)(char *, int); //함수 포인터 선언
    pfn_OutputIDnum = OutputIDnum; //OutputIDnum( )의 주소값으로 초기화
    또는…
    int (*pfn_OutputIDnum)(char *, int) = OutputIDnum; //함수 포인터 선언과 동시에 초기화

 

 

 

3. 과제8-3번 프로그램에서 2차원 배열 포인터를 이용한 함수를 만들어보세요.

   1:  /************************************************************************
   2:  
   3:      3. 다음과 같은 2차원 배열이 있을 때 다음 물음에 답하세요.
   4:          0    3    6    9    12    30
   5:          15    18    21    24    27    105
   6:          30    33    36    39    42    180
   7:          45    54    63    72    81    315
   8:  
   9:      1) 짝수를 모두 출력하세요.     
  10:      2) 2의 배수이면서 3의 배수인 숫자의 합계는 얼마입니까?     
  11:      3) 전체 합계와 평균 출력(평균은 소수점 두 자리까지).
  12:      
  13:      !!! 1~3번 문제를 합하기 !!!
  14:  
  15:      작성자: 김수만
  16:      작성일자: 2011년 6월 10일
  17:  
  18:  ************************************************************************/
  19:  #include <stdio.h>
  20:   
  21:  #define    ROW    4
  22:  #define    COL    6
  23:   
  24:   
  25:  void Print_Even_Number(int (*)[COL]);
  26:  int Detect_Sum_6_multiple(int (*)[COL]);
  27:  void Print_Sum_Avg_Array(int (*)[COL]);
  28:   
  29:   
  30:   
  31:  int main()
  32:  {
  33:      int aArr[4][6] = {{0, 3, 6, 9, 12, 30},
  34:                      {15, 18, 21, 24, 27, 105},
  35:                      {30, 33, 36, 39, 42, 180},
  36:                      {45, 54, 63, 72, 81, 315}};
  37:      int iRow;
  38:      int iCol;
  39:      int iSum = 0;        //전체 원소의 합.
  40:      int iSum_2and3 = 0;    //6의 배수인 숫자의 합.
  41:   
  42:      printf("\n1) 짝수를 모두 출력하세요.\n");
  43:      Print_Even_Number(aArr);
  44:          
  45:       printf("\n2) 2의 배수이면서 3의 배수인 숫자의 합계는 얼마입니까?\n");    
  46:      
  47:      iSum_2and3 = Detect_Sum_6_multiple(aArr);    
  48:      printf("2의 배수이면서 3의 배수인 숫자의 합은 %d입니다.\n", iSum_2and3);
  49:              
  50:      printf("\n3) 전체 합계와 평균 출력(평균은 소수점 두 자리까지).\n");
  51:      Print_Sum_Avg_Array(aArr);
  52:      
  53:      return 0;
  54:  }
  55:   
  56:  //배열의 주소를 받아 배열의 원소 중 짝수만 출력.
  57:  void Print_Even_Number(int (*aArr)[COL])
  58:  {
  59:      int iRow;
  60:      int iCol;
  61:   
  62:      printf("배열의 값 중 짝수인 수는 다음과 같다.\n");
  63:   
  64:      for(iRow = 0 ; ROW > iRow ; ++iRow)
  65:      {
  66:          for(iCol = 0 ; COL > iCol ; ++iCol)
  67:          {
  68:              if(0 == (*(*(aArr + iRow) + iCol) % 2))
  69:              {
  70:                  printf("%5d", *(*(aArr + iRow) + iCol));
  71:              }
  72:          }
  73:      }
  74:      
  75:      putchar('\n');
  76:   
  77:      return ;    
  78:  }
  79:   
  80:  //배열의 주소를 받아 배열의 원소 중 6의 배수의 합을 구해서 리턴.
  81:  int Detect_Sum_6_multiple(int (*aArr)[COL])
  82:  {
  83:      int iRow;
  84:      int iCol;
  85:      int iSum = 0;
  86:   
  87:      for(iRow = 0 ; ROW > iRow ; ++iRow)
  88:      {
  89:          for(iCol = 0 ; COL > iCol ; ++iCol)
  90:          {
  91:              if(0 == (*(*(aArr + iRow) + iCol) % 6))
  92:              {
  93:                  iSum = iSum + *(*(aArr + iRow) + iCol);
  94:              }
  95:          }
  96:      }
  97:   
  98:      return iSum;    
  99:  }
 100:   
 101:   
 102:  //배열의 주소를 받아 배열의 합과 평균을 출력.
 103:  void Print_Sum_Avg_Array(int (*aArr)[COL])
 104:  {
 105:      int iRow;
 106:      int iCol;
 107:      int iSum = 0;
 108:      float fAvg;
 109:   
 110:      for(iRow = 0 ; ROW > iRow ; ++iRow)
 111:      {
 112:          for(iCol = 0 ; COL > iCol ; ++iCol)
 113:          {
 114:              iSum = iSum + *(*(aArr + iRow) + iCol);
 115:          }
 116:      }
 117:      
 118:      fAvg = iSum / (float)(iRow * iCol);
 119:      
 120:      printf("배열의 전체 합은 %d이고,\n", iSum);
 121:      printf("배열의 원소들의 평균은 %.2f입니다.\n", fAvg);    
 122:      
 123:   
 124:      return ;    
 125:  }

 

 

 

4. 과제9-1번 프로그램에서 2차원 배열 포인터를 이용한 함수를 만들어보세요.


   1:  /***********************************************************************
   2:  
   3:      4. 과제9-1번 프로그램에서 2차원 배열 포인터를
   4:          이용한 함수를 만들어보세요.
   5:  
   6:      {
   7:          1. 출현 빈도 그래프 
   8:  
   9:          0에서부터 9까지의 60개의 수가 배열에 저장되어 있을 때, 
  10:          배열 원소 60개의 합과 평균을 구하여 출력하고 각 수에 대한
  11:          빈도 수를 세어서 다음과 같이 막대 그래프 형식으로 출력하시오
  12:          프로그램의 주요한 부분에 주석을 명시하시오.
  13:      }
  14:      
  15:      작성자: 김수만
  16:      작성일자: 2011년 6월 10일
  17:      
  18:  ***********************************************************************/
  19:  #include <stdio.h>
  20:  #include <stdlib.h>
  21:   
  22:  #define ROW        6
  23:  #define COL        10
  24:   
  25:   
  26:  void Set_Matrix(int (*aArr)[COL]);
  27:  int Cal_Sum_Matrix(int (*aArr)[COL]);
  28:  float Cal_Avg_Matrix(int (*aArr)[COL]);
  29:  void View_Matrix(int (*aArr)[COL]);
  30:  void View_Histogram_Matrix(int (*aArr)[COL]);
  31:   
  32:   
  33:  int main(void)
  34:  {
  35:      int iRow;
  36:      int iCol;
  37:      int iSum;
  38:      float fAvg;
  39:      int aArr[ROW][COL];
  40:   
  41:      Set_Matrix(aArr);                // 배열에 값 세팅
  42:      iSum = Cal_Sum_Matrix(aArr);    // 배열의 합을 구함.
  43:      fAvg = Cal_Avg_Matrix(aArr);    // 배열의 평균을 구함.
  44:      
  45:      View_Matrix(aArr);                // 배열의 값들을 출력.
  46:      
  47:      printf(" Sum of Array : %d\n", iSum);        //합 출력.
  48:      printf(" Average of Array : %f\n", fAvg);    //평균 출력.
  49:      
  50:      View_Histogram_Matrix(aArr);    // 배열의 값들로 히스토그램을 그림.
  51:      
  52:      return 0;
  53:  }
  54:   
  55:  //행렬에 랜덤값들을 대입.
  56:  void Set_Matrix(int (*aArr)[COL])
  57:  {
  58:      int iRow;
  59:      int iCol;
  60:      
  61:      srand(time(NULL));        //시드값으로 시간 넣기
  62:      
  63:      //0,0부터 행렬의 끝까지 있는 원소들을 랜덤값으로 채움.
  64:      for(iRow = 0 ; ROW > iRow ; ++iRow)
  65:      {
  66:          for(iCol = 0 ; COL > iCol ; ++iCol)
  67:          {
  68:              *(*(aArr + iRow) + iCol) = rand() % 10;    //0~9사이의 값을 배열에 넣음.
  69:          }
  70:      }
  71:      
  72:      return ;
  73:  }
  74:   
  75:  //행렬의 합을 구하여 반환.
  76:  int Cal_Sum_Matrix(int (*aArr)[COL])
  77:  {
  78:      int iRow;
  79:      int iCol;
  80:      int iSum = 0;
  81:      
  82:      //0,0부터 행렬의 끝까지 있는 원소들의 합을 구하여 iSum에 저장.
  83:      for(iRow = 0 ; ROW > iRow ; ++iRow)
  84:      {
  85:          for(iCol = 0 ; COL > iCol ; ++iCol)
  86:          {
  87:              iSum = iSum + *(*(aArr + iRow) + iCol);
  88:          }
  89:      }
  90:      
  91:      return iSum;
  92:  }
  93:   
  94:  //행렬의 평균을 구하여 반환.
  95:  float Cal_Avg_Matrix(int (*aArr)[COL])
  96:  {
  97:      int iRow;
  98:      int iCol;
  99:      float fAvg = 0;
 100:      
 101:      //0,0부터 행렬의 끝까지 있는 원소들의 합을 구하여 fAvg에 저장.
 102:      for(iRow = 0 ; ROW > iRow ; ++iRow)
 103:      {
 104:          for(iCol = 0 ; COL > iCol ; ++iCol)
 105:          {
 106:              fAvg = fAvg + (float)(*(*(aArr + iRow) + iCol));
 107:          }
 108:      }
 109:      
 110:      fAvg = fAvg / (ROW * COL);        //원소들의 합을 행렬의 크기로 나눔.
 111:      
 112:      return fAvg;
 113:  }
 114:   
 115:  //행렬에 있는 값들을 일정 포맷으로 출력.
 116:  void View_Matrix(int (*aArr)[COL])
 117:  {
 118:      int iRow;
 119:      int iCol;
 120:      
 121:      printf("---------------------------------\n");
 122:      printf("  Array\n");
 123:      printf("---------------------------------\n");
 124:      
 125:      //행렬의 각 원소들의 값을 보기 좋게 출력. 네모.?
 126:      for(iRow = 0 ; ROW > iRow ; ++iRow)
 127:      {
 128:          for(iCol = 0 ; COL > iCol ; ++iCol)
 129:          {
 130:              printf("%2d,", *(*(aArr + iRow) + iCol));
 131:          }
 132:          
 133:          if((ROW - 1) == iRow)        //마지막 행의 값들의 출력을 마치면
 134:          {
 135:              putchar('\b');            //마지막에 출력된 콤마로 가서,
 136:              putchar(' ');            //콤마를 지움.
 137:          }
 138:          
 139:          putchar('\n');        //다음 행에선 보기 좋게 개행.
 140:      }
 141:      
 142:      return ;
 143:  }
 144:   
 145:  //행렬에 있는 값들의 빈도를 막대 그래프로 그림. (히스토그램)
 146:  void View_Histogram_Matrix(int (*aArr)[COL])
 147:  {
 148:      int iRow;
 149:      int iCol;
 150:      int aFreq[10] = {0};        //빈도수를 저장할 배열의 초기화
 151:   
 152:      printf("---------------------------------\n");
 153:      printf(" no  count  BarGraph\n");
 154:      printf("---------------------------------\n");
 155:   
 156:      //빈도 조사
 157:      for(iRow = 0 ; ROW > iRow ; ++iRow)
 158:      {
 159:          for(iCol = 0 ; COL > iCol ; ++iCol)
 160:          {
 161:              ++aFreq[*(*(aArr + iRow) + iCol)];
 162:          }
 163:      }
 164:   
 165:      //히스토그램 출력
 166:      for(iRow = 0 ; 10 > iRow ; ++iRow)
 167:      {
 168:          printf(" %d\t%d\t", iRow, aFreq[iRow]);
 169:          
 170:          //아무 값이나 나올 수 있는 최대의 값은 행렬의 크기.
 171:          for(iCol = 0 ; (COL * ROW) > iCol ; ++iCol)
 172:          {
 173:              if(iCol < aFreq[iRow])        //빈도수만큼만 *출력.
 174:              {
 175:                  putchar('*');
 176:              }
 177:          }
 178:          
 179:          putchar('\n');
 180:      }
 181:      
 182:      return ;
 183:  }