[C언어 소스] 디지털 시계

안녕하세요. 언제나 휴일이예요.

이번에는 디지털 시계 소스 코드입니다. 먼저 0부터 9까지 출력할 정보를 3차원 배열로 정의한 후에 시, 분, 초를 출력하는 함수를 정의합니다.

그리고 콘솔 커서의 위치를 이동하는 gotoxy 함수를 정의합니다. 그리고 time 함수를 이용하여 1초가 지났는지 주기적으로 확인하여 1초가 지나면 현재 시각을 구한 후에 출력합니다.

디지털 시계 실행 화면
디지털 시계

소스 코드

#include <Windows.h>
#include <stdio.h>
#include <time.h>
#include <conio.h>
#pragma warning(disable:4996)
char*digits[10][5][4] =//0~9까지 출력할 정보
{
    {
        { "■","■","■","■" },
        { "■","  ","  ","■" },
        { "■","  ","  ","■" },
        { "■","  ","  ","■" },
        { "■","■","■","■" }
    },
    {
        { "  ","  ","  ","■" },
        { "  ","  ","  ","■" },
        { "  ","  ","  ","■" },
        { "  ","  ","  ","■" },
        { "  ","  ","  ","■" }
    },
    {
        { "■","■","■","■" },
        { "  ","  ","  ","■" },
        { "■","■","■","■" },
        { "■","  ","  ","  " },
        { "■","■","■","■" }
    },
    {
        { "■","■","■","■" },
        { "  ","  ","  ","■" },
        { "■","■","■","■" },
        { "  ","  ","  ","■" },
        { "■","■","■","■" }
    },
    {
        { "■","  ","■","  " },
        { "■","  ","■","  " },
        { "■","■","■","■" },
        { "  ","  ","■","  " },
        { "  ","  ","■","  " }
    },
    {
        { "■","■","■","■" },
        { "■","  ","  ","  " },
        { "■","■","■","■" },
        { "  ","  ","  ","■" },
        { "■","■","■","■" },
    },
    {
        { "■","  ","  ","  " },
        { "■","  ","  ","  " },
        { "■","■","■","■" },
        { "■","  ","  ","■" },
        { "■","■","■","■" }
    },
    {
        { "■","■","■","■" },
        { "■","  ","  ","■" },
        { "■","  ","  ","■" },
        { "  ","  ","  ","■" },
        { "  ","  ","  ","■" }
    },
    {
        { "■","■","■","■" },
        { "■","  ","  ","■" },
        { "■","■","■","■" },
        { "■","  ","  ","■" },
        { "■","■","■","■" }
    },
    {
        { "■","■","■","■" },
        { "■","  ","  ","■" },
        { "■","■","■","■" },
        { "  ","  ","  ","■" },
        { "  ","  ","  ","■" }
    }
};

int sx[6] = { 0,10,24,34,48,58 };//시분초를 출력할 x좌표 

char *colons[5] = { " ","■","  ","■","  " };
int sx2[6] = { 20,44 };//콜론을 출력할 좌표

void gotoxy(int x, int y)
{
    COORD Pos = { x,y };
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}


//dn자리에 정수 n을 출력하는 함수
void DrawNum(int dn, int n)
{
    int y, x;

    for (y = 0; y<5; y++)
    {
        for (x = 0; x<4; x++)
        {
            gotoxy(sx[dn] + x * 2, y);
            printf("%s", digits[n][y][x]);
        }
        printf("\n");
    }
}


//콜론을 출력하는함수 n이 0이면 시와 분사이, 1이면 분과 초사이
void DrawColon(int n)
{
    int y = 0;


    for (y = 0; y<5; y++)
    {
        gotoxy(sx2[n], y);
        printf("%s\n", colons[y]);
    }

}


//시간을 출력하는함수
void DrawTime(int h, int m, int s)
{
    DrawNum(0, h / 10);//시의 앞자리
    DrawNum(1, h % 10);//시의 뒷자리
    DrawColon(0);//콜론
    DrawNum(2, m / 10);//분의 앞자리
    DrawNum(3, m % 10);//분의 뒷자리
    DrawColon(1);//콜론
    DrawNum(4, s / 10);//초의 앞자리
    DrawNum(5, s % 10);//초의 뒷자리
}

int main(void)
{
    time_t now, before;
    struct tm nt;

    gotoxy(0, 8);
    printf("아무키나 누르면 프로그램 종료");

    now = before = time(0); //초 단위 시간을 구함
    localtime_s(&nt, &now); //지역 시각을 구함
    DrawTime(nt.tm_hour, nt.tm_min, nt.tm_sec);//현재 시각을 출력
    while (kbhit() == 0)
    {
        now = time(0);//초단위 시간을 구함
        if (now != before)//다르면
        {
            before = now;//현재 초단위 시간을 기억
            localtime_s(&nt, &now);//지역 시각을 구함
            DrawTime(nt.tm_hour, nt.tm_min, nt.tm_sec);//현재 시각을 출력
        }
    }

    return 0;
}