[C] 씹어먹는 C 언어 - <13 - 3. function >

Kim Dongil·2022년 10월 23일
0

C

목록 보기
19/28

1. 사용자로 부터 5 명의 학생의 수학, 국어, 영어 점수를 입력 받아서 평균이 가장 높은 사람 부터 평균이 가장 낮은 사람까지 정렬되어 출력하도록 하세요.

특히, 평균을 기준으로 평균 이상인 사람 옆에는 '합격', 아닌 사람은 '불합격' 을 출력하게 해보세요
(난이도 : 中上).

#include <stdio.h>

int average(int (*pstudent)[3]);

int main(void)
{
	int student[5][3]; //학생 5 명의 국어,수학,영어 점수
	int i, j; 

	printf("국어, 영어, 수학 점수를 차례대로 입력하세요 \n\n");

	for (i = 0; i < 5; i++)
	{
		printf("학생 %d : ", i + 1);
		for (j = 0; j < 3; j++)
		{
			scanf_s("%d", &student[i][j]);
		}
	}
	
	printf("\n");

	average(student);

	return 0;
}

int average(int(*pstudent)[3])
{
	float aver[5]; // 학생 5 명의 평균 점수 
	float average = 0; // 학생 한명 평균 점수
	float totalaver = 0; // 모든 학생 점수를 더하고 난 평균점수
	int i, j;
	int temp = 0; 

	for (i = 0; i < 5; i++)
	{
		for (j = 0; j < 3; j++)
		{
			average += pstudent[i][j];
		}
		average /= 3; // 학생 한명 평균 점수가 구해짐 
		printf("학생 %d 의 평균점수 : %.2f \n", i+1, average);
		aver[i] = average; // 구해진 평균 점수를 5 명의 평균 점수 배열에 넣음 
		totalaver += aver[i]; // 모든 학생의 평균을 더하기
		average = 0; // 0 으로 초기화 시켜서 다음 학생의 평균 점수 구하기 
	}

	totalaver /= 5;
	printf("\n학생 5 명의 평균 점수 : %.2f \n\n", totalaver);

	for (i = 0; i < 5; i++) // 학생 5 명의 평균 점수를 높은 사람부터 낮은 사람 순으로 정렬
	{
		for (j = i+1; j < 5; j++)
		{
			if (aver[i] < aver[j])
			{
				temp = aver[j];
				aver[j] = aver[i];
				aver[i] = temp;
			}
		}
	}

	for (i = 0; i < 5; i++) // 학생 5 명의 평균 점수를 출력하고 합격인지 불합격인지 알리기 
	{
		if (aver[i] >= totalaver)
		{
			printf("%.2f 합격\n", aver[i]);
		}

		else
		{
			printf("%.2f 불합격\n", aver[i]);
		}
	}

	return 0;
}

2. 유클리도 호제법을 이용해서 N 개의 수들의 최대공약수를 구하는 함수를 만들어보세요.

유클리드 호제법이 무엇인지 모르신다면, 인터넷 검색을 활용하는 것을 추천합니다. (댓글을 달아도 돼요)
(난이도 : 中上)

n개 는 어려워서 2개라고 가정하고 풀었다.

#include <stdio.h>

int gcd(int a, int b);

int main(void)
{
	int a, b;
	printf("최대공약수를 구하고 싶은 두 수를 입력하세요\n");
	scanf_s("%d %d", &a, &b);


	printf("두 수의 최대공약수 : %d", gcd(a, b));

	return 0;
}

int gcd(int a, int b)
{
	int temp, n;
	
	if (a<b) 
	{
		temp = a;
		a = b;
		b = temp;
	}

	while (b != 0)
	{
		n = a % b;
		a = b;
		b = n;
	}

	return a;
}

n개 일때

#include <stdio.h>

int gcd(int a, int b);

int main(void)
{
	int gcd_number[50];
	int i, n;
	int result = 0;

	printf("원하는 자연수들의 최대공약수를 구하는 프로그램입니다. \n");
	printf("몇 개의 수를 입력하시겠습니까? (최대 50개) : ");
	scanf_s("%d", &n);

	printf("원하는 수를 입력하세요\n");
	for (i = 0; i < n; i++)
	{
		scanf_s("%d", &gcd_number[i]);
	}
	
	result = gcd_number[0];

	for (int i = 1; i < n; i++)
	{
		result = gcd(result, gcd_number[i]);
	}

	printf("최대공약수 : %d \n", result);
	

	return 0;
}

int gcd(int a, int b)
{
	int temp, r;

	if (a < b)
	{
		temp = a;
		a = b;
		b = temp;
	}

	while (b != 0)
	{
		r = a % b;
		a = b;
		b = r;
	}

	return a;
}

3. 자기 자신을 호출하는 함수를 이용해서 1 부터 특정한 수까지의 곱을 구하는 프로그램을 만들어보세요.

(난이도 : 下)

문제가 무슨 뜻인지 이해를 못해서 답을 보았다..
보자마자 아차! 싶었다

#include <stdio.h>

int factorial(int n);

int main(void)
{
	int n;
	
	printf("1 부터 n 까지의 곱을 구하세요 \n");
	printf("n 값 입력 : ");
	scanf_s("%d", &n);
	printf("1 부터 n 까지의 곱 : %d", factorial(n));

	return 0;
}

int factorial(int n)
{
	if (n == 1)
		return 1;
	else
		return n* factorial(n - 1);
}

4. 계산기를 만들어보세요. 사용자가 1 을 누르면 +, 2 를 누르면 - 와 같은 방식으로 해서 만들면 됩니다. 물론 이전의 계산 결과는 계속 누적되어야 하고, 지우기 기능도 있어야 합니다.

(물론 하나의 함수에 구현하는 것이 아니라 여러개의 함수로 분할해서 만들어야겠죠?)
(난이도 : 中)

#include <stdio.h>

int plus(int* p_result);
int minus(int* p_result);
int multiply(int* p_result);
int divide(int* p_result);
int reset(int* p_result);

int main(void)
{
	int n;
	int result = 0;

	for (;;)
	{
		printf("1 을 누르면 +\n");
		printf("2 를 누르면 -\n");
		printf("3 을 누르면 *\n");
		printf("4 를 누르면 /\n");
		printf("5 를 누르면 초기화\n");
		printf("0 을 누르면 종료 입니다 \n");
		scanf_s("%d", &n);

		switch (n)
		{
		case 1:
			plus(&result);
			break;
		case 2:
			minus(&result);
			break;
		case 3:
			multiply(&result);
			break;
		case 4:
			divide(&result);
			break;
		case 5:
			reset(&result);
			break;
		case 0:
			return 0;
		default:
			printf("\n잘못 입력하셨습니다\n\n");
			continue;
		}
	}

	return 0;
}

int plus(int* p_result)
{
	int n;

	printf("\n더하고 싶은 값을 입력하세요 \n");
	scanf_s("%d", &n);

	*p_result += n;
	printf("현재 값 : %d \n\n", *p_result);

	return 0;
}

int minus(int* p_result)
{
	int n;

	printf("\n빼고 싶은 값을 입력하세요 \n");
	scanf_s("%d", &n);

	*p_result -= n;
	printf("현재 값 : %d \n\n", *p_result);

	return 0;
}

int multiply(int* p_result)
{
	int n;

	printf("\n곱하고 싶은 값을 입력하세요 \n");
	scanf_s("%d", &n);

	*p_result *= n;
	printf("현재 값 : %d \n\n", *p_result);

	return 0;
}

int divide(int* p_result)
{
	int n;

	printf("\n나누고 싶은 값을 입력하세요 \n");
	scanf_s("%d", &n);

	*p_result /= n;
	printf("현재 값 : %d \n\n", *p_result);

	return 0;
}

int reset(int* p_result)
{
	int n = 0;

	printf("\n값을 초기화 시킵니다\n");
	*p_result = n;
	printf("현재 값 : %d \n\n", *p_result);

	return 0;
}

5. N 진법에서 M 진법으로 변환하는 프로그램을 만들어보세요.

(난이도 : 中)

#include <stdio.h>

int main(void)
{
	int radix, n, i = 0;
	char array[100];

	printf("변환하고 싶은 진법 입력(2~16) : ");
	scanf_s("%d", &radix);

	if (radix < 2 || radix>16)
	{
		printf("2 에서 16진법 까지만 변환 가능합니다 \n");
        return 0;
	}

	printf("변환하고 싶은 수 입력 : ");
	scanf_s("%d", &n);

	while (n >= radix)  
	{
		array[i] = n % radix;
		n /= radix;
		i++;
	}

	array[i] = n;

	printf("%d 진법으로 변환된 수 : ", radix);

	for (; i >= 0; i--)
	{
		if (array[i] < 10)
			printf("%c", array[i] + 48); // 각 숫자를 아스키 문자 코드에 대응시키기 위해서
		else
			printf("%c", array[i] + 55); // 16진수에서 각 수를 A, B, C... 에 대응시키기 위해서
	}

	return 0;
}

다른 분 답안을 보는데 이 풀이만 1시간 가까이 지켜본거같다. (이쁘고 간결하다고 느껴졋다)

6. 에라토스테네스의 체를 이용해서 1 부터 N 까지의 소수를 구하는 프로그램을 만들어보세요.

(난이도 : 中)

#include <stdio.h>

int IsPrimeNumber(int n);

int main(void)
{
	int n;

	printf("1부터 n 까지의 소수를 구하는 프로그램 입니다. \n");
	printf("n 값 입력 : ");
	scanf_s("%d", &n);

	if (n < 2 || n>1000)
	{
		printf("2 이상 1000 이하 의 값만 가능합니다 \n");
		return 0;
	}

	IsPrimeNumber(n);


	return 0;
}

int IsPrimeNumber(int n)
{
	int i, j;
	int arr[1001];

	for (i = 2; i <= n; i++)	
	{
		arr[i] = i;
	}

	for (i = 2; i <= n; i++)
	{
		if (arr[i] == 0)
			continue;
		for (j = i + i; j <= n; j += i)
		{
			arr[j] = 0;
		}
		printf("%d ", arr[i]);
	}

	return 0;
}

7. 1000 자리의 수들의 덧셈, 뺄셈, 곱셈, 나눗셈을 수행하는 프로그램을 만들어보세요. 나눗셈의 경우 소수 부분을 잘라버리세요.

물론, 소수 부도 1000 자리로 구현해도 됩니다. 1000 자리 수들의 연산 수행 시간은 1 초 미만이여야 합니다.
(난이도 : 上)

강해져서 돌아오겠다 

씹어먹는 C 언어 - <13 - 3. 마술 상자 함수 3 (function)>
씹어먹는 C 언어 - <13 - 4. 마술 상자 함수 (생각해볼 문제에 대한 아이디어)>
C언어 진법 변환의 원리와 소스 코드

0개의 댓글