初学C,但不是初学编程,老师布置的作业有点难度(至少对于目前的授课进度)
确保了月份和天数都必须输入正确的值
高中学过vb,有点编程思想就不用从零开始学C了
希望有机会能搞搞竞赛
稍稍讲讲思路
先判断年月日是不是正常数值,计算天数时调用自定义的mon函数得出前月天数和,再加上本月的指定的日期
最后输出前判断闰年2月要不要多加一天
更详细的写在注释里
知识点
- 全局变量
- 数组
- 自定义函数
- for循环
- if及逻辑运算
- switch结构
#include<stdio.h>
int m[12]={31,28,31,30,31,30,31,31,30,31,30,31};
//每个月的天数
int flag=2;
//flag用来判断是否为闰年
//flag=1表示为闰年,为0非闰年,为2表示输入了不可能存在的年月日
int mon(int x)
{
//本函数用于计算这个月之前一共有多少天
//感觉写在case里面会很麻烦就用了自定义函数,杨老师别扣我分Orz
int i,z=0;
for(i=0;i<=x-2;i++)//数组范围0-11,再计算到前一个月,所以x-2
{
z+=m[i];
}
return(z);
}
int main()
{
int year,month,day,dd;
//dd用于存放要输出的天数
printf("input year\n");
scanf("%d",&year);
printf("input month\n");
scanf("%d",&month);
printf("input day\n");
scanf("%d",&day);
if((month>0&&month<13)&&(month==2||(month!=2&&(day>0&&day<=m[month-1]))))
{
//判断月份是否输入正确
//除2月外天数是否输入正确
if(year%4==0&&year%100!=0||year%400==0)
{
//闰年
if((month==2&&(day>0&&day<30))||month!=2)
flag=1;//2月小于等于29天
// else
// flag=2;
}
else
{
//非闰年
if((month==2&&(day>0&&day<=28))||month!=2)
flag=0;//2月小于等于28天
// else
// flag=2;
}
//之前没给flag赋初值为2,赋值后应该就不用这两个else了
}
else
flag=2;
//判断结束
if(flag!=2)
{
switch(month)
{
case 1:dd=day;break;
case 2:dd=mon(month)+day;break;
case 3:dd=mon(month)+day;break;
case 4:dd=mon(month)+day;break;
case 5:dd=mon(month)+day;break;
case 6:dd=mon(month)+day;break;
case 7:dd=mon(month)+day;break;
case 8:dd=mon(month)+day;break;
case 9:dd=mon(month)+day;break;
case 10:dd=mon(month)+day;break;
case 11:dd=mon(month)+day;break;
case 12:dd=mon(month)+day;break;
}
if(flag==1&&month>2)
dd++;//闰年的2月多一天
printf("这是%d年中的第%d天",year,dd);
getchar();
}
else
printf("没有这一天!\n");
getchar();
return 0;
}//getchar使exe在输出结果后不会立马关闭
感觉用do...while循环保证输入日期的正确性也可以,但判断每月天数这一步不是很好处理。