C언어/참고서: C언어 콘서트

C언어 28차시 반복문 연습문제 3

Olivia-BlackCherry 2023. 3. 27. 22:50

목차

    1. 피보나치 수열 구하기

    ♣결과

    ♧코드

    <if-else if, else 구문>

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main(void)
    {
    	int i, n, a, b, c;
    	printf("피보나치 수열의 몇 번째 항까지 구할까요?");
    	scanf("%d", &n);
    
    	printf("0 1 ");
    	for (i = 0; i <= n; i++) {
    		if (i == 0) a = 0;
    		else if (i == 1) b = 1;
    		else {
    			c = a + b;
    			printf("%d ", c);
    			a = b;
    			b = c;
    		}
    	}
    	printf("\n");
    	return 0;
    }

    <더 간단히>

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    int main(void)
    {
    	int i, a = 0, b = 1, c, n;
    
    	printf("몇 번째 항까지 구할까요? ");
    	scanf("%d", &n);
    	for (i = 0; i <= n; i++) {
    		printf("%d, ", a);
    		c = a + b;
    		a = b;
    		b = c;
    	}
    	return 0;
    }

     

     

    2. 남은 연료의 양 계산하기

    ♣결과

    ♧코드

    //오류를 찾아보자! 

    //olivia_codingschool
    
    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main(void)
    {
    	int full, now, input_value;
    	char status;
    	full = 1000;
    	now = 200;
    	printf("지금은 %d리터 남아있습니다.", now);
    
    	while (now > 100) {
    		printf("충전하려면 +, 소모하려면 -를 붙여 숫자를 입력해주세요.\n");
    		scanf("%c%d", &status, &input_value);
    		printf("%c %d \n", status, input_value);
    
    		if (status == '-') {
    			printf("-입니다\n");
    			now = now - input_value;
    		}
    		if (status == '+') {
    			printf("+입니다\n");
    			now = now + input_value;
    		}
    	}
    	printf("연료가 10프로 미만으로 남았습니다");
    	
    
    	return 0;
    }

    // 다른 방법

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main(void)
    {
    	double capacity, supply, pumped;
    	capacity = 1000.0;
    	
    	printf("현재 채워진 연료는 얼마인가요?\n");
    	scanf("%lf", &supply);
    
    	while (supply > capacity * 0.10) {
    		printf("연료의 변화량은 얼마인가요?\n");
    		scanf("%lf", &pumped);
    		supply = supply + pumped;
    		if (supply < 0.0)
    			supply = 0.0;
    		if (supply > capacity)
    			supply = capacity;
    		printf("현재 남은 양은 %lf입니다\n", supply);
    	}
    	printf("\n남은 연료의 양이 얼마 되지 않습니다.\n");
    	return 0;
    }

     

     

    3. 소수 판별하기

    ♣결과

    ♧코드

    //olivia_codingschool
    
    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main(void)
    {
    	int i, j, number, is_prime;
    	is_prime = 1;
    	printf("구하고자 하는 숫자를 입력하세요\n");
    	scanf("%d", &number);
    
    	for (i = 2; i <= number; i++) {
    		if (i == number) continue;
    		if (number % i == 0) {
    			is_prime = 0;
    			break;
    		}
    	}
    	if (is_prime == 1)
    		printf("%d는 소수이다.", number);
    
    	return 0;
    }

     

     

    4. 피타고라스 정리를 만족하는 세 삼각형의 변 구하기

    1) 삼각형의 가장 긴 변은 나머지 두 변의 합보다 작다

    2) 직각 삼각형의 가장 긴 한 변의 제곱은 나머지 두 변의 제곱의 합과 같다.

    ♣결과

    ♧코드

    <if-else 구문>

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main(void)
    {
    	int a, b, c;
    
    	for (a = 1; a <= 100; a++) {
    		for (b = 1; b <= 100; b++) {
    			for (c = 1; c <= 100; c++) {
    				if ((a + b > c) && (c * c == a * a + b * b)){
    					printf("a=%d b=%d c=%d\n", a, b, c);
    				}
    				else if ((a + c > b) && (b * b == a * a + c * c)) {
    					printf("A=%d B=%d C=%d\n", a, b, c);
    				}
    				else if ((b + c > a) && (a * a == b * b + c * c)) {
    					printf("%d %d %d\n", a, b, c);
    				}
    			}
    		}
    	}
    	return 0;
    }

    <논리 연산자 연결>

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main(void)
    {
    	int a, b, c;
    
    	for (a = 1; a <= 100; a++) {
    		for (b = 1; b <= 100; b++) {
    			for (c = 1; c <= 100; c++) {
    				if (((a + b > c) && (c * c == a * a + b * b)) || ((a + c > b) && (b * b == a * a + c * c)) || ((b + c > a) && (a * a == b * b + c * c)))
    					printf("a=%d b=%d c=%d\n", a, b, c);
    			}
    		}
    	}
    
    	return 0;
    }

     

    5. 도박꾼이 목표 금액에 도달하는 확률 

    초기 금액 50달러

    목표 금액 250달러

    한 번의 도박에 1달러를 건다.

    총 1000회의 도박을 한다. 1회의 도박마다 가진 돈을 다 잃거나 목표 금액인 250달러에 도달하면 도박을 중지한다. 

    1000회의 횟수 동안 도박사가 이길 확률이 얼마나 될지를 계산해보자.

    ♣결과

    ♧코드

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int main(void)
    {
    	int stake = 50;
    	int goal = 250;
    	int T = 1000;
    	int t;
    
    	int bets = 0;
    	int wins = 0;
    	srand(time(NULL));
    	for (t = 0; t < T; t++) {
    
    		int cash = stake;
    		while (cash > 0 && cash < goal) {
    			bets++;
    			if ((double)rand() / RAND_MAX < 0.5) cash++;
    			else                     cash--;
    		}
    		if (cash == goal) wins++;
    	}
    
    	printf("초기 금액 $%d \n", stake);
    	printf("목표 금액 $%d \n", goal);
    	printf("%d 중의 %d번 승리\n", T, wins);
    	printf("이긴 확률=%f \n", 100.0 * wins / T);
    	return 0;
    }

     

     

    6. 파이 계산하기 - Gregory-Leibniz 무한수열 이용

    출처: 어서와 자바는 처음이지

    파이를 구하는 방법이다. 

    파이: 원에서 원주와 반지름의 비율을 나타내느느 상수

    파이를 계산하는 방법 중 하나로 Gregory-Leibniz의 무한수열을 활용한다. 

    프로그램을 작성해보자.

     

    ♣결과

    ♧코드

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int main(void)
    {
    	int i, n;
    	printf("숫자를 입력하세요");
    	scanf("%d", &n);
    	double x, y, pie;
    	pie = 0;
    	
    	for (i = 1; i <= n; i++) {
    		if (i == 1) x = 1;
    		else x = x + 2;
    
    		if (i % 2 == 1) pie = pie + 4 / x;
    		else pie = pie - 4 / x;
    	}
    	printf("%lf\n", pie);
    	return 0;
    }