연재 완료/C Lang 예제코드 모음

C언어 연습문제 풀이 CH7 (1~8)

라이피 (Lypi) 2018. 5. 20. 22:50
반응형

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;
	}
}


반응형