爱在华师大

 找回密码
 注册账号
查看: 1711|回复: 16

【求教】一个简单的C程序

[复制链接]
发表于 2008-3-21 20:52:36 | 显示全部楼层 |阅读模式
任务二 输入一个日期按不同格式显示。


输入一个日期 例如2007-1-23,英式信函输出为:日//23/01/2007,美式信函输出月//
01/23/2007
。编写程序:

(1)
编写一个子函数show BritishDateString 参数为年月日,按英式信函日期输出。
(2)
编写一个子函数showUSADateString,参数为年月日,按美式信函日期输出。
(3)
编写一个子函数checkYear,,参数为年,检查用户输入日期的年是否是一个有效日期(1000-9999)。如果不是个有效日期,缺省返回为9999,否则返回原值。使用条件运算符完成。
(4)
编写一个子函数checkMonth,参数为月,分别检查用户输入日期的月(1-12),是否是一个有效日期。如果不是个有效日期,缺省设置为1月。使用条件运算符完成。
(5)
编写一个子函数checkDay,参数为年月日,检查用户输入日期的日,是否是一个有效日期。如果不是个有效日期,缺省设置为1日。

提示:1,3,5,7,8,10,12月份,有效取值为1-31;

4,6
,9,11月份,有效取值为1-30;

      闰年的2月份为29天,非闰年的2月份为28天。

(6)
编写主函数,输入年月日,使用checkYearcheckMonthcheckDay函数检查年月日的正确性,再分别按英式信函和美式信函格式输出。


我编写的程序如下,但总觉得检查输入每月天数的子函数checkDay太繁冗,希望得到C语言大师兄的指导!


#include <stdafx.h>
#include <stdio.h>
#include <conio.h>

void main()
{
  int year,month,day;
  void showBritishDateString(int a,int b,int c);
  void showUSADateString(int x,int y,int z);
  int checkYear(int m);
  int checkMonth(int n);
  int checkDay(int p,int q,int r);
  printf("Please input the date!The format is 'year-month-day!' \n");
  scanf("%d-%d-%d",&year,&month,&day);
  year=checkYear(year);
  month=checkMonth(month);
  day=checkDay(year,month,day);
  showBritishDateString(year,month,day);
  showUSADateString(year,month,day);
  printf("Please press any key to quit the program!\n");
  getch();
}

  int checkYear(int m)
{
  if(m<1000||m>9999)
  m=9999;
  return (m);
}

  int checkMonth(int n)
{
  if(n<1||n>12)
  n=1;
  return (n);
}

  int checkDay(int p,int q,int r)
{
  if((q==1||q==3||q==5||q==7||q==8||q==10||r==12)&&(r>31)||(r<1))
     r=1;
  if((q==4||q==6||q==9||q==11)&&(r>30)||(r<1))
     r=1;
  if(((p%4==0 && p%100!=0)||(p%400==0))&&((q=2)&&((r>29)||(r<1))))/**如果是闰年,而且在2月份,并且所输入的日子比29大或者比1小,条件成立**/
     r=1;
  if((!((p%4==0 && p%100!=0)||(p%400==0)))&&((q=2)&&((r>28)||(r<1))))/**如果不是闰年,而且在2月份,并且所输入的日子比28大或者比1小,条件成立**/
     r=1;
  return (r);
}



  void showBritishDateString(int a,int b,int c)
{
  printf("The BritishDateString is %d/%d/%d!\n",c,b,a);
}

  void showUSADateString(int x,int y,int z)
{
  printf("The USADateString is %d/%d/%d!\n",y,z,x);

}




作为报酬,能简化我程序的大师兄,我将赠送一套软件——Visual Studio 2008,总大小3G左右!集成Visual Basic、C++、Foxbase!
发表于 2008-3-21 21:28:07 | 显示全部楼层
日期的话  只要是小于1  大于31  不需要管它是哪年哪月  直接设1   呵呵
发表于 2008-3-21 21:31:42 | 显示全部楼层

回复 #2 aidedaijiayang 的帖子

月分不同,一个月的日期也有多有少,不一样的
发表于 2008-3-21 21:35:50 | 显示全部楼层
记得多用 if   else  语句  比 if  好很多..
if(小于1或大于31)
   r=1;
else if(非31天月份 & r=31 )
   r=1;
else if(闰年2月 & r=30)
  r=1;
else if(非闰年 & r=28 )
  r=1;
发表于 2008-3-21 21:36:29 | 显示全部楼层
月份再不同  我也没见哪个月会是 32天的  呵呵
发表于 2008-3-21 21:47:13 | 显示全部楼层

回复 #4 aidedaijiayang 的帖子

不愧是软禁工程的啊
发表于 2008-3-21 21:58:53 | 显示全部楼层

回复 #5 aidedaijiayang 的帖子

发表于 2008-3-21 22:23:58 | 显示全部楼层
~~    飘..
其实   有Oracle的话  就一个判断语句就搞定了 -_-..
发表于 2008-3-21 22:27:42 | 显示全部楼层
牛人真多~~~
嘿嘿~
偶飘啊飘啊飘~
 楼主| 发表于 2008-3-21 22:28:03 | 显示全部楼层
原帖由 aidedaijiayang 于 2008-3-21 21:35 发表
记得多用 if   else  语句  比 if  好很多..
if(小于1或大于31)
   r=1;
else if(非31天月份 & r=31 )
   r=1;
else if(闰年2月 & r=30)
  r=1;
else if(非闰年 & r=28 )
  r=1;


可是,大哥,else if是对上句if的否定啊,你第一句写了 if(小于1或大于31),下面用else,就是说,r>=1且r<=31的情况了,不是么?
发表于 2008-3-21 22:45:24 | 显示全部楼层
int checkDay(int p,int q,int r)
{
      switch(q)
       {
           case 1:case 3:case 5:case 7:case 8:case 10:case 12:
                if ((r>31)||(r<1))
                 {
                     r=1;
                 }
             case 4: case 6: case 9: case 11:
                 if ((r>30)||(r<1))
                  {
                     r=1;
                  }
              case 2:
                  //闰年
                   if(year%4==0&&year%100!=0||year%400==0)
                    {
                        if ((r>29)||(r<1))
                         {
                             r=1;
                         }
                    }
                    //不是闰年
              else
                     {
                        if (r>28)||(r<1)
                         {
                              r=1;
                         }
                      }               
         }
         
       return (r);
}
发表于 2008-3-21 22:50:03 | 显示全部楼层
year 改成 P.
 楼主| 发表于 2008-3-21 22:55:30 | 显示全部楼层
原帖由 -273.15℃ 于 2008-3-21 22:45 发表
int checkDay(int p,int q,int r)
{
      switch(q)
       {
           case 1:case 3:case 5:case 7:case 8:case 10:case 12:
                if ((r>31)||(r30)||(r29)||(r28)||(r


大致看懂了,虽然switch还没有学过……多谢指点
发表于 2008-3-21 22:55:52 | 显示全部楼层
Visual Studio 2008,总大小3G左右!集成Visual Basic、C++、Foxbase!
-----------------------------------------------------------------------------------------------------------
网上的Visual Studio 2008一般3.72G,MSDN2.2G,你这是啥版本?还集成了Foxbase~~
头像被屏蔽
发表于 2008-3-21 23:12:36 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
 楼主| 发表于 2008-3-21 23:12:56 | 显示全部楼层
原帖由 aidedaijiayang 于 2008-3-21 21:35 发表
记得多用 if   else  语句  比 if  好很多..
if(小于1或大于31)
   r=1;
else if(非31天月份 & r=31 )
   r=1;
else if(闰年2月 & r=30)
  r=1;
else if(非闰年 & r=28 )
  r=1;


我按照您的思路编写如下:

int checkDay(int p,int q,int r)
{
        if(r<1||r>31)
                r=1;
        else if((q==4||q==6||q==9||q==11||q==2)&&(r==31))
                r=1;
        else if(((p%4==0 && p%100!=0)||(p%400==0))&&(r==30))
                r=1;
        else if((!((p%4==0 && p%100!=0)||(p%400==0))&&(r==28)))
                r=1;
        return (r);
}

输入2001-2-31

输出未变,没有更正,所以程序还是有点问题,出在非闰年的处理上!

[ 本帖最后由 消逝的岁月 于 2008-3-21 23:16 编辑 ]
发表于 2008-3-21 23:30:24 | 显示全部楼层
if(小于1或大于31)
   r=1;
else if(非31天月份 & r=31 )
   r=1;
else if(闰年2月 & r=30)
  r=1;
else if(2月 & r=29 )
  r=1;

汗....   自己要BS自己一下了..
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|爱在华师大 ( 曾经也有备案 )

GMT+8, 2024-10-7 10:20

广告与合作请【联系我们】

© 2007-2024 iecnu.com

快速回复 返回顶部 返回列表