最后54分全部奉送!(还是关于日期判断的问题)(54分)

  • 主题发起人 主题发起人 zxin
  • 开始时间 开始时间
Z

zxin

Unregistered / Unconfirmed
GUEST, unregistred user!
一个Edit,一个Button,在Edit中输入一个日期,如何判断是否合法?
要求如下:
1:日期的格式必须是“1998-03-30”
2:充分考虑每个月的天数以及闰年情况,例如2月最多有29天,输入1998-02-30就为不合法
3.不利用系统StrToDate( )来判断,要求用Delete( )、pos( )、CutStr( )等函数来判断
 
1.formatDateTime('yyyy/mm/dd',now);
 
用datetimepicker多好啊﹗﹗還用那么麻煩啊﹗
 
同意hgood
 
伤脑筋,没办法!要求就是这样!
 
我觉得 这个问题可以这样分析一下:
一、确定输入的合法性:
1、判断 edit 中的字符数 是否为10个(****-**-**);
2、判断 edit 中的每个字符 是否都是 数字 和 “-”;
3、“-”的位置,它只能在 第5、8位上;
二、日期的合法性:
1、闰年闰月问题;
2、大小月的问题。
就这些吧?
请在设计程序之前将strutils添加到uses中
每个字符串 都得过这两关
第一关:
第一小关:
delphi有专门的计算字符串数目的函数,如果不能用就这样:
在 edit.text 的字符串尾添加一特殊字符比如‘œ’(alt+156(小键盘))以形成一新串,
在新串中搜索(用到pos()函数)‘œ’,如果返回值是 ‘11 ’就说明过关。
当然这个特殊字符也有可能与用户误输入的相同,但不要走极端,谁会在日期项输入œ。
第二小关:
通过循环控制逐个截取(用到cutstr()函数) edit.text 中字符,
判断是否在ascii码确定的数字范围之间,当循环变量为5和8时判断是否为‘-’(也用ascii码);
都是 则过关;
第二关:
第一小关:
需要一个变量作为闰年的标志,变量名如:y
截取(用到cutstr()函数)edit.text中 年 的部分(前四位)转换成数字 存在变量year中,
有下面的条件表达式:
y:=((year mod 4 = 0) and (year mod 100) !=0)) or (year mod 400 =0)
y 为真 是闰年 否则 不是;

第二小关:
这时应该有一个各包含12个元素的数组:
day 与索引号对应存储 31、29(这时就用到了第一关中的标记变量year,year为真,day[2]:=29,否则
day[2];=28)、31、30……31,就是存储了 月份大小 的属性;
截取 月 部分的字符转换成数字 (变量名如:num1:smllint),截取 日 部分的字符转换成数字 (变
量名如:num2:smllint),判断 num2<day[num2] (即 日 是否 小于 该月的最大天数) 值为真则过关。
应该可以了吧?
 
try
formatDateTime('yyyy/mm/dd',now);
return 合法
except
return 非法
end;
 
Yves的方法不错!不过第一关的第一小关应该可以不必加&#339;吧!
我觉得可以这样:
while edit.text[k]<>'' do
k:=k+1;
这样的话只有当K为空值时才终止循环!如果此时K=11则说明通过,否则一律判为不合法!
 
;)楼上说的对,是我绕圈了。

对于判断闰年的表达式:
y:=((year mod 4 = 0) and (year mod 100) !=0)) or (year mod 400 =0)
有一点错误(语法错)
改为:
y:=((year mod 4 =0) and (not(year mod 100=0)) or (year mod 400 =0);
真值的意义不变。
我对pasical 语言的语法不熟悉,我以前做过类似这样的题,不过使用的是c(tc2),所以
上面的 pasical 表达式可能还存在语法错误?
为了保险起见,附上c的表达方式,请zxin 和其他高手对照指正(错了一定告诉我呀)
y=(year%4==0&&year%100!=0)||year%400==0;
 
Type
Data=class
Month,Day,Year:integer;
Procedure SetValue(m_month,m_day,m_year:integer);
Function LeapYear:Boolean;
end;

PROCEDURE Date.SetValue(m,d,y:Integer);
begin
Month:=m;
Day:=d;
Year:=y;
end;

PROCEDURE Date.LeapYear:Boolean;
begin
if (Year mod 4 <>0) then
LeapYear:=False;
else
if (Year mod 100 <>0) then
LeapYear:=True;
else
if (Year mod 400 <>0) then
LeapYear:=False;
else
LeapYear:=True;
end;

Var
Day:date;
Leap:Boolean;
begin
Day.SetValue(10,20,2002);
leap:=Day.LeapYear;
end;
end.
 
独步天下:
您应再加一个方法来判断 edit框中的字符串是否合法,并将合法的字符串过滤后传递给
setvalue方法的参数。
 
你是在编程序解决问题还是搞什么编程竞赛
如果为了解决问题,完全可以借助异常处理来实现
如果是搞什么竞赛,干脆退出算了,因为这种要求无理,也没什么实际意义,对提高编程也没什么帮助
 
是啊,kang的方法 高明,
to kang
你不也是在寻求最好、最简洁的编程方法么,寻求最好的方法当然要各抒己见,各出绝招了,
竞赛也不过如此吧,kang 也过于吹毛求疵了。
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部