1. 목적
- 주어진 수학 공식을 C 프로그램에 적용시킨다.
2. 문제
- 100 개의 -50.00 ~ 49.99 난수를 이용하여 다음의 계산 값을 출력한다.
* 최대값, 최소값, 평균, 표준편차
* 평균과 표준편차는 아래의 공식을 활용한다.
* 거듭제곱과 제곱근은 math.h 에서 가져와 쓴다.
* 100 개의 입력된 난수 값을 먼저 출력한 뒤 계산된 값을 출력시킨다.
- 출력화면
-30.71 15.04 -48.52 -18.14 -12.98 34.35 40.42 -35.44 3.18 20.76
31.86 -49.29 4.39 25.48 -14.07 -40.66 -0.65 33.59 11.56 -35.63
-38.36 -48.75 -11.30 -17.81 41.90 -13.62 -9.67 -32.74 -39.50 7.61
-36.29 43.90 -19.44 40.78 -24.53 39.07 12.47 6.59 12.04 16.41
24.79 -19.88 -30.47 42.41 -36.33 -7.13 12.09 -8.62 -36.40 -48.41
15.90 2.95 -41.18 11.66 13.36 26.58 -24.50 30.25 -31.61 39.05
24.75 -3.45 32.73 14.09 -14.43 -1.42 -36.55 40.81 -15.81 40.65
23.93 -2.16 12.71 20.05 10.01 -7.75 4.20 -27.34 -44.24 -20.91
8.67 17.52 22.18 -6.06 30.30 9.95 -19.58 -1.01 48.73 -43.52
최 대 값 : 48.73
최 소 값 : -49.29
평 균 : 0.03
표준편차 : 4.36
Press any key to continue
3. 이해
- 난수를 원하는 범위 만큼 출력할수 있는가?
- 수학 공식을 정확히 이해하여 C 코드로 표현할수 있는가?
- 자릿수 출력을 정확히 할수 있는가?
4. 코드
#include <time.h>
#include <stdlib.h>
#include <math.h>
#define randomize() srand( (unsigned)time(NULL) )
int main()
{
double min, max, ave, sum, puncha;
double entry[100] = {0};
int i,j,k;
i = j = k = 0;
min = max = ave = sum = puncha = 0;
randomize();
rand();
for(i = 0; i < 100; i++)
{
entry[i] = (float)((rand() % 10000)) / 100 - 50;
entry[i] == 50 ? entry[i] = 49.99f : entry[i];
max < entry[i] ? max = entry[i] : max;
min > entry[i] ? min = entry[i] : min;
sum += entry[i];
}
i = 0;
ave = sum / 100;
while(i < 100)
{
puncha = pow((entry[i] - ave), 2);
i++;
}
puncha = sqrt((puncha / 100));
for(i = 0; i < 10; i++)
{
for(j = 0; j < 10; j++)
{
printf("%6.02f ", entry[k]);
k++;
}
printf("\n");
}
printf("최 대 값 : %6.02f\n", max);
printf("최 소 값 : %6.02f\n", min);
printf("평 균 : %6.02f\n", ave);
printf("표준편차 : %6.02f\n", puncha);
return 0;
}
5. 해설
- rand() 함수는 0 ~ 32767 까지 값을 만들어 내므로 원하는 수가 rand() 함수 보다 작으면 나머지 연산
자를 크다면 곱셈을 행하여 큰수로 만든 후에 나머지 연산자를 써서 원하는 숫자를 만듭니다. 소숫
점이나 음수는 빼기 나눗셈을 통해 얻습니다.
- %6.02f 는 원하는 출력형식입니다. 소숫점 아래 2자리 총 6 글자를 출력하는 방식입니다.
- math.h 에서 제곱근을 얻는 sqrt 함수를 거듭제곱을 얻는 pow 함수를 이용했습니다. 리턴 값은
double 형이므로 float 를 쓰지 않았습니다.
- 조건문에서 등호는 = 이 아닌 == 입니다. = 을 쓰면 할당되어 버리므로 항상 조건을 만족시키며 엉
뚱한 실행 결과를 만듭니다.
- 단순 조건문인 [조건식] ? [참] : [거짓] 과 병렬 할당문인 [변수] = [변수] = ... = 숫자는 참고로 보시기
랍니다.
- sum += entry[i] 문은 sum = sum + entry[i] 과 같은 뜻입니다.
- 행렬의 index 를 구하는 부분에서 0 ~ 99 까지 적용됩니다. i < 100 부분에서 100 이 되면 루프를 빠져
나가므로 entry[100] 는 접근 하지 않습니다.(그래서 오류 없음)
6. 참고
- http://www.winapi.co.kr/clec/cpp1/8-1-3.htm : 지수함수