/*
휴대전화기의 숫자버튼을 이용한 문자 작성
영문자 대소문자 구분하여 문자를 작성할 수 있도록 프로그램을 확장하시오
숫자버튼을 오래누르면(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언어 프로젝트 안기수 저
'C > 명품 C언어 프로젝트(안기수 저)' 카테고리의 다른 글
명품 C언어 프로젝트 10.4장 교실 내의 자리배치 (0) | 2017.10.09 |
---|---|
명품 C언어 프로젝트 10.3장 움직이는 광고판 (15) | 2017.10.05 |
명품 C언어 프로젝트 10.1장 디지털 시계 (8) | 2017.09.25 |
명품 C언어 프로젝트 9.2장 디지털 레시피 (0) | 2017.09.24 |
명품 C언어 프로젝트 9.1장 디지털 피아노 (0) | 2017.09.22 |