| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2495 人关注过本帖
标题:小弟刚看c程序设计,看到swith cse,求教
只看楼主 加入收藏
csu0801
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2016-4-9
收藏
 问题点数:0 回复次数:10 
小弟刚看c程序设计,看到swith cse,求教
输入年月日,判断这是这天是今年的第几天,一段程序。为什么可以这样写?比如月份是11月,不是执行case 11之后switch就结束了吗?要得到正确的结果,得从case 11逐步执行到case 1。

请教各位前辈,如何理解。
#include<stdio.h>
  int main(void)
  {   
      int year,month,day,sum=0;  
      printf("Please input year,month,day:\n");
      scanf("%d,%d,%d",&year,&month,&day);  
      switch(month)  
      {   
      case 12:  sum+=30;  
      case 11:  sum+=31;   
      case 10:  sum+=30;
      case 9:   sum+=31;   
      case 8:   sum+=31;   
      case 7:   sum+=30;  
      case 6:   sum+=31;   
      case 5:   sum+=30;   
      case 4:   sum+=31;  
      case 3:   sum+=28;   
      case 2:   sum+=31;   
      case 1:   sum+=day;  
      }   
      if((year%400==0)||(year%4==0)&&(year%100!=0) && month>2) //闰年2月份之后,天数+1
      {  
          sum+=1;
      }
      printf("Total day = %d\n",sum);  
      return 0;
  }
搜索更多相关主题的帖子: c程序设计 include 年月日 如何 
2016-04-09 11:26
csu0801
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2016-4-9
收藏
得分:0 
回复 楼主 csu0801
难道是因为没有break,,??就会从case 11连续有效的执行下去?


如果这段程序加了break,反而得不到正确的结果。
2016-04-09 11:38
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
不能加break,break作用是结束switch语句,你理解下:判断这是这天是今年的第几天;这句话,是不是在这天之前的所有天数都要加起来,所以才要从你说的case 11一直执行下去,把后面的天数都加起来。要加break的话,那么每一句的case后面天数要修改的,修改成包含下面语句的天数,就可以加上break了。
例如:case 12:  sum+=30+31+30+31+31+30+31+30+31+28+31+day; break;
      后面的case类似都把该句下面的天数加上来,就可以加break了。
个人理解,你试试看,是不是结果就正确了。其实case后面要不要加break,我觉得看你需求和你设计的算法,不是说格式要求case后面必须跟个break的;
2016-04-09 11:52
alice_usnet
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:18
帖 子:370
专家分:2020
注 册:2016-3-7
收藏
得分:0 
switch饱受诟病的fall through,除了使新手迷惑之外还会使程序维护困难,实际应用中敝大于利。

未佩好剑,转身便已是江湖
2016-04-09 12:27
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
http://blog.
2016-04-09 14:53
csu0801
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2016-4-9
收藏
得分:0 
谢谢各位老大的讲解,让我理解更加全面
2016-04-09 15:26
mk_zhou
Rank: 2
来 自:历代兵家必争之地
等 级:论坛游民
威 望:1
帖 子:78
专家分:83
注 册:2015-6-30
收藏
得分:0 
每个case语句结束后都加上break 退出switch语句。

仰望星空,看看有没有馅饼落下
2016-04-09 23:51
方森鹿林
Rank: 2
等 级:论坛游民
帖 子:14
专家分:16
注 册:2016-4-5
收藏
得分:0 
楼主说的“比如月份是11月,不是执行case 11之后switch就结束了吗?”
感觉并不是这样的,因为运行完case11之后 后面并没有break啊 所以还是要依次往下累计的。
2016-04-10 09:14
csu0801
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2016-4-9
收藏
得分:0 
回复 8楼 方森鹿林
你说得对
2016-04-10 18:22
zhangheyan19
Rank: 2
等 级:论坛游民
帖 子:16
专家分:16
注 册:2016-4-5
收藏
得分:0 
程序代码:
#include<stdio.h>


int main(void)
{
    int year,month,day,sum=0;

    printf("Please input year,month,day:\n");
    scanf("%d,%d,%d",&year, &month, &day);



    switch(month)
    {
        case 12:  //12月

            if(day > 31){

                goto lable;

            }else{

                sum = 334 + day;
                break;

            }

        case 11:  //11月

            if(day > 30){

                goto lable;

            }else{

                sum = 304 + day;
                break;

            }

        case 10:  //10月

            if(day > 31){

                goto lable;

            }else{

                sum = 273 + day;
                break;

            }

        case 9:  //9月

            if(day > 30){

                goto lable;

            }else{

                sum = 243 + day;
                break;

            }

        case 8:  //8月

            if(day > 31){

                goto lable;

            }else{

                sum = 212 +day;
                break;

            }

        case 7:   //7月

            if(day > 31){

                goto lable;

            }else{

                sum = 181+day;
                break;

            }

        case 6:  //6月

            if(day > 30){

                goto lable;

            }else{

                sum = 151 + day;
                break;

            }


        case 5:  //5月

            if(day > 31){

                goto lable;

            }else{

                sum = 120 + day;//-31
                break;

            }

        case 4:  //4月

            if(day > 30){

                goto lable;

            }else{

                sum = 90 + day;//-30
                break;

            }

        case 3://3月

            if(day > 31){

                goto lable;

            }else{

                sum = 59 + day;//31
                break;

            }

        case 2://2月

            if((year%400==0)||(year%4==0)&&(year%100!=0) && month>2){

                if(day > 29){

                    goto lable;

                }else{

                    sum = 31 + day;
                    break;

                }

            }else if (day > 28) {

                goto lable;

            }else{

                sum = 31 + day;
                break;

            }

        case 1://1月

            if(day > 31){

                goto lable;

            }

            sum=day;
            break;


    }

    if((year%400==0)||(year%4==0)&&(year%100!=0) && month>2) //闰年2月份之后,天数+1
    {

        sum+=1;

    }

    printf("Total day = %d\n",sum);

    return 0;

    lable:
    printf("error\n");

    return 0;
}
2016-04-10 21:06
快速回复:小弟刚看c程序设计,看到swith cse,求教
数据加载中...
 
   



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

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