实验目的:
1. 熟悉C程序设计中的选择和循环等语句
2. 熟悉C程序设计中的for循环语句和if语句
3. 熟悉C程序设计中的用函数实现模块化程序设计
实验原理:
1. 计算前设定1990年为基础年。
2. 直接求出这月之前总天数,然后求这个月第一天周几。
实验内容:
打印月历
1)年份和月份由键盘输入,打印的月历按星期一到星期日排列;
2)注意大小月、闰年等问题。
实验结果:
#include <stdio.h>
#include <stdlib.h>
int months[2][13] = {
{ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
{ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
};
int isLeap(int year);
int first_day_of_month1(int year, int month);
int first_day_of_month2(int year, int month);
void show(int year, int month, int first);
int main()
{
int year, month;
printf("year/month: ");
scanf("%d/%d", &year, &month);
int first_month = first_day_of_month2(year, month);
show(year, month, first_month);
return 0;
}
int isLeap(int year)
{
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}
int first_day_of_month1(int year, int month)
{
int base_year = 1900;
int base_first_day = 1;
int year_total = 0, month_total = 0;
int first_years;
for (int i = base_year; i < year; i++)
year_total += isLeap(i);
year_total = year_total % 7;
first_years = (year_total + base_first_day) % 7;
for (int i = 1; i < month; i++)
month_total += months[isLeap(year)][i];
month_total = month_total % 7;
return (month_total + first_years) % 7;
}
int first_day_of_month2(int year, int month)
{
int base_year = 1900;
int base_first_day = 1;
int total = 0;
int first_years;
for (int i = base_year; i < year; i++)
{
if(isLeap(i))
total += 366;
else
total += 365;
}
for (int i = 1; i < month; i++)
total += months[isLeap(year)][i];
total = total % 7;
return (total + base_first_day) % 7;
}
void show(int year, int month, int first)
{
printf("Sun Mon Tue Wed The Fri Sat\n");
printf("---------------------------\n");
for (int i = 0; i < first; i++)
printf(" ");
for (int i = 1; i <= months[isLeap(year)][month]; i++)
{
printf("%3d ", i);
if ((i + first) % 7 == 0)
printf("\n");
}
}
总结与思考
该程序设计题巧妙地结合了多方面的知识,有用printf函数输出数据,用scanf函数输入数据,使用if,for等语句实现数值关系计算和循环,并自定义函数。在推理计算过程中,也考察了学生的逻辑思维能力,能否合理想出将1990年作为基础年份进行计算。