当前位置: 代码迷 >> C语言 >> [求助]这段程序编译后运行时,如输入点 . 则会被printf函数刷屏,为什么?
  详细解决方案

[求助]这段程序编译后运行时,如输入点 . 则会被printf函数刷屏,为什么?

热度:110   发布时间:2007-10-01 23:42:51.0
[求助]这段程序编译后运行时,如输入点 . 则会被printf函数刷屏,为什么?

/* Note:Your choice is C IDE */
#include "stdio.h"
main()
{
int y,m,d,d2,u,jin=0,s=0; /*定义年月日,和变量日期*/
int m3,m4,m5,m6,m7,m8,m9,m10,m11,m12;
start:;
m3=59,m4=90,m5=120,m6=151,m7=181,m8=212,m9=243,m10=273,m11=304,m12=334;
printf("输入生产年份(2005-2011年):\n");
scanf("%d",&y);
if (y<2005||y>2011)
{ while (s<1)
{printf("您输入年份有误,",s++);goto start;}
{printf("你是第一天玩电脑还是脑子有毛病啊,年份都不会输入?\a请再",s=0);goto start;}
}
else if(y==2005)
jin=6;
else if(y==2006)
jin=0;
else if(y==2007)
jin=1;
else if(y==2008)
{jin=2; m3=60,m4=91,m5=121,m6=152,m7=182,m8=213,m9=244,m10=274,m11=305,m12=335;}
else if(y==2009)
jin=4;
else if(y==2010)
jin=5;
else if(y==2011)
jin=6;
start2:;
printf("输入%d年的生产月份:\n\n",y);
scanf("%d",&m);
if (m<0||m>12) /*琐定一年12个月*/
{ while (s<1)
{printf("您输入月份有误,请重新",s++);goto start2;}
printf("你是第一天玩电脑还是脑子有毛病啊,月份都不会输入?\a请再",s=0);goto start2;
}
else
switch (m)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: d=31; break;
case 4:
case 6:
case 9:
case 11: d=30; break;
case 2:
if((y%4!=0)||(y%100==0)&&(y%400!=0))
d=28;
else d=29;
m3=60+jin,m4=91+jin,m5=121+jin,m6=152+jin,m7=182+jin;
m8=213+jin,m9=244+jin,m10=274+jin,m11=305+jin,m12=335+jin;
break; /* 是闰年2月要加一天*/
default :printf("错误,请重新输入\n\n");
}
printf("%d年的%d月有%d天\n\n",y,m,d); /*自动识别2006年某月的天数*/
goto start3;

start3:;
printf("输入%d年%d月的生产日期:\n\n",y,m);
scanf("%d",&d2);
if (0>d2||d<d2) /*与当月天数比较,纠正用户输入错误*/
{ while (s<1)
{printf("您输入日期有误,请重新",s++);goto start3;}
{printf("你是第一天玩电脑还是脑子有毛病啊,生产日期都不会输入?\a请再",s=0);goto start3;}
}
else
switch (m) /*最菜的计算列表,请高手指点有没有更好的办法*/
{
case 1: u=(d2+jin)/7+(((d2+jin)%7)>0);break;
case 2: u=(d2+31+jin)/7+(((d2+31+jin)%7)>0);break;
case 3: u=(d2+m3+jin)/7+(((d2+m3+jin)%7)>0);break;
case 4: u=(d2+m4+jin)/7+(((d2+m4+jin)%7)>0);break;
case 5: u=(d2+m5+jin)/7+(((d2+m5+jin)%7)>0);break;
case 6: u=(d2+m6+jin)/7+(((d2+m6+jin)%7)>0);break;
case 7: u=(d2+m7+jin)/7+(((d2+m7+jin)%7)>0);break;
case 8: u=(d2+m8+jin)/7+(((d2+m8+jin)%7)>0);break;
case 9: u=(d2+m9+jin)/7+(((d2+m9+jin)%7)>0);break;
case 10: u=(d2+m10+jin)/7+(((d2+m10+jin)%7)>0);break;
case 11: u=(d2+m11+jin)/7+(((d2+m11+jin)%7)>0);break;
case 12: u=(d2+m12+jin)/7+(((d2+m12+jin)%7)>0);break;
}
start4:;
printf("%d年%d月%d日是%d年的第 %d 周,感谢使用本软件!\n\n",y,m,d2,y,u);
goto start;
}

这段程序编译后运行时,如输入点 . 则会被printf函数刷屏,为什么?
如何纠正错误呢?

[此贴子已经被作者于2007-10-2 0:32:51编辑过]

搜索更多相关的解决方案: printf  函数  编译  运行  

----------------解决方案--------------------------------------------------------

拜读中...
回三楼,乍可能啊?

[此贴子已经被作者于2007-10-2 0:25:21编辑过]


----------------解决方案--------------------------------------------------------

goto 语句本身就是个地雷,没办法,学汇编转过来的,已经深受其害,惯用了,555555...
怎么办啊?没的解了?难道scanf("%d",&y);函数无法控制点 . 的输入?所以一顿狂printf ?
我要疯了~

[此贴子已经被作者于2007-10-2 0:23:46编辑过]


----------------解决方案--------------------------------------------------------

我编译过了
输入
.

确实会不停的执行
printf("你是第一天玩电脑还是脑子有毛病啊,年份都不会输入?\a请再",s=0);

并且lz的\a给我很大的震动


----------------解决方案--------------------------------------------------------
楼主学学数组吧
----------------解决方案--------------------------------------------------------
int m3,m4,m5,m6,m7,m8,m9,m10,m11,m12;
定义成这样的确是没学过数组的.
----------------解决方案--------------------------------------------------------
写的不错,题目完种解
只要自己肯去做
肯定能学不少

----------------解决方案--------------------------------------------------------

自学的,刚学语句及用法,数组明天再学!谢谢大家关心!
我们工厂产品出货填写的是生产周,生产部一楼和三楼由于计算方法不统一,所以我才想到做这个程序。

[此贴子已经被作者于2007-10-2 22:46:31编辑过]


----------------解决方案--------------------------------------------------------

用do-while就可以省去用 goto 的麻烦,例如获取月份:

do{
printf("请输入月份:");
scanf("%d",&m);
}while(m<0||m>12);

其实只要结合if等条件判断语句灵活使用,goto 语句并不像一般人不加思索就随口而出所说的那样逻辑性差或者怎样不好。我就非常喜欢用 goto 语句,不过不适宜过多使用,多了万一出错可能就会很难排错。
----------------解决方案--------------------------------------------------------
如果学了C++,你就会明白goto语句可怕的地方,即使你的程序逻辑上正确
轻的话就是内存泄露,重的就会崩溃
----------------解决方案--------------------------------------------------------
  相关解决方案