目标:
输入一个日期,如“ 2017 6 15 ”,计算这一天是这一年的第几天(1月1日是第一天)并输出。假设输入的都是合法的日期,但别忘了考虑闰年的情况。
程序实现:
我们可以用这种switch()嵌套的方法,但是代码量较大
#include <stdio.h>
#include <iostream>
int main()
{
int y, m, d, n;
int a,b,c;
c=d;
scanf("%d %d %d",&y,&m,&d);
a = y%400==0 || y%100!=0 && y%4==0 ?1:0;
switch (a){
case 1:for(b=1;b<=m;b++)
{
n=n+c;
switch (b){
case 0:c=0;break;
case 1:c=31;break;
case 2:c=29;break;
case 3:c=31;break;
case 4:c=30;break;
case 5:c=31;break;
case 6:c=30;break;
case 7:c=31;break;
case 8:c=31;break;
case 9:c=30;break;
case 10:c=31;break;
case 11:c=30;break;
case 12:c=31;break;
}
}break;
case 0:for(b=1;b<=m;b++)
{
n=n+c;
switch (b){
case 0:c=0;break;
case 1:c=31;break;
case 2:c=28;break;
case 3:c=31;break;
case 4:c=30;break;
case 5:c=31;break;
case 6:c=30;break;
case 7:c=31;break;
case 8:c=31;break;
case 9:c=30;break;
case 10:c=31;break;
case 11:c=30;break;
case 12:c=31;break;
}
}break;
}
n=n+d;
printf("%d-%d-%d是第%d天\n",y,m,d,n);
return 0;
}
改进以上代码之后
#include<stdio.h>
int main()
{
int y,m,d,n=0;
int c,b=0;
scanf("%d %d %d",&y,&m,&d);
while(b<m){
switch(b){
case 0:c=d;break;
case 1:c=31;break;
case 2:c=29;break;
case 3:c=31;break;
case 4:c=30;break;
case 5:c=31;break;
case 6:c=30;break;
case 7:c=31;break;
case 8:c=31;break;
case 9:c=30;break;
case 10:c=31;break;
case 11:c=30;break;
case 12:c=31;break;
}
n=n+c;
b++;
}
if((y%400==0||(y%4==0&&y%100!=0))&&m>2) //是闰年且月份大于2方加一
n++;
printf("%d-%d-%d是第%d天\n",y,m,d,n);
return 0;
}
也可以写成这样
#include<stdio.h>
int main(){
int y,m,d;
int b,n;
int a[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
scanf("%d %d %d",&y,&m,&d);
b=(y % 400 == 0) || (y % 4 == 0 && y % 100 != 0)?1:0;
n= d;
for(int i = 1; i <= m-1; i++){
n+= a[i];
}
if(m >= 3 && b==1){
n ++;//如果是闰年,且超过了2月,则多加一天
}
printf("%d-%d-%d是第%d天\n",y,m,d,n);
return 0;
}
运行结果为:
输入:2017 6 15
输出:2017-6-15是第166天
输入:2000 10 1
输出:2000-10-1是第275天