C语言题目:输入某年某月某日,判断这一天是这一年的第几天? 我哪里错了?

#include <stdio.h>
void main()
{
int y,m,d;
int sum=0;
int flog;//标识是否是闰年
int flog2=1;//标识是否是合法月份
printf("请输入年月日(yyyy-mm-dd)\n");
scanf("%4d-%2d-%2d",&y,&m,&d);
switch (m-1)
{
case 12: sum+=31;
case 11: sum+=30;
case 10: sum+=31;
case 9: sum+=30;
case 8: sum+=31;
case 7: sum+=31;
case 6: sum+=30;
case 5: sum+=31;
case 4: sum+=30;
case 3: sum+=31;
case 2: sum+=29;
case 1: sum+=31;
default:printf("非法月份\n");
flog2=0;
break;
}
sum=sum+d;
if(( y%4==0 && y%100!=0 ) || y%400==0)
flog=1;
else
flog=0;
if (d>0&&d<=31)
{
if(flog==1)
printf("这一天是这年的第%d天",sum-flog);
if(flog==0)
printf("这一天是这年的第%d天",sum);
}
else
printf("非法日期\n");
}

我哪里有错误了??为什么输入非法月份后不会停止,
例如输入:2013-13-01,
这输出:非法月份
这是今年的第367天

输入:2013-03-32
则输出:非法月份
非法日期

如何改进呢??

#include <stdio.h>
void main()
{
int y,m,d;
int sum=0;
int flog;//标识是否是闰年
printf("请输入年月日(yyyy-mm-dd)\n");
scanf("%4d-%2d-%2d",&y,&m,&d);
if(( y%4==0 && y%100!=0 ) || y%400==0)
flog=1;
else
flog=0;
while((y<0)||(m>12||m<0)||(d<0||d>31)||((m%2==0)&&(d==31))||((flog==1)&&(m==2)&&(d>28)))
{
printf("input errro!\n");
printf("请输入年月日(yyyy-mm-dd)\n");
scanf("%4d-%2d-%2d",&y,&m,&d);
}
switch (m-1)
{
case 12: sum+=31;
case 11: sum+=30;
case 10: sum+=31;
case 9: sum+=30;
case 8: sum+=31;
case 7: sum+=31;
case 6: sum+=30;
case 5: sum+=31;
case 4: sum+=30;
case 3: sum+=31;
case 2:
if(flog==1) //这里改一下
sum+=28;
else
sum+=30;
case 1: sum+=31;break; //这里加上一个break语句
default:printf("非法月份\n");
break;
}
sum=sum+d;
if(flog==1)
printf("%d is leap year!\n",y);
printf("这一天是这年的第%d天",sum);
}
根据你的意思,修改了一下程序!你看看!
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-10-20

    #include <stdio.h>
    void main()
    {
     int y,m,d;
     int sum=0;
     int flog;//标识是否是闰年
     int flog2=1;//标识是否是合法月份
     printf("请输入年月日(yyyy-mm-dd)\n");
     scanf("%4d-%2d-%2d",&y,&m,&d);
     switch (m-1)
    {
     case 11: sum+=30;//case12这句不要。因为swich是计算某月之前的月数有多少天,再加上该月的第几天
     case 10: sum+=31;
     case 9: sum+=30;
     case 8: sum+=31;
     case 7: sum+=31;
     case 6: sum+=30;
     case 5: sum+=31;
     case 4: sum+=30;
     case 3: sum+=31;
     case 2: sum+=29;
     case 1: sum+=31;

    break;//这里要改
     default:
      {
      printf("非法月份\n");
            flog2=0;
      }
     break; 

     if(flog2==1)//这里改一下
     {
      sum=sum+d;
     if(( y%4==0 && y%100!=0 ) || y%400==0)
      flog=1;
     else
      flog=0;
     if (d>0&&d<=31)
     {
      if(flog==1)
      printf("这一天是这年的第%d天",sum-flog);
      if(flog==0)
      printf("这一天是这年的第%d天",sum);
     }
     else
      printf("非法日期\n");
     }
    }

第2个回答  2013-10-20

还有很多需要改进啊  

1.判非法日期不完善 距离 难道2013-4-31合法吗?

2.日期累加完全不是这样做的 ,switch语言机制你还没弄清楚啊

你可以试试无论你输入什么 都会输出非法月份

  我已经把你的代码改好了 你想不出来 我可以发给你

#include <stdio.h>
void main()
{
    int a[13]= {31,29,31,30,31,30,31,31,30,31,30,31};
    int y,m,d;
    int sum=0,i;
    int flag=0;//标识是否是闰年
    printf("请输入年月日(yyyy-mm-dd)\n");
    scanf("%4d-%2d-%2d",&y,&m,&d);
    if(m>=13||m<=0)
    {
        printf("非法月份\n");
        return 0;
    }
    if(( y%4==0 && y%100!=0 ) || y%400==0)
        flag=1;
    if(m==2)
    {
        if((flag==1&&(d<=0||d>=29))||(flag==0&&(d<=0||d>=28)))
        {
            printf("非法日期\n");
            return 0;
        }
    }
    else if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
    {
        if(d<=0||d>=31)
        {
            printf("非法日期\n");
            return 0;
        }
    }
    else    if(d<=0||d>=31)
    {
        printf("非法日期\n");
        return 0;
    }
    for(i=1; i<m; i++)
        sum+=a[i-1];
    sum+=d;
    if(m<3)
        flag=0;
        printf("这一天是这年的第%d天",sum-flag);
}

追问

老师要求用switch-case语句,部分误差不管,我是初学C,太复杂搞不定啊~不过非常感谢你的详细解答,谢谢!谢谢!

第3个回答  2013-10-20
要考虑的情况比较多,
#include <stdio.h>
void main()
{
int y,m,d;
int sum=0;
int flog;//标识是否是闰年
printf("请输入年月日(yyyy-mm-dd)\n");
scanf("%4d-%2d-%2d",&y,&m,&d);
while((y<0)||(m>12||m<0)||(d<0||d>31)||((m==4||m==6||m==9||m==11)&&d>30)||(m==2&&d>29))
{
printf("input errro!\n");
printf("请输入年月日(yyyy-mm-dd)\n");
scanf("%4d-%2d-%2d",&y,&m,&d);
}
if(( y%4==0 && y%100!=0 ) || y%400==0)
flog=1;
else
flog=0;
switch (m-1)
{

case 11: sum+=30;
case 10: sum+=31;
case 9: sum+=30;
case 8: sum+=31;
case 7: sum+=31;
case 6: sum+=30;
case 5: sum+=31;
case 4: sum+=30;
case 3: sum+=31;
case 2:
if(flog==1)
sum+=29;
else
sum+=28;
case 1: sum+=31;break;
case 0: sum=0;break;
default:printf("非法月份\n");
break;
}
sum=sum+d;

printf("这一天是这年的第%d天\n",sum);
}
第4个回答  2018-03-05
#include<stdio.h>
#include<math.h>
void main()
{ int year,month,day,q,num,Jan, Feb, Mar, Apr, May,Jun,
Jul, Aug, Sept, Oct, Nov, Dec;
printf("input the day");
scanf("%d%d%d",&year,&month,&day);
if(year%4==0&&year%100!=0||year%400==0)
{q=1;}
else
{q=0;}
Jan=31;
Feb=28+q;
Mar=31;
Apr=30;
May=31;
Jun=30;
Jul=31;
Aug=31;
Sept=30;
Oct=31;
Nov=30;
Dec=31;
switch(month)
{
case 1 : printf("num=%d",day);break;
case 2:printf("num=%d",Jan+day);break;

case 3:printf("num=%d",Jan+Feb+day);break;

case 4:printf("num=%d",Jan+Feb+Mar+day);break;

case 5:printf("num=%d",Jan+Feb+Mar+Apr+day);break;

case 6 :printf("num=%d",Jan+Feb+Mar+Apr+May+day);break;

case 7 :printf("num=%d",Jan+Feb+Mar+Apr+May+Jun+day);break;
case 8 :printf("num=%d",Jan+Feb+Mar+Apr+May+Jun+Jul+day);break;

case 9 :printf("num=%d",Jan+Feb+Mar+Apr+May+Jun+Jul+Aug+day);break;

case 10 :printf("num=%d",Jan+Feb+Mar+Apr+May+Jun+Jul+Aug+Sept+day);break;

case 11 :printf("num=%d",Jan+Feb+Mar+Apr+May+Jun+Jul+Aug+Sept+ Oct+day);break;

case 12 :printf("num=%d",Jan+Feb+Mar+Apr+May+Jun+Jul+Aug+Sept+ Oct+ Nov+day);break;
default :printf("error");
}
}

C语言编程:输入某年某月某日,判断这一天是这一年的第几天?
int getDaysByMonth(int m,int d,char flag){ int c;if(flag=='r'){\/\/闰年 if(m==2){\/\/2月是29天 return(31+d);}else if(m>2){ c=0;m=m-1;for(;m>0;m--){ if(m==1||m==3||m==5||m==7||m==8||m==10||m==12){ c+=31;}else if(m==2){ c+=29...

用C语言编写:输入某年某月某日,判断这一天是这一年的第几天?
int n,year,month,day,month_day_sum=0,sum,month_day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};printf("please input the \\"year month day\\"\\n");scanf("%d%d%d",&year,&month,&day);if(year%100!=0&&year%4==0||year%400) month_day[2]=29;if(day>31||day<...

求输入某年某月某日,判断这天是星期几,这一年的第几天,距
判断某年某月某日是这年的第几天 为解决此问题,首先设定全局变量months[12],用于存放各月天数。接着,定义年、月、日三个变量,用于存储用户输入的日期信息。对months数组进行初始化,考虑7月与8月为31天的特性,引入临时变量j判断分界点。根据输入的年、月、日数据,计算当前日期是今年的第几天。...

C语言编程:输入某年某月某日判断这一天是一年的第几天的程序是是什么...
if (days==0){ printf("您输入的日期格式无效。\\n");return 0;} if (isRunnian(year) && month >2){ printf("输入日期是对应年份的第%d天",days+1);}else{ printf("输入日期是对应年份的第%d天",days);} return 0;} \/\/循环实现 int getDays(int month,int day){ int NUMBER[12]...

C语言中输入年月日,判断这一天是一年的第几天……
1#include<stdio.h> 2#include<stdlib.h> 3\/*题目:输入某年某月某日,判断这一天是这一年的第几天*\/ 4intmain(){ 5system("color1F");\/\/设定显示框为蓝底白字 6system("modeconcols=80lines=30");\/\/固定显示框尺寸 7\/ 8intdays[11];9intyear,moon,day,i,t1,t2;10while(1){ 11...

C语言编程:输入某年某月某日,判断这一天是这一年的第几天?
printf("请输入年月日(例如2017-01-01):");scanf("%d-%d-%d",&y,&m,&d);} \/\/先判断是否为闰年 if((y%4==0 && y%100!=0)||(y%400==0)){\/\/闰年 count=getDaysByMonth(m,d,'r');}else{\/\/平年 count=getDaysByMonth(m,d,'n');} printf("%d-%02d-%02d是今年的第%d...

C语言编程:输入某年某月某日,判断这一天是这一年的第几天?
13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};printf("输入年、月、日,用空格隔开:");scanf("%d%d%d", &year, &month, &day);for (i=1; i =3)days+=1;printf("%d年%d月%d日是这一年的第%d天!\\n", year, month, day, days);return 0;} ...

c语言输入某年某月某日 判断这一天是这一年的第几天用switch
month) \/*先计算某月以前月份的总天数*\/{case 1:sum=0;break;case 2:sum=31;break;case 3:sum=59;break;case 4:sum=90;break;case 5:sum=120;break;case 6:sum=151;break;case 7:sum=181;break;case 8:sum=212;break;case 9:sum=243;break;case 10:sum=273;break;case 11:...

C语言算某年某月某日是这年的第几天哪有问题
case 5:case 7:case 8:case 10:case 12:sum+=31;break;case 4:case 6:case 9:case 11:sum+=30;break;case 2:if(year%4==0&&year%100!=0||year%400==0) { sum+=29;} else { sum+=28;} } } printf("%d年%d月%d日是该年的第%d天",year,month,day,sum);return 0;} ...

C语言编程:输入某年某月某日判断这一天是一年的第几天的程序是是什么...
year) && month >2){\\x0d\\x0aprintf("输入日期是对应年份的第%d天",days+1);\\x0d\\x0a}else{\\x0d\\x0aprintf("输入日期是对应年份的第%d天",days);\\x0d\\x0a}\\x0d\\x0areturn 0;\\x0d\\x0a}\\x0d\\x0a\\x0d\\x0a\/\/循环实现\\x0d\\x0aint getDays(int month,...

相似回答