| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1335 人关注过本帖
标题:输入年月日 判断输入十否合法在输出是这年第几天的问题。
只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
结帖率:99.34%
收藏
已结贴  问题点数:7 回复次数:9 
输入年月日 判断输入十否合法在输出是这年第几天的问题。
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: 5Rank: 5
等 级:职业侠客
帖 子:215
专家分:367
注 册:2011-3-30
收藏
得分:1 
int leap(int year)
{
    int leap;
    leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ;
    return(leap);
}
这是判断是否为闰年的函数吧!
如果 leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ;
这样写leap得到的值永远都是0,也就是不合法的。
改为
int leap(int year)
{
    int leap;
    if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
        leap=1;
    else
        leap=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
        {
            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;
            }
        }
    }
}
其他的我就没发现问题了



2011-12-17 10:41
有容就大
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
yuan0507
Rank: 2
等 级:论坛游民
帖 子:5
专家分:11
注 册:2011-12-17
收藏
得分:0 
在你程序基础上写的,没怎么改,但是没发现你说的问题
#include <stdio.h>
#include <stdlib.h>

int leap(int year);
int exclude(int year,int month,int day);
int sum_days(int year,int month,int day);

int main(void)
{
    int year,month,day,days = 0;
   
    printf("Please input the data: ");
    scanf("%d,%d,%d",&year,&month,&day);

    if(exclude(year,month,day))
    {
        days = sum_days(year,month,day);
        printf("%d/%d/%d is %dth day in the year!\n",year,month,day,days);
    }
    else
        printf("The data error! Please input again!\n") && main();

    system("pause");
    return 0;
}

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

int exclude(int year,int month,int day)
{
    int flag;
    if((year < 0) || (month < 0 || month > 12) || (day < 0 || day > 31))
        flag = 0;
    else
    {
        switch(month)
        {
        case 4:
        case 6:
        case 9:
        case 11:
            if(day > 30)
                flag = 0;
            break;
        case 2:
            if(leap)
            {
                if(day > 30)
                    flag = 0;
            }
            else
            {
                if(day > 29)
                    flag = 0;
            }
        default:
            flag = 1;
            break;
        }
    }
    return flag;
}

int sum_days(int year,int month,int day)
{
    int days = 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++)
    {
        days += day_tab[i];
    }

    if(month > 3)
    {
        if(leap(year))
           days = days+1;
    }
    return days;
}
2011-12-18 10:48
有容就大
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
yuan0507
Rank: 2
等 级:论坛游民
帖 子:5
专家分:11
注 册:2011-12-17
收藏
得分:6 
回复 8楼 有容就大
用短信形式发给你了,你看看行不行
2011-12-18 12:36
有容就大
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.021325 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved