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

명품 C언어 프로젝트 10.2장 휴대전화 문자

꾸준함. 2017. 9. 29. 22:51

/*

휴대전화기의 숫자버튼을 이용한 문자 작성

영문자 대소문자 구분하여 문자를 작성할 수 있도록 프로그램을 확장하시오

숫자버튼을 오래누르면(2초 이상) 문자가 아닌 숫자를 표시할 수 있도록 프로그램을 수정하시오

*/

#include <stdio.h>

#include <conio.h>

#include <time.h>

#include <Windows.h>

 

void display_phone_pad(void);

void control_phone_pad(void);

void draw_check02(int c, int r);

void gotoxy(int x, int y);

void intro(void);

 

char alpha[][3] = {

        { ' ' },{ '.', 'q', 'z' },{ 'a', 'b', 'c' },

        { 'd', 'e', 'f' },{ 'g', 'h', 'i' },{ 'j', 'k', 'l' },

        { 'm', 'n', 'o' },{ 'p', 'r', 's' },{ 't', 'u', 'v' },

        { 'w', 'x', 'y' }

};

 

char capital[][3] = {

        {' '}, {'.', 'Q', 'Z'}, {'A', 'B', 'C'},

        {'D', 'E', 'F'}, {'G', 'H', 'I'}, {'J', 'K', 'L'},

        {'M', 'N', 'O'}, {'P', 'R', 'S'}, {'T', 'U', 'V'},

        {'W', 'X', 'Y'}

};

 

int main(void)

{

        display_phone_pad();

        control_phone_pad();

        return 0;

}

 

void intro(void)

{

        gotoxy(1, 20);

        printf("대소문자 바꾸고 싶으면 ");

        printf("'c'키 누르고 원하는 패드 다시 입력");

}

 

void gotoxy(int x, int y)

{

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

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

/*

숫자버튼을 제어하여 문자를 작성하는 함수 control_phone_pad

*/

void control_phone_pad(void)

{

        char c1, c2, c3, cnt;

        int CAPS=0; //대문자 여부

        time_t start, end;

        c1 = getch();

        start = time(NULL);

        do

        {

               cnt = 0;

               if (c1 == 'c')

               {

                       CAPS = 1 - CAPS;

                       c1 = getch();

               }

               if (c1 == ' ') //입력버튼이 space면 커서 뒤로 이동하여 마지막 문자 지운다

                       printf("\b");

               else if (!CAPS)

                       printf("%c", alpha[c1 - '0'][cnt]);

               else if (CAPS)

                       printf("%c", capital[c1 - '0'][cnt]);

               do

               {

                       c2 = getch(); //숫자를 누르고 싶으면 2초 후에 똑같은 패드 누르기

                       end = time(NULL);

                       if ((c1 == c2) && ((end - start) <= 2))

                       {

                              if (cnt > 1) //같은 숫자버튼에 대한 마지막문자를 처리했으면

                                      cnt = 0;

                              else //같은 숫자버튼에 대한 다음 문자처리

                                      cnt++;

                              c1 = c2;

                              if (!CAPS)

                                      printf("\b%c", alpha[c1 - '0'][cnt]);

                              else

                                      printf("\b%c", capital[c1 - '0'][cnt]);

                              start = time(NULL);

                       }

                       else if (c1 == c2 && ((end-start)>2)) //2초 이상

                              printf("\b%d", c1 - '0');

                       else

                              break;

               } while (1);

               start = time(NULL);

               c1 = c2;

        } while (1);

}

 

/*

휴대전화기의 숫자 패드를 출력하는 함수 display_phone_pad

*/

void display_phone_pad(void)

{

        int y, x, z, cnt = 0;

        draw_check02(3, 4);

        intro();

        for (y = 1; y <= 5; y += 2)

        {

               for (x = 2; x <= 10; x += 4)

               {

                       gotoxy(x, y);

                       printf("%d", ++cnt);

                       gotoxy(x + 1, y + 1);

                       for (z = 0; z <= 2; z++)

                              printf("%c", alpha[cnt][z]);

               }

        }

        gotoxy(6, 7);

        printf("0");

        gotoxy(7, 8);

        printf("SP");

        gotoxy(1, 15);

}

 

/*

확장된 바둑판 그리기 함수 draw_check02

*/

void draw_check02(int c, int r)

{

        int i, j;

        unsigned char a = 0xa6;

        unsigned char b[12];

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

               b[i] = 0xa0 + i;

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

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

        {

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

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

        }

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

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

        printf("\n");

        for (i = 0; i < r - 1; 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[7]);

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

               {

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

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

               }

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

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

               printf("\n");

        }

        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 - 1; i++)

        {

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

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

        }

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

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

        printf("\n");

}

 


개발환경:Visual Studio 2017


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


[참고] 명품 C언어 프로젝트 안기수 저

반응형