| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1184 人关注过本帖
标题:请问谁有办法优化一下
只看楼主 加入收藏
a249426519
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-1-13
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:29 
请问谁有办法优化一下
题目是输入某年某月某日,判断这一天是这一年的第几天?
不改思路
#include<stdio.h>
int main(void)
{
    int x,y,z,n;
    printf("请输入年月日:");
    scanf("%d%d%d",&z,&y,&x);
    if(x>0&&y>0&&z>0&&x<31&&y<=12)
    {
        if((z%4==0&&z%100!=0)||(z%400==0))
        {
            if(y==1)
            {
                n=x+(y-1)*31;
                printf("是%d年的第%d天。\n",z,n);
            }
            else if(y==2&&x<28)
            {
                n=x+(y-1)*31;
                printf("是%d年的第%d天。\n",z,n);
            }
            else if(y%2==0)
            {
                if(x<=30)
                {
                    if(y<8)
                        n=x+y/2*31+28+(y/2-1)*30;
                    else if(y<12)
                        n=x+31*4+30*2+28+(y/2-3)*31+(y/2-4)*30;
                    printf("是%d年的第%d天。\n",z,n);
                }
                else
                    printf("你的输入有误!\n请从新执行程序!\n");
            }
            else
            {
                if(x<=31)
                {
                    if(y<8)
                        n=x+y/2*31+28+(y/2-1)*30;
                    else if(y<=12)
                        n=x+31*4+30*2+28+(y/2-3)*31+(y/2-4)*30;
                    printf("是%d年的第%d天。\n",z,n);
                }
                else
                    printf("你的输入有误!\n请从新执行程序!\n");
            }
        }
        else
        {
            if(y==1)
            {
                n=x+(y-1)*31;
                printf("是%d年的第%d天。\n",z,n);
            }
            else if(y==2&&x<29)
            {
                n=x+(y-1)*31;
                printf("是%d年的第%d天。\n",z,n);
            }
            else if(y%2==0)
            {
                if(x<=30)
                {
                    if(y<8)
                        n=x+y/2*31+29+(y/2-1)*30;
                    else if(y<12)
                        n=x+31*4+30*2+29+(y/2-3)*31+(y/2-4)*30;
                    printf("是%d年的第%d天。\n",z,n);
                }
                else
                    printf("你的输入有误!\n请从新执行程序!\n");
            }
            else
            {
                if(x<=31)
                {
                    if(y<8)
                        n=x+y/2*31+29+(y/2-1)*30;
                    else if(y<=12)
                        n=x+31*4+30*2+29+(y/2-3)*31+(y/2-4)*30;
                    printf("是%d年的第%d天。\n",z,n);
                }
                else
                    printf("你的输入有误!\n请从新执行程序!\n");
            }
        }
    }
    else
        printf("你的输入有误!\n请从新执行程序!\n");
    return 0;
}
搜索更多相关主题的帖子: 优化 void include 年月日 
2012-01-19 04:04
a249426519
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-1-13
收藏
得分:0 
麻烦顺便找一下漏洞
2012-01-19 04:10
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
哇,这么多if -- else ,  那还不如把12个月分成switch语句算出天数来。
switch (month)
{
case 1:0 + day;
case 2: 31 + day
case 3: 31 + ? ( 平润年28/29)+ day;
……
case 12: 31 + ……+ 30 + day?
default:……
}

梅尚程荀
马谭杨奚







                                                       
2012-01-19 06:10
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:5 
以前写的 , 你参考下。
#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 (month == 2)
        {
            if((leap(year) && day > 29) || (!leap(year) && day > 28))
                return (0);
            else
                return (1);
        }
        else
          switch (month)
          {
            case 6:
            case 4:
            case 9:
            case 11: { if (day == 31) return (0);
                         else   return (1);
                         break;}
            default : return (1); break;
          }
    }
}

梅尚程荀
马谭杨奚







                                                       
2012-01-19 06:14
hengde_li
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:131
专家分:178
注 册:2010-1-15
收藏
得分:0 
建立个数组就行了,月份及其天数,闰年就给2月加一天,然后就是几个月天数的累加了
2012-01-19 09:23
zhangxiangD
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:39
专家分:119
注 册:2011-12-20
收藏
得分:0 
我这个更简单!
#include<stdio.h>
#include<iostream>
using namespace std;
int yearday[2][13]={
    {0,31,28,31,30,31,30,31,31,30,31,30,31},
    {0,31,29,31,30,31,30,31,31,30,31,30,31}
} ;
int main()
{
    cout<<"输入年、月、日:"<<endl;
    int year,month,day,days=0;
    scanf("%d,%d,%d",&year,&month,&day);
    for(int i=0;i<month;i++)
       days+=yearday[year%4==0&&year%100||year%400==0][i];
    days+=day;
    cout<<year<<"年"<<month<<"月"<<day<<"日是这一年的第"<<days<<"天。"<<endl;
    return 0;
}
2012-01-19 11:35
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:5 
还有没有比这更简单的
程序代码:
#include<stdio.h>
int main()
{
    const int predays[] = {0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
    int year, month, day;
    printf("输入年月日(以空格分隔):");
    scanf("%d %d %d", &year, &month, &day);
    printf("%d-%d-%d 是该年第 %d 天\n", year, month, day, predays[month] + day + (month > 2 ? !(year % 4) && year % 100 || !(year % 400) : 0));
    return 0;
}

重剑无锋,大巧不工
2012-01-19 12:02
烟雾中的迷茫
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:621
专家分:1069
注 册:2011-2-9
收藏
得分:0 
回复 3楼 有容就大
这个貌似倒着写好些...
2012-01-19 13:28
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
收藏
得分:0 
里面重复了那么多。
2012-01-19 14:09
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:5 
如果有非法输入怎么办?2000,2,29?

梅尚程荀
马谭杨奚







                                                       
2012-01-19 17:00
快速回复:请问谁有办法优化一下
数据加载中...
 
   



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

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