UIT2024_Calendar/stu2024/数技2401严一顺(有问题改不动了).cpp
2024-12-07 16:23:34 +08:00

265 lines
5.8 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "stdio.h"
/*判断闰年*/
int leap(int year)
{
return ((year % 4 == 0 && year % 100!= 0) || year % 400 == 0);
}
/*获取某月的天数*/
int ji_suan_tian_shu(int month, int year)
{ if(year==1582&&month==10)
{
return 21;
}
if (month == 2) {
return leap(year)? 29 : 28;
} else if (month == 4 || month == 6 || month == 9 || month == 11) {
return 30;
} else {
return 31;
}
}
/*计算1月1日是星期几*/
int ji_suan_di_yi_tian(int year)
{
int K=year%100;
int J=year/100;
if(year<1582)
{
return (1+(13*(1+1))/5+K+K/4+5-J)%7;
}
else
{
return (1+(13*(1+1))/5+K+K/4+J/4+5*J)%7;
}
}
/*输出日历的星期单列*/ void xing_qi()
{
printf(" 日 一 二 三 四 五 六\n");
}
/*处理1582年单列*/void chu_li_1582_nian_10_yue_de_ri_li(int *di_yi_tian)
{
for (int i=0;i<*di_yi_tian;i++)//在前面加空格
{
printf("");
}
for (int day=1;day<=4;day++)//输出1到4号
{
printf("%5d",day);
if ((*di_yi_tian+day-1)%7==6)//到了周六换行
{
printf("\n");
}
}
int x=5;
for (int day=15;day<=31;day++)//输出15号及之后
{
if ((*di_yi_tian+x-1)%7==0)//一周换行
{
printf("\n");
}
printf("%5d",day);
x++;
}
printf("\n");
//*di_yi_tian=(*di_yi_tian+21)%7;
}
/*输出某月的日历单列*/void shu_chu_yue_ri_li(int month, int year) {
int zhe_ge_yue_you_duo_shao_tian = ji_suan_tian_shu(month, year);
int zhe_ge_yue_di_yi_tian = ji_suan_di_yi_tian(year);
for (int i = 1; i < month; i++) //计算某月前面的月有多少天
{
zhe_ge_yue_di_yi_tian+= ji_suan_tian_shu(i, year);
}
zhe_ge_yue_di_yi_tian%= 7;//计算前面月的最后一天是周几
xing_qi();
/*输出前面的空格*/for (int i = 0; i <zhe_ge_yue_di_yi_tian ; i++) {
printf(" ");
}
/*处理1582年10月少的那10天*/if (year == 1582 && month == 10)
{
chu_li_1582_nian_10_yue_de_ri_li(&zhe_ge_yue_di_yi_tian);
//两个函数结合准确输出1582年10月的月历
}
else {
// 输出其余日期
for (int i = 1; i <=zhe_ge_yue_you_duo_shao_tian; i++) {
printf("%5d", i);
if ((zhe_ge_yue_di_yi_tian + i) % 7 == 0) {
printf("\n");
}
}
}
if ((zhe_ge_yue_di_yi_tian + zhe_ge_yue_you_duo_shao_tian) % 7!= 0) {
printf("\n");//当前月1号星期加上有多少天判断是不是整的周数
}//判断该月最后一行是不是完整的
}
/*输出一年的日历*/ void shu_chu_ri_li(int year)
{
for (int month = 1; month <= 12; month++)
{
printf(" %d月\n", month);
shu_chu_yue_ri_li(month, year);
printf("\n");
}
}
/*输出一年的日历双列*/
void shu_chu_ri_li_2(int year)
{
int kai_shi_day[12];
kai_shi_day[0]=ji_suan_di_yi_tian(year);//储存开始日期
for (int month=1;month<12;month++) //计算每月起始星期几
{
kai_shi_day[month]=(kai_shi_day[month-1]+ji_suan_tian_shu(year,month))%7;//将每个月起始星期储存
}
const char *yue_fen[]={"1月", "2月", "3月", "4月", "5月", "6月","7月", "8月", "9月", "10月", "11月", "12月"};
for (int i = 0; i < 6; i++) //每行两个月
{
printf("\n");
for (int j = 0; j < 2; j++) //两个月的标题
{
int month = i * 2 + j + 1;
printf(" %d %s ",year,yue_fen[month-1]);
}
printf("\n");
for (int j = 0; j < 2; j++)//星期标题
{
printf("日 一 二 三 四 五 六 ");
}
printf("\n");
int zui_duo_days[2] = { ji_suan_tian_shu(year, i * 2 + 1), ji_suan_tian_shu(year, i * 2 + 2) };//两个月的最大天数
int kai_shi_days[2] = { kai_shi_day[i * 2], kai_shi_day[i * 2 + 1] };//起始星期几
//打印日期
int day[2] = {1, 1}; //每个月的当前日期
int sheng_yu_days = 1; //是否有剩余日期
while (sheng_yu_days)//判断是否有剩余
{
sheng_yu_days = 0;
for (int j = 0; j < 2; j++)
{
if (day[j] == 1)//打印空格
{
for (int k = 0; k < kai_shi_days[j]; k++)
{
printf(" ");
}
}
while (day[j] <= zui_duo_days[j] && ((day[j] + kai_shi_days[j] - 1) % 7) != 6)//打印日期
{
printf("%2d ",day[j]++);
sheng_yu_days=1;//设置为1表示未打印完
}
if (day[j] <= zui_duo_days[j])//最后一个日期,换行并进入下一个月
{
printf("%2d ",day[j]++);
sheng_yu_days=1;
} else
{
printf(" "); //填充空格
}
printf(" "); //每月之间的间隔
}
printf("\n");
}
}
}
int main()
{
int x;
for(;x!=4;)
{
printf(" menu\n ");
printf("1.判断是否是闰年\n");
printf("2.查询这一年的某一天是周几\n");
printf("3.输出这一年的日历\n");
printf("4.退出程序\n");
printf("扣1,2,3,4来选择功能\n");
scanf("%d",&x);
if(x>4)
{
printf("请从1 2 3 4中选择输入\n");
}//if的括号
else if(x==1)
{
int year;
printf("请输入年份:\t");
scanf("%d",&year);
if((year%4==0&&year%100!=0)||year%400==0)
printf("是闰年\n");
else
printf("是平年\n");
}
else if(x==2)
{
int year;
int month;
int day;
printf("请输入日期 (输入格式为 年 月 日):");
scanf("%d %d %d",&year,&month,&day);
if(year==1582&&month==10&&day>4&&day<15);
printf("不存在这一天,请重新输入 (输入格式为 年 月 日):\t");
scanf("%d %d %d",&year,&month,&day);
const char *chu_chun_xing_qi[]={"","","","","","",""};
int K=year%100;
int J=year/100;
int w;
if(year<1582||(year==1582&&(month<10||(month==10&&day<=4))))
{
w=(day+(13*(month+1))/5+K+K/4+5-J)%7;
printf("这一天是周%s\n",chu_chun_xing_qi[w]);
}
else
{
w=(day+(13*(month+1))/5+K+K/4+J/4+5*J)%7;
printf("这一天是周%s\n",chu_chun_xing_qi[w]);
}
}
else if(x==3)
{
int year;
printf("请输入年份:\t");
scanf("%d",&year);
printf("扣1 2选择\n1.单列\n2.双列\t");
int c;
scanf("%d",&c);
if(c==1)
{
shu_chu_ri_li(year);
}
else if(c==2)
{
shu_chu_ri_li_2(year) ;
}
}
}//for的括号
return 0;
}