今天看到一个网页,其功能是计算一个人从出生到今天,共有多少天,然而多次尝试,均提示输入格式错误,便萌生了自己用C语言写这个程序的想法。
本程序实现的基本思想:采用控制台方式输入生日,并将该数据赋给一个结构体变量YearStart。计算这个日期距1900年的天数。同时调用系统函数,获得系统时间,将其赋给另一个结构体变量YearEnd,并计算它距1900年的天数。最后将后者减去前者,得到的数据便是生日那天据今天的天数。
运行结果举例:
以下是我的程序代码:
// 测试你活了多少天.cpp : 定义控制台应用程序的入口点。
//
/*
********************************************************
*作者:钩鸿踏月,2011年3月20日
*版本:1.0——2011年3月20日
* 1.1——2011年8月28日
********************************************************
*/
#include "stdafx.h"
#include <conio.h>
#include <stdlib.h>
#include <time.h>
//定义结构体Date,声明相关成员,并声明两个变量
struct Date
{
int year;
int month;
int day;
}YearStart,YearEnd;
int main()
{
int i;//变量用于年份的循环
int sum=0,s=0;//保存起始年份至1900年份的天数
int sum1=0,s1=0;//保存系统年份至1900年份的天数
int month[13];//该数组用来保存输入年份和当前年份的月份数列
int sumday[13];//用来保存本月初至年初天数
int monthdayr[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
//定义闰年每个月的天数,分别保存为monthdayr[1]至monthdayr[12]中
int monthday[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
//定义平年每个月的天数,分别保存为monthdayr[1]至monthdayr[12]中
printf("请输入您的生日:\n");
printf("年:");
scanf("%d",&YearStart.year);
printf("月:");
scanf("%d",&YearStart.month);
printf("日:");
scanf("%d",&YearStart.day);
//输入出生年月,将其分别赋给结构体变量YearStart的各成员
struct tm *p;
time_t timep;
time(&timep);
p=localtime(&timep); //取得系统时间
YearEnd.year=1900+p->tm_year;
YearEnd.month=1+p->tm_mon;
YearEnd.day= p->tm_mday;//将系统时间赋给结构体变量YearEnd各成员
for(i=1900;i<YearStart.year;i++)
{
if((i%4==0&&i%100!=0)||(i%100==0&&i%400==0))
sum+=366;
else
sum+=365;
}//统计输入的年份距1900年有多少天
if((YearStart.year%4==0&&YearStart.year&100!=0)||
(YearStart.year%100==0&&YearStart.year%400==0))
//判断起始年份是否为闰年
{//是闰年
for(i=1;i<YearStart.month;i++)
{
month[i]=i/i;//初始化数组month中的值
sumday[i]=month[i]*monthdayr[i];
s+=sumday[i];//计算出month中记录的月份至年初有多少天
}
s+=YearStart.day;//加上日,统计本日距本年初的天数
sum+=s;//统计该输入日期据1900年元旦的总天数
}
else//不是闰年
{
for(i=1;i<YearStart.month;i++)
{
month[i]=i/i;//初始化数组month中的值
sumday[i]=month[i]*monthday[i];
s+=sumday[i];//计算出month中记录的月份至年初有多少天
}
s+=YearStart.day;//加上日,统计本日距本年初的天数
sum+=s;//统计该输入日期距1900年元旦的总天数
}
for(i=1900;i<YearEnd.year;i++)
{
if((i%4==0&&i%100!=0)||(i%100==0&&i%400==0))
sum1+=366;
else
sum1+=365;
}//统计系统年份距1900年有多少天
if((YearEnd.year%4==0&&YearEnd.year&100!=0)||
(YearEnd.year%100==0&&YearEnd.year%400==0))
//判断系统年份是否是闰年
{//是闰年
for(i=1;i<YearEnd.month;i++)
{
month[i]=i/i;//初始化数组month中的值
sumday[i]=month[i]*monthdayr[i];
s1+=sumday[i];//计算出month中记录的月份至年初有多少天
}
s1+=YearEnd.day;//加上日,统计本日距本年初的天数
sum1+=s1;//统计该系统日期距1900年元旦的总天数
}
else//不是润年
{
for(i=1;i<YearEnd.month;i++)
{
month[i]=i/i;//初始化数组month中的值
sumday[i]=month[i]*monthday[i];
s1+=sumday[i];//计算出month中记录的月份至年初有多少天
}
s1+=YearEnd.day;//加上日,统计本日距本年初的天数
sum1+=s1;//统计该系统日期距1900年元旦的总天数
}
sum=sum1-sum;//将系统日期距1900年的总天数减去输入日期距1900年的总天数
printf("你活了%d天\n",sum);//输出你活了多少天
system("pause");
}
2011年3月20日星期日