当前位置: 代码迷 >> C语言 >> [原创]初学c语言,做的第一个小程序(40分钟完成)
  详细解决方案

[原创]初学c语言,做的第一个小程序(40分钟完成)

热度:216   发布时间:2007-06-28 20:32:28.0
[原创]初学c语言,做的第一个小程序(40分钟完成)
输入任意年月日,判断这一天是那年的第几天.
以下是我的源代码:


main()
{
int y,m,d,s=0,i=0,j=0;
clrscr();
printf("Please input the YEAR MONTH DAY:\n");
scanf("%d %d %d",&y,&m,&d);
if(y%4==0&&y%100!=0||y%400==0) i=1;
if((d<1||d>31)||(d>28&&i!=1)||(d>29&&i==1))
{
printf("Input Error!!!");
goto loop;
}
switch (m)
{
case 1: s=0+d;break;
case 2: s=31+d;break;
case 3: s=31+d+i+28;break;
case 4: s=31+i+28+31+d;break;
case 5: s=31+i+28+31+30+d;break;
case 6: s=31+i+28+31+30+31+d;break;
case 7: s=31+i+28+31+30+31+30+d;break;
case 8: s=31+i+28+31+30+31+30+31+d;break;
case 9: s=31+i+28+31+30+31+30+31+31+d;break;
case 10: s=31+i+28+31+30+31+30+31+31+30+d;break;
case 11: s=31+i+28+31+30+31+30+31+31+30+31+d;break;
case 12: s=31+i+28+31+30+31+30+31+31+30+31+30+d;break;
default: printf("Input Error!!!"); goto loop;
}
j=((s+10)%10);
switch (j)
{
case 1: printf("DATE %d.%d.%d is the %dst day of year %d.",y,m,d,s,y);break;
case 2: printf("DATE %d.%d.%d is the %dnd day of year %d.",y,m,d,s,y);break;
case 3: printf("DATE %d.%d.%d is the %drd day of year %d.",y,m,d,s,y);break;
default: printf("DATE %d.%d.%d is the %dth day of year %d.",y,m,d,s,y);
}
loop: getch();
}

小弟是c的初学者, 这是我做的第一个有点用的程序, 各位大侠帮忙看看,指点一下,还有那些需要改进的地方.
搜索更多相关的解决方案: c语言  初学  

----------------解决方案--------------------------------------------------------
第一次写就不说你什么了.
等你以后自己再回过头来看你写的东西吧.
----------------解决方案--------------------------------------------------------
前辈们帮忙看一下噢~
我是很认真学习的~~~~~
可别打消我的积极性~~
----------------解决方案--------------------------------------------------------
case 1: s=0+d;break;
case 2: s=31+d;break;
case 3: s=31+d+i+28;break;
case 4: s=31+i+28+31+d;break;
case 5: s=31+i+28+31+30+d;break;
case 6: s=31+i+28+31+30+31+d;break;
case 7: s=31+i+28+31+30+31+30+d;break;
case 8: s=31+i+28+31+30+31+30+31+d;break;
case 9: s=31+i+28+31+30+31+30+31+31+d;break;
case 10: s=31+i+28+31+30+31+30+31+31+30+d;break;
case 11: s=31+i+28+31+30+31+30+31+31+30+31+d;break;
case 12: s=31+i+28+31+30+31+30+31+31+30+31+30+d;break;

case 1: printf("DATE %d.%d.%d is the %dst day of year %d.",y,m,d,s,y);break;
case 2: printf("DATE %d.%d.%d is the %dnd day of year %d.",y,m,d,s,y);break;
case 3: printf("DATE %d.%d.%d is the %drd day of year %d.",y,m,d,s,y);break;
default: printf("DATE %d.%d.%d is the %dth day of year %d.",y,m,d,s,y);

goto loop;

有待改进.
----------------解决方案--------------------------------------------------------
如果是第一个程序那说明你的悟性是很不错的

至于这个程序我的建议:
1. 写什么程序都不要用goto语句
2. 31+i+28+31+30+31+30+31+31+30+31+30+d;这种情况你可以写在注释里 在程序中你最好自己计算好了再写在程序里
不要什么东西都让计算机帮你算 在这个程序中看不出效率上的问题 但是最好养成一个好习惯
3. 写程序的时候多培养书写规范问题
----------------解决方案--------------------------------------------------------
呵呵,支持一下~~~~~~
----------------解决方案--------------------------------------------------------
将每月的天数用个一维数组初始化一下,会不会好点。
----------------解决方案--------------------------------------------------------
对于程序的整洁度,我的建议是:
把case 1...12的的数据用数组初始化一下。
至于求天数,大可以根据月份和数组下标的关系来确定。这样可以省去大量的case。
对于条件判定中,建议在(d>28&&i!=1)||(d>29&&i==1)中,加入m==2,因为只有在2月份的时候,其天数的最大值才为28||29。
还有就是,如5楼的 cdmalcl 所言, 最好不要用goto语句,因为其影响了源代码的阅读。。。
纯属个人意见。。。多多见量。。。

[此贴子已经被作者于2007-6-28 23:26:28编辑过]


----------------解决方案--------------------------------------------------------
呵呵, 有意思!
----------------解决方案--------------------------------------------------------
以下是引用tony_lsj在2007-6-28 22:50:15的发言:
将每月的天数用个一维数组初始化一下,会不会好点。

每个月的天数是有规律的(除了2月而已)
可以用一个数学函数概况出来
但是长度只有12 所以用函数可能不如用记录的方法运算效率高


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