2011년6월9일_C과제9(출현 빈도 그래프(히스토그램), 로또 번호 생성기)

 

 

 

Histogram

 

2. 로또 번호 생성 프로그램

사용자에게 로또 게임 수를 입력받아 게임의 횟수별로 임의로 6개의 수(1~45)를 자동 생성하는 프로그램을 작성하시오.
단, 생성된 난수는 모두 다른 값이어야 한다. 로또 번호는 정수형 배열을 선언하여 설정한다.
프로그램의 주요한 부분에 주석을 명시하시오.

clip_image002

 

(해법 찾기와 의사코드 플로차트는 나중에 시간나면 작성할 것.)

 

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

 

clip_image002[4]clip_image002[6]

 

 

 

 

 

 

Lotto Generator


2.
로또 번호 생성 프로그램

사용자에게 로또 게임 수를 입력받아 게임의 횟수별로 임의로 6개의 수(1~45)를 자동 생성하는 프로그램을 작성하시오. 단, 생성된 난수는 모두 다른 값이어야 한다. 로또 번호는 정수형 배열을 선언하여 설정한다.
프로그램의 주요한 부분에 주석을 명시하시오.

clip_image002[8]

 

(해법 찾기와 의사코드 플로차트는 나중에 시간나면 작성할 것.)

 

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

clip_image002[12]clip_image002[14]

부가기능으로 1번 히스토그램을 추가하여 보았습니다.


image

 

 

image

좌측부터 로또번호, 로또번호가 나온 프로그램 실행하는 동안 누적합, 로또번호 한 번 생성시 누적합 (200회입력한 결과)