万年历c语言大作业实验,C语言实现万年历效果

#include

#include

#include

#define str " SUN MON TUE WED THU FRI SAT "

void menu(); //操作菜单

int leap(int year); //判断某年是不是闰年

int days_month(int year, int month); //返回某月的天数

int someday(int year, int month, int day); //计算某天是星期几

void search_month(int year, int month); //输出某月的日历

void search_someday(int year, int month, int day); //查询某日是星期几

int main()

{

int i, year, month, day;

int k1, k2, k3, k4; //用于判断输入的数据和操作是否正确,1代表正确,0代表错误

int a = 1;

menu();

do

{

printf("请输入你要进行的操作(1-4):");

scanf_s("%d", &i);

getchar();

switch (i)

{

case 1:

printf("请输入你要查询的年份:"); scanf_s("%d", &year);

for (a; a <= 12; a++)

{

printf("\n\n---------******* %d *******------------\n", a);

search_month(year, a);

}

printf("---------*********************------------\n\n\n");

break;

case 2:

printf("请输入您所要查询的相关信息.\n");

printf("年份:"); scanf_s("%d", &year);

printf("月份:"); scanf_s("%d", &month);

k1 = 1;

while (k1)

{

if (month > 12 || month < 1)

{

printf("你输入的月份有误,请重新输入!\n");

printf("月份:");

scanf_s("%d", &month);

if (month < 1 || month>12) k1 = 1;

}

else k1 = 0;

}

search_month(year, month);

printf("---------*********************------------\n\n\n");

break;

case 3:

printf("请输入你要查询的日期\n");

printf("年份:"); scanf_s("%d", &year);

printf("月份:"); scanf_s("%d", &month);

k2 = 1;

while (k2)

{

if (month > 12 || month < 1)

{

printf("你输入的月份有误,请重新输入!\n");

printf("月份:");

scanf_s("%d", &month);

if (month < 1 || month>12) k2 = 1;

}

else k2 = 0;

}

// printf("%d年%d月有%d天\n",year,month,days_month(year,month)); 调试观察输入的日期是否有误,可忽略

printf("日期:"); scanf_s("%d", &day);

k3 = 1;

while (k3)

{

if (day > days_month(year, month) || day < 1)

{

printf("你输入的日期有误,请重新输入!\n");

printf("日期:");

scanf_s("%d", &day);

if (day > days_month(year, month) || day < 1) k3 = 1;

}

else k3 = 0;

}

search_someday(year, month, day);

printf("---------*********************------------\n\n\n"); break;

case 4:exit(0);

printf("---------*********************------------\n\n\n"); break;

default:

k4 = 1;

while (k4)

{

printf("你输入的数据有误,请重新输入你要进行的操作(1-4):");

scanf_s("%d", &i);

if (i < 1 || i>4) k4 = 1;

else k4 = 0;

}

break;

}

} while (i > 0 && i < 5);

return 0;

}

void menu()

{

int i = 1;

printf("\n\n\t\t----------------------------------------\n");

printf("\t\t|--------------------------------------|\n");

printf("\t\t| %d. 输出某年的日历 |\n", i);

printf("\t\t| %d. 输出某月的日历 |\n", i + 1);

printf("\t\t| %d. 查询某日是星期几 |\n", i + 2);

printf("\t\t| %d. 退出系统 |\n", i + 3);

printf("\t\t|--------------------------------------|\n");

printf("\t\t----------------------------------------\n\n");

}

int leap(int year)

{

if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) return 1;

else return 0;

}

int days_month(int year, int month)

{

int days_month;

switch (month)

{

case 1:

case 3:

case 5:

case 7:

case 8:

case 10:

case 12: days_month = 31; break;

case 4:

case 6:

case 9:

case 11:days_month = 30; break;

case 2:

if (leap(year) == 1)

{

days_month = 29; break;

}

else days_month = 28; break;

}

return days_month;

}

int someday(int year, int month, int day)

{

//该函数运用了特殊的计算公式,详细可参见 http://blog.163.com/hexin_mars_blog/blog/static/248215040201571351115699/

int someday, m, n, i; //someday表示查询的日子是星期几

m = year - year / 1000 * 1000;

n = m - m / 100 * 100 - 1; //用于获得年份的后两位数

int days = 0;

for (i = 1; i < month; i++) days = days + days_month(year, i);

days = days + day;

someday = (n + n / 4 - n / 100 + n / 400 + days) % 7;

return someday;

}

void search_someday(int year, int month, int day)

{

char weekname[20];

switch (someday(year, month, day))

{

case 0:strcpy_s(weekname, "星期天"); break;

case 1:strcpy_s(weekname, "星期一"); break;

case 2:strcpy_s(weekname, "星期二"); break;

case 3:strcpy_s(weekname, "星期三"); break;

case 4:strcpy_s(weekname, "星期四"); break;

case 5:strcpy_s(weekname, "星期五"); break;

case 6:strcpy_s(weekname, "星期六"); break;

}

printf("你所要查询的日期是%s\n", weekname);

}

void search_month(int year, int month)

{

int i = 0, j, k = 0, m; //j用于记录某月的第一天是星期几 m用于记录某月的天数 k用于换行提示

char x[10] = " ";

m = days_month(year, month);

j = someday(year, month, 1);

//输出某月的日历

printf("------------------------------------------\n");

printf("%s\n", str);

for (; i < j; i++)

{

printf("%s", x); k++;

}

for (i = 1; i <= m; i++)

{

k++;

if (k % 7 == 0)

{

if (i < 10)

{

printf(" %d ", i);

printf("\n");

}

else if (i >= 10)

{

printf(" %d ", i);

printf("\n");

}

}

else

{

if (i < 10)

{

printf(" %d ", i);

}

else if (i >= 10)

{

printf(" %d ", i);

}

}

}

printf("\n------------------------------------------\n");

}

void exit()

{

exit(0);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值