Notice
Recent Posts
Recent Comments
Link
«   2026/08   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Archives
Today
Total
관리 메뉴

강동영의 일상

[쉽게 풀어쓴 C언어 Express] 6일 차 본문

coding

[쉽게 풀어쓴 C언어 Express] 6일 차

rokaf6444 2022. 11. 16. 02:30

01. 0 또는 1 값을 무작위로 반환하는 coin_rand() 함수를 작성하여 간단한 동전 던지기 게임을 시뮬레이션하여 보자. 컴퓨터가 동전을 던지고 사용자는 앞뒤를 말한다. 컴퓨터는 coin_rand()를 이용하여 생성된 난수가 1이면 동전의 앞면으로 간주하고 0이면 동전의 뒷면으로 간주한다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int coin_rand() {
	int coin;

	srand(time(NULL));
	coin = rand() % 2;

	return 0;
}
int main() {
	while (1) {
		int coin = 0, user = 0;
		char go = 0, y = 0, n = 0;

		coin_rand();
		printf("앞면 또는 뒷면(1 또는 0):");
		scanf("%d", &user);

		if (coin == user) {
			printf("맞았습니다.");
		}
		else {
			printf("틀렸습니다.");
		}
		printf("\n계속하시겠습니까?(y 또는 n):");
		getchar();
		scanf("%c", &go);

		if (go == 'n')
			break;

		else if (go == 'y')
			continue;
	}
	return 0;
}

 

앞면 또는 뒷면(1 또는 0):1
틀렸습니다.
계속하시겠습니까?(y 또는 n):y
앞면 또는 뒷면(1 또는 0):0
맞았습니다.
계속하시겠습니까?(y 또는 n):y
앞면 또는 뒷면(1 또는 0):

 

 

 

02. 화면에 가로로 막대그래프를 그리는 프로그램을 작성하여 보자. 인수의 값만큼의 별표 문자를 출력하는 함수 print_star(int n)를 작성하라. 반복적으로 사용자로부터 값을 입력받아서 print_star()를 호출하여 입력값만큼 막대를 그리는 프로그램을 완성하라. 사용자가 음수를 입력하면 반복을 중단하라.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void print_star(int n);

int main() {
	int n;
	
	while (1) {
		printf("\n값을 입력하시오(종료는 음수): ");
		scanf("%d", &n);

		if (n < 0) {
			break;
		}
		print_star(n);
	}
	return 0;
}

void print_star(int n) {
	for (int i = 0; i < n; i++) {
		printf("*");
	}
}

 

값을 입력하시오(종료는 음수): 5
*****
값을 입력하시오(종료는 음수): 10
**********
값을 입력하시오(종료는 음수): -1

 

 

 

03. 오일러의 수 e는 자연로그의 밑수로 사용된다. 이 값은 다음과 같은 식에 의하여 근사치를 구할 수 있다. 팩토리얼 값을 계산하는 함수 factorial()을 작성하고 오일러의 수를 계산하는 프로그램을 작성하라.

 

e = 1 + 1/1! + 1/2! + 1/3! +  + 1/n!

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int factorial(int user);

int main() {
	int user;
	double e = 1;

	printf("어디까지 계산할까요: ");
	scanf("%d", &user);

	for(int i = 1; i <= user; i++)
		e  = e + 1.0 / factorial(i);

	printf("오일러의 수는 %lf입니다.", e);

	return 0;
}

int factorial(int user) {
	if (user == 1)
		return user;

	else
		return (user * factorial(user - 1));
}

 

어디까지 계산할까요: 30
오일러의 수는 2.718282입니다

 

 

 

04. 두 개의 부동 소수점 수가 근사적으로 같은 값이면 1을 반환하고 근사적으로 같지 않으면 0을 넘겨주는 함수 math_equal(a, b)을 작성하시오. 근사적으로 같다고 하는 것은 다음의 부등식을 만족하는 경우라고 가정한다.

 

|a - b| / min(|a|,|b|) < e

 

부동 소수점 수의 절대값을 구하는 함수와 두수 중에서 최솟값을 찾는 함수는 라이브러리 함수를 이용하라. e는 상수로서 0.000001로 정의된다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#define e 0.000001

double math_equal(double a, double b);
double min(double a, double b);

int main() {
	double a, b;

	printf("실수를 입력하시오: ");
	scanf_s("%lf", &a);
	printf("실수를 입력하시오: ");
	scanf_s("%lf", &b);

	math_equal(a, b);

	return 0;
}

double min(double a, double b) {
	double c = a - b;

	if (c == a - b) {
		return b;
	}

	if (c == b - a) {
		return a;
	}
}

double math_equal(double a, double b) {
	double c = a - b;

	if ((fabs(c) / (min(fabs(a), fabs(b))) < e)) {
		printf("두 개의 실수는 서로 같음");

		return 0;
	}

	if ((fabs(c) / (min(fabs(a), fabs(b))) >= e)) {
		printf("두 개의 실수는 서로 다름");

		return 1;
	}
}

 

실수를 입력하시오: 1.2345
실수를 입력하시오: 1.2346
두 개의 실수는 서로 다름