(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

+ Recent posts