C语言编程 Switch 语句编写 最简单的日历

Switch语句是C语言的几个分支结构

本次编程练习,是根据输入的今年的第几天,输出是 几月几日,星期几。

实现思路大致如下:

1.先读取系统时间,得知今年的年号,
2.根据年号获得今年的第一天是星期几
3.得知今年是否闰年
4.switch语句初始化今年每个月的天数(注意是否闰年对二月单独处理)
5 .for循环查询月份和当月的日期
6.计算星期几
7. 输出月日
8.switch 输出星期几

#include <iostream>
#include <stdio.h>
#include <time.h>
#include <conio.h>

int leapYear(int y)
{
	//return ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0);
	int r = 0;
	if (y % 100 == 0)
	{
		//整百年数
		if (y % 400 == 0) r = 1;
		else r = 0;
	}
	else
	{
		//非整百年数
		if (y % 4 == 0)r = 1;
		else r = 0;
	}

	return r;

}
long firstDayOfYear(int y)
{
	long n;
	int i = 1;
	n = y * 365;
	for (i = 1; i < y; i++) {
		
		if (leapYear(i))n += 1;
	}
	return n %= 7;//n=n%7;
}


int main()
{
	int year;
	char szCurrentDateTime[32];
	time_t nowtime;
	struct tm ptm;
	int monthdays[12];
	int isleapyear;
	int diyitianxingqiji;
	time(&nowtime);

	localtime_s(&ptm,&nowtime);

	sprintf_s(szCurrentDateTime, "M-%.2d-%.2d %.2d:%.2d:%.2d",
	ptm.tm_year + 1900, ptm.tm_mon + 1, ptm.tm_mday,
	ptm.tm_hour, ptm.tm_min, ptm.tm_sec);

	//printf(szCurrentDateTime);

	//得到当前年号
	year = ptm.tm_year + 1900;

	//一般方法是用4或400去除这一年的年份数,如果除得的商是整数而没有余数,那么这一年是闰年

	
	
	isleapyear=leapYear(year);

	diyitianxingqiji = firstDayOfYear(year);

	printf("今年第一天是星期几=%d\n", diyitianxingqiji);

	for (int i = 0; i < 12; i++)
	{
		switch (i)
		{
		case 0: monthdays[i] = 31;
			break;
		case 1: if (isleapyear==1)monthdays[i] = 29;
				else monthdays[i] = 28;
			break;
		case 2: monthdays[i] = 31;
			break;
		case 3: monthdays[i] = 30;
			break;
		case 4: monthdays[i] = 31;
			break;
		case 5: monthdays[i] = 30;
			break;
		case 6: monthdays[i] = 31;
			break;
		case 7: monthdays[i] = 31;
			break;
		case 8: monthdays[i] = 30;
			break;
		case 9: monthdays[i] = 31;
			break;
		case 10: monthdays[i] = 30;
			break;
		case 11: monthdays[i] = 31;
			break;

		}

	}
	
	
	int dijiday;

	printf("请输入需要查询的是今年第多少天\n");
	scanf_s("%d", &dijiday);

	
	int ztsh = 365;

	if (isleapyear == 1)ztsh = 366;

	if (dijiday < 1 || dijiday>ztsh)
	{
		printf("err input\n");
		exit(0);
	}


	int monthx=0,dayx=0;
	int weekx=0;
	int sum = 0;
	int oldsum = 0;

	for (int i = 0; i < 12; i++)
	{
		sum = sum + monthdays[i];
		if (sum >= dijiday)
		{
			monthx = i + 1;
			dayx = dijiday - oldsum;
			break;
		}

		oldsum = sum;
	}

	weekx = (diyitianxingqiji + dijiday-1) % 7;


	printf("今年第%d天是 %d 月 %d 日 星期 ", dijiday, monthx, dayx);
	
	switch (weekx)
	{
	case 0:printf("日\n");
		break;
	case 1:printf("一\n");
		break;
	case 2:printf("二\n");
		break;
	case 3:printf("三\n");
		break;
	case 4:printf("四\n");
		break;
	case 5:printf("五\n");
		break;
	case 6:printf("六\n");
		break;
	}
	_getch();




}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值