C++:输出日历的算法
2012-04-16 23:06
344 查看
功能:只要输入四位数的年份和该年的元旦是星期几,就可以输出全年的日历。
思路提示:
(1)一年有12个月,所以,输出年历的算法是:
int month=1;
while (month<=12)
{
计算第month月的天数MAX_DAY;
输出天数是MAX_DAY的第month月的年历;
month++;
}
(2)根据大月、小月、闰年、平年,计算year第month月的天数MAX_DAY,算法是:
switch (month)
{
case 1:case3:case 5:case7:case 8:case10:case 12:
MAX_DAY=31;break;
case 2:
if (((year%4)= =0)&&((year%100)!=0)||(year%400= =0))
MAX_DAY=29;
else
MAX_DAY=28;
break;
case 4:case 6:case 9:case 11:
MAX_DAY=30;
break;
}
(3)输出日历
printf(“\n= = = = = = = = = =%2d月份= = = = = = = = = =\n”,month);
printf(“ SUN MON TUE WED THU FRI SAT\n”);
for (i=0;i<week;i++)
printf(“%4c”,’ ’);
for (day=1;day<=MAX_DAY;day++)
{
printf(“%4d”,day);
week++;
week%=7;
if (week= =0)
printf(“\n”);
}
#include"stdio.h"
#include"stdlib.h"
void setmonth(int r);
void main(void)
{
int year,month,day,a,b,i,j,d,x,mon,k;
printf(" 时间:2009-7-4 21:47 完成\n");
printf("----------------------------------------------------\n");
printf(" 如果你想选择输出全年的日历,请选1!\n");
printf(" 如果你想选择输出某个月的日历,请选2!\n");
printf("如果你想知道某年某月某日的具体是星期几,请选择3!\n");
printf(" 你还要继续吗?请选择4!\n");
printf(" 如果你要退出,请选择5!\n");
printf("-----------------------------------------------------\n");
do
{
printf("请选择:");
scanf("%d",&x);
if(x==1) //判断输出全年日历的条件
{
month=12;
printf("请输入年:");
scanf("%d",&year);
}
if(x==2) //判断输出某个月的日历的条件
{
printf("请输入年、月:");
scanf("%d%d",&year,&month);
}
if(x==3) //判断输出具体某天是星期几的条件
{
printf("请输入年、月、日:");
scanf("%d%d%d",&year,&mon,&day);
month=mon-1;
}
if(x==5) //退出的条件
exit(100);
a=((year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400)%7; //判断某年的第一天是星期几
for(i=1,d=0;i<=month;i++)
{
switch(i)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:d=31;break;
case 2:if(!(year%4)&&(year%100)||!(year%400)) //判断是否是闰年
d=29;
else
d=28;
break;
case 4:
case 6:
case 9:
case 11:d=30;
}
b=a%7; //判断某月的第一天是星期几
a+=d; //求总的天数
if(x==1) //判断输出全年的日历
{
printf("========================================================\n");
setmonth(i); //调用输出的月份
printf("************************************************\n");
printf("========================================================\n");
printf(" 星期一 星期二 星期三 星期四 星期五 星期六 星期日\n");
for(j=1;j<=b;j++)
printf("%8c",' ');
for(j=1;j<=d;j++)
{
printf("%8d",j);
if((j+b)%7==0)
printf("\n");
}
}
if(x==1) //跟随条件一,每个月的末尾换行
printf("\n");
}
if(x==2) //输出一个月的日历
{
printf("========================================================\n");
setmonth(i-1); //调用月份的输出
printf("************************************************\n");
printf("========================================================\n");
printf(" 星期一 星期二 星期三 星期四 星期五 星期六 星期日\n");
for(j=1;j<=b;j++)
printf("%8c",' ');
for(j=1;j<=d;j++)
{
printf("%8d",j);
if((j+b)%7==0)
printf("\n");
}
printf("\n");
}
if(x==3) //输出具体某天是星期几
{
a+=day;
a%=7;
switch(a)
{
case 0:printf("%d-%d-%d是星期天!",year,mon,day);break;
case 1:printf("%d-%d-%d是星期一!",year,mon,day);break;
case 2:printf("%d-%d-%d是星期二!",year,mon,day);break;
case 3:printf("%d-%d-%d是星期三!",year,mon,day);break;
case 4:printf("%d-%d-%d是星期四!",year,mon,day);break;
case 5:printf("%d-%d-%d是星期五!",year,mon,day);break;
default:printf("%d-%d-%d是星期六!",year,mon,day);
}
printf("\n");
}
printf("请选择继续还是要退出:"); //条件的判断
scanf("%d",&k);
}while(k==4);
if(k==5)
exit(100);
}
void setmonth(int r)
{
switch(r)
{
case 1:printf("%4c一月份",' ');break;
case 2:printf("%4c二月份",' ');break;
case 3:printf("%4c三月份",' ');break;
case 4:printf("%4c四月份",' ');break;
case 5:printf("%4c五月份",' ');break;
case 6:printf("%4c六月份",' ');break;
case 7:printf("%4c七月份",' ');break;
case 8:printf("%4c八月份",' ');break;
case 9:printf("%4c九月份",' ');break;
case 10:printf("%4c十月份",' ');break;
case 11:printf("%2c十一月份",' ');break;
default:printf("%2c十二月份",' ');
}
}
思路提示:
(1)一年有12个月,所以,输出年历的算法是:
int month=1;
while (month<=12)
{
计算第month月的天数MAX_DAY;
输出天数是MAX_DAY的第month月的年历;
month++;
}
(2)根据大月、小月、闰年、平年,计算year第month月的天数MAX_DAY,算法是:
switch (month)
{
case 1:case3:case 5:case7:case 8:case10:case 12:
MAX_DAY=31;break;
case 2:
if (((year%4)= =0)&&((year%100)!=0)||(year%400= =0))
MAX_DAY=29;
else
MAX_DAY=28;
break;
case 4:case 6:case 9:case 11:
MAX_DAY=30;
break;
}
(3)输出日历
printf(“\n= = = = = = = = = =%2d月份= = = = = = = = = =\n”,month);
printf(“ SUN MON TUE WED THU FRI SAT\n”);
for (i=0;i<week;i++)
printf(“%4c”,’ ’);
for (day=1;day<=MAX_DAY;day++)
{
printf(“%4d”,day);
week++;
week%=7;
if (week= =0)
printf(“\n”);
}
#include"stdio.h"
#include"stdlib.h"
void setmonth(int r);
void main(void)
{
int year,month,day,a,b,i,j,d,x,mon,k;
printf(" 时间:2009-7-4 21:47 完成\n");
printf("----------------------------------------------------\n");
printf(" 如果你想选择输出全年的日历,请选1!\n");
printf(" 如果你想选择输出某个月的日历,请选2!\n");
printf("如果你想知道某年某月某日的具体是星期几,请选择3!\n");
printf(" 你还要继续吗?请选择4!\n");
printf(" 如果你要退出,请选择5!\n");
printf("-----------------------------------------------------\n");
do
{
printf("请选择:");
scanf("%d",&x);
if(x==1) //判断输出全年日历的条件
{
month=12;
printf("请输入年:");
scanf("%d",&year);
}
if(x==2) //判断输出某个月的日历的条件
{
printf("请输入年、月:");
scanf("%d%d",&year,&month);
}
if(x==3) //判断输出具体某天是星期几的条件
{
printf("请输入年、月、日:");
scanf("%d%d%d",&year,&mon,&day);
month=mon-1;
}
if(x==5) //退出的条件
exit(100);
a=((year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400)%7; //判断某年的第一天是星期几
for(i=1,d=0;i<=month;i++)
{
switch(i)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:d=31;break;
case 2:if(!(year%4)&&(year%100)||!(year%400)) //判断是否是闰年
d=29;
else
d=28;
break;
case 4:
case 6:
case 9:
case 11:d=30;
}
b=a%7; //判断某月的第一天是星期几
a+=d; //求总的天数
if(x==1) //判断输出全年的日历
{
printf("========================================================\n");
setmonth(i); //调用输出的月份
printf("************************************************\n");
printf("========================================================\n");
printf(" 星期一 星期二 星期三 星期四 星期五 星期六 星期日\n");
for(j=1;j<=b;j++)
printf("%8c",' ');
for(j=1;j<=d;j++)
{
printf("%8d",j);
if((j+b)%7==0)
printf("\n");
}
}
if(x==1) //跟随条件一,每个月的末尾换行
printf("\n");
}
if(x==2) //输出一个月的日历
{
printf("========================================================\n");
setmonth(i-1); //调用月份的输出
printf("************************************************\n");
printf("========================================================\n");
printf(" 星期一 星期二 星期三 星期四 星期五 星期六 星期日\n");
for(j=1;j<=b;j++)
printf("%8c",' ');
for(j=1;j<=d;j++)
{
printf("%8d",j);
if((j+b)%7==0)
printf("\n");
}
printf("\n");
}
if(x==3) //输出具体某天是星期几
{
a+=day;
a%=7;
switch(a)
{
case 0:printf("%d-%d-%d是星期天!",year,mon,day);break;
case 1:printf("%d-%d-%d是星期一!",year,mon,day);break;
case 2:printf("%d-%d-%d是星期二!",year,mon,day);break;
case 3:printf("%d-%d-%d是星期三!",year,mon,day);break;
case 4:printf("%d-%d-%d是星期四!",year,mon,day);break;
case 5:printf("%d-%d-%d是星期五!",year,mon,day);break;
default:printf("%d-%d-%d是星期六!",year,mon,day);
}
printf("\n");
}
printf("请选择继续还是要退出:"); //条件的判断
scanf("%d",&k);
}while(k==4);
if(k==5)
exit(100);
}
void setmonth(int r)
{
switch(r)
{
case 1:printf("%4c一月份",' ');break;
case 2:printf("%4c二月份",' ');break;
case 3:printf("%4c三月份",' ');break;
case 4:printf("%4c四月份",' ');break;
case 5:printf("%4c五月份",' ');break;
case 6:printf("%4c六月份",' ');break;
case 7:printf("%4c七月份",' ');break;
case 8:printf("%4c八月份",' ');break;
case 9:printf("%4c九月份",' ');break;
case 10:printf("%4c十月份",' ');break;
case 11:printf("%2c十一月份",' ');break;
default:printf("%2c十二月份",' ');
}
}
相关文章推荐
- 蓝桥杯-算法提高-任意年月日历输出
- ADV-89-算法提高-输出九九乘法表、ADV-90-算法提高-输出日历
- c++经典题---巧用算法输出A组成的三角形
- 蓝桥杯 ADV-90 算法提高 输出日历
- c++ 深度优先算法输出树的访问顺序
- 期末考试 编程题#2:输出指定结果一(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- C++输出日历程序
- 算法提高 ADV-93 任意年月日历输出
- c/c++ 算法之 输出1~1000之间的素数
- 算法提高 ADV-93 任意年月日历输出
- 用C++编一程序,先输出一行sun mon tue wed thu fri fri,接着使用右对齐打印出日期,像日历那样
- 简化以下程序,将函数对象 divide_by 转换为一个函数,并将 for 循环替换为用一个标准的 C++ 算法来输出数据
- 文件操作与模板 编程题#3: 整数的输出格式(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 期末考试 编程题#10:输出指定结果二(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;虚函数继承)
- 期末考试 编程题#1:输出200(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 算法 - 输出一个字符串的全排列(C++)
- 算法竞赛_最长回文子串(含特殊符号输出)_C++
- 算法提高 ADV-90 输出日历
- C/C++经典算法精华整理(4)-位字段输出二进制数据
- 【算法】 输入n 输出一个n*n的zigzag矩阵 利用c++实现