C++ 日期计算器 之 超级无敌小白版 (比大佬的代码更数学化一点,刚入门的快看过来)

C++ 日期计算器 之 超级无敌小白版

因为没有用很多更复杂的语法,看起来会更数学化一点,所以必然会比其他大佬的代码长很多。
以下代码更适合刚入门遇到写日期计算器这类问题的小白哦,想要提升找更简单方法滴大佬们转向去其他贴昂,不要浪费时间啦!!
C++一般都会在一个项目里,去分很多类去做,这样会更清楚。这道题我分了两个类哦。
#ifndef MYDATE_H
#define MYDATE_H
#include <iostream>
using namespace std;

class myDate {
	private:
		int year;
		int month;
		int day;
	public:
		myDate(): year(1990), month(1), day(1) {}; // 1900,1,1
		myDate(int newyear, int newmonth, int newday);
		bool validity(int newyear, int newmonth, int newday);
		//所设置的日期是否合法?
		bool setDate(int newyear, int newmonth, int newday);
		// 月:1-12,日: 1--31
		bool setyear(int newyear);  //1900----3000
		int  getyear();
		bool setmonth(int newmonth); //1--31
		int  getmonth();
		bool setday(int newday);
		int  getday();
		bool increaseday(int n);  // 31+1==
		bool reduceday(int n);
		void display();
};

#endif


//成员函数定义

myDate::myDate(int newyear, int newmonth, int newday) {
	setDate(newyear, newmonth, newday);
}

bool myDate::validity(int newyear, int newmonth, int newday) {
	if (newyear >= 1900 && newyear <= 3000) {
		if (newmonth == 2) {
			if (((newyear % 4 == 0) && (newyear % 100 != 0)) || (newyear % 400 == 0)) {
				if ((newday > 0) && (newday <= 29))
					return true;
				else
					return false;
			} else {
				if ((newday > 0) && (newday <= 28))
					return true;
				else
					return false;
			}
		} else if ((newmonth == 1) || (newmonth == 3) || (newmonth == 5) || (newmonth == 7) || (newmonth == 8)
		           || (newmonth == 10) || (newmonth == 12)) {
			if ((newday > 0) && (newday <= 31))
				return true;
			else
				return false;
		} else if ((newmonth == 4) || (newmonth == 6) || (newmonth == 9) || (newmonth == 11)) {
			if ((newday > 0) && (newday <= 30))
				return true;
			else
				return false;
		} else
			return false;
	} else
		return false;
}


bool myDate::setDate(int newyear, int newmonth, int newday) {
	if (newyear >= 1900 && newyear <= 3000) {
		if (newmonth == 2) {
			if (((newyear % 4 == 0) && (newyear % 100 != 0)) || (newyear % 400 == 0)) {
				if ((newday > 0) && (newday <= 29)) {
					year = newyear;
					month = newmonth;
					day = newday;
					return true;
				} else
					return false;
			} else {
				if ((newday > 0) && (newday <= 28)) {
					year = newyear;
					month = newmonth;
					day = newday;
					return true;
				} else
					return false;
			}
		} else if ((newmonth == 1) || (newmonth == 3) || (newmonth == 5) || (newmonth == 7) || (newmonth == 8)
		           || (newmonth == 10) || (newmonth == 12)) {
			if ((newday > 0) && (newday <= 31)) {
				year = newyear;
				month = newmonth;
				day = newday;
				return true;
			} else
				return false;
		} else if ((newmonth == 4) || (newmonth == 6) || (newmonth == 9) || (newmonth == 11)) {
			if ((newday > 0) && (newday <= 30)) {
				year = newyear;
				month = newmonth;
				day = newday;
				return true;
			} else
				return false;
		} else
			return false;
	} else
		return false;
}


bool myDate::setyear(int newyear) {
	if (newyear >= 1900 && newyear <= 3000) {
		if (month == 2) {
			if (day == 29) {
				if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
					return true;
					year = newyear;
				} else
					return false;
			} else {
				return true;
				year = newyear;
			}
		} else {
			return true;
			year = newyear;
		}
	} else
		return false;
}


bool myDate::setmonth(int newmonth) {
	if (newmonth == 2) {
		if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
			if ((day > 0) && (day <= 29)) {
				month = newmonth;
				return true;
			} else
				return false;
		} else {
			if ((day > 0) && (day <= 28)) {
				month = newmonth;
				return true;
			} else
				return false;
		}
	} else if ((newmonth == 1) || (newmonth == 3) || (newmonth == 5) || (newmonth == 7) || (newmonth == 8)
	           || (newmonth == 10)
	           || (newmonth == 12)) {
		if ((day > 0) && (day <= 31)) {
			month = newmonth;
			return true;
		} else
			return false;
	} else if ((newmonth == 4) || (newmonth == 6) || (newmonth == 9) || (newmonth == 11)) {
		if ((day > 0) && (day <= 30)) {
			month = newmonth;
			return true;
		} else
			return false;
	}
}


bool myDate::setday(int newday) {
	if (month == 2) {
		if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
			if ((newday > 0) && (newday <= 29)) {
				day = newday;
				return true;
			} else
				return false;
		} else {
			if ((newday > 0) && (newday <= 28)) {
				day = newday;
				return true;
			} else
				return false;
		}
	} else if ((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month == 8) || (month == 10)
	           || (month == 12)) {
		if ((newday > 0) && (newday <= 31)) {
			day = newday;
			return true;
		} else
			return false;
	} else if ((month == 4) || (month == 6) || (month == 9) || (month == 11)) {
		if ((newday > 0) && (newday <= 30)) {
			day = newday;
			return true;
		} else
			return false;
	}
}


int myDate::getyear() {
	return year;
}

int myDate::getmonth() {
	return month;
}

int myDate::getday() {
	return day;
}

void myDate::display() {
	cout << getyear() << "年" << getmonth() << "月" << getday() << "日" << endl;
}

bool myDate::increaseday(int n) {
	int x = 0;
	int i, j, k;
	int leap_year[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	int normal_year[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

	for (i = 1900; i < year; i++) {
		if (((i % 4 == 0) && (i % 100 != 0)) || (i % 400 == 0))
			x += 366;
		else
			x += 365;
	}

	if (((i % 4 == 0) && (i % 100 != 0)) || (i % 400 == 0)) {
		for (j = month; j > 0; j--) {
			x = x + leap_year[j - 1];
		}
	} else {
		for (j = month; j > 0; j--)
			x = x + normal_year[j - 1];
	}

	x = x + n - 1;
	year = 1900;
	month = 0;

	while (x > 365) {
		if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
			x = x - 366;
			year++;
		} else {
			x = x - 365;
			year++;
		}
	}

	if (x <= 31) {
		month = 1;
		day = x;
	} else if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
		for (k = 0; x > 0; k++) {
			month++;
			x = x - leap_year[k];
		}
		day = x + leap_year[k];
	} else {
		for (k = 0; x > 0; k++) {
			month++;
			x = x - normal_year[k];
		}
		day = x + normal_year[k];
	}
	return true;
}

bool myDate::reduceday(int n) {
	int x = 0;
	int i, j, k;
	int leap_year[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	int normal_year[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

	for (i = 1900; i < year; i++) {
		if (((i % 4 == 0) && (i % 100 != 0)) || (i % 400 == 0))
			x += 366;
		else
			x += 365;
	}

	if (((i % 4 == 0) && (i % 100 != 0)) || (i % 400 == 0)) {
		for (j = month - 1; j > 0; j--) {
			x = x + leap_year[j - 1];
		}
	} else {
		for (j = month - 1; j > 0; j--)
			x = x + normal_year[j - 1];
	}

	x = x - n + 1;
	year = 1900;
	month = 0;

	while (x > 365) {
		if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
			x = x - 366;
			year++;
		} else {
			x = x - 365;
			year++;
		}
	}

	if (x <= 31) {
		month = 1;
		day = x;
	} else if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
		for (k = 0; x > 0; k++) {
			month++;
			x = x - leap_year[k];
		}
		day = x + leap_year[k];
	} else {
		for (k = 0; x > 0; k++) {
			month++;
			x = x - normal_year[k];
		}
		day = x + normal_year[k];
	}
	return true;
}

第二个类:

#include "myDate.h"
#include <iostream>
using namespace std;

int main() {
	int n;
	//1、定义对象
	myDate today(2010, 4, 22);
	//2、显示当前日期
	today.display();  //1
	//3、修改日期,使用setDate()
	today.setDate(2010, 2, 28);
	//4、显示当前日期
	today.display();  //2
	//5、修改日期,使用setXXX()
	today.setday(26);
	//6、显示当前日期
	today.display();  //3
	//7、修改日期,使用increaseday()
	today.increaseday(5);
	//8、显示当前日期
	today.display();
	//9、修改日期,使用reduceday()
	today.setDate(2014, 1, 1);
	today.reduceday(3);
	//10、显示当前日期
	today.display();
	//11、使用cout输出,getXXX()获得的数据

	cout << today.getyear() << "年" << today.getmonth() << "月" << today.getday() << "日" << endl;
	return 0;
}

运行结果如下图:在这里插入图片描述

因为是有题目哒,所以代码是按题目中具体的数值去写的,大家可以稍微改下,加一点交互,让程序可以输入任意的时间,变成真正的在exe里运行的日期计算器哦!
这段代码打了巨久无比,主要是increase和reduce那边很容易出错。小白阶段真不容易,大家也加油呀,一起进步!!!
(引用一句话)愿世上再无bug!!!
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值