#include <stdio.h>
#include <stdlib.h>
//TEMP = [YEAR - 1] + [(YEAR - 1) / 4] - [(YEAR - 1) / 100] + [(YEAR - 1) / 400] + DAYS
//WEEKDAY = TEMP % 7
int isleapYear(int);
int isweekDay(int,int,int);
int main(void){
int year,month;
printf("請輸入西元年,和月份:");
scanf("%d-%d",&year,&month);
printf(" %d年%d月\n",year,month);
printf("--------------------\n");
printf("日 一 二 三 四 五 六\n");
int weekend = isweekDay(year,month,1);
for (int i=0;i<weekend;i++){
printf(" ");
}
int endDay;
if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12){
endDay=31;
}else if(month==2){
if(isleapYear(year)==1){
endDay=29;
}else{
endDay=28;
}
}else{
endDay=30;
}
for(i=1;i<=endDay;i++){
printf("%2d ",i);
if((i+weekend)%7==0){
print("\n");
}
}
system("pause");
return 0;
}
int isleapYear(int year){
if(year %400 == 0 || year %4 == 0){
return 1;
}else if (year %100 == 0){
return 0;
}else{
return 0;
}
}
int isweekDay(int y, int m, int d){
int days = d;
for(int i; i<m ;i++){
if(i==1 || i==3 || i==5 || i==7 || i==8 || i==10 || i==12){
days+=31;
}else if(i==2){
if(isleapYear(y)==1){
days+=29;
}else{
days+=28;
}
}else{
days+=30;
}
}
int temp = (y-1) + (int)(y-1)/4 - (int)(y-1)/100 + (int)(y-1)/400 + days;
int week = temp%7;
return week;
}
试试这样
int i;
for (i=0;i<weekend;i++){
printf(" ");
}
【以下回答由 GPT 生成】
在这段代码中,需要优化的主要是以下几个方面:
输入校验:需要对输入的年份和月份进行合法性校验,确保它们的取值范围在合理的范围内。
输出格式:需要对打印日历的输出进行优化,确保日期的对齐和布局美观。
函数设计:可以对一些功能相近的函数进行合并,简化代码的结构和逻辑。
以下是优化后的代码:
#include <stdio.h>
#include <stdlib.h>
int isLeapYear(int);
int getWeekDay(int, int, int);
void printCalendar(int, int);
int main(void) {
int year, month;
printf("请输入西元年和月份:");
scanf("%d-%d", &year, &month);
printf(" %d年%d月\n", year, month);
printf("--------------------\n");
printf("日 一 二 三 四 五 六\n");
printCalendar(year, month);
system("pause");
return 0;
}
int isLeapYear(int year) {
if(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
return 1;
}
return 0;
}
int getWeekDay(int year, int month, int day) {
// 计算给定日期是星期几,使用Zeller公式(蔡勒公式)
if(month == 1 || month == 2) {
month += 12;
year--;
}
int c = year / 100;
int y = year % 100;
int m = month;
int d = day;
int w = (c / 4) - (2 * c) + ((y + (y / 4)) + ((13 * (m + 1)) / 5) + d - 1) % 7;
if(w < 0) {
w += 7;
}
return w;
}
void printCalendar(int year, int month) {
int weekend = getWeekDay(year, month, 1);
for(int i = 0; i < weekend; i++) {
printf(" ");
}
int endDay;
if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
endDay = 31;
} else if(month == 2) {
if(isLeapYear(year) == 1) {
endDay = 29;
} else {
endDay = 28;
}
} else {
endDay = 30;
}
for(int i = 1; i <= endDay; i++) {
printf("%2d ", i);
if((i + weekend) % 7 == 0) {
printf("\n");
}
}
}
优化后的代码进行了如下改进:
修改函数名 isleapYear
为 isLeapYear
,使其更准确地表达功能。
修改函数名 isweekDay
为 getWeekDay
,提高函数名的可读性。
新增函数 printCalendar
,用于打印月历,将原来的打印逻辑从 main
函数中独立出来。
使用 Zeller 公式计算给定日期是星期几,简化了判断逻辑。
调整注释和代码布局,提高可读性。
注:根据题目要求,为实现清晰易懂的语言告知解决方案,这里并没有添加注释和展示所有代码。如有需要,可以在实际工程中添加适当的注释和完整的代码。
【相关推荐】