(Lab 9-1) 난수
- 난수 범위(a~b): a + rand() % (b - a + 1)
- 난수 시드 설정: srand(time(NULL))
시드 설정을 하지 않으면 프로그램을 몇번을 시도해도 똑같은 패턴의 값이 나옴

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand(time(NULL));
int n, r, st, en, sum = 0;
printf("난수의 개수: ");
scanf("%d", &n);
printf("시작과 끝 : ");
scanf("%d %d", &st, &en);
for (int i = 0; i < n; i++) {
r = st + rand() % (en - st + 1);
printf("%d ", r);
sum += r;
}
printf("\n");
printf("sum=%d ", sum);
printf("avg=%d\n", sum / n);
}
(Lab 9-2)(1): 확률 계산(주사위)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand(time(NULL));
int i, n, sum[7] = { 0 };
int r, st, en;
printf("주사위 횟수 : ");
scanf("%d", &n);
st = 1, en = 6;
for (int i = 0; i < n; i++) {
r = st + rand() % (en - st + 1);
sum[r]++;
}
for (i = 1; i < sizeof(sum)/sizeof(int); i++) {
printf("%d : %d (%.2f%%)\n", i, sum[i], sum[i]*100./n); // %표시 -> %%
}
}
(Lab 9-2)(2): 주사위 확률 조작
r = rand() % 100;
if (r <= 9) dice = 1;
else if (r <= 19) dice = 2;
else if (r <= 29) dice = 3;
else dice = 6;
- 확률을 조작하는 방법
1, 2, 3, 4, 5, 6을 구간으로 변경한다
1: 0~9
2: 10~19
3: 20~29
4: 30~39
5: 40~49
6: 50~99 (6: 50% 이상)
특정 확률로 조작하려는 값을 else 부분에 배치한다

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand(time(NULL));
int i, n, sum[7] = { 0 };
int r, st, en;
printf("주사위 횟수 : ");
scanf("%d", &n);
printf("정상적인 주사위\n");
st = 1, en = 6;
for (int i = 0; i < n; i++) {
r = st + rand() % (en - st + 1);
sum[r]++;
}
for (i = 1; i < sizeof(sum) / sizeof(int); i++) {
printf("%d : %d (%.2f%%)\n", i, sum[i], sum[i] * 100. / n);
}
printf("\n이상한 주사위\n");
for (i = 0; i < sizeof(sum) / sizeof(int); i++) {
sum[i] = 0;
}
st = 0, en = 99; // 범위 0~99
for (int i = 0; i < n; i++) {
r = st + rand() % (en - st + 1);
if (r <= 9) r = 1;
else if (r <= 19) r = 2;
else if (r <= 29) r = 3;
else if (r <= 39) r = 4;
else if (r <= 49) r = 5;
else r = 6;
sum[r]++;
}
for (i = 1; i < sizeof(sum) / sizeof(int); i++) {
printf("%d : %d (%.2f%%)\n", i, sum[i], sum[i] * 100. / n);
}
}
(Lab 9-3): 모의 성적 데이터 발생1
- 단순히 0~100을 동일한 확률로 발생 -> 테스트 데이터로 적합하지 않음

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int i, n, sum[9] = { 0 };
int r, st, en, hap = 0;
char* score[] = { "A+","A","B+","B","C+","C", "D+","D", "F" };
srand(time(NULL));
printf("학생 수 : ");
scanf("%d", &n);
st = 0, en = 100; // 100점은?
for (i = 0; i < n; i++) {
r = st + rand() % (en - st + 1);
// r = rand() % 101;
printf("%d ", r);
if (r >= 95) r = 0; //A+
else if (r >= 90) r = 1; //A
else if (r >= 85) r = 2; //B+
else if (r >= 80) r = 3; //B
else if (r >= 75) r = 4; //C+
else if (r >= 70) r = 5; //C
else if (r >= 65) r = 6; //D+
else if (r >= 60) r = 7; //D
else r = 8; // F
sum[r]++;
hap += r;
}
printf("\n\n");
printf("n = %d 평균 = %.2f\n", n, (double)hap / n);
for (i = 0; i < 9; i++) {
printf("%-3s: %5d (%6.2f%%)\n",score[i], sum[i], sum[i] * 100. / n); // 형식 지정자 주의
}
}
(Lab 9-4): 모의 성적 데이터 발생2 (성적 분포가 주어졌을 때 모의 데이터 발생시키기)
A+ : 10%, A : 10%, B+: 20%, B:25%, C+: 15%, C:10%, D+:5%, D:3%, F:2%
- 주사위 확률 조작 방법과 같은 방법으로 A+ ~ F에 해당하는 점수 설정
- 각 학점별 % 분포가 학생수(정수)로 환산할 때 정확하게 일치하지 않을 수 있음
각 학점별 배정 가능한 최대 인원수를 미리 계산해 놓고 성적을 발생시킬때 인원 체크를 한다
소수점으로 나오는 경우 정수에서 모자라는 부분을 조정함



#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int i, nstudents, r, sum = 0, j = 0;
double temp;
int grade;// 0~8, A+ ~ F
int count[9] = { 0 }; // 0 ~ 8, A+ ~ F 인원수
int compensaton[9]; // 보정해야할 위치
char* score[] = { "A+","A","B+","B","C+","C", "D+","D", "F" };
// A+:10%, A:10%, B+:20%, B:25%, C+:15%, C:10%, D+:5%, D:3%, F:2%
int maxcount[9] = { 10,10,20,25,15,10,5,3,2 }; //미리 계산된 최대 인원: 100명 기준
int start[9] = { 95,90,85,80,75,70,65,60,0 }; // 점수 시작
int end[9] = { 100,94,89,84,79,74,67,64,59 }; // 점수 끝
srand(time(NULL));
scanf("%d", &nstudents);
//maxcount[i]를 계산한다
for (i = 0; i < 9; i++) {
temp = maxcount[i] * nstudents / 100.;
if (temp != (int)temp) // 소수점이 있다면
compensaton[j++] = i; // 보정이 필요한 배열에 저장, 내림 연산
maxcount[i] = (int)temp;
sum += maxcount[i];
}
// 소수점 보정
for (i = 0; i < nstudents - sum; i++) {
maxcount[compensaton[i]]++;
}
sum = 0;
for (i = 0; i < nstudents; i++) {
do {
r = rand() % 101;
for (j = 0; j < 9; j++) {
if (r >= start[j] && r <= end[j]) {
grade = j;
break;
}
} // 이미 해당 학점의 점수가 모두 발생되었다면
// 다른 학점을 발생할 때까지 반복
} while (count[grade] + 1 > maxcount[grade]); //인원 체크
count[grade]++; //학점 별 count를 증가시킨다
printf("%d ", r);
sum += r;
}
printf("\n\n");
printf("n = %d 평균 = %.2f\n", nstudents, (double)sum / nstudents);
for (i = 0; i < 9; i++) {
printf("%-3s: %5d (%6.2f%%)\n", score[i], count[i], count[i] * 100. / nstudents); // 형식 지정자 주의
}
}
(Lab 9-5) 문장의 알파벳 분포 조사
- 디버그 -> 속성 -> 명령 인수 => input.txt
- 파일의 끝(EOF)을 검사하는 방법: 파일의 끝 or (입력시)CTRL + Z
int count[26]
while ((c = getchar()) != EOF) {
total++;
if (isalpha(c))
alpha++
count[toupper(c) - 'A']++;
}


방법1) 속성 - 디버그 - 명령인수 : < input.txt
방법2) 커맨드창(cmd): cmd창을 활용할때는 디버그의 명령인수에 아무것도 안적혀 있어야함, 그리고 input.txt의 내용 직접입력 후 ctrl + z
방법3) 윈도우 창

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <ctype.h>
int main() {
int count[26] = { 0 };
int c, alpha, total;
alpha = 0;
total = 0;
while ((c = getchar()) != EOF) {
total++;
if (isalpha(c)) {
alpha++;
count[toupper(c) - 'A']++;
}
}
printf("전체문자수=%d 알파벳수=%d\n", total, alpha);
for (int i = 0; i < sizeof(count) / sizeof(int); i++) {
if (i != 0 && i % 5 == 0)
printf("\n");
printf("%c: %d (%.2f%%) ", 'A' + i, count[i], count[i] * 100. / alpha);
}
}
(Lab 9-ACM) 괄호 검증 - VPS ( https://www.acmicpc.net/problem/9012)
- 괄호 문자열에서 '('와')'의 개수는 같아야 한다.
- 문자열을 앞에서부터 하나씩 보면서 '('와')'의 개수를 비교할 때 (의 개수가 항상 많거나 같아야 한다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <ctype.h>
int main() {
char buf[51];
int t, i, j, k, result = 1;
int c;
scanf("%d", &t);
//getchar();
for (i = 0; i < t; i++) {
//gets(buf);// 이전에 getchar() 버퍼 비우기
//gets_s(buf,sizeof(buf)); // 이전에 getchar()로 버퍼 비워야함
scanf(" %[^\n]s", buf); // %앞에 공백 두어서 공백문자 무시해야함 or getchar()로 버퍼 비우기
//scanf("%s", buf); // 이전에 버퍼 비울 필요 없음
result = 1;
k = 0;
for (j = 0; buf[j] != '\0'; j++) {
if (buf[j] == '(')
k++;
else if (buf[j] == ')')
k--;
if (k < 0) {
result = 0;
break;
}
}
if (k != 0)
result = 0;
if (result)
printf("YES\n");
else
printf("NO\n");
}
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <windows.h>
#define MESG_LEN 100
#define DELAY 50
void delayPrint(char mesg[])
{
for (int i = 0; i < strlen(mesg); i++) {
fprintf(stdout, "%c", mesg[i]);
fflush(stdout);
Sleep(DELAY); // milliseconds
}
printf("\n");
}
void main()
{
char mesg[MESG_LEN];
printf("Type the message to be displayed in drawing a character: ");
gets(mesg);
if (strlen(mesg) < 2)
strcpy(mesg, "Welcome to the delayed printing world!");
delayPrint(mesg);
}
'프로그래밍랩' 카테고리의 다른 글
기말고사 기출 (0) | 2024.11.29 |
---|---|
프로그래밍랩 13주차 (0) | 2024.11.25 |
프로그래밍랩 12주차 (0) | 2024.11.19 |
프로그래밍랩 10-11 주차 (0) | 2024.11.08 |
프로그래밍랩 9주차 (0) | 2024.11.07 |