任务二 输入一个日期按不同格式显示。
输入一个日期 例如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)
编写主函数,输入年月日,使用checkYear,checkMonth,checkDay函数检查年月日的正确性,再分别按英式信函和美式信函格式输出。
我编写的程序如下,但总觉得检查输入每月天数的子函数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! |