花了整整一天写的,总算好了。哈哈哈。我来晒一晒。
一、基本功能要求
实现万年历的功能,并以交互方式显示。适用于从公元 1 年 1 月 1 日至公元 9999 年之间的所有日期显示。输入某一年份,系统可输出该年年历,并保存为 *.txt 文件;输入某年某月可显示该月所有天数及每天所对应的星期;在屏幕上输入某一年、月、日,能够显示出星期几。
二、主要知识点
1 、输入 / 输出人机界面交互。
2 、逻辑表达式、条件控制语句、闰年 / 平年判断、全年天数计算等。
3 、函数的调用、数组的使用、文件的操作。
4 、掌握输出格式控制方法,实现对打印结果进行输出控制。
#include
#include
#include
using namespace std;
int everyMonth[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
class PC
{
public:
void Input();//进行操作选择
void SetDays();//如果输入某年,进行'3'操作处理
void SetMonth();//如果选输入某年某月,进行'2'操作处理
void SetYear();//如果输入某年某月某日,进行'1'操作处理
bool IsLeap(int year);//判断是否是闰年
bool IsRight(int year,int month,int day);//判断输入是否合法
int GetDays(int year,int month,int day);//得到此日期前(从1年1月1号还是算)的天数
void Print(int year,int month);//输出到界面上
void Output(int year); //打印到文档out,一年的
};
void PC::Input()
{
char choose;
bool flag=true;
while(flag)
{
cout<<"欢迎使用万年历!请选择: (1/2/3/4/else)"<
cout<<"输入您的选择: ";
cin>>choose;
switch(choose)
{
case '1':SetYear();break;
case '2':SetMonth();break;
case '3':SetDays();break;
case '4':flag=false;break;
default:cout<<"输入错误,请重新输入";
}
}
}
bool PC::IsRight(int year,int month,int day) //判断日期输入是否正确
{
if(year<1 || year>9999 || month<1 || month>12)//年月是否正确
return false;
//日期是否正确
if(day<0)return false;
else if( day==29)
return((month==2 && IsLeap(year))|| month!=2);
else if(day==31)return(month==1 ||month==3 ||month==5 ||month==7 ||month==8 || month==10 || month==12);
else if(day>31) return false;
else return true;
}
void PC::SetDays()//如果输入某年某月某日,进行'1'操作处理
{
int weekDay;
int year,month,day;
cout<<" 请输入年_月_日:";
cin>>year>>month>>day;
while(!IsRight(year,month,day))
{
cout<<"输入错误,请重新输入年_月_日:";
cin>>year>>month>>day;
}
weekDay=GetDays(year, month,day)%7;
switch(weekDay)
{
case 0: cout<
}
bool PC::IsLeap(int year)//判断是否是闰年
{
return ((year%4==0 && year%100!=0)||(year%400==0));
}
int PC::GetDays(int year,int month,int day)//得到此日前所有已经过的日子
{
int yearDays, monthDays,sum;
int accumulate=0;
for(int i=1;i
accumulate++;
yearDays=accumulate+365*(year-1);
if((year%4==0 && year%100!=0)||(year%400==0)) everyMonth[2]=29;//如果是闰年,则2月为29天
for(int j=1;j
sum=yearDays+monthDays+day;//所有已经过的日子之和
return sum;
}
void PC::SetMonth()//当输入的是年月时,处理
{
int weekDay;
int year,month,day;
cout<<" 请输入年_月:";
cin>>year>>month;
day=1;
while(!IsRight(year,month,day))//判断输入是否正确,设置day=1
{
cout<<"输入错误,请重新输入年_月:";
cin>>year>>month;
}
weekDay=GetDays(year, month,day)%7;
Print(year,month);
}
void PC::SetYear()
{
int year,month,day;
cout<<" 请输入年:";
cin>>year;
month=1;day=1;
while(!IsRight(year,month,day))//判断是否输入正确,若错误,请重新输入 .设置day=1,month=1,
{
cout<<"输入错误,请重新输入年:";
cin>>year;
}
cout<<"万年历打印在out文档中,请查看。"<
for(int k=1;k<=12;k++)//将12个月的万年历在界面上输出
Print(year,k);
}
void PC:: Print(int year,int month)//打印到界面上
{
int weekday,day=1;
cout<<" 公元"<
switch(weekday)//输出处理
{
case 0: cout<<" "<
for(int i=2;i<=everyMonth[month];i++)
{
weekday=(++weekday)%7;
if(!weekday)
{cout<
cout<
cout<
void PC::Output(int year)//打印到out文本框内
{
int weekday,month=1,day=1;
int i,j;
ofstream outfile("out.txt",ios::out);
for(i=1;i<=12;i++)
{
outfile<<" 公元"<
switch(weekday)
{
case 0: outfile<<" "<
for( j=2;j<=everyMonth[i];j++)
{
weekday=(++weekday)%7;
if(!weekday)
{outfile<
outfile<
outfile<
}
cout<
}
int main()
{
PC pc;
pc.Input();
}