C程序高手请进
发布网友
发布时间:2022-06-09 17:43
我来回答
共1个回答
热心网友
时间:2024-11-23 18:49
//-----头文件包含-------------------------
#include <windows.h>
#include <winnt.h>
#include<iostream>
#include<iomanip>
using namespace std;
//-----函数声明-------------------------
int week(int,int,int); //根据年月日判断星期几
int leap_year(int); //判断闰年
void display_year(int ); //显示某年日历
void demand_day(int,int,int); //查询某天
//-----主函数-------------------------
int main()
{
int y,m,d,es=1;// y→year|m →month|d→day
while(es)//设置一个永真循环,不断处理用户输入
{
HANDLE consolehwnd; //创建句柄,详细句柄知识,请百度一下或查MSDN
consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE); //实例化句柄
SetConsoleTextAttribute(consolehwnd,10); //设置控制台文本属性,值不同,显示不同
//菜单输出,这个你可以随便改
cout<<"请选择操作:\n1→显示某年日历\
\n2→查询某天\n0→退出"<<endl;
char tp[20];cin>>tp;//接受用户选择
if(tp[1]!='\0'||tp[0]>'2'||tp[0]<'0'){cout<<"输入有误"<<endl;continue;}//判断用户选择
switch(tp[0]-48)//根据用户选择执行对应处理函数
{/*system("cls");清除屏幕所有文本,俗称清屏函数,cls 即CLear Screen*/
case 1:{cout<<"请输入年份:";cin>>y;system("cls");display_year(y);break;}
case 2:{cout<<"请输入年、月、日,以空格分开:";cin>>y>>m>>d;system("cls");
demand_day(y,m,d);break;}
case 0:{es=0;break;}
}
}
return 0;
}
//-----根据年月日判断星期几-------------------------
int week(int y,int m, int d)
{
int week1,yy=y;
if(m==1) {m=13;yy--;}
if(m==2) {m=14;yy--;}
week1=(d+2*m+3*(m+1)/5+yy+yy/4-yy/100+yy/400)%7; //利用一个既有公式
/*
求某年某月某日是星期几的公式
W=[C/4]-2C+y+[y/4]+[26(m+1)/10]+d-1
其中,W是所求日期的星期数.如果求得的数大于7,可以减去7的倍数,直到余数小于7为止.
c是公元年份的前两位数字,y是以知公元年份的后两位数字;m是月数,d是日数.
方括[ ]表示只截取该数的整数部分.还有一个特别要注意的地方:所求的月份如果是1月或2月,
则应视为前一年的13月或14月.所以公式中m 的取值范围不是1-12,而是3-14.
*/
int s;
switch (week1)
{
case 0: s=1; break;
case 1: s=2; break;
case 2: s=3; break;
case 3: s=4; break;
case 4: s=5; break;
case 5: s=6; break;
case 6: s=0; break;
}
return s;
}
//----判断闰年-------------------------------------
int leap_year(int y)
{
int i;
if((y%4==0&&y%100!=0)||y%400==0)i=1;
else i=0;
return i;
}
//--------显示某年日历------------------------
void display_year(int y)
{
int n1,n2,i,j,a[13],c,d;
HANDLE consolehwnd;
consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(consolehwnd,5);
cout<<setw(38)<<y<<"年"<<endl;
cout<<setw(28)<<"*********";
for(i=1;i<=27;i++)cout<<'*';
cout<<endl;
a[1]=a[3]=a[5]=a[7]=a[8]=a[10]=a[12]=31;//
a[4]=a[6]=a[9]=a[11]=30; //确定每月天数
if(leap_year(y))a[2]=29;
else a[2]=28; //
for(i=1;i<=11;i+=2) //六次循环
{
SetConsoleTextAttribute(consolehwnd,1);
cout<<setw(14)<<i<<"月"<<setw(42)<<i+1<<"月"<<endl;
SetConsoleTextAttribute(consolehwnd,2);
cout<<setw(4)<<"日"<<setw(4)<<"一"<<setw(4)<<"二"<<setw(4)<<"三"<<setw(4)\
<<"四"<<setw(4)<<"五"<<setw(4)<<"六";
cout<<setw(16)<<' ';
cout<<setw(4)<<"日"<<setw(4)<<"一"<<setw(4)<<"二"<<setw(4)<<"三"<<setw(4)\
<<"四"<<setw(4)<<"五"<<setw(4)<<"六"<<endl;
SetConsoleTextAttribute(consolehwnd,7);
n1=week(y,i,1);n2=week(y,i+1,1);
if(n1) //-----------
{
for(j=1;j<=n1;j++) //
cout<<setw(4)<<' ';
}
for(j=1;j<=7-n1;j++)
cout<<setw(4)<<j;
cout<<setw(16)<<' ';
if(n2)
{ //-----输出每次循环的第一行---
for(j=1;j<=n2;j++)
cout<<setw(4)<<' ';
}
for(j=1;j<=7-n2;j++)
cout<<setw(4)<<j;
cout<<endl; //--------------
c=8-n1;d=8-n2;
for(int m=1;m<6;m++) //每月日历最多占六行
{
if(c>a[i])cout<<setw(4*7)<<' ';//若c>a[i],则该月的这一行全部输出空格
for(j=c;j<=a[i];j++)
{
cout<<setw(4)<<j;
if((j-c+1)%7==0){c=j+1;break;}
if(j==a[i]){cout<<setw((6-week(y,i,a[i]))*4)<<' ';c=j+1;break;}
//如果j是该月最后一天,该行剩下的全部补空格
}
cout<<setw(16)<<' ';
if(d>a[i+1])cout<<setw(4*7)<<' ';
for(j=d;j<=a[i+1];j++)
{ //
cout<<setw(4)<<j;
if((j-d+1)%7==0){d=j+1;break;}
if(j==a[i+1]){cout<<setw((6-week(y,i+6,a[i+1]))*4)<<' ';d=j+1;break;}
}
cout<<endl;
}
cout<<endl;
}
cout<<endl;
}
//--------查询某天------------
void demand_day(int y,int m,int d)
{
int n;
HANDLE consolehwnd;
consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(consolehwnd,5);
n=week(y,m,d);//这是核心,几乎就是把week函数包装下
switch(n)
{
case 1:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期一"<<endl;break;
case 2:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期二"<<endl;break;
case 3:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期三"<<endl;break;
case 4:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期四"<<endl;break;
case 5:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期五"<<endl;break;
case 6:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期六"<<endl;break;
case 0:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期日"<<endl;break;
default:break;
}
cout<<endl;
}