C/C++【日期】再算星期(选做)

本文介绍了一种通过编程计算任意给定日期(年月日)是星期几的方法,包括了日期合法性验证和利用数学模型进行星期计算的过程,适用于年份大于1900的日期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

19.【日期】再算星期(选做)

再次给出任意一个年月日(年>1900),现在我们不能只是直接计算,要先判断给出的日期是否合法,对于非法的日期要给出错误提示信息,合法的日期要再计算是星期几。

输入:

年 月 日

输出:

0~6。
星期日用 0 表示,星期一用 1 表示,星期二用 2 表示......星期六用 6 表示。

在这里插入图片描述

假设年份大于1900。先想一想:我们现在只会使用 if 语句,该如何建立数学模型?

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
	int x,y,z,a=1900,p,q,i,j,k,m,n,A,e,f=0,X;
	scanf("%d %d %d",&x,&y,&z);//输入年月日 
    i=x%4;//年份能否被四整除
	 
    //判断输入年格式是否正确 
    if (x<=1900) {printf("year is error.\n"); return 0;}
	if (y>12||y<1)	{printf("month is error.\n"); return 0;}
	if (i==0&&y==2&&(z>29||z<1)) {printf("day is error.\n"); return 0;}
	if (i!=0&&y==2&&(z>28||z<1)) {printf("day is error.\n"); return 0;}
	if ((y==4||y==6||y==9||y==11)&&(z>30||z<1)) {printf("day is error.\n"); return 0;}
	if ((y==1||y==3||y==5||y==7||y==8||y==10||y==12)&&(z>31||z<1)) 
	    {printf("day is error.\n"); return 0;}
    
	switch(y) //假设不是闰年,计算零散的天数 
	{
		case 1:m=z;break;
		case 2:m=31+z;break;
		case 3:m=31+28+z;break;
		case 4:m=31+28+31+z;break;
		case 5:m=31+28+31+30+z;break;
		case 6:m=31+28+31+30+31+z;break;
		case 7:m=31+28+31+30+31+30+z;break;
		case 8:m=31+28+31+30+31+30+31+z;break;
		case 9:m=31+28+31+30+31+30+31+31+z;break;
		case 10:m=31+28+31+30+31+30+31+31+30+z;break;
		case 11:m=31+28+31+30+31+30+31+31+30+31+z;break;
		case 12:m=31+28+31+30+31+30+31+31+30+31+30+z;break; 
	}
	
	
	p=x%100;//输入年能否被100整除 
	q=x%400;//输入年能否被400整除 
	if (p==0&&q==0&&y>2)//如果输入是世纪闰年366天一年 
	{
		m++;
	}
	if (i==0&&p!=0&&y>2) //如果输入的是非世纪年且是闰年,二月加一天//如果不到2月29呢?不就不用考虑2月29啦? 
    {
		    m++;
	}
	
	e=366+365*3;
	j=x-a;//相对于1900年的年数个数 
	k=j/4;//循环的整数年的个数 
	n=j%4;//不参与循环的零散年的个数 
	
	switch(n)
	{
		case 1:f=366;break;
		case 2:f=366+365;break;
		case 3:f=366+365+365;break; 
	}
	
	A=e*k+f+m;//输入年相对于1900.1.1的天数
	X=(A-1)%7; 
	
	printf("%d\n",X);
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值