| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1335 人关注过本帖
标题:输入年月日 判断输入十否合法在输出是这年第几天的问题。
取消只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
结帖率:99.34%
收藏
已结贴  问题点数:7 回复次数:6 
输入年月日 判断输入十否合法在输出是这年第几天的问题。
RT 关键是看判断输入的日期是否合法的子函数。 代码如下:#include  <stdio.h>
int  main(void)
{
    int sum_day(int, int);
    int leap(int year);
    int exclude(int, int, int);
    int year, month, day, days;
    printf("Input date(year, month, day):");
    scanf("%d,%d,%d", &year, &month, &day);
    printf("%d/%d/%d", year, month, day);
    if (exclude(year, month, day))
    {
    days = sum_day(month, day);
    if (leap(year) && month >= 3)
        days = days + 1;
    printf("is the %dth day in the year.\n", days);
    }
    else
        printf("\nData error! Please enter again:\n") && main();
    return 0;
}

int sum_day(int month, int day)
{
    int  day_tab[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} ;
    int i;
    for (i = 1; i < month; i++)
        day += day_tab[i];
    return(day);
}

int leap(int year)
{
    int leap;
    leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ;
    return(leap);
}

int exclude(int year, int month, int day)
{
    if ( (month <= 0 || month > 12 ) || (day <= 0 || day > 31))
        return (0);
    else
    {
    if (leap(year))
    {
        switch (month)
        {
        case 4:
        case 6:
        case 9:
        case 11: if (day == 31) return (0); break;
        case 2:  if (day > 29)   return (0); break;
        default : return (1); break;
        }
    }
    else
    if (!leap(year))
    {
        switch (month)
        {
        case 4:
        case 6:
        case 9:
        case 11: if (day == 31) return (0); break;
        case 2:  if (day > 28)  return (0); break;
        default : return (1); break;
        }
    }
    }
}
经过 exclude()子函数除2月份所有的不合法日期都能排除, 但是2月份无论是第几天都不合法。为什么?
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 有容就大 于 2011-12-16 22:51 编辑 ]
搜索更多相关主题的帖子: 年月日 include 
2011-12-16 22:39
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
没人说两句吗?莫非是编译器的问题?

梅尚程荀
马谭杨奚







                                                       
2011-12-17 09:05
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 3楼 心灵百合
优先级% 大于 == 大于 && 大于 || 大于 = 。所以
leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ;
相当于 leap = (((year % 4 == 0 )&& (year % 100 != 0)) || (year % 400 == 0 ));是没问题的。
关键是exclude()函数, if (!leap(year))有无不影响程序吧,为什么偏偏只有输入month是2月份时会出错!
究竟是哪里的问题?


梅尚程荀
马谭杨奚







                                                       
2011-12-17 14:05
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
是不是我的问题太肤浅了 大家都不屑一顾?

梅尚程荀
马谭杨奚







                                                       
2011-12-17 18:39
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
up!

梅尚程荀
马谭杨奚







                                                       
2011-12-18 00:04
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 7楼 yuan0507
谢谢你帮忙。
不过我试过你的程序还是有点问题。
运行你的源代码出现这个情况:
图片附件: 游客没有浏览图片的权限,请 登录注册
明显2月30是不存在的而排除子函数没有发现。 将if(leap)
            {
                if(day > 30)
                    flag = 0;
            }
            else
            {
                if(day > 29)
                    flag = 0;
             }中的 > 改成 >=  并在case 2:分支最后加break;后还是无法检测平年2月29日。
图片附件: 游客没有浏览图片的权限,请 登录注册
显然2011,2,29日是不合法的日期。
你能不能再帮看下。

梅尚程荀
马谭杨奚







                                                       
2011-12-18 11:40
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
恩 看了。结果是正确的。比较下发现我的原函数没有error 但是有个warning: warning C4715: 'exclude' : not all control paths return a value
是不是说不是所有的分支都返回 value.
很奇怪把返回值都放到falg中再集中返回没有问题。如果分散return就可能使某个分支失效,即使没有语法错误!
能解释下吗?

梅尚程荀
马谭杨奚







                                                       
2011-12-18 16:01
快速回复:输入年月日 判断输入十否合法在输出是这年第几天的问题。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019414 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved