个人思路
前言
这个题目已经被讲到烂了, 但是作为学习者, 不能只听不做, 或者照葫芦画瓢, 这样的学习方法可能收益不大, 学习代码的这个事情, 听完之后, 眼睛会了之后, 自己也要亲自手敲一遍, 才算是完成了这项知识点的学习.
于是我花了差不多半天的时间才做了出来 .........
所以说嘛 一定要自己来一遍 自己手敲一遍
于是我做出了跟老师讲的又不一样的方法 来解决这个问题
核心逻辑
① 计算一共经历了多少年
闰年 + 366
非闰年 + 365
② 计算月份部分
2月份的话
闰年 29 天
非闰年 28 天
除了2月份, 其它通通 "多退少补"
③ 计算 日 部分
多退少补
Debug之路
逻辑很简单对吧
逻辑是很简单, 代码写出来之后, 一般正常人总是会报错 或者 结果不符合预期的
那就慢慢修改 如果不细心 就会跟我一样 修了半天
最简单的Debug方法就是printf 出来啦
代码调试的差不多了 就可以去参考正确答案了
用Excel参考就可以
把日期打算去 用一个日期减去 另外一个日期 即可
如果答案一模一样 那么任务就完成了
Demo展示
请输入您的生日:
(年 月 日)
如 :2000 1 1
2019 9 1
您的生日为 2019 9 1
今天的日期 2022 12 21
您一共经历了 1207 个日夜
距离今年的生日 111 天
Process finished with exit code 0
代码演练
精简版
#include <stdio.h>
#include <time.h>
int main() {
int The_Days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int Birthday[3] = {2000, 2, 19};
int Today[3] = {2022, 9, 22};
struct tm t;
time_t now;
time(&now);
localtime_s(&t, &now);
Today[0] = (t.tm_year + 1900);
Today[1] = (t.tm_mon + 1);
Today[2] = t.tm_mday;
int Days = 0;
int Actual_Days = 0;
int mark = 0;
printf("请输入您的生日:\n");
printf("(年 月 日)\n");
printf("如 :2000 1 1\n");
scanf("%d %d %d", &Birthday[0], &Birthday[1], &Birthday[2]);
printf("您的生日为 %d %d %d\n", Birthday[0], Birthday[1], Birthday[2]);
printf("今天的日期 %d %d %d\n", Today[0], Today[1], Today[2]);
if (((0 == Birthday[0] % 4) && (0 != Birthday[0] % 100)) || (0 == Birthday[0] % 400)) {
if (Birthday[1] > 2) {
Days += 365;
} else if (Birthday[1] == 2 && Birthday[2] == 29) {
Days += 365;
} else {
Days += 366;
}
}
else{
Days += 365;
}
for (int i = (Birthday[0] + 1); i < Today[0]; ++i) {
if (((0 == i % 4) && (0 != i % 100)) || (0 == i % 400)){
Days += 366;
}
else{
Days += 365;
}
}
if(Birthday[1] < Today[1]){
for (int j = Birthday[1]; j < Today[1]; ++j) {
if (j == 2) {
if (((0 == Today[0] % 4) && (0 != Today[0] % 100)) || (0 == Today[0] % 400)){
Actual_Days += (The_Days[j] + 1);
}
else{
Actual_Days += The_Days[j];
}
}
else{
Actual_Days += The_Days[j];
}
}
}
else if(Birthday[1] > Today[1]){
for (int j = Today[1]; j < Birthday[1]; ++j) {
if (j == 2) {
if (((0 == Today[0] % 4) && (0 != Today[0] % 100)) || (0 == Today[0] % 400)){
Actual_Days -= (The_Days[j] + 1);
}
}
else{
Actual_Days -= The_Days[j];
}
}
}
mark += Actual_Days;
Days += Actual_Days;
Actual_Days = 0;
if(Birthday[2] > Today[2]){
Actual_Days = Today[2] - Birthday[2];
}
else if (Birthday[2] < Today[2]){
Actual_Days = Today[2] - Birthday[2];
}
mark += Actual_Days;
Days += Actual_Days;
Actual_Days = 0;
printf("您一共经历了 %d 个日夜\n", Days);
printf("距离今年的生日 %d 天\n", mark);
return 0;
}
原版
#include <stdio.h>
#include <time.h>
int main() {
int The_Days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int Birthday[3] = {2000, 2, 19};
int Today[3] = {2022, 9, 22};
// int Birthday[3] = {2000, 2, 19};
// int Today[3] = {2022, 1, 22};
// int Birthday[3] = {2000, 2, 19};
// int Today[3] = {2022, 2, 22};
// printf("年:%d\n", t.tm_year + 1900);
// printf("月:%d\n", t.tm_mon + 1);
// printf("日:%d\n", t.tm_mday);
// 名为t的tm结构指针?
struct tm t; //tm结构指针
// 名为now 类型为time_t的 变量
time_t now; //声明time_t类型变量
// time(&now);// 等同于now = time(NULL)
time(&now); //获取系统日期和时间
// 获取咱东八区的日期和时间
localtime_s(&t, &now); //获取当地日期和时间
Today[0] = (t.tm_year + 1900);
Today[1] = (t.tm_mon + 1);
Today[2] = t.tm_mday;
int Days = 0;
int Actual_Days = 0;
int mark = 0;
printf("请输入您的生日:\n");
printf("(年 月 日)\n");
printf("如 :2000 1 1\n");
scanf("%d %d %d", &Birthday[0], &Birthday[1], &Birthday[2]);
printf("您的生日为 %d %d %d\n", Birthday[0], Birthday[1], Birthday[2]);
printf("今天的日期 %d %d %d\n", Today[0], Today[1], Today[2]);
// printf("请输入您出生后的某个日期:\n");
// printf("年 月 日\n");
// printf("如 :2000 1 1\n");
// scanf("%d %d %d", &Today[0], &Today[1], &Today[2]);
// 年
// --------------------------------------------------------------------------------------
if (((0 == Birthday[0] % 4) && (0 != Birthday[0] % 100)) || (0 == Birthday[0] % 400)) {
if (Birthday[1] > 2) {
Days += 365;
} else if (Birthday[1] == 2 && Birthday[2] == 29) {
Days += 365;
} else {
Days += 366;
}
}
else{
Days += 365;
}
// 以上是头一年的特殊情况 原因是闰年2月份29号
// ----------------------------------------------------------------
for (int i = (Birthday[0] + 1); i < Today[0]; ++i) {
if (((0 == i % 4) && (0 != i % 100)) || (0 == i % 400)){
Days += 366;
}
else{
Days += 365;
}
// printf("年份部分统计得出 %d \n",Days);
}
// 月
// --------------------------------------------------------------------------------------
// 当前日期比生日晚了
if(Birthday[1] < Today[1]){
for (int j = Birthday[1]; j < Today[1]; ++j) {
if (j == 2) {
if (((0 == Today[0] % 4) && (0 != Today[0] % 100)) || (0 == Today[0] % 400)){
Actual_Days += (The_Days[j] + 1);
}
else{
Actual_Days += The_Days[j];
}
}
else{
Actual_Days += The_Days[j];
}
// printf("当前月份比生日月份晚了 %d \n",Actual_Days);
}
}
// 当前日期比生日早了
else if(Birthday[1] > Today[1]){
for (int j = Today[1]; j < Birthday[1]; ++j) {
if (j == 2) {
if (((0 == Today[0] % 4) && (0 != Today[0] % 100)) || (0 == Today[0] % 400)){
Actual_Days -= (The_Days[j] + 1);
}
}
else{
Actual_Days -= The_Days[j];
}
// printf("当前月份比生日月份早了 %d \n",Actual_Days);
}
}
mark += Actual_Days;
Days += Actual_Days;
// printf("月份部分统计得出 %d \n",Days);
Actual_Days = 0;
// 日
// --------------------------------------------------------------------------------------
if(Birthday[2] > Today[2]){
Actual_Days = Today[2] - Birthday[2];
}
else if (Birthday[2] < Today[2]){
Actual_Days = Today[2] - Birthday[2];
}
// printf("每日累计得出 %d \n",Actual_Days);
mark += Actual_Days;
Days += Actual_Days;
Actual_Days = 0;
// printf("累计得出 %d \n",Days);
printf("您一共经历了 %d 个日夜\n", Days);
printf("距离今年的生日 %d 天\n", mark);
return 0;
}