#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>
int String_Detector(char str[]);
int extends_rands(double S_P);
void sys_console(char str[]);
int main()
{
srand(time(NULL));
char str[20] = {};
// 처음에 입력한 확률값은 문자형으로 들어감. - 검사용도
double User_input_Probability = 0; // 사용자가 입력할 확률
double System_Probability = 0; // 사용자가 입력한 확률을 시스템에서 처리할 수있게 바꿈
int focus_num = 0; // 확률 맞추기 위한 변수
int i = 0; // 카운트 변수
unsigned int try_focus_num = 0; // 확률을 맞추기 위해 시도한 횟수를 나타낼 변수
while(1)
{
fflush(stdin);
sys_console("color 0f");
printf("\n\n\n\t\t\t\t확률을 입력하세요.\n\t\t\t\t(-.-%) : ");
scanf_s("%s",str,sizeof(str));
// 정해진 크기만큼만 입력받도록 scanf_s(format,변수,크기)
// 만약 사용자가 입력한 문자길이가 버퍼크기를 넘어설 때 배열첫번째방에 0이 들어감
if ( String_Detector(str)) {
User_input_Probability = atof(str); // str을 실수형으로 바꿔서 확률변수에 대입
System_Probability = 100 / User_input_Probability;
// 몫 = 100 / 사용자가 입력한 확률
if (User_input_Probability > 100.0) continue; // 확률이 100.0 초과면 재입력
sys_console("color 04");
while(1){
// rand 난수 생성의 범위는 0~32767
// 0.000001 처럼 소숫점이하자리를 계산하려면 더 큰 난수를 생성해야함
if ( 0 == extends_rands(System_Probability) )
{ // focus_num 0이되면 확률적중
sys_console("color 0a");
printf("\n\n\t\t\t\t 확률 ( %s )\n",str);
printf("\n\t\t\t\t시도 횟수 : %d\n",try_focus_num);
try_focus_num=0;
printf("\n\t\t\t계속 하시려면 아무키나 누르세요... (종료= 'f' ) ");
if( getch() == 'f' ) {
sys_console("color 0f");
exit(0);
}
break;
}
else try_focus_num++; // 시도횟수누적
}
} else { continue; } // 다시 입력하는 루틴으로
}
return 0;
}
int String_Detector(char str[])
{
int i = 0;
int str_len = strlen(str)-1;
int check = 0;
// return 0 ==> 재입력 루틴 이동
// 소숫점이 여러개인지 확인
while(i < str_len)
{
if ( str[i] == '.') check++;
i++;
} if (check > 1) return 0; // 소숫점은 하나만 올 수 있습니다.
// 맨 처음부터 소숫점이 나올 수 없다
// str[0]에 0이 들어가면 버퍼크기를 초과해서 입력한것이다.
if ( str[0] == '.' || str[0] == 0 ) return 0;
// 확률이 0으로 시작하는 경우 소숫점 맨 마지막 자리의 값은 항상 1~9가 와야 실행됨
// [ 0 또는 0.00 ] 입력 방지용
if (str[0] == '0') {
if ( !(str[str_len] >= '1' && str[str_len] <='9') ) return 0;
}
for(i=0; str[i]!='\0'; i++) // 문자배열을 입력받은 길이만큼 검사한다.
{
// 배열방에 0부터 9까지의 숫자와 소숫점(.) 값이 아닌게 들어가면 재입력받도록
if( !(str[i] >='0' && str[i] <='9') && str[i] != '.' ) return 0;
}
return 1;
}
int extends_rands(double S_P)
{
int focus_num = 0;
focus_num = rand();
focus_num <<= 15; // 값을 늘린다.
focus_num ^= rand();
focus_num = fmod(focus_num,S_P);
// math.h에 정의된 fmod함수는 실수형 mod이다.
// 소숫점밑자리까지 처리하기 위해서 필요하다.
// 만약 사용자가 입력한 확률이 50.1%라면 몫이 1.9960...가 나오게되는데
// 이때 정수 mod를 사용하면 몫이 1로서 확률이 100%가 되버린다.
// 따라서 실수까지 처리해줘야한다.
printf("\t\t\t\t맞추는 중 : %d\n",focus_num); // 맞추는 중...
return focus_num;
}
void sys_console(char str[])
{
system("cls");
system(str);
}