如何用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)的输出格式应该以字符数组保存。
展开
 我来答
cjj796
2014-11-19 · TA获得超过8709个赞
知道大有可为答主
回答量:1.3万
采纳率:68%
帮助的人:3497万
展开全部

你好!这样的效果可以吗,两个效果,私信说明一下

匿名用户
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++;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wqte45
2017-10-17 · TA获得超过997个赞
知道小有建树答主
回答量:1492
采纳率:53%
帮助的人:366万
展开全部
#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);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式