生命沙漏核心算法
源代码在线查看: arithmetic.c
/***
***********************************************
*说明:
*本程序为"生命沙漏"
*STM32是否为闰年和相应月份的天数部分算法
*文件名称:arithmetic.c
*************************************************
*包含功能:
*1、判断某一年是否为闰年
*2、计算某一年某一月的天数
*3、计算某一时间段的闰年数
*4、计算一个人活了多少天
*5、计算一个人的星座
*************************************************
*当前版本: ve1.0
*作者: 吾ARM1
*修改时间:2012年4月17日
*完成时间: 2012年4月9日
*************************************************/
#include "arithmetic.h"
/*--------------------
函数名: Year_Arith
返回值: 1/0
输入参数:year
功能描述:输入年份,可以判断出这一年是否为闰年
----------------------*/
u8 Year_Arith(u16 year)
{
u16 Year_Mark;
Year_Mark = year;
if((Year_Mark%4==0||Year_Mark%400==0)&&(Year_Mark%100!=0))
return 1;
else
return 0;
}
/*--------------------
函数名: Arith
返回值: 29/28/30/31
输入参数:Some_Year,month
功能描述:输入某一年的某一月得出该月的天数
----------------------*/
u8 Day_Arith(u16 Some_Year,u8 month)
{
u8 i;
i = Year_Arith(Some_Year);
if(month==2&&i==1)
return 29;
if(month==2&&i==0)
return 28;
switch(month)
{
case 1: return 31;break;
case 3: return 31;break;
case 4: return 30;break;
case 5: return 31;break;
case 6: return 30;break;
case 7: return 31;break;
case 8: return 31;break;
case 9: return 30;break;
case 10: return 31;break;
case 11: return 30;break;
case 12: return 31;break;
}
}
/*--------------------
函数名: Have_Leap_Year_Arith
返回值: count,从出生到当前年份的闰年数
输入参数:Birth_Year,Present_Year两者分别为:出生年份,当前年份
功能描述:分别输入出生年份和当前年份,最后得出并返回润年数。
----------------------*/
u8 Have_Leap_Year_Arith(u16 Birth_Year,u16 Present_Year)
{
u8 count=0;
u8 flag = 0;
for(Birth_Year=Birth_Year+1;Birth_Year {
flag = Year_Arith(Birth_Year);
if(flag==1)
{
++count;
flag = 0;
}
else
count = count;
}
return count;
}
/*--------------------
函数名: From_Present_Start
返回值: RFPresent_Start_Day,返回从出生年元月到当前元月的天数,最大值为:65535
输入参数:FSome_Year,FSome_Month两者分别为:出生年份,当前年份
功能描述:分别输入某一年和某一月,最后得出从改年起初到改年该月的天数。
----------------------*/
u16 From_Present_Start(u16 FSome_Year,u8 FSome_Month)
{
u8 i = 0;
u8 FPresent_Start_Day = 0;
u16 RFPresent_Start_Day=0;
i = Year_Arith(FSome_Year);//判断输入年份是否为闰年
for(;FSome_Month>1;FSome_Month--)
{
FPresent_Start_Day = Day_Arith(FSome_Year,FSome_Month);//得出当月天数
RFPresent_Start_Day = RFPresent_Start_Day+FPresent_Start_Day;//将得出的天数进行垒加
}
if(i==1) RFPresent_Start_Day = 366 - RFPresent_Start_Day;
if(i==0) RFPresent_Start_Day = 365 - RFPresent_Start_Day;
return RFPresent_Start_Day;
}
/*---------------------------------------------------------------
函数名: Have_Day_Arith
返回值: Day_Num,返回从出生年元月到当前元月的天数,最大值为:65535
输入参数:Birth_Year1,Present_Year1,Birth_Month,Present_Month,Birth_Day,Present_Day两者分别为:出生年份,当前年份,出生月份,当前月份,出生日,当日
功能描述:分别输入出生年月日和当前年月日,最后得出天数并返回。
-----------------------------------------------------------------*/
u16 Have_Day_Arith(u16 Birth_Year1,u16 Present_Year1,u8 Birth_Month,u8 Present_Month,u8 Birth_Day,u8 Present_Day)
{
u8 Leap_Year_Num1 = 0,Year_Num = 0,i=0,j=0;
u16 Day_Num,Birth_Day_Num = 0,Present_Day_Num = 0;
u16 Byear,Fyear;
Byear = Birth_Year1;
Fyear = Present_Year1;
i = Year_Arith(Birth_Year1);
j = Year_Arith(Present_Year1);
Birth_Day_Num = From_Present_Start(Birth_Year1,Birth_Month);//得出出生当年当月之前的天数
if(j==1)
{
Present_Day_Num =366 - From_Present_Start(Present_Year1,Present_Month);//得出当前年、月之前的天数
}
else
Present_Day_Num =365 - From_Present_Start(Present_Year1,Present_Month);//得出当前年、月之前的天数
Leap_Year_Num1 = Have_Leap_Year_Arith(Byear,Fyear);//得出闰年数
Year_Num = Fyear-Byear;//得出年数差
Day_Num = (0*366+((u16)Year_Num-(u16)Leap_Year_Num1-1)*365)+Birth_Day_Num-Birth_Day+Present_Day_Num+Present_Day;//得出总的天数
return Day_Num;//返回结果最大为:65535天
}
/*---------------------------------------------------------------
函数名: Constellation_Arith
返回值: 无
输入参数:u8 Birth_Month,u8 Birth_Day。出生月,出生日
功能描述: 根据输入的出生月 和出生日(公历),得出所属星座
-----------------------------------------------------------------*/
void Constellation_Arith(u8 Birth_Month,u8 Birth_Day)
{
if(((Birth_Month==1)&&(Birth_Day>=20))||((Birth_Month==2)&&(Birth_Day {
star = 39;//水
star1 = 40; //瓶
//为水瓶座
}
if(((Birth_Month==2)&&(Birth_Day>=19))||((Birth_Month==3)&&(Birth_Day {
star = 41;//双
star1 = 42; //鱼
//为双鱼座
}
if(((Birth_Month==3)&&(Birth_Day>=21))||((Birth_Month==4)&&(Birth_Day {
star = 43;//白
star1 = 44; //羊
//白羊座
}
if(((Birth_Month==4)&&(Birth_Day>=20))||((Birth_Month==5)&&(Birth_Day {
star = 37;//金
star1 = 38; //牛
//金牛座
}
if(((Birth_Month==5)&&(Birth_Day>=21))||((Birth_Month==6)&&(Birth_Day {
star = 45;//双
star1 = 46; //子
//双子座
}
if(((Birth_Month==6)&&(Birth_Day>=22))||((Birth_Month==7)&&(Birth_Day {
star = 47;//巨
star1 = 48; //蟹
//巨蟹座
}
if(((Birth_Month==7)&&(Birth_Day>=23))||((Birth_Month==8)&&(Birth_Day {
star = 49;//狮
star1 = 46; //子
//狮子座
}
if(((Birth_Month==8)&&(Birth_Day>=23))||((Birth_Month==9)&&(Birth_Day {
star = 50;//处
star1 = 51; //女
//处女座
}
if(((Birth_Month==9)&&(Birth_Day>=21))||((Birth_Month==10)&&(Birth_Day {
star = 30;//天
star1 = 52; //秤
//天秤座
}
if(((Birth_Month==10)&&(Birth_Day>=24))||((Birth_Month==11)&&(Birth_Day {
star = 30;//天
star1 = 53; //蝎
//天蝎座
}
if(((Birth_Month==11)&&(Birth_Day>=22))||((Birth_Month==12)&&(Birth_Day {
star = 54;//射
star1 = 55; //手
//射手座
}
if(((Birth_Month==12)&&(Birth_Day>=22))||((Birth_Month==1)&&(Birth_Day {
star = 56;//射
star1 = 57; //手
//摩羯座
}
}
/******************* (C) COPYRIGHT 2012 吾ARM1 *****END OF FILE****/