[1번 문제]
/*
자신이 사용하는 컴파일러에서 소수 이하 몇 자리까지 유효한지를 확인하시오
*/
#include <stdio.h>
int main(void)
{
double num = 0.111111111111111111111111111111111111111111111111111111111111111111111; //소수를 길게 선언한다
printf("소수 출력 결과:%.16lf\n", num);//16자리까지 유효하다
printf("소수 출력 결과:%.17lf\n", num);//17번째부터 다른 숫자가 출력
return 0;
}
[2번 문제]
간지 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
10간 |
신 |
임 |
계 |
갑 |
을 |
병 |
정 |
무 |
기 |
경 |
|
|
12지 |
자 |
축 |
인 |
묘 |
진 |
사 |
오 |
미 |
신 |
유 |
술 |
해 |
띠 |
쥐 |
소 |
호랑이 |
토끼 |
용 |
뱀 |
말 |
양 |
원숭이 |
닭 |
개 |
돼지 |
/*
다음의 표를 참고하여 서기를 간지로 변환하는 함수를 작성하시오.
서기 2009년은 간지로 기축년입니다
*/
#include <stdio.h>
void convert(int year)
{
char *gan[10] = { "경", "신", "임", "계", "갑", "을", "병", "정", "무", "기" };
char *ji[12] = { "신", "유", "술", "해", "자", "축", "인", "묘", "진", "사", "오", "미" };
printf("%s%s년입니다\n", gan[(year % 10)], ji[(year % 12)]);
}
int main(void)
{
int year;
printf("년도를 입력하세요:");
scanf("%d", &year);
convert(year);
return 0;
}
[3번 문제]
/*
임의의 자리수에서 반올림을 계산하는 함수를 작성하시오
예를 들어 1965.78에 대한 10의 자리 반올림 결과는 2000이고,
1의 자리 반올림 결과는 1970입니다.
소수 이하 첫째 반올림 결과는 1966으로 계산합니다
*/
#include <stdio.h>
#include <math.h>
double roundoff(double num, double i)
{
double frct, intg;
frct = modf(num / (i * 10), &intg); //double modf(double x, double *inptr);->double형 x는 분해의 대상이 되는 실수, inptr은 정수 부분을 반환받는 변수
if (frct >= .5) //소숫점이 0.5보다 높으면
num = (intg + 1)*(i * 10);
else //낮으면
num = (intg*(i * 10));
return num;
}
int main(void)
{
double num;
double i;
printf("실수 입력:");
scanf("%lf", &num);
printf("반올림하고 싶은 자리수 입력(ex:십의자리 수:10, 소수 둘째자리:0.01):");
scanf("%lf", &i);
printf("%lf자리에서 반올림한 %lf는 %lf이다\n", i, num, roundoff(num, i));
return 0;
}
[4번 문제]
/*
임의의 정수에 대해 일부분만을 추출하여 정수로 반환하는 함수 extraction을 작성하시오
예를 들어 extraction(34562, 2, 3)의 결과로 정수 456을 반환합니다
*/
#include <stdio.h>
#include <math.h>
int extraction(int number, int num1, int num2)
{
char result[100];
itoa(number, result, 10); //정수를 문자열로 전환
result[(num1 - 1) + num2] = '\0'; //문자열의 마지막은 NULL
return atoi(&(result[num1 - 1])); //다시 정수로 변환
}
int main(void)
{
int number, num1, num2;
printf("정수를 입력하세요:");
scanf("%d", &number);
printf("몇번째 자리부터 출력 원하시나요?");
scanf("%d", &num1);
printf("몇 개의 숫자를 출력 원하시나요?");
scanf("%d", &num2);
printf("원하시는 숫자:%d\n", extraction(number, num1, num2));
return 0;
}
[5번 문제]
/*
입력한 금액에 대해 화폐 단위별로 개수를 출력하는 함수를 정의하시오
*/
#include <stdio.h>
#include <math.h>
void ShowMoney(int money)
{
printf("5만원권:%d, 1만원권:%d, 5천원권:%d, 1천원권:%d", money / 50000, money % 50000 / 10000, money % 10000 / 5000, money % 5000 / 1000);
printf(" 500원:%d, 100원:%d, 50원:%d, 10원:%d\n", money % 1000 / 500, money % 500 / 100, money % 100 / 50, money % 50 / 10);
}
int main(void)
{
int money;
printf("가지고 있는 잔금 입력:");
scanf("%d", &money);
ShowMoney(money);
return 0;
}
[6번 문제]
/*
double 형의 값을 반환하는 라이브러리 함수(지수, 로그, 삼각함수 등)의 사용방법을 설명하고,
실제로 계산도 할 수 있는 double형 라이브러리 함수 사용법 프로그램을 작성하시오
*/
#include <stdio.h>
#include <math.h>
int main(void)
{
double num1 = 2.0;
double num2 = 4.0;
double num3 = 8.0;
double num4 = 9.0;
double num5 = 16.0;
double mantissa;
double rad = 1.0;
int expt;
printf("지수함수 e^%.1f=%f\n", num1, exp(num1));
printf("\ndouble ldexp(double x, int n)은 x*2^n을 계산합니다\n");
printf("%.1f*2^%.1f=%f\n:", num2, num1, ldexp(num2, 2));
printf("\ndouble frexp(double x, int *expptr)은 x를 지수 부분과 소수 부분으로 분리합니다\n");
mantissa = frexp(num3, &expt);
printf("%.1f=%.1f*2^%d\n", num3, mantissa, expt);
printf("\n로그 함수들입니다\n");
printf("log(%.1f)=%f\n", num4, log(num4));
printf("log10(%.1f)=%f\n", num4, log10(num4));
printf("\ndouble pow(double x, double y)는 x^y를 계산하는 함수입니다\n");
printf("%.1f^%.lf=%f\n", num1, num2, pow(num1, num2));
printf("\ndouble sqrt(double x)는 x의 양의 제곱근을 계산하는 함수입니다\n");
printf("square root(%.1f)=%f\n", num5, sqrt(num5));
printf("\n여기서부터는 삼각함수들입니다\n");
printf("arc sin(%lf)=%lf\n", rad, asin(rad));
printf("arc cos(%lf)=%lf\n", rad, acos(rad));
printf("arc tan(%lf)=%lf\n", rad, atan(rad));
printf("sin(%lf)=%lf\n", rad, sin(rad));
printf("cos(%lf)=%lf\n", rad, cos(rad));
printf("tan(%lf)=%lf\n", rad, tan(rad));
printf("sinh(%lf)=%lf\n", rad, sinh(rad));
printf("cosh(%lf)=%lf\n", rad, cosh(rad));
printf("tanh(%lf)=%lf\n", rad, tanh(rad));
return 0;
}
[7번 문제]
/*
주민등록번호의 생년월일 부분에 대해 연월일을 구분하여 출력하는 함수 birthday를 작성하시오
예를 들어 birthday(870312)의 경과로 "1987년 3월 12일"을 출력합니다.
*/
#include <stdio.h>
#include <stdlib.h>
void birthday(int number)
{
//앞서 푼 화폐 문제와 비슷하다
int year = number / 10000;
int month = number % 10000 / 100;
int day = number % 100;
if (year > 17)
printf("19%d년 %d월 %d일\n", year, month, day);
else if (year > 0 && year < 10)
printf("200%d년 %d월 %d일\n", year, month, day);
else if (year >= 10 && year <= 17)
printf("20%d년 %d월 %d일\n", year, month, day);
}
int main(void)
{
int number;
while (1) //세가지 결과 다 보여주기 위해
{
printf("생년월일을 입력하시오:");
scanf("%d", &number);
birthday(number);
}
return 0;
}
[8번 문제]
/*
수학능력시험의 수험번호 구성을 조사하고, 입력한 번호에 대해 각 번호의 의미를 구분하여 출력하는 함수를 작성하시오
조사결과:
첫 두자리:시험지구
그 다음 두자리:고시장
그 다음 두자리:교실
마지막 두자리:짝수면 짝수형, 홀수면 홀수형
*/
#include <stdio.h>
#include <string.h>
int main(void)
{
//두자리씩 끊기 편하게 문자열로 수험번호 입력
char number[10];
int num1, num2, num3, num4;
printf("수험번호 입력:");
scanf("%s", number);
while (strlen(number) != 8)
{
printf("번호 재입력:");
scanf("%s", number);
}
num1 = (number[0] - '0') * 10 + number[1] - '0'; //정수로 바꾸기 위해 '0' 빼줌
num2 = (number[2] - '0') * 10 + number[3] - '0';
num3 = (number[4] - '0') * 10 + number[5] - '0';
num4 = (number[6] - '0') * 10 + number[7] - '0';
printf("%d시험지구\t", num1);
printf("%d고시장\t", num2);
printf("%d교실\t", num3);
if (num4 % 2 == 0)
printf("짝수형 교실\n");
else
printf("홀수형 교실\n");
return 0;
}
[9번 문제]
/*
내림차순으로 정렬된 n개의 점수(백점 만점)가 배열에 저장되어 있다고 가정하고,
등수와 점수를 출력하는 프로그램을 작성하시오.
단, 배열의 동점을 두 군데 이상 저장합니다.
만약 1등이 2명 있을 경우 다음 등수는 3이 됩니다
*/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int student;
int count = 0;
int *arr;
printf("인원 수 입력:");
scanf("%d", &student);
arr = (int*)malloc(sizeof(int)*student);
for (int i = 0; i < student; i++)
{
printf("%d번째 점수를 입력하세요:", i+1);
scanf("%d", &arr[i]);
}
for (int i = 0; i<student - 1; i++)
{
for (int j = 0; j<(student - i) - 1; j++) //len-1인 이유: j j+1을 비교하기 때문!!
{
if (arr[j]<arr[j + 1]) //오름차순일 경우 arr[j]>arr[j+1]
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (int i = 0; i < student; i++)
{
if (arr[i] == arr[i - 1])
{
int j = i;
while (arr[j] == arr[j - 1])
j--;
printf("%d등: %d점\n", j+1, arr[i]);
}
else
printf("%d등: %d점\n", i + 1, arr[i]);
}
free(arr);
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
[참고] 명품 C언어 프로젝트 안기수 저, http://blog.naver.com/jungtosu2/20185060810
'C > 명품 C언어 프로젝트(안기수 저)' 카테고리의 다른 글
명품 C언어 프로젝트 3.1장 연습문제 (0) | 2017.06.07 |
---|---|
명품 C언어 프로젝트 2.3장 연습문제 (0) | 2017.06.02 |
[C언어] 시간과 날짜와 관련된 함수들 (4) | 2017.06.02 |
명품 C언어 프로젝트 2.1장 연습문제 (7) | 2017.05.28 |
명품 C언어 프로젝트 1장 연습문제 (8) | 2017.05.25 |