• 编写一个程序,输出当年的月历。


    显示效果如:


    #include<stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef enum bool
    {
    	false, true
    }bool;
    
    bool isLeapYear(int year)//判断是否闰年
    {
    	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
    	{
    		return true;
    	}
    	else
    	{
    		return false;
    	}
    }
    
    int getMonthDays(int year, int month)//获得该月天数
    {
    	int days = 0;
    	switch (month)
    	{
    	case 1:
    	case 3:
    	case 5:
    	case 7:
    	case 8:
    	case 10:
    	case 12:
    		days = 31;
    		break;
    	case 4:
    	case 6:
    	case 9:
    	case 11:
    		days = 30;
    		break;
    	case 2:
    		if (isLeapYear(year))
    		{
    			days = 29;
    		}
    		else
    		{
    			days = 28;
    		}
    		break;
    	}
    	return days;
    }
    
    void showMonth(int days, int startday)//输出月历
    {
    	const char weeks[][4] = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };
    	for (int i = 0; i < 6; i++)
    	{
    		printf("%s ", weeks[i]);
    	}
    	printf("%s
    ", weeks[6]);
    
    	for (int i = 1; i <= days; i++)
    	{
    		if (i == 1)
    		{
    			for (int j = 0; j < startday; j++)
    			{
    				printf("    ");
    			}
    			printf("%3d ", 1);
    		}
    		else
    		{
    			printf("%3d ", i);
    		}
    		if ((i + startday) % 7 == 0)
    		{
    			putchar('
    ');
    		}
    	}
    	putchar('
    ');
    }
    
    int main(void)
    {
    	//以1970年1月1日(星期四)为基准
    	int year, month, monthDays, startday, days;
    	const int startYear = 1970;
    	printf("请输入年月例:2015 8
    ");
    	while (scanf("%d %d", &year, &month) != EOF)
    	{
    		monthDays = getMonthDays(year, month);
    		days = 0;
    		for (int i = startYear; i < year; i++)
    		{
    			if (isLeapYear(i))
    			{
    				days += 366;
    			}
    			else
    			{
    				days += 365;
    			}
    		}
    		for (int i = 1; i < month; i++)
    		{
    			days += getMonthDays(year, i);
    		}
    		startday = (days + 4) % 7;
    		//printf("%d
    ", startday);
    
    		showMonth(monthDays, startday);
    		printf("请输入年月例:2015 8
    ");
    	}
    	return 0;
    }

    输出:

    请输入年月例:2015 8
    2005 7
    SUN MON TUE WED THU FRI SAT
                          1   2
      3   4   5   6   7   8   9
     10  11  12  13  14  15  16
     17  18  19  20  21  22  23
     24  25  26  27  28  29  30
     31
    请输入年月例:2015 8
    



    Keep it simple!
    作者:N3verL4nd
    知识共享,欢迎转载。
  • 相关阅读:
    jwt原理
    图书管理系统后端
    图书管理系统前端
    图书管理前端页面
    Linux多任务: exec 和fork()的联用
    CPU 字长与存储器位宽不一致处理
    关键字volatule
    linux C 中断程序:利用队列保存中断类型
    Linux下的Make与Makefile
    C :assert() 的用法
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/5834710.html
Copyright © 2020-2023  润新知