C++课设万年历的设计,高分求解!成功了再加分!

(1) 程序运行时,首先给出3个菜单选项的内容和输入提示:
1 显示一年的日历
2 显示某一天是星期几
0 退出
(2)用户可以通过主菜单选择不同的选项。若选择1,则通过输入年份,显示输出该年每个月的日历。若选择2,则通过输入日期,查询这一天是星期几。
要求请大家看清楚,按1显示一年的日历,按2显示某一天是星期几,按0推出 。。按要求的

#include <iostream.h>

#include <stdlib.h>

int getday(int y,int m,int d)

{

 if(m<=2){

  m+=12;

  y--;

 }

 int c=y/100;

 y=y%100;

 return (y+y/4+c/4-2*c+26*(m+1)/10+d-1)%7;

}

void dispaly(int y)

{

 int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};

 month[1]+=(y%400==0||(y%4==0&&y%100!=0));

 int wday=getday(y,1,1);

 for(int i=0;i<12;i++){

  cout<<i+1<<"月\n"<<endl;

  cout<<"日\t一\t二\t三\t四\t五\t六"<<endl;

  int j;

  for(j=0;j<wday;j++)

   cout<<" \t";

  for(j=0;j<month[i];j++){

   cout<<j+1<<"\t";

   if((j+wday+1)%7==0)

    cout<<endl;

  }

  wday=(wday+j)%7;

  cout<<endl<<endl;

 }

 

}

int main()

{

 int y,m,d;

 char week[15]="日一二三四五六";

 int atc;

 while(1){

  system("cls");  

  cout<<"1 显示一年的日历"<<endl;

  cout<<"2 显示某一天是星期几"<<endl;

     cout<<"0 退出"<<endl; 

  cin>>atc;

  switch(atc){

   case 1:

    cout<<"输入年份:";

    cin>>y;

    dispaly(y);

    break;

   case 2:

    cout<<"输入年 月 日:"; 

    cin>>y>>m>>d;

    cout<<"星期为:"<<week[getday(y,m,d)*2]<<week[getday(y,m,d)*2+1]<<endl;

    break;

   case 0:return 0;

   default :cout<<"错误输入!"<<endl; 

  }

  system("pause");

 }     

 return 0;

}

测试见附图。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-09-24
#include "iostream"
#include "string"
#include "iomanip"
using namespace std;

int monthdays[12]={31,28,31,30,31,30,31,31,30,31,30,31};
string weekday[7]={"星期天","星期一","星期二","星期三","星期四","星期五","星期六"};
string monthname[12]={"January","February","March","April","May","June","July","August","September","October","November","December"};
string tiangan[10]={"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};
string dizhi[12]={"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"};
string shengxiao[12]={"鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"};

void showcalendar(int f);
void showpermoncal(int mon,int monthweek,int flag);

int main()
{
int f;

cout<<"请选择操作:"<<endl<<"1.查询某年日历;"<<endl<<"2.查询某年某月的日历;"<<endl<<"3.查询某天是星期几"<<endl;
cin>>f;

showcalendar(f);

return 0;
}

void showcalendar(int f)
{
int year,month,day;
int flag=0,mon=1;
int monthweek,week;
int totaldays;
int T,D,S;//天干,地支,生肖

cout<<"请输入年份: ";
cin>>year;

totaldays=(year-1)*365+(year-1)/4+(year-1)/400-(year-1)/100;
week=(totaldays+1)%7;
monthweek=week;

T=(year+6)%10;
D=(year+8)%12;
S=D;

if((year%4==0&&year%100!=0)||(year%400==0)) flag=1;
cout<<endl<<" *****"<<year<<"年*****"<<endl<<endl;
cout<<" "<<shengxiao[S]<<"年"<<endl;;
cout<<" 农历"<<tiangan[T]<<dizhi[D]<<"年"<<endl<<endl;

if(f>=2)
{
cout<<"请输入月份: ";
cin>>month;
if(f==3)
{
cout<<"请输入日期: ";
cin>>day;
while(mon<month)
totaldays+=monthdays[mon++-1];
if(month>2&&flag) totaldays++;
totaldays=totaldays+day-1;
week=(totaldays+1)%7;
cout<<year<<"年"<<month<<"月"<<day<<"日"<<" "<<weekday[week]<<endl;
return;
}
while(mon<=12)
{
if(mon==month)
{showpermoncal(mon,monthweek,flag); break;}
if(mon==2&&flag) monthweek++;
monthweek=(monthweek+monthdays[mon++-1])%7;
}
return;
}

while(mon<=12)
{
showpermoncal(mon,monthweek,flag);
if(mon==2&&flag) monthweek++;
monthweek=(monthweek+monthdays[mon++-1])%7;
}

}

void showpermoncal(int mon,int monthweek,int flag)
{
cout<<monthname[mon-1]<<endl;
cout<<"***************"<<endl;
cout<<"Sun Mon Tue Wen Tur Fri Sat"<<endl;
for(int i=0;i<monthweek;i++) cout<<" ";
for(int j=0;j<monthdays[mon-1];j++)
{
cout<<setw(2)<<j+1<<" ";
if((j+1+monthweek)%7==0) cout<<endl;
}
if(mon==2&&flag) cout<<"29";
cout<<endl<<endl;
}
第2个回答  2010-09-25
代码如下,参考下:
#include <iostream>
using namespace std;
long int f(int year,int month)
{/*f(年,月)=年-1,如月<3;否则,f(年,月)=年*/
if(month<3) return year-1;
else return year;
}

long int g(int month)
{/*g(月)=月+13,如月<3;否则,g(月)=月+1*/
if(month<3) return month+13;
else return month+1;
}

long int n(int year,int month,int day)
{
/*N=1461*f(年、月)/4+153*g(月)/5+日*/
return 1461L*f(year,month)/4+153L*g(month)/5+day;
}

int w(int year,int month,int day)
{
/*w=(N-621049)%7(0<=w<7)*/
return(int)((n(year,month,day)%7-621049L%7+7)%7);
}

int date[12][6][7];
int day_tbl[ ][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};

void printyear()
{
int sw,leap,i,j,k,wd,day;
int year;/*年*/
char title[]="SUN MON TUE WED THU FRI SAT";
printf("Please input the year whose calendar you want to know: ");/*输入年*/
scanf("%d%*c",&year);/*输入年份值和掠过值后的回车*/
sw=w(year,1,1);
leap=year%4==0&&year%100||year%400==0;/*判闰年*/
for(i=0;i<12;i++)
for(j=0;j<6;j++)
for(k=0;k<7;k++)
date[i][j][k]=0;/*日期表置0*/
for(i=0;i<12;i++)/*一年十二个月*/
for(wd=0,day=1;day<=day_tbl[leap][i];day++)
{/*将第i+1月的日期填入日期表*/
date[i][wd][sw]=day;
sw=++sw%7;/*每星期七天,以0至6计数*/
if(sw==0) wd++;/*日期表每七天一行,星期天开始新的一行*/
}
printf("\n|==================The Calendar of Year %d =====================|\n|",year);
for(i=0;i<6;i++)
{
/*先测算第i+1月和第i+7月的最大星期数*/
for(wd=0,k=0;k<7;k++)/*日期表的第六行有日期,则wd!=0*/
wd+=date[i][5][k]+date[i+6][5][k];
wd=wd?6:5;
printf("%2d %s %2d %s |\n|",i+1,title,i+7,title);
for(j=0;j<wd;j++)
{
printf(" ");/*输出四个空白符*/
/*左栏为第i+1月,右栏为第i+7月*/
for(k=0;k<7;k++)
{
if(date[i][j][k])
printf("%4d",date[i][j][k]);
else
printf(" ");
}
printf(" ");/*输出十个空白符*/
for(k=0;k<7;k++)
{
if(date[i+6][j][k])
printf("%4d",date[i+6][j][k]);
else
printf(" ");
}
printf(" |\n|");
}
}
system("pause");
}
void showweekday()
{
int i,j,leap,year,month,day,days=0,sum;
char week[][10] = {"SUN","MON","TUE","WED","THU","FRI","SAT"};
printf("Please input the year month day: ");
scanf("%d%d%d",&year,&month,&day);
leap=(year%4==0&&year%100||year%400==0);
for(i=0;i<month-1;i++)
days += day_tbl[leap][i];
days += day;
sum = year-1+(year-1)/4-(year-1)/100+(year-1)/400+days;
j = sum % 7; //j是星期几,j=0星期日
printf("%d年%d月%d日是%s\n",year,month,day,week[j]);
system("pause");
}
void menu()
{
printf("\n|==================The Menu =====================|\n|");
printf("1 显示一年的日历\n");
printf("2 显示某一天是星期几\n");
printf("0 退出\n");
printf("\nplease input the choice:\n");
}

void main()
{
int choice;
while (1)
{
menu();
cin>>choice;
switch (choice)
{
case 1:
system("cls");
printyear();
break;
case 2:
system("cls");
showweekday();
break;
case 0:
exit(0);
break;
}
}
}
第3个回答  2010-09-24
细细的问一下,1582年10月4日前的要不要啊,那个以前的历法我都不知道啊

#include <iostream.h>
int getday(int y,int m,int d)
{
if(m<=2){
m+=12;
y--;
}
int c=y/100;
y=y%100;
return (y+y/4+c/4-2*c+26*(m+1)/10+d-1)%7;
}
void dispaly(int y)
{
int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
month[1]+=(y%400==0||(y%4==0&&y%100!=0));
int wday=getday(y,1,1);
for(int i=0;i<12;i++){
cout<<i+1<<"月\n"<<endl;
cout<<"日\t一\t二\t三\t四\t五\t六"<<endl;
int j;
for(j=0;j<wday;j++)
cout<<" \t";
for(j=0;j<month[i];j++){
cout<<j+1<<"\t";
if((j+wday+1)%7==0)
cout<<endl;
}
wday=(wday+j)%7;
cout<<endl<<endl;
}

}
int main()
{
int y,m,d;
char week[15]="日一二三四五六";
int atc;
while(1){
cout<<"1、输入年份打印出月份表"<<endl;
cout<<"2、计算星期"<<endl;
cout<<"0、退出"<<endl;
cin>>atc;
switch(atc){
case 1:
cout<<"输入年份:";
cin>>y;
dispaly(y);
break;
case 2:
cout<<"输入年 月 日:";
cin>>y>>m>>d;
cout<<"星期为:"<<week[getday(y,m,d)*2]<<week[getday(y,m,d)*2+1]<<endl;
break;
case 0:return 0;
default :cout<<"错误输入!"<<endl;
}
}

return 0;
}