demo17:输入一堆日期,比较并输出所有日期中最早的日期+优化

本文介绍两种实现方法来找出用户输入的多个日期中的最早日期,并通过结构体优化代码。第一种方法使用多个变量进行比较,而第二种方法利用结构体简化了代码结构。

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

8.写程序实现:输入日期,比较并输出所有日期中最早的日期(规定输入错误日期算输入结束)  eg:2000/12/23 2000/1/12 1<12 则日期2更早(比较最小值应初始化为最大值!)

(1)第一种做法:定义很多变量

代码如下:

//1.定义很多变量
#include<stdio.h>
#include<limits.h> //定义整数类型极限的库函数 
bool IsLeapYear(int year){ //判断是否为闰年 
	if(year%400==0||(year%4==0&&year%100!=0)){
		return true;
	}
	else return false;
}
int Get_YM_Day(int year,int month){ //数组查表法实现函数功能:查询该年该月有多少天 
	int arr[13]={29,31,28,31,30,31,30,31,31,30,31,30,31};
	int i=0;
	if(month==2&&IsLeapYear(year)){
		return arr[i];
	}
	else return arr[month];
}
int main(){
	int year=0,month=0,day=0;
	int myear=INT_MAX,mmonth=12,mday=31; //求最小值则初始化为最大值,此处用库函数为年份初始化为最大值 
	for(;;){
		bool tag=false; //避免交换值部分代码重复,切记一定要定义在for循环内!否则一旦被赋值为true,则永远是true,意味着每次都会交换 
		printf("Please input year/month/day:(yyyy/mmmm/dd)\n");
		scanf("%d/%d/%d",&year,&month,&day);
		if(year<1||month<1||month>12||day<1){
			break;
		}
		if(day>Get_YM_Day(year,month)){
			break;
		}
		if(year<myear){
			tag=true;
		}
		else if(year==myear&&month<mmonth){  //因为初始化的最大值,所以输入的值不是小于就是等于 
			tag=true;
		}
		else if(year==myear&&month==mmonth&&day<mday){
			tag=true;
		}
		if(tag){
			myear=year;
			mmonth=month;
			mday=day;
		}
	}
	printf("MinYear/MinMonth/MinDay:%d/%d/%d\n",myear,mmonth,mday); 
	return 0;	
} 

ps:需要注意的地方已在代码区用注释标记,请大家仔细看代码并自己动手敲😊 

代码实现如下: 

 (1)第二种做法:用结构体优化代码

代码如下:

//2.结构体优化
#include<stdio.h>
#include<limits.h>
bool IsLeapYear(int year){
	if(year%400==0||(year%4==0&&year%100!=0)){
		return true;
	}
	else return false;
}
int Get_YM_Day(int year,int month){
	int arr[13]={29,31,28,31,30,31,30,31,31,30,31,30,31};
	int i=0;
	if(month==2&&IsLeapYear(year)){
		return arr[i];
	}
	else return arr[month];
}
struct Date{
	int year;
	int month;
	int day;
}; 
int main(){
	struct Date n={0,0,0}; //赋初值(初始化)
	struct Date min={INT_MAX,12,31}; //赋初值(初始化)
	for(;;){
		bool tag=false;
		printf("Please input year/month/day:(yyyy/mmmm/dd)\n");
		scanf("%d/%d/%d",&n.year,&n.month,&n.day);
		if(n.year<1||n.month<1||n.month>12||n.day<1){
			printf("Input error!\n");
			break;
		}
		else if(n.day>Get_YM_Day(n.year,n.month)){
			printf("Input error!\n");
			break;
		}
		if(n.year<min.year){
			tag=true;
		}
		else if(n.year==min.year&&n.month<min.month){
			tag=true;
		}
		else if(n.year==min.year&&n.month==min.month&&n.day<min.day){
			tag=true;
		}
		if(tag){
			min=n; //结构体可以整体赋值(前提:结构体类型相同!)
		}
	}
	printf("\nMinyear/Minmonth/Minday=%d/%d/%d",min.year,min.month,min.day);
	return 0;
}

ps:需要注意的地方仍然已在代码区用注释标记,请大家仔细看代码并自己动手敲😊  

代码实现如下:

 

 希望看到文章结尾没有让读者失望,会继续努力再接再厉的!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值