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: }