UIT2024_Calendar/stu2024/数技2402赵思雨(1).cpp
2024-12-07 16:23:34 +08:00

461 lines
9.0 KiB
C++

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
void rili(int year,int pri){//1.按月份输出
int a,b,con=0;
int c=0;
int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
a=((year-1)*365+((year-1)/4)-((year-1)/100)+((year-1)/400)+1)%7;//判断某一年第一天
if(year<=1582){
a=((year-1)*365+((year-1)/4)-((year-1)/100)+((year-1)/400)+11)%7;
}
if((year%4==0&&year%100!=0)||year%400==0) //闰年
arr[2]=29;
if(pri==1){ //单列输出
for(int i=1;i<13;i++){
printf("=======================%2d月=======================\n",i);
printf("\t\t\t\t\t\t\n");
if(year==1582&&i==11)
a=1;
if(year==1582&&i==112)
a=3;
if(a!=0){
for(int x=1;x<=a;x++)
{
printf("\t");
}
}
else
printf("\n");
for(int j=1;j<=arr[i];j++)
{
if(year==1582&&i==10&&(j>4&&j<15)){ //特殊年
continue;
}
con+=1;
printf("%d\t",j);
if((con+a)%7==0||j==arr[i])
printf("\n");
}
a=(arr[i]+a)%7;
con=0;
printf("\n");
}
} //单列结束
else if(pri==2){ //双列
con=0;
int q,m;
for(int i=1;i<13;i+=2){
printf("=======================%2d月=======================\t",i);
printf("=======================%2d月=======================\n",i+1);
printf("\t\t\t\t\t\t\t\t\t\t\t\t\t\n");
b=(arr[i]+a)%7;
q=7-b+1;
m=7-a+1;
if(year==1582&&i==11){
a=1;b=3;m=7;q=5;
}
if(a!=0){
for(int x=1;x<=a;x++)
{
printf("\t");
}
}
for(int x=1;x<=7-a;x++)
{
printf("%d\t",x);
}
if(year==1582&&i+1==10){
printf("\t1\t2\t3\t4\t15\t16\t");
q=17;
}
else{
if(b!=0)
{
for(int x=1;x<=b;x++)
{
printf("\t");
}
}
for(int y=1;y<=7-b;y++)
{
printf("%d\t",y);
}
}
printf("\n");
/////////////////////////////////////第一行
for(int j=m;j<=arr[i];j++)
{
printf("%d\t",j);
if(j==arr[i]&&(j+a)%7!=0){
for(int g=0;g<=7-b-1;g++){
printf("\t");
}
}
if((j+a)%7==0||j==arr[i]){
for(int y=q;y<=arr[i+1];y++){
printf("%d\t",y);
if(year==1582&&(i+1)==10){
if(y==23||y==30||y==31){
q=y+1;
printf("\n");
break;
}
else
continue;
}
else{
if(((y+b)%7==0||y==arr[i+1])&&j!=arr[i]){
q=y+1;
printf("\n");
break;
}
else if(j==arr[i]&&(y+b)%7==0&&y!=arr[i+1]){
q=y+1;
printf("\n\t\t\t\t\t\t\t");
continue;
}
}
}
}
if(year==1582&&i==9&&j==29)
printf("\n");
}
a=(arr[i+1]+b)%7;
printf("\n");
}
}
}
void xingqi(int year,int mon,int day){ //查询星期
int a,b,con=0;
int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
a=((year-1)*365+((year-1)/4)-((year-1)/100)+((year-1)/400)+1)%7;//判断某一年第一天
if(year<=1582){
a=((year-1)*365+((year-1)/4)-((year-1)/100)+((year-1)/400)+11)%7;
}
if((year%4==0&&year%100!=0)||year%400==0) //闰年
arr[2]=29;
if(year==1582){
arr[10]=21;
}
for(int i=1;i<mon;i++){
a=(a+arr[i])%7;
}
if(year==1582&&mon==10&&day>=15){
b=(day-10)%7;
}
else
b=(a+day-1)%7;
switch(b){
case 1:printf("这一天是星期一\n");break;
case 2:printf("这一天是星期二\n");break;
case 3:printf("这一天是星期三\n");break;
case 4:printf("这一天是星期四\n");break;
case 5:printf("这一天是星期五\n");break;
case 6:printf("这一天是星期六\n");break;
case 0:printf("这一天是星期日\n");break;
}
}
void run(int year){ //判断闰年
if((year%4==0&&year%100!=0)||year%400==0)
printf("%d是闰年\n",year);
else
printf("%d不是闰年\n",year);
}
bool nian(int year){
if(year>0&&year<10000)
return true;
else
return false;
}
bool yue(int mon){
if(mon>0&&mon<13)
return true;
else
return false;
}
bool ri(int year,int mon,int day){
int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if((year%4==0&&year%100!=0)||year%400==0) //闰年
arr[2]=29;
if(year==1582&&mon==10&&day>4&&day<15)
return false;
if(day>0&&day<=arr[mon])
return true;
else
return false;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main(){
qwe:printf("1.查询对应年份的日历\n2.查询对应日期的星期\n3.查询对应年份是否为闰年\n4.退出\n(如果需要返回请按0)\n");
printf("请选择想要执行的项目:\n");
char num[100001]; //选择项目内容
int year=0,pri=0,mon=0,day=0,a,b,c;//年份 输出方式 月
char y[100001],p[100001],m[100001],d[100001];
while(gets(num)){
year=0;pri=0;mon=0;day=0;
if(strlen(num)!=1){
printf("输入错误!请重新输入:\n");
continue;
}
if(num[0]=='1'){
asd: printf("请输入想要查询的年份:\n");
edc: while(gets(y)){
year=0;
if(y[0]=='0'&&strlen(y)==1){
goto qwe;
}
if(strlen(y)<=4){
for(int i=0;i<strlen(y);i++){
if(y[i]>='0'&&y[i]<='9'){
continue;
}
else
{
printf("输入有误!请重新输入:\n");
goto edc;
}
}
break;
}
else{
printf("输入有误!请重新输入:\n");
continue;
}
}
a=strlen(y)-1;
c=strlen(y);
while(a>=0){
b=((int)y[a]-48)*pow(10,c-a-1);
year+=b;
a-=1;
}
while(!nian(year)){
printf("您输入的年份有误请重新输入:\n");
goto edc;
}
printf("请选择日历的表现形式:\n1.单列输出\n2.双列输出\n");
bnm: while(gets(p)){
if(p[0]=='0'&&strlen(p)==1){
goto asd;
}
if(strlen(p)>1||(strlen(p)==1&&(p[0]>'2'||p[0]<'1'))){
printf("输入错误!请重新输入:\n");
continue;
}
else
break;
}
pri=(int)p[0]-48;
while(pri!=1&&pri!=2){
printf("请输入1或2\n");
goto bnm;
}
rili(year,pri);
//执行1 输出日历
}
else if(num[0]=='2'){
rty: printf("请输入想要查询的具体日期\n");
printf("年:");
wsx: while(gets(y)){
year=0;
if(y[0]=='0'&&strlen(y)==1){
goto qwe;
}
if(strlen(y)<=4){
for(int i=0;i<strlen(y);i++){
if(y[i]>='0'&&y[i]<='9'){
continue;
}
else
{
printf("输入有误!请重新输入:\n");
goto wsx;
}
}
break;
}
else{
printf("输入有误!请重新输入:\n");
continue;
}
}
a=strlen(y)-1;
c=strlen(y);
while(a>=0){
b=((int)y[a]-48)*pow(10,c-a-1);
year+=b;
a-=1;
}
while(!nian(year)){
printf("您输入的年份有误请重新输入:\n");
goto wsx;
}
uio: printf("月:");
qaz: while(gets(m)){
mon=0;
if(m[0]=='0'&&strlen(m)==1){
goto rty;
}
if(strlen(m)>2||(strlen(m)<=2&&((m[0]>'9'||m[0]<'0')||((m[1]>'9'||m[1]<'0')&&m[1]!='\0')))){
printf("输入错误!请重新输入:\n");
continue;
}
else
break;
}
a=strlen(m)-1;
c=strlen(m);
while(a>=0){
b=((int)m[a]-48)*pow(10,c-a-1);
mon+=b;
a-=1;
}
if(!yue(mon)){
printf("您输入的月份有误请重新输入:\n");
goto qaz;
}
printf("日:");
rfv: while(gets(d)){
day=0;
if(d[0]=='0'&&strlen(d)==1){
goto uio;
}
if(strlen(d)>2||(strlen(d)<=2&&((d[0]>'9'||d[0]<'0')||((d[1]>'9'||d[1]<'0')&&d[1]!='\0')))){
printf("输入错误!请重新输入:\n");
continue;
}
else
break;
}
a=strlen(d)-1;
c=strlen(d);
while(a>=0){
b=((int)d[a]-48)*pow(10,c-a-1);
day+=b;
a-=1;
}
while(!ri(year,mon,day)){
printf("您输入的日期有误请重新输入:\n");
goto rfv;
}
xingqi(year,mon,day);
}
else if(num[0]=='3'){ //3程序
printf("请输入想要查询的年份:\n");
tgb: while(gets(y)){
year=0;
if(y[0]=='0'&&strlen(y)==1){
goto qwe;
}
if(strlen(y)<=4){
for(int i=0;i<strlen(y);i++){
if(y[i]>='0'&&y[i]<='9'){
continue;
}
else
{
printf("输入有误!请重新输入:\n");
goto tgb;
}
}
break;
}
else{
printf("输入有误!请重新输入:\n");
continue;
}
} //判空字符
a=strlen(y)-1;
c=strlen(y);
while(a>=0){
b=((int)y[a]-48)*pow(10,c-a-1);
year+=b;
a-=1;
}
while(!nian(year)){
printf("您输入的年份有误请重新输入:\n");
goto tgb;
} //判错误年份
run(year);
}
else if(num[0]=='4')break;
else{ //判错误序号
printf("输入错误!请重新输入:\n");
continue;
}
printf("想要在使用一次赵思雨的无敌旋风霹雳程序吗\n1.好的\n2.婉拒\n");//继续程序
char ok[100001];
int f=ok[100001]-48;
okf: while(gets(ok)){
if(strlen(ok)>1||(strlen(ok)==1&&(ok[0]>'2'||ok[0]<'1'))){
printf("输入错误!请重新输入:\n");
continue;
}
else
break;
}
f=(int)ok[0]-48;
while(f!=1&&f!=2){
printf("请输入1或2\n");
goto okf;
}
if(f==2)break;
else if(f==1){
system("cls");
goto qwe;
}
}
}