如何用c语言或者c++编程万年历?
要能提供以下几个基本功能:(1)从键盘读入要求输出日历的年份xxxx,此部分要求对读入的数据具有一定的错误检查能力,如输入的不是数字,或输入的是五位以上的年份等。(2)根...
要能提供以下几个基本功能:
(1)从键盘读入要求输出日历的年份xxxx,此部分要求对读入的数据具有一定的错误检查能力,如输入的不是数字,或输入的是五位以上的年份等。
(2)根据2005年10月20日是星期四,推算出xxxx年的1月1日是星期几。
(3)输出到指定文件夹下面。输出的格式如下(假设要求输出2005年的):
程序设计的具体说明
(1)算法的关键在于确定要求输出年份的1月1日是星期几,这个可以通过判断该年的1月1日与2005年10月20日之间有多少天来推算可得。注意辨别润年的情况。
(2)组成年份四位数字(即0,1,…9)的输出格式应该以字符数组保存。 展开
(1)从键盘读入要求输出日历的年份xxxx,此部分要求对读入的数据具有一定的错误检查能力,如输入的不是数字,或输入的是五位以上的年份等。
(2)根据2005年10月20日是星期四,推算出xxxx年的1月1日是星期几。
(3)输出到指定文件夹下面。输出的格式如下(假设要求输出2005年的):
程序设计的具体说明
(1)算法的关键在于确定要求输出年份的1月1日是星期几,这个可以通过判断该年的1月1日与2005年10月20日之间有多少天来推算可得。注意辨别润年的情况。
(2)组成年份四位数字(即0,1,…9)的输出格式应该以字符数组保存。 展开
3个回答
2014-11-17
展开全部
有这三个函数,你自己排列吧。
// 某年是否闰年?
BOOL IsLeapYear(unsigned int iYear)
{
return !(iYear%4)&&(iYear%100) || !(iYear%400);
}
// 某年某月某日是星期几?蔡勒(Zeller)公式
unsigned char WeekDay(unsigned int iYear, unsigned char iMonth, unsigned char iDay)
{
//数组元素monthday[i]表示第i个月以前的总天数除以7的余数
unsigned char monthday[]={0,3,3,6,1,4,6,2,5,0,3,5};
unsigned int iDays = (iYear-1)%7 + (iYear-1)/4 - (iYear-1)/100 +(iYear-1)/400;
iDays += (monthday[iMonth-1] +iDay) ;
//如果iYear是闰年
if(IsLeapYear(iYear) && iMonth>2)
iDays++;
//返回:0,1,2,3,4,5,6表日、一、二、三、四、五、六
return iDays%7;
}
// 某年某月共多少天?
unsigned char MonthDays(unsigned int iYear, unsigned char iMonth)
{
unsigned char result=0;
switch(iMonth)
{
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
result=31;
break;
case 4:case 6:case 9:case 11:
result=30;
break;
case 2:
//如果是闰年
if(IsLeapYear(iYear))
result=29;
else
result=28;
break;
}
return result;
}
更多追问追答
追问
可以给我一份完整的程序吗,能运行的。
追答
项目代码,不能给人的,大概示意如下:
char *sztext[]={"日","一","二","三","四","五","六"};
sprintf(buffer,"%04d年%02d月 ",system_date.year,system_date.month);
A->DisplayHZK(DATE_X+10,DATE_Y+1,48,fgclr,bgclr,FONT_S,buffer); // printf就行了
for (i=0;i<7;i++)
{
//if(i==0||i==6)sztextclr=errorclr; // 红色,周未
//else sztextclr=rightclr; // 绿色 输出到文本这些就没用了
A->DisplayHZK(DATE_X+1+i*COL_WIDTH,DATE_Y+TITLE_HEIGHT+1,40,sztextclr,TRANSPARENT,FONT_S,sztext[i]); // printf就行了
}
day=1;
for(i=0; i<6; i++) // 最多6排
{
for(j=0; j<7; j++)
{
if(j < WeekDay(system_date.year,system_date.month, 1) && i==0)
continue;
if(day > MonthDays(system_date.year, system_date.month))
break;
if(j==0||j==6)sztextclr=errorclr;
else sztextclr=rightclr;
sprintf(buffer,"%2d",day); // printf就行了
A->DisplayHZK(DATE_X+5+j*COL_WIDTH,DATE_Y+TITLE_HEIGHT+TITLE_HEIGHT+5+i*ROW_HEIGHT,24,
sztextclr,TRANSPARENT,FONT_S,buffer); // printf就行了
day++;
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include<iostream.h>
#include<iomanip.h>
static char *title=" SUN MON TUE WED THU FRI SAT";
static char *month[12]={"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};
static day[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int leap(int year);
int week(int year);
void main()
{
int i,j,year,initweek;
do
{
cout<<"输入年份:";
cin>>year;
}while (year<=1900); //要求输入的年份必须大于1900
if(leap(year)) //闰年的二月份为29天
day[1]=29;
initweek=week(year);
cout<<"\n\t"<<setw(21)<<year;
for (i=0;i<12;i++)
{
cout<<"\n\t";
for (int k=0;k<35;k++) //输入一条横线
cout<<"-";
cout<<"\n\t"<<setw(21)<<month[i]; //输出月份
cout<<"\n\n\t"<<title<<"\n\t"; //输出星期号
for (k=0;k<initweek;k++) //输出若干空格
cout<<" ";
for (j=1;j<=day[i];j++) //输出当前月份所有的日期
{
if ((j+initweek)%7==1) //遇到星期日时换一行输出
cout<<"\n\t";
cout<<setw(5)<<j;
}
cout<<"\n\t";
for (k=0;k<35;k++) //输出一条横线
cout<<"-";
initweek=(initweek+day[i]%7)%7; //计算下一个月1号的星期号
}
cout<<endl;
}
//判断year年份是否为闰年
int leap(int year)
{
int leap;
if(year%400==0)
leap=1;
else if(year%4==0 && year%100!=0)
leap=1;
else leap=0;
return leap;
}
//计算year年的1月1日是星期几
int week(int year)
{
int i,leapyears=0,totalday;
for (i=1900;i<year;i++) //计算从1900年到当前的前一年一共有多少个闰年
if (leap(i)) leapyears++;
totalday=(year-1900)*365+leapyears;
//计算从1900年到当前年的前一年一共有多少天
return (totalday%7+1);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询