Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <time.h>
- const char *dayname[7] = { "일", "월", "화", "수", "목", "금", "토" };
- char print_string[300];
- // tf(true/false) 정의
- typedef int tf;
- #define true 1
- #define false 0
- // 달 출력(달(0~11), 시작요일:0~6), 반환값은 다음 달 시작요일
- // tf yoon_year로 윤년인지 판단
- // tf print가 false일 경우, 계산만 하고 리턴
- // today를 받아, 향후 7일 간의 일정을 표시
- int draw_month(int month, int start_day, int today, tf yoon_year, tf print);
- int main(void)
- {
- // 유저가 종료할 때 까지 루프
- while (1) {
- int year_int, month_int, start_day, today;
- tf yoon_year = false;
- // time.h의 strftime 함수 이용하여 현재 년/월/일 가져오기
- // https://www.quora.com/How-can-I-get-system-day-month-and-year-easily-by-using-C-programming-language
- time_t timer;
- struct tm* tm_info;
- char day[3];
- char month[3];
- char year[5];
- time(&timer);
- tm_info = localtime(&timer);
- strftime(day, 3, "%d", tm_info);
- strftime(month, 3, "%m", tm_info);
- strftime(year, 5, "%Y", tm_info);
- // char에서 int로 변환
- year_int = atoi(year);
- month_int = atoi(month);
- today = atoi(day);
- // 올해 1월 1일의 요일 가져오기
- tm_info->tm_mday = 1;
- tm_info->tm_mon = 1 - 1; // struct tm의 month는 0부터 시작
- tm_info->tm_year = year_int - 1900; // struct tm의 year는 1900부터 시작
- mktime(tm_info);
- start_day = tm_info->tm_wday;
- // 윤년 판단
- if ( (year_int % 4 == 0) &&
- ((year_int % 100 != 0) || (year_int % 400 == 0)))
- {
- yoon_year = true;
- }
- printf("\n[ %d년 %d월 %d일 ]\n\n", year_int, month_int, today);
- for (int i = 0; i < 12; i++) {
- //start_day = draw_month(i, start_day, today, yoon_year, true); // 모든 달 출력
- start_day = draw_month(i, start_day, today, yoon_year, (i + 1 == month_int));
- }
- if (strlen(print_string) == 0) {
- printf("\n < 7일간 일정 없음! >\n");
- } else {
- printf("\n < 7일 일정 >\n\n");
- printf("%s", print_string);
- }
- // 캘린더/일정 출력 끝, 일정 입력 시작
- printf("\n");
- int user_day;
- printf("(0을 입력하면 종료)\n");
- printf("일정을 추가할 날을 선택해주세요 : ");
- scanf("%d", &user_day);
- if (user_day == 0)
- return 0;
- char buffer[100];
- printf("메시지를 입력해주세요 : ");
- gets(buffer);
- // 파일로 저장
- FILE *fp_out;
- char filename[9]; // 0000.txt + '\0'
- filename[0] = '0' + (month_int < 10 ? 0 : month_int / 10);
- filename[1] = '0' + (month_int % 10);
- filename[2] = '0' + (today < 10 ? 0 : today / 10);
- filename[3] = '0' + (today % 10);
- filename[4] = '.';
- filename[5] = 't';
- filename[6] = 'x';
- filename[7] = 't';
- filename[8] = '\0';
- fp_out = fopen(filename, "w");
- fputs(buffer, fp_out);
- fclose(fp_out);
- }
- return 0;
- }
- int draw_month(int month, int start_day, int today, tf yoon_year, tf print)
- {
- int i;
- if (print) {
- // 달 출력
- printf(" < %d 월 >\n", month + 1);
- // 구분선
- for (i = 0; i < 55; i++) {
- printf("%c", '=');
- }
- printf("\n");
- // 요일 출력
- for (i = 0; i < 7; i++)
- {
- // 폭을 7로 설정
- printf("%7s", dayname[i]);
- }
- printf("\n");
- // 구분선
- for (i = 0; i < 55; i++) {
- printf("%c", '-');
- }
- printf("\n");
- // 첫 주 시작일까지 공백 출력
- for (i = 0; i < start_day; i++)
- {
- // 폭을 7로 설정
- printf("%7s", " ");
- }
- }
- for ( i = 0;
- i < (
- (month + 1) % 2 == 0 ?
- // 짝수 달
- month + 1 == 2 ?
- // 2월
- yoon_year ?
- // 윤년
- 29
- :
- // !윤년
- 28
- :
- // 2월을 제외한 짝수 달
- month + 1 >= 8 ? 31 :30
- :
- // 홀수 달
- month + 1 >= 8 ? 30 : 31
- );
- i++) //일 출력
- {
- if (print) {
- FILE *fp_in;
- char buffer[100];
- char filename[9]; // 0000.txt + '\0'
- filename[0] = '0' + (month + 1 < 10 ? 0 : (month + 1) / 10);
- filename[1] = '0' + (month + 1) % 10;
- filename[2] = '0' + (i + 1 < 10 ? 0 : (i + 1) / 10);
- filename[3] = '0' + (i + 1) % 10;
- filename[4] = '.';
- filename[5] = 't';
- filename[6] = 'x';
- filename[7] = 't';
- filename[8] = '\0';
- fp_in = fopen(filename, "r");
- if (fp_in != NULL) {
- // 파일이 존재함, 일정 "유"로 표시
- char tmp[4];
- tmp[0] = (i + 1 < 10 ? ' ' : '*');
- tmp[1] = (i + 1 < 10 ? '*' : '0' + (i + 1) / 10);
- tmp[2] = '0' + (i + 1) % 10;
- tmp[3] = '\0';
- printf("%7s", tmp); //폭을 7로 설정
- // 향후 7일 간의 일정 표시
- if (today <= i + 1 && i + 1 <= today + 7) {
- // 마지막 출력을 위해 저장
- fgets(buffer, 100, fp_in);
- // append
- strncat(print_string, filename, 2); // 월
- strcat(print_string, "/");
- strncat(print_string, filename + 2, 2); //일
- strcat(print_string, " : ");
- strcat(print_string, buffer);
- strcat(print_string, "\n");
- }
- // 파일 닫기
- fclose(fp_in);
- } else {
- printf("%7d", i + 1); //폭을 7로 설정
- }
- }
- start_day++;
- if (start_day == 7) //요일이 7이면
- {
- start_day = 0; //0으로 변경
- if (print)
- printf("\n");
- }
- }
- if (print) {
- printf("\n");
- for (i = 0; i < 55; i++) {
- printf("%c", '=');
- }
- printf("\n");
- }
- return start_day; //다음 달 시작 요일 반환
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement