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

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

꾸준함. 2017. 8. 12. 14:54

[1번 문제]

/*

입력된 정수를 long형 변수 num에 저장하고, 저장된 숫자의 역순 값을 long형 변수 rev에 저장하여 출력하는 프로그램을 작성한다.

예를 들어 정수 1234가 입력되었다면 변수 rev에는 정수 4321이 저장되도록 한다

*/

#include <stdio.h>

#include <math.h>

 

long reverse(long num)

{

        long rev=0;

        int length = 0;

        length = (int)(log10(num) + 1);

        for (int i = length; i >= 1; i--)

        {

               rev += num % 10 * pow(10, i - 1);

               num /= 10;

               //printf("%ld\n", rev);

        }

        return rev;

}

 

int main(void)

{

        long num;

        printf("뒤집고 싶은 숫자를 입력: ");

        scanf("%ld", &num);

        printf("역순으로 출력: %ld\n", reverse(num));

        return 0;

}


[2번 문제]

/*

입력된 실수를 double형 변수 num에 저장하고, 저장된 숫자의 역순 값을 double형 변수 rev에 저장하여 출력하는 프로그램을 작성한다.

예를 들어 정수 1.234가 입력되었다면 변수 rev에는 정수 432.1이 저장되도록합니다

*/

#include <stdio.h>

#include <math.h>

 

double reverse(double num)

{

        int length, length2;

        double rev = 0.0;

        int count = 0;

        int number=(int)num; //실수 중 정수형 부분

        //printf("정수부분:%d\n", number);

        length = (int)(log10(number) + 1); //정수 부분 길이

        double decimal = num - number; //실수형 부분

        //printf("실수부분: %lf\n", decimal);

        //printf("%d\n", (int)(10 * decimal));

        do

        {

               if ((int)(10*decimal)%10==0) //0이 두번 나오기 전까지

               {

                       //printf("count++\n");

                       count += 1;

               }

               if (count == 2)

                       break;

               decimal *= 10;

        } while (count != 2);

        length2 = (int)(log10((int)decimal) + 1); //실수부분 길이

        for (int i = length2; i >= 1; i--)

        {

               rev += ((int)decimal % 10) * pow(10, i - 1);

               decimal /= 10;

        }

        //printf("%lf\n", rev);

        for (int i = length; i >= 1; i--)

        {

               rev += (number) % 10 * pow(10, -i);

               number /= 10;

        }

        return rev;

}

 

int main(void)

{

        double num = 1.234;

        printf("역순: %lf\n", reverse(num));

        return 0;

}


[3번 문제]

/*

야구선수의 타율과 같은 소수 이하의 숫자는 할푼리 단위로 읽습니다.

예를 들어 1 미만의 실수 0.435가 입력되었을 경우 "사할삼푼오리"로 출력하는 프로그램을 작성하시오

*/

#include <stdio.h>

 

void batting_average(double num)

{

        int ten = 10;

        char *unit[] = { "", "", "" };

        for (int i = 0; i < 3; i++)

        {

               int number = (int)(num*ten) % 10;

               if (number)

                       printf("%d%s", number, unit[i]);

               ten *= 10;

        }

}

 

int main(void)

{

        double average;

        printf("타율 입력: ");

        scanf("%lf", &average);

        batting_average(average);

        printf("\n");

        return 0;

}


[4번 문제]

/*

주판의 기본을 연습할 수 있도록 1부터 9까지 표시하는 과정을 애니메이션을 이용하여 단계별로 화면에 출력하는 프로그램을 작성하시오

*/

#include <stdio.h>

#include <Windows.h>

#include <conio.h>

 

void display_abacus(int number);

void draw_rectangle(int c, int r);

void gotoxy(int x, int y);

 

int main(void)

{

        int number = 0;

        printf("0~9를 주판모양으로 출력\n\n");

        printf("시작하려면 키보드를 누르세요\n");

        getch();

        system("cls");

        gotoxy(1, 4);

        draw_rectangle(1, 8);

        display_abacus(number);

        do

        {

               gotoxy(1, 14);

               printf("현재값:%d\n", number);

               gotoxy(1, 16);

               display_abacus(number);

               gotoxy(1, 24);

               Sleep(1000);

               number++;

        } while (number < 10);

        gotoxy(1, 17);

        return 0;

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

void draw_rectangle(int c, int r)

{

        int i, j;

        unsigned char a = 0xa6;

        unsigned char b[7];

        for (i = 1; i < 7; i++)

               b[i] = 0xa0 + i;

 

        printf("%c%c", a, b[3]);

        for (i = 0; i < c; i++)

               printf("%c%c", a, b[1]);

        printf("%c%c", a, b[4]);

        printf("\n");

        for (i = 0; i < r; i++)

        {

               printf("%c%c", a, b[2]);

               for (j = 0; j < c; j++)

                       printf("  ");

               printf("%c%c", a, b[2]);

               printf("\n");

        }

        printf("%c%c", a, b[6]);

        for (i = 0; i < c; i++)

               printf("%c%c", a, b[1]);

        printf("%c%c", a, b[5]);

        printf("\n");

}

 

 

 

void display_abacus(int number)

{

        int i, m;

        unsigned char a1 = 0xa6, a2 = 0xa1;

        gotoxy(3, 5);

        if (number / 5)

               printf("%c%c", a1, 0xa2);

        else

               printf("%c%c", a2, 0xdf);

        gotoxy(3, 6);

        if (number < 5)

               printf("%c%c", a1, 0xa2);

        else

               printf("%c%c", a2, 0xdf);

        gotoxy(1, 7);

        printf("%c%c", a1, 0xa7);

        printf("%c%c", a1, a2);

        printf("%c%c", a1, 0xa9);

        m = number % 5;

        for (i = 1; i <= 5; i++)

        {

               gotoxy(3, 7 + i);

               if (m >= i)

                       printf("%c%c", a2, 0xdf);

               else if (m == 0)

               {

                       printf("%c%c", a1, 0xa2);

                       m = 5;

               }

               else

               {

                       printf("%c%c", a1, 0xa2);

                       m = 5;

               }

        }

}


[5번 문제]

/*

다음의 표를 참고하여 두 자리 이상의 정수를 로마 숫자로 변환하는 프로그램을 작성한다

*/

#include <stdio.h>

 

void print_roman_number(int n);

 

int main(void)

{

        int n;

        do

        {

               system("cls");

               printf("10진 정수를 로마 숫자로 변환\n\n");

               printf("1이상 6999 미만의 정수만 입력\n");

               printf("숫자를 입력하고 Enter\n");

               printf("숫자입력>");

               scanf("%d", &n);

               if (n < 1 || n>=7000)

                       break;

               printf("변환된 로마숫자: ");

               print_roman_number(n);

               printf("\n");

               printf("아무키나 누르시오...");

               getch();

        } while (n);

        return 0;

}

 

void print_roman_number(int n)

{

        int i;

        char rome[7] = { 'I', 'V', 'X', 'L', 'C', 'D', 'M' };

        if (n <= 3)

               for (i = 1; i <= n; i++)

                       printf("%c", rome[0]);

        else if (n < 10)

        {

               if (n == 4)

                       printf("%c", rome[0]);

               if (n <= 8)

               {

                       printf("%c", rome[1]);

                       for (i = 5; i < n; i++)

                              printf("%c", rome[0]);

               }

               else

                       printf("%c%c", rome[0], rome[2]);

        }

        else if (n < 40)

        {

               if (n < 20)

               {

                       printf("%c", rome[2]);

                       print_roman_number(n % 10);

               }

               else if (n < 30)

               {

                       printf("%c%c", rome[2], rome[2]);

                       print_roman_number(n % 10);

               }

               else

               {

                       printf("%c%c%c", rome[2], rome[2], rome[2]);

                       print_roman_number(n % 10);

               }

        }

        else if (n < 50)

        {

               printf("%c%c", rome[2], rome[3]);

               print_roman_number(n % 10);

        }

        else if (n < 90)

        {

               if (n < 60)

               {

                       printf("%c", rome[3]);

                       print_roman_number(n % 10);

               }

               else if (n < 70)

               {

                       printf("%c%c", rome[3], rome[2]);

                       print_roman_number(n % 10);

               }

               else if (n < 80)

               {

                       printf("%c%c%c", rome[3], rome[2], rome[2]);

                       print_roman_number(n % 10);

               }

               else

               {

                       printf("%c%c%c%c", rome[3], rome[2], rome[2], rome[2]);

                       print_roman_number(n % 10);

               }

        }

        else if (n < 100)

        {

               printf("%c%c", rome[2], rome[4]);

               print_roman_number(n % 10);

        }

        else if (n < 200)

        {

               printf("%c", rome[4]);

               print_roman_number(n % 100);

        }

        else if (n < 300)

        {

               printf("%c%c", rome[4], rome[4]);

               print_roman_number(n % 100);

        }

        else if (n < 400)

        {

               printf("%c%c%c", rome[4], rome[4], rome[4]);

               print_roman_number(n % 100);

        }

        else if (n < 500)

        {

               printf("%c%c", rome[4], rome[5]);

               print_roman_number(n % 100);

        }

        else if (n < 600)

        {

               printf("%c", rome[5]);

               print_roman_number(n % 100);

        }

        else if (n < 700)

        {

               printf("%c%c", rome[5], rome[4]);

               print_roman_number(n % 100);

        }

        else if (n < 800)

        {

               printf("%c%c%c", rome[5], rome[4], rome[4]);

               print_roman_number(n % 100);

        }

        else if (n < 900)

        {

               printf("%c%c%c%c", rome[5], rome[4], rome[4], rome[4]);

               print_roman_number(n % 100);

        }

        else if (n < 1000)

        {

               printf("%c%c", rome[5], rome[6]);

               print_roman_number(n % 100);

        }

        else if (n < 2000)

        {

               printf("%c", rome[6]);

               print_roman_number(n % 1000);

        }

        else if (n < 3000)

        {

               printf("%c%c", rome[6], rome[6]);

               print_roman_number(n % 1000);

        }

        else if (n < 4000)

        {

               printf("%c%c%c", rome[6], rome[6], rome[6]);

               print_roman_number(n % 1000);

        }

        else if (n < 5000)

        {

               printf("%c%c%c%c", rome[6], rome[6], rome[6], rome[6]);

               print_roman_number(n % 1000);

        }

        else if (n < 6000)

        {

               printf("%c%c%c%c%c", rome[6], rome[6], rome[6], rome[6], rome[6]);

               print_roman_number(n % 1000);

        }

        else if (n < 7000)

        {

               printf("%c%c%c%c%c%c", rome[6], rome[6], rome[6], rome[6], rome[6], rome[6]);

               print_roman_number(n % 1000);

        }

}


[6번 문제]

/*

로마 숫자를 입력하면 10진수로 변환하는 프로그램을 작성한다

*/

#include <stdio.h>

 

int number(char *roma);

 

int main(void)

{

        char roma[100];

        char *pointer; //로마숫자를 가리키는 포인터

        int num; //십진수

 

        printf("로마숫자: ");

        scanf("%s", roma);

       

        num = 0;

        pointer = roma;

        while (*pointer)

        {

               if (number(pointer + 1) == 0) //다음문자가 널인 경우 더하고

                       num += number(pointer);

               else if (number(pointer) >= number(pointer + 1)) //지금 가리키고 있는 로마숫자가 다음 로마숫자보다 클경우

                       //ex) XI 6(5+1)

                       num += number(pointer);

               else //지금 가리키고 있는 로마숫자가 다음 로마숫자보다 작을 경우

                       //ex) IX 4(5-1)

                       num -= number(pointer);

               pointer++;

        }

        printf("로마숫자:%d\n", num);

        return 0;

}

 

int number(char *roma)

{

        switch (*roma)

        {

        case 'I':

               return 1;

               break;

        case 'V':

               return 5;

               break;

        case 'X':

               return 10;

               break;

        case 'L':

               return 50;

               break;

        case 'C':

               return 100;

               break;

        case 'D':

               return 500;

               break;

        case 'M':

               return 1000;

               break;

        default:

               return 0;

        }

}


[7번 문제]

/*

한글과 영문이 포함된 텍스트 파일에 대해 영어 단어와 한글 단어가 각각 몇 개가 포함되어 있는지를

계산하는 프로그램을 작성한다

*/

#include <stdio.h>

#include <stdlib.h>

 

int main(void)

{

        int alpha = 0, hangul = 0;

        char c1;

        unsigned char uc1, uc2;

        FILE *fp = fopen("C:\\5.4.7.txt", "r");

        if (fp == NULL)

        {

               printf("파일 오픈 에러\n");

               exit(1);

        }

        while ((c1 = fgetc(fp)) != EOF)

        {

               //printf("%c\n", c1);

               if ((c1 >= 65 && c1<=90) || (c1>=97 && c1 <= 122))

                       alpha++;

               else if (c1 != ' ') //그 외 띄어쓰기가 아니라면

               {

                       uc1 = c1;

                       uc2 = fgetc(fp);

                       hangul++;

               }

        }

        printf("영어:%d, 한글:%d\n", alpha, hangul);

        return 0;

}


[8번 문제]

/*

한글과 영어문장이 저장된 파일의 내용을 역순으로 변환하는 프로그램을 작성한다

*/

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <malloc.h>

 

typedef struct _TXT

{

        int number;

        char string[256];

}TXT;

 

int main(void)

{

        FILE *fp;

        int lines;

        char s[256];

        TXT *p;

 

        //행의 수를 카운트하여 필요한 메모리 확보

        if (!(fp = fopen("C:\\심리테스트질문.txt", "r")))

               return 1;

        for (lines = 0; !feof(fp);lines++)

               fgets(s, 255, fp);

        p = (TXT*)malloc(lines * sizeof(TXT));

        if (!p)

               return 2;

 

        memset(p, 0, lines * sizeof(TXT)); //초기화

        fseek(fp, SEEK_SET, 0);

        for (int i = 0; i < lines; i++)

        {

               p[i].number = i;

               fgets(p[i].string, 255, fp);

               p[i].string[strlen(p[i].string) - 1] = '\0';

        }

        fclose(fp);

 

        //거꾸로 표시

        for (int i = lines - 1; i > 0; i--)

               printf("%04d:%s\n", p[i].number + 1, p[i].string);

        free(p);

        return 0;

}

 


[9번 문제]

/*

50000원권 화폐는 2009 6월에 발행되었습니다.

50000원권을 포함하여 처리하도록 함수 5.4.5를 수정하세요

*/

#include <stdio.h>

 

void serial_unit(long money)

{

        long money_unit[] = { 50000, 10000, 5000, 1000, 500, 100, 50, 10, 5, 1 };

 

        long i, num;

        char *unit[] = { "오만원", "만원", "오천원", "천원", "오백원", "백원", "오십원", "십원", "오원", "일원" };

        printf("\n화폐 단위\n");

        for (i = 0; i <= 9; i++)

        {

               num = money / money_unit[i];

               money = money - num*money_unit[i];

               printf("%6s\t:%3ld\n", unit[i], num);

        }

        printf("\n");

}

 

int main(void)

{

        long money;

        printf("금액 입력: ");

        scanf("%ld", &money);

        serial_unit(money);

        return 0;

}

 


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


[참고] 명품 C언어 프로젝트 안기수 저, http://hyunssssss.tistory.com/29


*8번 문제는 http://hyunssssss.tistory.com/29를 그대로 작성했습니다. 파일 입출력 문제를 별로 안 풀다보니 미숙한 것 같습니다.

반응형