1. 확률이 조작된 주사위 2개가 있다. 주사위 2개의 합을 구한다.
그러므로 주사위 2개의 합이 2가 나올 확률은 0이다.
난수를 이용하여 주사위 2개의 합(2 ~ 12)을 구하고 그 분포를 화면과 같이 Histogram으로 표시하는 프로그램을 작성하시오. 주사위 합은 50,000번 구한다. 화면과 같이 분포는 소수점 2자리, Histogram은 1%당 1개씩 *를 표시하며 소숫점이 존재하면 한 개씩 더 출력한다. (예, 1.89%의 경우 2개의 *가 표시된다.)
(주의사항 : 주사위 2개의 확률이 조작되어야 함.)
<실행화면>
<소스코드>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
int r1, r2, dice[13] = { 0 }; // 필요하면 변수 추가
int n, i, j, hist;
double perc = 0.0;
srand((unsigned)time(NULL)); // 난수 초기화
for (i = 0; i < 50000; i++) { // 50000 번 동안
// 첫 번째 주사위: r1
n = rand() % 100;
if (n < 40) r1 = 6; // 6이 나올 확률이 40%
else if (n < 55) r1 = 2; // 나머지(2~5) 각 15% 확률로 매핑
else if (n < 70) r1 = 3;
else if (n < 85) r1 = 4;
else r1 = 5;
// 두 번째 주사위: r2
n = rand() % 100;
if (n < 40) r2 = 3; // 3이 나올 확률이 40%
else if (n < 52) r2 = 1; // 나머지(1,2,4,5,6) 각 12% 확률로 매칭
else if (n < 64) r2 = 2;
else if (n < 76) r2 = 4;
else if (n < 88) r2 = 5;
else r2 = 6;
dice[r1 + r2]++;
}
// 2~12 값에 대하여 발생 빈도 %와 Histogram을 출력한다.
for (i = 2; i <= 12; i++) {
perc = 100.0 * dice[i] / 50000;
printf("%2d:%5.2lf%% ", i, perc);
// *의 수는 소숫점이 있으면 +1개 출력한다.
for (j = 0; j < perc; j++)
printf("*");
printf("\n");
}
}
2. 로또 숫자 발생기
로또는 1~45 숫자 중에 6개의 번호를 예측하는 것이다. 사용자가 번호를 미리 선택할 수 있는 로또 발행기 프로그램을 작성한다. 입력으로 로또 매수 T 가 주어지고 각각의 로또마다 사용자가 미리 선택한 번호를 받는다. 미리 선택하는 번호의 개수 n이 주어지어 다음 줄에 사용자가 선택한 n개의 숫자가 주어진다. 출력은 로또 매수 번호와 로또 번호 6개가 크기 순으로 출력된다. 예를 들어 7개의 로또를 출력할 때 n=0 인 경우 자동으로 [01] : 18 20 35 41 42 45 식으로 6개의 번호를 난수로 발생하여 출력하고 n=3 8, 38, 17 이 입력되는 경우 3개만 수동으로 [04] : 08 13 17 18 26 38 식으로 8, 38, 17이 포함된 6개의 로또 번호를 출력하여야 한다. 마지막 6, 3 8 13 23 37 43 의 경우 6개의 수 모두를 수동으로 선택한 경우이다. 수동 번호 입력은 8 38 17과 같이 크기순이 아닐 수도 있다.
<실행화면>
<소스코드>
// quiz2 로또번호 발생기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
void main()
{
int T, n, l, i, j; // n: 사용자가 미리 선택한 숫자의 개수, l: 랜덤 넘버
int lotto[46] = { 0 };
scanf("%d", &T); // 로또 매수
for (i = 0; i < T; i++) {
// lotto[]를 0으로 초기화한다.
for (j = 0; j < 46; j++)
lotto[j] = 0;
// n개의 수를 입력받고 lotto[]에 미리 1로 설정한다.
scanf("%d", &n);
for (j = 0; j < n; j++) {
scanf("%d", &l);
lotto[l] = 1;
}
// 추가로 (6-n)개의 난수를 발생하여 lotto[]에 1로 설정한다.
for (j = 0; j < 6 - n; j++) {
do {
l = rand() % 45 + 1;
} while (lotto[l] == 1); // l이 이미 뽑힌 수라면 계속 반복한다.
lotto[l] = 1;
}
// 발생된 6개의 수를 크기 순으로 출력한다.
printf("[%02d] : ", i + 1);
for (j = 1; j <= 45; j++) {
if (lotto[j] == 1)
printf("%02d ", j);
}
printf("\n");
}
//Sleep(10000);
}
3. 입력받은 단어를 알파벳 순서로 출력하는 프로그램을 작성하시오.
알파벳은 대/소문자 구분없이 처리한다. 즉, Ab 와 aB는 같은 것으로 본다. 입력으로 Test set의 수 T가 첫줄에 주어지고 각각의 test case 에는 단어(길이<=80)이 주어진다. (Hint : i = 0 ~ 25 라면 ‘a’ + i 는 ‘a’ ~ ‘z’ 가 되고 ‘A’+i 는 ‘A’ ~ ‘Z’ 가 된다.)
<실행화면>
<소스코드>
// quiz3 알파벳 순서 출력
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <windows.h>
void main()
{
int T, len, i, j;
char str[81];
scanf("%d", &T);
while (T--) {
scanf("%s", str); // 단어 입력
len = strlen(str); // len 구함
// 알파벳 순서 출력
for (i = 0; i < 26; i++) { // for i = 0 ~ 25 (a ~ z) 또는 (A ~ Z)
for (j = 0; j < len ; j++) { // for j = 0 ~ len-1
if (str[j] == 'a' + i || str[j] == 'A' + i) { // (a~z) 또는 (A~Z) 조건에 맞으면 str[j]를 출력
printf("%c", str[j]);
}
}
}
printf("\n");
}
//Sleep(10000);
}
[프로그래밍랩] 6주차 C언어 복습 - 행렬, 구조체, 포인터 (0) | 2025.04.20 |
---|---|
[프로그래밍랩] 5주차 - Quiz (0) | 2025.04.13 |
[프로그래밍랩] 5주차 - 난수, 확률, 통계 (0) | 2025.04.13 |
[프로그래밍랩] 4주차 - 재귀함수 (0) | 2025.04.06 |
[2025 코딩캠프] #5 포인터와 제어문으로 직선의 방정식 구하기 (lv.2) (0) | 2025.01.23 |