2011년6월9일_C과제9(출현 빈도 그래프(히스토그램), 로또 번호 생성기)
Histogram |
2. 로또 번호 생성 프로그램
사용자에게 로또 게임 수를 입력받아 게임의 횟수별로 임의로 6개의 수(1~45)를 자동 생성하는 프로그램을 작성하시오.
단, 생성된 난수는 모두 다른 값이어야 한다. 로또 번호는 정수형 배열을 선언하여 설정한다.
프로그램의 주요한 부분에 주석을 명시하시오.
(해법 찾기와 의사코드 플로차트는 나중에 시간나면 작성할 것.)
1: /***********************************************************************
2:
3: 1. 출현 빈도 그래프
4:
5: 0에서부터 9까지의 60개의 수가 배열에 저장되어 있을 때,
6: 배열 원소 60개의 합과 평균을 구하여 출력하고 각 수에 대한
7: 빈도 수를 세어서 다음과 같이 막대 그래프 형식으로 출력하시오
8: 프로그램의 주요한 부분에 주석을 명시하시오.
9:
10:
11: 작성자: 김수만
12: 작성일자: 2011년 6월 8일
13: 수정일자: 2011년 6월 9일
14:
15: ***********************************************************************/
16: #include <stdio.h>
17: #include <stdlib.h>
18:
19: #define ROW 6
20: #define COL 10
21:
22:
23: void Set_Matrix(int aArr[ROW][COL]);
24: int Cal_Sum_Matrix(int aArr[ROW][COL]);
25: float Cal_Avg_Matrix(int aArr[ROW][COL]);
26: void View_Matrix(int aArr[ROW][COL]);
27: void View_Histogram_Matrix(int aArr[ROW][COL]);
28:
29:
30: int main()
31: {
32: int iRow;
33: int iCol;
34: int iSum;
35: float fAvg;
36: int aArr[ROW][COL];
37:
38: Set_Matrix(aArr); // 배열에 값 세팅
39: iSum = Cal_Sum_Matrix(aArr); // 배열의 합을 구함.
40: fAvg = Cal_Avg_Matrix(aArr); // 배열의 평균을 구함.
41:
42: View_Matrix(aArr); // 배열의 값들을 출력.
43:
44: printf(" Sum of Array : %d\n", iSum); //합 출력.
45: printf(" Average of Array : %f\n", fAvg); //평균 출력.
46:
47: View_Histogram_Matrix(aArr); // 배열의 값들로 히스토그램을 그림.
48:
49: return 0;
50: }
51:
52: //행렬에 랜덤값들을 대입.
53: void Set_Matrix(int aArr[ROW][COL])
54: {
55: int iRow;
56: int iCol;
57:
58: srand(time(NULL)); //시드값으로 시간 넣기
59:
60: //0,0부터 행렬의 끝까지 있는 원소들을 랜덤값으로 채움.
61: for(iRow = 0 ; ROW > iRow ; ++iRow)
62: {
63: for(iCol = 0 ; COL > iCol ; ++iCol)
64: {
65: aArr[iRow][iCol] = rand() % 10; //0~9사이의 값을 배열에 넣음.
66: }
67: }
68:
69: return ;
70: }
71:
72: //행렬의 합을 구하여 반환.
73: int Cal_Sum_Matrix(int aArr[ROW][COL])
74: {
75: int iRow;
76: int iCol;
77: int iSum = 0;
78:
79: //0,0부터 행렬의 끝까지 있는 원소들의 합을 구하여 iSum에 저장.
80: for(iRow = 0 ; ROW > iRow ; ++iRow)
81: {
82: for(iCol = 0 ; COL > iCol ; ++iCol)
83: {
84: iSum = iSum + aArr[iRow][iCol];
85: }
86: }
87:
88: return iSum;
89: }
90:
91: //행렬의 평균을 구하여 반환.
92: float Cal_Avg_Matrix(int aArr[ROW][COL])
93: {
94: int iRow;
95: int iCol;
96: float fAvg = 0;
97:
98: //0,0부터 행렬의 끝까지 있는 원소들의 합을 구하여 fAvg에 저장.
99: for(iRow = 0 ; ROW > iRow ; ++iRow)
100: {
101: for(iCol = 0 ; COL > iCol ; ++iCol)
102: {
103: fAvg = fAvg + (float)aArr[iRow][iCol];
104: }
105: }
106:
107: fAvg = fAvg / (ROW * COL); //원소들의 합을 행렬의 크기로 나눔.
108:
109: return fAvg;
110: }
111:
112: //행렬에 있는 값들을 일정 포맷으로 출력.
113: void View_Matrix(int aArr[ROW][COL])
114: {
115: int iRow;
116: int iCol;
117:
118: printf("---------------------------------\n");
119: printf(" Array\n");
120: printf("---------------------------------\n");
121:
122: //행렬의 각 원소들의 값을 보기 좋게 출력. 네모.?
123: for(iRow = 0 ; ROW > iRow ; ++iRow)
124: {
125: for(iCol = 0 ; COL > iCol ; ++iCol)
126: {
127: printf("%2d,", aArr[iRow][iCol]);
128: }
129:
130: if((ROW - 1) == iRow) //마지막 행의 값들의 출력을 마치면
131: {
132: putchar('\b'); //마지막에 출력된 콤마로 가서,
133: putchar(' '); //콤마를 지움.
134: }
135:
136: putchar('\n'); //다음 행에선 보기 좋게 개행.
137: }
138:
139: return ;
140: }
141:
142: //행렬에 있는 값들의 빈도를 막대 그래프로 그림. (히스토그램)
143: void View_Histogram_Matrix(int aArr[ROW][COL])
144: {
145: int iRow;
146: int iCol;
147: int aFreq[10] = {0}; //빈도수를 저장할 배열의 초기화
148:
149: printf("---------------------------------\n");
150: printf(" no count BarGraph\n");
151: printf("---------------------------------\n");
152:
153: //빈도 조사
154: for(iRow = 0 ; ROW > iRow ; ++iRow)
155: {
156: for(iCol = 0 ; COL > iCol ; ++iCol)
157: {
158: ++aFreq[aArr[iRow][iCol]];
159: }
160: }
161:
162: //히스토그램 출력
163: for(iRow = 0 ; 10 > iRow ; ++iRow)
164: {
165: printf(" %d\t%d\t", iRow, aFreq[iRow]);
166:
167: //아무 값이나 나올 수 있는 최대의 값은 행렬의 크기.
168: for(iCol = 0 ; (COL * ROW) > iCol ; ++iCol)
169: {
170: if(iCol < aFreq[iRow]) //빈도수만큼만 *출력.
171: {
172: putchar('*');
173: }
174: }
175:
176: putchar('\n');
177: }
178:
179: return ;
180: }
Lotto Generator |
2. 로또 번호 생성 프로그램
사용자에게 로또 게임 수를 입력받아 게임의 횟수별로 임의로 6개의 수(1~45)를 자동 생성하는 프로그램을 작성하시오. 단, 생성된 난수는 모두 다른 값이어야 한다. 로또 번호는 정수형 배열을 선언하여 설정한다.
프로그램의 주요한 부분에 주석을 명시하시오.
(해법 찾기와 의사코드 플로차트는 나중에 시간나면 작성할 것.)
1: /**************************************************************************
2:
3: 2. 로또 번호 생성 프로그램
4:
5: 사용자에게 로또 게임 수를 입력받아 게임의 횟수별로
6: 임의로 6개의 수(1~45)를 자동 생성하는 프로그램을 작성하시오.
7: 단, 생성된 난수는 모두 다른 값이어야 한다.
8:
9: 로또 번호는 정수형 배열을 선언하여 설정한다.
10: 프로그램의 주요한 부분에 주석을 명시하시오.
11:
12: 작성자: 김수만
13: 작성일자: 2011년 6월 8일
14: 수정일자: 2011년 6월 9일
15:
16: **************************************************************************/
17:
18: #include <stdio.h>
19: #include <stdlib.h>
20:
21: #define COL 6
22:
23: void Gen_Lotto_Number1(int aArr[COL]);
24: void Gen_Lotto_Number(int aArr[COL]);
25: void swap(int *px, int *py);
26: void bubble_sort(int array[], int count);
27:
28:
29: int main()
30: {
31: int aArr[COL];
32: int iCnt;
33: int iRow;
34: int iCol;
35: unsigned char aFreq[45] = {0};
36: unsigned int aFreq_Sum[45] = {0};
37:
38:
39: srand(time(NULL)); //시드값
40:
41: printf("*** LOTTO NUMBER GENERATOR ***\n");
42:
43: while(1)
44: {
45: printf("Enter the game count : ");
46: scanf("%d", &iCnt);
47:
48: if(0 > iCnt)
49: {
50: printf("종료!\n");
51: break;
52: }
53:
54: printf("===================================\n");
55:
56: for(iRow = 0 ; iCnt > iRow ; ++iRow)
57: {
58: Gen_Lotto_Number(aArr);
59:
60: printf("Game%5d : ", iRow + 1);
61:
62: for(iCol = 0 ; COL > iCol ; ++iCol)
63: {
64: printf("%3d", aArr[iCol]);
65: ++aFreq[aArr[iCol] - 1];
66: ++aFreq_Sum[aArr[iCol] - 1];
67: }
68:
69: printf("\n");
70: }
71:
72: printf("===================================\n\n");
73:
74:
75: //히스토그램
76: for(iRow = 0 ; 45 > iRow ; ++iRow)
77: {
78: printf("%3d%4d%4d ", iRow + 1, aFreq_Sum[iRow], aFreq[iRow]);
79:
80: for(iCol = 0 ; 100 > iCol ; ++iCol)
81: {
82: if(iCol < aFreq[iRow])
83: {
84: printf("=");
85: }
86: }
87:
88: printf("*\n");
89: }
90:
91:
92: //배열 초기화
93: for(iCol = 0 ; 45 > iCol ; ++iCol)
94: {
95: aFreq[iCol] = 0;
96: }
97:
98: }
99:
100: return 0;
101: }
102:
103: /****************************************************************************
104:
105: 로또 번호 6자리 생성기
106:
107: 최초 1 ~ 45사이의 랜덤값을 생성하고,
108: 다음에 생성한 수와 저장된 이전 값을 비교하여 다르면 저장. (같으면 버림)
109:
110: ****************************************************************************/
111: void Gen_Lotto_Number(int aArr[COL])
112: {
113: int iLoop;
114: int iLoop_Match;
115: int iTemp;
116: int iFlag = 0;
117:
118: //최초 로또번호 생성.
119: aArr[0] = (rand() % 45) + 1;
120: //나머지 5개 생성.
121: for(iLoop = 1 ; COL > iLoop ; ++iLoop)
122: {
123: iTemp = (rand() % 45) + 1; //임시변수에 로또번호생성
124:
125: for(iLoop_Match = 0 ; iLoop > iLoop_Match ; ++iLoop_Match)
126: {
127: if(aArr[iLoop_Match] == iTemp) //이전 값과 현재 생성값이 다르면
128: { //각자 비교만 하지 이전값들 모두 다르면이 아님. (수정해야함)
129: iFlag = 1;
130: }
131:
132: if(0 == iFlag && (iLoop - 1) == iLoop_Match)
133: {
134: aArr[iLoop] = iTemp;
135: }
136: else if(1 == iFlag && (iLoop - 1) == iLoop_Match)
137: {
138: iTemp = (rand() % 45) + 1; //임시변수에 로또번호생성
139: iLoop_Match = -1;
140: iFlag = 0;
141: }
142: }
143: }
144:
145: //낮은 숫자 우선 정렬
146: bubble_sort(aArr, 6);
147:
148: return ;
149: }
150:
151:
152: /****************************************************************************
153:
154: 로또 번호 6자리 생성기
155:
156: 최초 1/3범위의 수를 생성하고,
157: 생성된 수 보다 1~10만큼 큰수를 계속 생성. 나온 수가 아름답지 않음.
158:
159: ****************************************************************************/
160: void Gen_Lotto_Number1(int aArr[COL])
161: {
162: int iLoop;
163: int iTemp;
164:
165: //최초 로또번호 생성.
166: aArr[0] = (rand() % 15) + 1;
167: //로또번호 나머지 5개 생성.
168: for(iLoop = 0 ; (COL - 1) > iLoop ; ++iLoop)
169: {
170: iTemp = rand() % ((21 + iLoop * 6) - aArr[iLoop]) + aArr[iLoop] + 1;
171: aArr[iLoop + 1] = iTemp;
172: }
173:
174: return ;
175: }
176:
177: //버블 정렬
178: void bubble_sort(int array[], int count)
179: {
180: int i;
181: int j;
182:
183: for(i = 0 ; i < count - 1 ; i++)
184: {
185: for(j = 0 ; j < count - 1 - i ; j++)
186: {
187: if(array[j] > array[j + 1])
188: {
189: swap(&array[j], &array[j + 1]);
190: }
191: }
192: }
193:
194: return ;
195: }
196:
197: //교환
198: void swap(int *px, int *py)
199: {
200: int temp = *px;
201:
202: *px = *py;
203: *py = temp;
204:
205: return ;
206: }
부가기능으로 1번 히스토그램을 추가하여 보았습니다.
|
좌측부터 로또번호, 로또번호가 나온 프로그램 실행하는 동안 누적합, 로또번호 한 번 생성시 누적합 (200회입력한 결과)