#include <iostream.h>
#include <iomanip.h>
#include <stdio.h>
char* weekd[7]={"SUN","MON","TUE","WEN","THU","FRI","STA"};
int year;
int l,c;
int day[13][3];
int i,j,k,t;
int getyear()
{
cout<<"请输入你想要查询的年份:";
cin>>year;
return year;
} //判断是否为闰年。
int ioleapyear()
{
if(year%4==0&&year%100!=0||year%400==0)
return 1;
else return 0;
}
int weekday(int b) //计算每年第一天是星期几。
{
return ((b-1)+(b-1)/4-(b-1)/100+(b-1)/400+1)%7;
}
int monthday(int i) //计算每个月多少天。
{
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12) return 31;
else if (i==2)
if(ioleapyear()) return 29;
else return 28;
else return 30;
}
void putout(){
cout<<"你要输入几行几列(请让行与列相乘为12):";
cin>>l>>c;
day[1][0]=weekday(year);
day[1][1]=1;
day[1][2]=31;
for(i=2;i<=12;i++){
day[i][0]=( day[i-1][0]+monthday(i-1) )%7;
day[i][1]=1;
day[i][2]=monthday(i);
}
for(i=0;i<l;i++){
for(int j=0;j<c;j++){
if(j)cout<<" ";
cout<<"----------"<<i*c+j+1<<"----------";
}
cout<<endl;
for(j=0;j<c;j++){
if(j)cout<<" ";
cout<<"日 一 二 三 四 五 六";
}
cout<<endl;
for(k=0;k<6;k++){
for(j=0;j<c;j++){
if(k!=0)day[i*c+j+1][0]=0;
if(j)cout<<" ";
for(t=1;t<day[i*c+j+1][0];t++)cout<<" ";
while(day[i*c+j+1][0]!=7&&day[i*c+j+1][1]<=day[i*c+j+1][2]){
printf("%2d ",day[i*c+j+1][1]);
day[i*c+j+1][0]++;
day[i*c+j+1][1]++;
}
if(day[i*c+j+1][1]>day[i*c+j+1][2])
for(t=day[i*c+j+1][0];t<7;t++)cout<<" ";
}
cout<<endl;
}
}
}
int main(){
getyear();
putout();
getchar();
return 0;
}
怎么改能使日期对齐??
日期没有与星期对齐, 在输出日期时先输出2*weekday(year)个空格;
#include <iostream.h>
#include <iomanip.h>
#include <stdio.h>
class Data //声明一个类Data
{
private: //私有部分,关于这个的特点,自己看书去
int year; //私有变量,同上
public: //公有变量,特点看书去
void getyear(); //提示用户输入想要查询的年份
int ioleapyear(); //判断该年是不是闰年
int weekday(); //判断该年的元旦是星期几
int monthday(int i); //该年每个月的天数
void disp(); //显示结果。
};
char* weekd[7]={"MON","TUE","WEN","THU","FRI","STA","SUN"}; //记录星期一到星期天
void Data::getyear()
{
cout<<"请输入你想要查询的年份:"; //cout是输出
cin>>year; //cin是输入一个值到变量
}
int Data::ioleapyear() //判断闰年和平年,闰年返回1,平年返回0
{
if(year%4==0&&year%100!=0||year%400==0) //计算闰年和平年的方法
//四位年份能被4整除但不能被100整除,或能被400整除
return 1;
else
return 0;
}
int Data::weekday()
{
int n=year-1900; //已知1900年的元旦刚好是星期一
n=n+(n-1)/4+1; // 判断,以每年52个整星期计算year年比1900年多出来的天数
//多出来的天数除以7的余数就是这年第一天是星期几
n=n%7; //%就是取余的意思
if(n==0) //当n=0的时候是周日,使它返回7
return 7; //返回输入的年份的元旦是星期几
else
return n; //n不是0的时候反正n的值就是星期几
}
int Data::monthday(int i) //这里是返回月有几天的,i是月份
{
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
return 31; //如果是1,2,5,7,8,10,12月,则返回是31天
else if (i==2) //判断可恶的2月
if(ioleapyear()) //当ioleapyear()返回1时就是闰年,则为29天,ioleapyear()是一个函数,调用的一个函数
return 29;
else return 28; //否则为28天
else
return 30; //其他的月份为30天
}
void Data::disp() //这个是显示函数
{
int i; //这个是月的记录变量
int n=weekday(); //这也是调用了一个函数,用n记录当年的元旦是星期几
for(i=1;i<=12;i++) //总共的月份 12 ,用循环来实现显示12个月
{
int lemp=1;
cout<<endl<<setw(5)<<i<<"月份"<<endl; //这个是显示月份的
//setw()是iomanip.h里的函数,只要在开头写上#include <iomanip.h> 就可以用了
//作用是设置宽度,就是i显示出来的宽度,这个是为了好看,当然你可以用空格什么的代替
cout<<"-------------------------------------------"<<endl; //endl是换行的意思,这句就是输出了一行横线
for(int j=0;j<7;j++) //循环显示星期上的字,就是mon,tue等等
cout<<setw(5)<<weekd[j];
cout<<endl<<"-------------------------------------------"<<endl;
for(int k=1;k<n;k++,lemp++) //输入每月第一天的起始位置,用空格补充
cout<<setw(5)<<" "; //就是如果是星期四,则前面有3个空格,1从星期四的位置出现
for(int d=1;d<=monthday(i);d++,lemp++) //循环输出每个月的日子
{
cout<<setw(5)<<d; //d就是日子
if(lemp==7) //控制一行输出到星期天,如果到星期天则重新计数
{
cout<<endl; //是星期天的话刚输出一个换行
lemp=0; //让临时记录星期的变量为0,以备下次使用
}
}
n=lemp%7; //当输出完一个月后,记录这个月的最后一天在哪,寻找下个月的
if(n==0) //第一天的起始位置
n=7; //就是当n为0的时候,是周日,令n为7
cout<<endl<<"-------------------------------------------"<<endl<<endl<<endl;
}
}
int main()
{
Data a; //创建一个对象a
cout<<setw(45)<<"万年历查询"<<endl;
cout<<"-------------------------------------------------------------------------------"
<<endl;
a.getyear(); //调用对象a里的函数,这个就管输入一个年份
a.disp(); //调用对象a的另一个函数,显示日历
return 0;
}
自己对照着看一下,这是用类定义做的,你的也可以看一下,对修改你自己的程序应该有所帮助