C/명품 C언어 프로젝트(안기수 저)

명품 C언어 프로젝트 2.2장 연습문제

꾸준함. 2017. 5. 31. 19:30

[1번 문제]

/*

자신이 사용하는 컴파일러에서 소수 이하 자리까지 유효한지를 확인하시오

*/

#include <stdio.h>

 

int main(void)

{

        double num = 0.111111111111111111111111111111111111111111111111111111111111111111111; //소수를 길게 선언한다

        printf("소수 출력 결과:%.16lf\n", num);//16자리까지 유효하다

        printf("소수 출력 결과:%.17lf\n", num);//17번째부터 다른 숫자가 출력

        return 0;

}

 


[2번 문제]

간지 

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

반응형