반응형
1~2. "Menu choices"를 인쇄하는 menu라는 함수를 작성하라. 이 함수의 원형은 void menu(void)이다.
#include <stdio.h> void menu(void); int main() { menu(); } void menu(void) { printf("Menu choices \n"); }
3~4. 인자로 문자열을 전달받아 그것을 출력하는 print라는 함수를 작성하라. 이 함수의 원형은 void print(char str[]); 이다.
#include <stdio.h> void print(char str[]); int main() { char str[] = "Hello World"; print(str); } void print(char str[]) { printf("%s\n",str); }
5~6. 정수 배열을 전달받아 전체 합계를 반환하는 total이라는 함수를 작성하라. 이 함수의 원형은 int total(int arr[], int count); 이다.
#include <stdio.h> int total(int arr[], int count); int main() { int iarr[] = { 1,2,4,3,57,8,3,2,10 }; for (int i = 0; i < sizeof(iarr) / sizeof(int); i++) { printf("%d",iarr[i]); if (i + 1 != sizeof(iarr) / sizeof(int)) { printf(" + "); } else { printf(" = "); } } printf("%d \n", total(iarr, sizeof(iarr) / sizeof(int))); } int total(int arr[], int count) { int sum = 0; for (int i = 0; i < count; i++) { sum += arr[i]; } return sum; }
7. 제라의 공식을 이용하여 한달 달력을 출력하는 프로그램을 작성하라.
#include <stdio.h> int zeller(int a, int b, int c, int d); int main() { int year, mon, day, week; printf("달력을 출력할 년도와 월을 입력받습니다. \n "); printf("년도를 입력해주세요: "); scanf_s("%d", &year); if (year < 1583) { printf("1583년 이후만 가능합니다. 다시 입력해주세요. \n"); printf("년도를 입력해주세요: "); scanf_s("%d", &year); } printf("월을 입력해주세요 : "); scanf_s("%d", &mon); if (mon < 1 || mon > 12) { printf("1월부터 12월 사이로 입력해주세요 \n"); printf("월을 입력해주세요 : "); scanf_s("%d", &mon); } int months[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; if (mon != 2) { day = months[mon - 1]; } else { day = (year % 400 == 0) || (year % 100 != 0) && (year % 4 == 0) ? 29 : 28; } week = zeller((int)year / 100, year - ((int)year / 100) * 100, mon, 1); printf("\n"); printf("일 월 화 수 목 금 토 \n"); for (int i = 1; i <= day; i++) { if (i == 1) { for (int k = 0; k < week; k++) { printf(" "); } } printf("%2d ", i); if (6 == week++) { printf("\n"); week = 0; } } printf("\n"); printf("\n"); } int zeller(int a, int b, int c, int d) { if (c == 1) { return ((int)(a * 21 / 4) + (int)((b-1) * 5 / 4) + (int)((c + 13) * 26 / 10) + (d - 1)) % 7; } else if (c == 2) { return ((int)(a * 21 / 4) + (int)((b-1) * 5 / 4) + (int)((c + 14) * 26 / 10) + (d - 1)) % 7; } else { return ((int)(a * 21 / 4) + (int)(b * 5 / 4) + (int)((c + 1) * 26 / 10) + (d - 1)) % 7; } }
제라의 공식
공식 : ([21a/4] + [5b/4] + [26(c+1)/10] + d -1)을 7로 나눈 나머지가 0이면 일요일 ~ 6이면 토요일.
이때,
1) []는 가우스 기호. (소수점 이하 버림)
2) a는 100년 단위, b는 100년 단위를 제외한 나머지, c는 월, d는 일.
3) 1월과 2월은 그 전년도 13월과 14월로 계산
4) 이 공식은 그레고리력(1582년 10월 15일 이후)에만 적용됨
ex1 ) 2018년 5월 20일은 a = 20, b = 18, c = 5, d = 20
(105+22+15+19) / 7 은 나머지가 0이므로 일요일
ex2 ) 2018년 1월 20일은 a = 20, b = 17, c = 13, d = 20
(105+21+36+19) / 7은 나머지가 6이므로 토요일
8. 7번문제의 년과 월을 main()함수의 매개변수로 받아서 출력하는 프로그램을 작성하라.
#include <stdio.h> #include <stdlib.h> int zeller(int a, int b, int c, int d); int main(int argc, char* argv[]) { int year, mon, day, week; if (argc != 3) { printf("매개변수에 년과 월을 입력하세요. \n"); return 0; } year = atoi(argv[1]); mon = atoi(argv[2]); if (year < 1583) { printf("년도가 잘못 입력되었습니다. 1583년 이후로 입력하세요. \n"); return 0; } if (mon < 1 || mon > 12) { printf("월이 잘못 입력되었습니다. 1월부터 12월 사이로 입력해주세요 \n"); return 0; } int months[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; if (mon != 2) { day = months[mon - 1]; } else { day = (year % 400 == 0) || (year % 100 != 0) && (year % 4 == 0) ? 29 : 28; } week = zeller((int)year / 100, year - ((int)year / 100) * 100, mon, 1); printf("\n"); printf("일 월 화 수 목 금 토 \n"); for (int i = 1; i <= day; i++) { if (i == 1) { for (int k = 0; k < week; k++) { printf(" "); } } printf("%2d ", i); if (6 == week++) { printf("\n"); week = 0; } } printf("\n"); printf("\n"); } int zeller(int a, int b, int c, int d) { if (c == 1) { return ((int)(a * 21 / 4) + (int)((b-1) * 5 / 4) + (int)((c + 13) * 26 / 10) + (d - 1)) % 7; } else if (c == 2) { return ((int)(a * 21 / 4) + (int)((b-1) * 5 / 4) + (int)((c + 14) * 26 / 10) + (d - 1)) % 7; } else { return ((int)(a * 21 / 4) + (int)(b * 5 / 4) + (int)((c + 1) * 26 / 10) + (d - 1)) % 7; } }
반응형