C/명품 C언어 프로젝트(안기수 저)

명품 C언어 프로젝트 3.7장 연습문제

꾸준함. 2017. 6. 28. 20:38

[1번 문제]

/*

이 절에서 소개되지 않은 난수 생성방법들을 조사하여 각 방법에 대해

최대 5자리의 정수 난수 10개와 0부터 1 사이의 실수 난수 10개를 출력하는 프로그램을 작성합니다

*/

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

 

int main(void)

{

        srand((unsigned)time(NULL));

        printf("정수 난수:\n");

        for (int i = 0; i < 10; i++)

               printf("%d\n", rand() % 100000 + 1); //5자리 난수

        printf("실수 난수:\n");

        for (int i = 0; i < 10; i++)

               printf("%g\n", rand() / (double)(RAND_MAX + 1)); //0~1 사이의 실수

 

        return 0;

}


[3번 문제]

/*

어느 컵에 동전이 들어 있는지 맞추는 게임 프로글매을 작성합니다.

게임을 시작하면 컵 세 개(또는 네 개)를 표시하고, 동전이 들어 있는 한개의 컵을 맞추도록 한다.

*/

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

 

int main(void)

{

        int cup[4] = { 0, }; //컵 네개

        int sel;

        srand((unsigned)time(NULL));

 

        for (int i = 0; i < 4; i++)

        {

               cup[i] = rand() % 2;

               if (cup[i] == 1)

                       break;

        }

        printf("어떤 컵에 동전이 있을 것 같나요?(1~4)");

        scanf("%d", &sel);

 

        if (cup[sel - 1] == 1)

        {

               printf("맞았습니다\n");

        }

        else

        {

               printf("꽝입니다. 다시 도전하세요\n");

               for (int i = 0; i < 4; i++)

                       printf("%d\t", cup[i]);

        }

        printf("\n");

        return 0;

}


 

[4번 문제]

/*

함수 rand를 이용하여 1~6 사이의 주사위 눈금 1000개를 생성하고,

각 눈금의 빈도에 대한 확률을 계산합니다

*/

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

 

int main(void)

{

        int arr[1000]; //크기가 1000인 배열

        int frequency[6] = { 0, }; //눈금 배열

        srand((unsigned)time(NULL));

        for (int i = 0; i < 1000; i++)

        {

               arr[i] = rand() % 6 + 1;

        }

        for (int i = 0; i < 1000; i++)

        {

               switch (arr[i])

               {

               case 1:

                       frequency[0]++;

                       break;

               case 2:

                       frequency[1]++;

                       break;

               case 3:

                       frequency[2]++;

                       break;

               case 4:

                       frequency[3]++;

                       break;

               case 5:

                       frequency[4]++;

                       break;

               case 6:

                       frequency[5]++;

                       break;

               }

        }

        for (int i = 0; i < 6; i++)

        {

               //printf("%d\n", frequency[i]);

               printf("주사위를 돌릴 때 %d 눈금이 나올 확률은:%g\n", i, (double)(frequency[i] / 1000.0));

        }

        return 0;

}

 

[5번 문제]

/*

지금까지 당첨된 실제 로또 번호에 대해 조사하고, 이 번호들이 과연 임의로 추출된 것인지 각 번호에 대한 당첨 확률을 계산하시오

*/

 

//760 10 22 27 31 42 45 + 12

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

 

int main(void)

{

        int lotto[6] = { 0, };

        int i = 0, j;

        int a = 0, b = 0, c = 0, d = 0, e = 0, f = 0;

        srand(time(NULL));

        while (i<100)

        {

               for (j = 0; j<6; j++)

                       lotto[j] = rand() % 50 + 1;

               for (j = 0; j<6; j++)

               {

                       if (lotto[j] == 10)

                              a++;

                       if (lotto[j] == 22)

                              b++;

                       if (lotto[j] == 27)

                              c++;

                       if (lotto[j] == 31)

                              d++;

                       if (lotto[j] == 42)

                              e++;

                       if (lotto[j] == 45)

                              f++;

               }

               i++;

        }

        printf("10이 나올 확률 %g\n15가 나올 확률 %g\n18이 나올 확률 %g\n21이 나올 확률 %g\n34가 나올 확률 %g\n41이 나올 확률 %g\n", (double)a / 100, (double)b / 100, (double)c / 100, (double)d / 100, (double)e / 100, (double)f / 100);

        return 0;

}

[6번 문제]

/*

함수 rand를 이용하여 중복되지 않는 로또번호 6개를 생성하는 과정을 1000번 반복한

다음 각 번호에 대한 당첨 확률을 계산한다

*/

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

 

int main(void)

{

        int num = 0;

        int frequency[45] = { 0, }; //각 번호에 대한 당첨 확률

        int lotto[6] = { 0, };

        srand((unsigned)time(NULL));

        while (num < 1000)

        {

               for (int i = 0; i < 6; i++)

               {

                       lotto[i] = rand() % 45 + 1;

                       for (int j = 0; j < i; j++)

                       {

                              if (lotto[i] == lotto[j])

                              {

                                      i--;

                                      break;

                              }

                       }

               }

               for (int i = 0; i < 6; i++)

               {

                       for (int j = 0; j < 45; j++)

                       {

                              if (lotto[i] == j)

                                      frequency[j]++;

                       }

               }

               num++;

        }

 

        for (int i = 0; i < 45; i++)

               printf("로또번호 %d가 나올 확률은 %g\n", i + 1, (double)(frequency[i] / 1000.0));

        return 0;

}

 

[9번 문제]

/*

임의의 비밀번호(password)를 생성하는 프로그램을 작성합니다.

비밀번호의 길이와 개수는 입력받아 처리합니다

*/

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

 

int main(void)

{

        int *arr;

        int num, sel;

        int capital; //영문 대문자 여부

        int ifalpha; //영문인지 숫자인지 여부

        srand((unsigned)time(NULL));

        printf("비밀번호의 길이 입력:");

        scanf("%d", &num);

        arr = (int*)malloc(sizeof(int)*num);

       

        printf("비밀번호를 어떻게 설정하시겠습니까?\n");

        printf("1. 영문\t2. 숫자\t3. 영문+숫자: ");

        scanf("%d", &sel);

        switch (sel)

        {

        case 1:

               for (int i = 0; i < num; i++)

               {

                       capital = rand() % 2; //bool처럼 1이면 대문, 0이면 소문

                       arr[i] = rand() % ('z' - 'a') + (capital ? 'A' : 'a');

                       //printf("%c\n", arr[i]);

               }

               break;

        case 2:

               for (int i = 0; i < num; i++)

               {

                       arr[i] = rand() % ('9' - '0') + '0';

               }

               break;

        case 3:

               for (int i = 0; i < num; i++)

               {

                       capital = rand() % 2;

                       ifalpha = rand() % 2;

                       if (ifalpha)

                       {

                              capital = rand() % 2; //bool처럼 1이면 대문, 0이면 소문

                              arr[i] = rand() % ('z' - 'a') + (capital ? 'A' : 'a');

                       }

                       else

                       {

                              arr[i] = rand() % ('9' - '0') + '0';

                       }

               }

               break;

        default:

               printf("잘못된 입력입니다\n");

        }

 

        printf("비밀번호는 ");

        for (int i = 0; i < num; i++)

               printf("%c", arr[i]);

        printf("\n");

        free(arr);

 

        return 0;

}


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


[참고] 명품 C언어 프로젝트 안기수 저


*생략된 문제는 토의문제라 생략했습니다!

반응형