C++万年历 十二生肖的代码带着解释,跪求大神
发布网友
发布时间:2022-04-24 08:49
我来回答
共3个回答
热心网友
时间:2022-06-18 04:43
写了下,测试成功,代码很简单,有注释。
#include <iostream>
using namespace std;
int main()
{
// 12 猪 在这能被12取余为0说明差值是12的倍数
// 0"猪", 1"鼠", 2"牛", 3"虎", 4"兔", 5"龙", 6"蛇", 7"马", 8"羊", 9"猴", 10"鸡", 11"狗"
char * zodiacArray[12] = { "猪", "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗" };
int baseYear = 2007; //07年是鼠年,以此为基准进行判断
int testYear = 2014;
int count = 0;
int result = 0;
while (true)
{
printf("Please input the year whose zodiac you want to know:\n");
cin>>testYear;
//和基准年间的差值
count = abs(baseYear - testYear);
//判断是基准年之前还是之后
if ((baseYear - testYear) > 0)
{
//基准年之前,差值取余再取补数即可得到生肖的位置,
result = 12 - count % 12;
}
else
{
//差值取余即可得到生肖的位置,
result = count % 12;
}
printf("要测试年份的生肖是: %s\n", zodiacArray[result]);
}
return 0;
}
热心网友
时间:2022-06-18 04:44
要确定生肖,这个简单,跟你讲一下吧,生肖与十二地支对应,只要求得地支,就可以知道生肖了,地支的求法如下:(年份-4)%12 即可,如果年份小于4的,你再往上加12的整数倍(如果要同时求天干,那么,加上60的整数倍),使其变正整数即可。
解释:公元4年刚好是甲子年,甲是十天干之首,子是十二地支之首,一年用一个干支来对应,天干地支组合起来是60年一个轮回。我们经常讲子鼠、丑牛、寅虎……就是将十二生肖与十二地支对应进来的称法。
如果有需要C++图形界面版本万年历,可继续追问。
热心网友
时间:2022-06-18 04:44
#include <iostream>
#include <iomanip.h>
using namespace std;
class Data //声明一个类Data
{
private: //私有部分,关于这个的特点,自己看书去
int year; //私有变量,同上
public: //公有变量,特点看书去
void getyear(); //提示用户输入想要查询的年份
int ioleapyear(); //判断该年是不是闰年
int weekday(); //判断该年的元旦是星期几
int monthday(int i); //该年每个月的天数
void disp(); //显示结果。
};
char* weekd[7]={"MON","TUE","WEN","THU","FRI","STA","SUN"}; //记录星期一到星期天
void Data::getyear()
{
cout<<"请输入你想要查询的年份:"; //cout是输出
cin>>year; //cin是输入一个值到变量
}
int Data::ioleapyear() //判断闰年和平年,闰年返回1,平年返回0
{
if(year%4==0&&year%100!=0||year%400==0) //计算闰年和平年的方法
//四位年份能被4整除但不能被100整除,或能被400整除
return 1;
else
return 0;
}
int Data::weekday()
{
int n=year-1900; //已知1900年的元旦刚好是星期一
n=n+(n-1)/4+1; // 判断,以每年52个整星期计算year年比1900年多出来的天数
//多出来的天数除以7的余数就是这年第一天是星期几
n=n%7; //%就是取余的意思
if(n==0) //当n=0的时候是周日,使它返回7
return 7; //返回输入的年份的元旦是星期几
else
return n; //n不是0的时候反正n的值就是星期几
}
int Data::monthday(int i) //这里是返回月有几天的,i是月份
{
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
return 31; //如果是1,2,5,7,8,10,12月,则返回是31天
else if (i==2) //判断可恶的2月
if(ioleapyear()) //当ioleapyear()返回1时就是闰年,则为29天,ioleapyear()是一个函数,调用的一个函数
return 29;
else return 28; //否则为28天
else
return 30; //其他的月份为30天
}
void Data::disp() //这个是显示函数
{
int i; //这个是月的记录变量
int n=weekday(); //这也是调用了一个函数,用n记录当年的元旦是星期几
for(i=1;i<=12;i++) //总共的月份 12 ,用循环来实现显示12个月
{
int lemp=1;
cout<<endl<<setw(5)<<i<<"月份"<<endl; //这个是显示月份的
//setw()是iomanip.h里的函数,只要在开头写上#include <iomanip.h> 就可以用了
//作用是设置宽度,就是i显示出来的宽度,这个是为了好看,当然你可以用空格什么的代替
cout<<"-------------------------------------------"<<endl; //endl是换行的意思,这句就是输出了一行横线
for(int j=0;j<7;j++) //循环显示星期上的字,就是mon,tue等等
cout<<setw(5)<<weekd[j];
cout<<endl<<"-------------------------------------------"<<endl;
for(int k=1;k<n;k++,lemp++) //输入每月第一天的起始位置,用空格补充
cout<<setw(5)<<" "; //就是如果是星期四,则前面有3个空格,1从星期四的位置出现
for(int d=1;d<=monthday(i);d++,lemp++) //循环输出每个月的日子
{
cout<<setw(5)<<d; //d就是日子
if(lemp==7) //控制一行输出到星期天,如果到星期天则重新计数
{
cout<<endl; //是星期天的话刚输出一个换行
lemp=0; //让临时记录星期的变量为0,以备下次使用
}
}
n=lemp%7; //当输出完一个月后,记录这个月的最后一天在哪,寻找下个月的
if(n==0) //第一天的起始位置
n=7; //就是当n为0的时候,是周日,令n为7
cout<<endl<<"-------------------------------------------"<<endl<<endl<<endl;
}
}
int main()
{
Data a; //创建一个对象a
cout<<setw(45)<<"万年历查询"<<endl;
cout<<"-------------------------------------------------------------------------------"
<<endl;
a.getyear(); //调用对象a里的函数,这个就管输入一个年份
a.disp(); //调用对象a的另一个函数,显示日历
system("pause");
return 0;
}