특히, 평균을 기준으로 평균 이상인 사람 옆에는 '합격', 아닌 사람은 '불합격' 을 출력하게 해보세요
(난이도 : 中上).
#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;
}
유클리드 호제법이 무엇인지 모르신다면, 인터넷 검색을 활용하는 것을 추천합니다. (댓글을 달아도 돼요)
(난이도 : 中上)
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;
}
(난이도 : 下)
문제가 무슨 뜻인지 이해를 못해서 답을 보았다..
보자마자 아차! 싶었다
#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);
}
(물론 하나의 함수에 구현하는 것이 아니라 여러개의 함수로 분할해서 만들어야겠죠?)
(난이도 : 中)
#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;
}
(난이도 : 中)
#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시간 가까이 지켜본거같다. (이쁘고 간결하다고 느껴졋다)
(난이도 : 中)
#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;
}
물론, 소수 부도 1000 자리로 구현해도 됩니다. 1000 자리 수들의 연산 수행 시간은 1 초 미만이여야 합니다.
(난이도 : 上)
강해져서 돌아오겠다
씹어먹는 C 언어 - <13 - 3. 마술 상자 함수 3 (function)>
씹어먹는 C 언어 - <13 - 4. 마술 상자 함수 (생각해볼 문제에 대한 아이디어)>
C언어 진법 변환의 원리와 소스 코드