问:c++程序设计: 1,输入年月日,输出距离今天还有多少天,星期几,是否是公历日。假定输入的年份

问:c++程序设计:
1,输入年月日,输出距离今天还有多少天,星期几,是否是公历日。假定输入的年份是1940 -2040之间
2,如果一个渔夫自1990年1月1日开始,三天打鱼二天晒网,输入一个1990年以后的日期,输出他这一天是打鱼还是晒网。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <time.h>
using namespace std;
// 判断星期几
int getWeekDay(const int year, const int yday)
{
int n = year - 1 + (int)((year - 1) / 4) - (int)((year - 1) / 100) + (int)((year - 1) / 400) + yday;
return n % 7;
}

// 是否闰年
bool isLeapYear(const int year)
{
return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}

// 获取当天是一年中的第几天
int getYearDay(const int year, const int month, const int mday)
{
int yday = 0;
for (int i = 1; i < month; i++)
{
switch (i)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
yday += 31;
break;
case 4:
case 6:
case 9:
case 11:
yday += 30;
break;
case 2:
yday += (isLeapYear(year) ? 29 : 28);
break;
}
}
yday += mday;
return yday;
}

// 计算两个日期的天数差(假设date1小于date2)
int getDayCount(const struct tm &date1, const struct tm &date2)
{
int nday = 0;
int yday1 = getYearDay(date1.tm_year + 1900, date1.tm_mon + 1, date1.tm_mday);
int yday2 = getYearDay(date2.tm_year + 1900, date2.tm_mon + 1, date2.tm_mday);
for (int i = date1.tm_year; i < date2.tm_year; i++)
{
if (isLeapYear(i + 1900))
nday += 366;
else nday += 365;
}
nday += (yday2 - yday1);
return nday;
}
// 公历节日,随便弄15个。
const char* festivals[] = {
"1,1", "元旦",
"2,14", "情人节",
"3,8", "妇女节",
"3,12", "植树节",
"3,15", "消费者权益日",
"4,1", "愚人节",
"4,5", "清明节",
"5,1", "劳动节",
"5,4", "青年节",
"6,1", "儿童节",
"7,1", "建党节",
"8,1", "建军节",
"9,10", "教师节",
"10,1", "国庆节",
"12,25", "圣诞节"
};
char *weekdays[] = { "日", "一", "二", "三", "四", "五", "六" };

void setDate(struct tm &date, const int year, const int month, const int day)
{
date.tm_year = year;
date.tm_mon = month;
date.tm_mday = day;
}

void testDate1()
{
int month, year, day;
cout << "请输入你想知道的年月日(用逗号隔开):";
scanf("%d,%d,%d", &year, &month, &day);
//cin >> year >> month >> day;
//距离元旦的天数
int yday = getYearDay(year, month, day);

// 将日期赋值到tm结构体中,方便函数调用
struct tm date;
setDate(date, year - 1900, month - 1, day);
// 取得今天的时间,并转换为tm结构体
time_t now = time((time_t*)NULL);
struct tm *today = localtime(&now);

int nday;
// 将年月日换算成如20160412的整数然后进行比较,简单直观
if (year * 10000 + (month - 1) * 100 + day >= 
(today->tm_year + 1900) * 1000 + today->tm_mon *100 + today->tm_mday)
nday = getDayCount(*today, date);
else nday = getDayCount(date, *today);

printf("%d,%d,%d离今天有%d天!\n", year, month, day, nday);
int wday = getWeekDay(year, yday);
cout << "是星期" << weekdays[wday] << endl;

// 看看今天是什么节日
char szDate[10] = { '\0' };
sprintf(szDate, "%d,%d", month, day);
for (int i = 0; i < 30; i+= 2)
{
if (strcmp(szDate, festivals[i]) == 0)
{
cout << "是" << festivals[i + 1] << "!\n";
break;
}
}
}

void testDate2()
{
struct tm date1900;
setDate(date1900, 0, 0, 1);
int year, month, day;

cout << "请输入你想知道的年月日(用逗号隔开):";
scanf("%d,%d,%d", &year, &month, &day);
struct tm date;
setDate(date, year - 1900, month - 1, day);
// 求出所输入日期和1900年1月1日的日期差就能判断
int ndays = getDayCount(date1900, date);
// 三天打渔两天晒网,即每5天一个周期。
int cycle = ndays % 5;
// 对5求模,则结果是0-3的话就是打渔,否则就是晒网
if (cycle < 3)
cout << "这天是在打渔!" << endl;
else
cout << "这天是在晒网!" << endl;
}

int main()
{
cout << "1. 离今天还有多少天!\n" <<
"2. 是打渔还是晒网!\n" <<
"3. 退出!" << endl;
int op;
do
{
cout << "请选择 1,2,3!\n";
cin >> op;
if (op < 1 || op > 3)
continue;
switch (op)
{
case 1:
testDate1();
break;
case 2:
testDate2();
break;
default:
break;
}
} while (op != 3);
system("pause");
return 0;
}

温馨提示:答案为网友推荐,仅供参考
相似回答