C语言 已知某年一月一日是星期几,按照SUN MON TUS WED THU FRI STA的格式输出该年某个月的月历

(即输入XXXX/1/1is星期n,x mouth,输出x月的月历)C语言编程 用循环和switch

以下是我以前写的一个万年历系统的一个模块:输入某一年份,然后显示出全年日历,你可以在其中修改满足你的要求-----------

#include <stdio.h>

void main(void)

{

 int year,month,day;

 //int month=1;

 int x;//定义该月的天数

 int sum,leap,result;

 int a[42]={0};

 printf("====>请输入年份:");

 scanf("%d",&year);

 for(month=1;month<13;month++){

  int a[42]={0};

  if(month==4||month==6||month==9||month==11) 

   x=30; 

  else if(month==2) 

  {

   if(year%400==0||(year%4==0&&year%100!=0)) 

    x=29; 

   else 

    x=28;

  } 

  else 

   x=31;

  day=1;

  

  switch(month)

  {

  case 1:{sum=day;     break;}

  case 2:{sum=31+day;  break;}

  case 3:{sum=59+day;  break;}

  case 4:{sum=90+day;  break;}

  case 5:{sum=120+day; break;}

  case 6:{sum=151+day; break;}

  case 7:{sum=181+day; break;}

  case 8:{sum=212+day; break;}

  case 9:{sum=243+day; break;}

  case 10:{sum=273+day;break;}

  case 11:{sum=304+day;break;}

  case 12:{sum=334+day;break;}

  }

  

  if(year%400==0||(year%4==0&&year%100!=0))

   leap=1;

  else

   leap=0;

  if(leap==1&&month>2)//如果是闰年并且月份大于2,总天数应该加一天

   sum=sum+1;

  

  result=(year-1+(year-1)/4-(year-1)/100+(year-1)/400+sum)%7;

  //写入数组

  a[result]=1;//定位该月第一天的位置

  for(int i=0;i<x;i++)

   a[result+i]=i+1;

  //输出结果

  printf("\n%d %d :",year,month);

  printf(" SUN MON TUE WEN THU FRI SAT\n" );

  printf("=========================================\n");

  for(i=0;i<6;i++)//格式化输出,一维变二维输出

  { 

   printf("\t");

   for(int j=0;j<7;j++)

    printf("%4d",a[7*i+j]);

   printf("\n");

  }

 }

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-29
我曾经写过一个类似的程序,要求比这个复杂(可以运行一下看效果),你可以参考一下我的源代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;

const int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
char number[10][5][5]={
{{'*','*','*','*','*'},{'*',' ',' ',' ','*'},{'*',' ',' ',' ','*'},{'*',' ',' ',' ','*'},{'*','*','*','*','*'}},
{{' ',' ','*','*',' '},{' ',' ',' ','*',' '},{' ',' ',' ','*',' '},{' ',' ',' ','*',' '},{' ',' ','*','*','*'}},
{{'*','*','*','*','*'},{' ',' ',' ',' ','*'},{'*','*','*','*','*'},{'*',' ',' ',' ',' '},{'*','*','*','*','*'}},
{{'*','*','*','*','*'},{' ',' ',' ',' ',' '},{'*','*','*','*','*'},{' ',' ',' ',' ','*'},{'*','*','*','*','*'}},
{{' ',' ','*','*',' '},{' ','*',' ','*',' '},{'*',' ',' ','*',' '},{'*','*','*','*','*'},{' ',' ',' ','*',' '}},
{{'*','*','*','*','*'},{'*',' ',' ',' ',' '},{'*','*','*','*','*'},{' ',' ',' ',' ','*'},{'*','*','*','*','*'}},
{{'*','*','*','*','*'},{'*',' ',' ',' ',' '},{'*','*','*','*','*'},{'*',' ',' ',' ',' '},{'*','*','*','*','*'}},
{{'*','*','*','*','*'},{' ',' ',' ',' ','*'},{' ',' ',' ',' ','*'},{' ',' ',' ',' ','*'},{' ',' ',' ',' ','*'}},
{{'*','*','*','*','*'},{'*',' ',' ',' ','*'},{'*','*','*','*','*'},{'*',' ',' ',' ','*'},{'*','*','*','*','*'}},
{{'*','*','*','*','*'},{'*',' ',' ',' ','*'},{'*','*','*','*','*'},{' ',' ',' ',' ','*'},{'*','*','*','*','*'}}
};

char ww[50]=" Sun Mon Tue Wed Thu Fri Sat";
char yue[13][10]={{""},{"Jan"},{"Feb"},{"Mar"},{"Apr"},{"May"},{"June"},
{"July"},{"Aug"},{"Sep"},{"Oct"},{"Nov"},{"Dec"}};
int year,week,total,top;
char tab[100][100];
FILE *fout;

int is_run(int x) {
if (x % 4 ==0 && x % 100 || x % 400==0) return 1;
return 0;
}

int maxx(int x,int y) {
return x>y?x:y;
}

void init()
{
bool ok;
char line[101];
printf("请输入年份xxxx: ");

while (1)
{
ok=true;
gets(line);
for (int i=0;i<strlen(line);i++)
{
if (line[i]==' ') continue;
if ( line[i]>'9' || line[i]<'0') { ok=false; break; }
}

if ( sscanf(line,"%d",&year) != 1 ) ok =false;
if (year<0 || year>9999) ok=false;
if (!ok) printf("输入不符合要求,请重新输入: ");
else break;
}
}

void printyear()
{
int a[4];
int i,j,k;
a[0]=year / 1000;
a[1]=year / 100 % 10;
a[2]=year / 10 % 10;
a[3]=year % 10;
for (i=0;i<5;i++)
{
printf(" ");
for (k=0;k<4;k++)
{
for (j=0;j<5;j++)
putchar(number[a[k]][i][j]);
printf(" ");
}
printf("\n");
}
printf("\n");
}

void printyear_to_file()
{
int a[4];
int i,j,k;
a[0]=year / 1000;
a[1]=year / 100 % 10;
a[2]=year / 10 % 10;
a[3]=year % 10;
for (i=0;i<5;i++)
{
fprintf(fout," ");
for (k=0;k<4;k++)
{
for (j=0;j<5;j++)
fprintf(fout,"%c",number[a[k]][i][j]);
fprintf(fout," ");
}
fprintf(fout,"\n");
}
fprintf(fout,"\n");
}
void printit()
{
int i,j;
int pos;
for (i=1;i<=12;i++)
{
top=(i-1)/2*9;

sprintf(tab[top] + strlen(tab[top])," %s ",yue[i]); top++;
sprintf(tab[top] + strlen(tab[top]), " ___________________________ "); top++;
sprintf(tab[top] + strlen(tab[top]), "%s ",ww); top++;
pos=week*4;
for (int ii=0;ii<week;ii++) sprintf(tab[top] + strlen(tab[top]), " ");
int mon=month[i];
if (i==2) mon += is_run(year);

for (j=1;j<=mon;j++)
{
week++;
if (week==7) week=0;
sprintf(tab[top] + strlen(tab[top]), "%4d",j);
pos+=4;
if ( pos == 28 ) { sprintf(tab[top] + strlen(tab[top])," "); top++; pos=0; }
}
if ( i % 2 )
{
for (j=pos;j<30;j++) sprintf(tab[top] + strlen(tab[top])," ");
if (top<(i-1)/2*9+8)
{
top++;
for (j=0;j<30;j++) sprintf(tab[top] + strlen(tab[top])," ");
}
}
}

printyear();
for (i=0;i<6*9;i++)
puts(tab[i]);

fout=fopen("B09060428A.txt","a+");
if (!fout)
printf("Can't open the file to store it! Sorry!\n");
else
{
printyear_to_file();
for (i=0;i<6*9;i++) fprintf(fout,"%s\n",tab[i]);
fprintf(fout,"\n\n");
fclose(fout);
}
}

int main()
{
char ch;
while (1)
{
memset(tab,0,sizeof(tab));
init();
total=0;
if (year>=2010)
{
int i;
for (i=2010;i<year;i++)
total+=365 + is_run(i);
week= (total + 5) % 7;
}else
{
int i;
for (i=2009;i>=year;i--)
total+=365 + is_run(i);
week= (14 - total % 7 -2 ) % 7;
}
printit();

printf("是否需要继续?Y(y) / N(n) :");
scanf("%s",&ch); getchar();
if (ch!='Y' && ch!='y')
{
printf("***********************Game over!*************************\n");
break;
}
}
return 0;
}