上次去面试:不用函数,计算任何两个日期之间的天数(10分)

  • 主题发起人 主题发起人 goddy
  • 开始时间 开始时间
G

goddy

Unregistered / Unconfirmed
GUEST, unregistred user!
上次去面试:不用函数,计算任何两个日期之间的天数 要自己处理闰月闰年
用java c or delphi vb
 
我觉得他是考察你的算法能力
其实这个算法说白了就是判断语句的组合使用
 
关注一下,我也不晓得怎么搞好。
 
出这个问题的人脑袋有问题:
result := d2 - d1;
 
这个要看不同语言的实现了
delphi是按照天数定义的
java好象是按照毫秒吧,减下在计算一下即可
 
var
date1,date2: TDate;
i: real;
begin
date1 := StrToDate('2006-09-12');
date2 := StrToDate('2006-09-01');
i := date1-date2;
end;
 
我写一个试试:)
 
如果日期都是重1899年12月31开始的话,你用时间类型的double型,整数部分就是天数,如果用delphi的话,直接trunc在减就是天数的吧
 
哈哈哈..真的很容易..那你面試通過了嗎?
 
润月润年都要自己算的
 
我面试40多家笔试都通不过 最近到一家没有笔试的公司上班
 
润年润月都不用你管的,开发工具早给你都算好了,delphi的整数部分就是天数,小数部分就是时间。你要天数直接减就可以了
 
人家面试出的题不能直接两个日期减的
 
如果您面试的公司是搞工具开发的,那你是得好好学习,查找一下2000年的《电脑爱好者》大把这方面的程序处理;如果是应用开发,那么开发工具早具备计算天数的功能,现成的不用而去自己开发这个功能,跟傻子有什么不一样。
 
用delphi的话,直接trunc在减就是天数的吧,DELPHI中时间是DOUBLE类型,整数部分是天数
小数部分是时,分,秒
 
关注
不能直接减?还能怎么实现?
 
这里顺便说一下我的经历:
我们单位用的是广东省某公司开发的管理系统(用foxpro2.5开发的),1999年10月份时派工程师来捉虫,其实我自己已经搞定,因那时刚自学编程,不敢确定是否正确,想学习人家大公司的解决方法,就开始时没说实情,需是先问他们的解决方法。他们是每个数据库表新建一个2位长度的字符型字段,然后用程序控制用户的输入、计算、存储等,天啊,我们的数据库总共有200多个表,一个人来修改要住一星期,费用是我们出。了解了他们的方法后,我把我的想法跟他说,他表示怀疑,打电话去跟老总(老总是本项目开发者,且是中山大学信息系的老师),老总也表示怀疑,亲自去试之后到那天晚上回电话说可以,这时我也就确信这样修改是可行的,也有点成就感了。说了这么多是想让大家明白(当然我们都应该是明白的,面试是要符合人家的胃口,但也要宛转的说明要充分利用现成的工具来开发系统会事半功倍,节省费用),其实我所说的Foxpro2.5的千年解决方法工具本身已经具备,就是set century on ,默认是off,然后在我们的管理系统上把原来的表格扩展一下就可以了,容易吧,整个系统只修改程序部分,不用修改数据库,个把钟头就搞定。哈哈。。。。大家共同进步!!
 
日期格式啥样的?连YearOf(),MonthOf(),DayOf()都不能用,那COPY()呢。
 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StrUtils, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Edit3: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure ParserDate(const AFormatedDate: string;
var AYear, AMonth, ADay: Word);
function GetDayNum(const AFrom, ATo: string): Integer;
function IsLeapYear(AYear: Word): Boolean;
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
{ 得到两个日期之间天数的算法 }
function TForm1.GetDayNum(const AFrom, ATo: string): Integer;
const
DayPerMonth: array[1..12] of Integer = (31, 28, 31, 30, 31, 30, 31, 31,
30, 31, 30, 31);
DayPerMonthEx: array[1..12] of Integer = (31, 29, 31, 30, 31, 30, 31, 31,
30, 31, 30, 31);
var
TmpFromYear, TmpFromMonth, TmpFromDay: Word;
TmpToYear, TmpToMonth, TmpToDay: Word;
i: Integer;
begin
{ 根据用户提供的数据格式解析 }
ParserDate(AFrom, TmpFromYear, TmpFromMonth, TmpFromDay);
ParserDate(ATo, TmpToYear, TmpToMonth, TmpToDay);
{ 判断两个日期的大小 }
if (TmpFromYear > TmpToYear) or
((TmpFromYear = TmpToYear) and (TmpFromMonth > TmpToMonth)) or
((TmpFromYear = TmpToYear) and (TmpFromMonth = TmpToMonth) and
(TmpFromDay > TmpToDay)) then
begin
ParserDate(AFrom, TmpToYear, TmpToMonth, TmpToDay);
ParserDate(ATo, TmpFromYear, TmpFromMonth, TmpFromDay);
end;
Result := 0;
{ 同一年的情况 }
if TmpFromYear = TmpToYear then
begin
if TmpFromMonth = TmpToMonth then
begin
Result := TmpToDay - TmpFromDay;
Exit;
end;
for i := TmpFromMonth + 1 to TmpToMonth - 1do
begin
if IsLeapYear(TmpFromYear) then
Result := Result + DayPerMonth
else
Result := Result + DayPerMonthEx;
end;
if IsLeapYear(TmpFromYear) then
Result := Result + DayPerMonth[TmpFromMonth] - TmpFromDay
else
Result := Result + DayPerMonthEx[TmpFromMonth] - TmpFromDay;
Result := Result + TmpToDay;
Exit;
end;
{ 计算整年的天数 }
for i := TmpFromYear + 1 to TmpToYear - 1do
begin
if IsLeapYear(i) then
Result := Result + 366
else
Result := Result + 365;
end;
{ 计算最先一年的天数 }
for i := TmpFromMonth + 1 to 12do
begin
if IsLeapYear(TmpFromYear) then
Result := Result + DayPerMonth
else
Result := Result + DayPerMonthEx;
end;
if IsLeapYear(TmpFromYear) then
Result := Result + DayPerMonth[TmpFromMonth] - TmpFromDay
else
Result := Result + DayPerMonthEx[TmpFromMonth] - TmpFromDay;
{ 计算最后一年的天数 }
for i := 1 to TmpToMonth - 1do
begin
if IsLeapYear(TmpToMonth) then
Result := Result + DayPerMonth
else
Result := Result + DayPerMonthEx;
end;
Result := Result + TmpToDay;
end;

{ 判断是否为闰年 }
function TForm1.IsLeapYear(AYear: Word): Boolean;
begin
Result := (AYear mod 4 = 0) and
((AYear mod 100 <> 0) or (AYear mod 400 = 0));
end;

{ 根据不同用户定义的格式解析日期 }
{ 比如提供日期为'19810115' }
procedure TForm1.ParserDate(const AFormatedDate: string;
var AYear, AMonth,
ADay: Word);
var
TmpStr: string;
begin
try
AYear := StrToInt(LeftStr(AFormatedDate, 4));
TmpStr := RightStr(AFormatedDate, 4);
AMonth := StrToInt(LeftStr(TmpStr, 2));
ADay := StrToInt(RightStr(TmpStr, 2));
except
AYear := 0;
AMonth := 0;
ADay := 0;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(GetDayNum(Edit1.Text, Edit2.Text)));
end;

end.
 
以上是我的一段算法,另外多说两句
1.这个考题非常好,测试了语言的掌握能力,算法设计能力,以及分析问题是否细心,缜密;
2.上面很多朋友说用相减的方式。是的,在Delphi这个环境中这个说法是正确的,可是如果脱离Delphi环境呢,难道以后遇到问题Delphi提供的功能我们会用,Delphi没有提供的功能我们就不会了吗?这样我们完全被别人控制了。
3.很多人都说自己是程序员,可是我们能称得上是程序员吗?微软使用API屏蔽了硬件细节结果统治了操作系统。表面上难做的事情都是他们做了,事实上我们丧失了了解细节的机会。现在.Net在API基础上再加一层FrameWork封装,也许不久,我们和我们以后的所谓程序员只会在微软定义的框架内做有限的组合拼装。
也许难以想象,举个例子
Intel的工程师和中关村的组装兼容机的工人
都可以成为硬件工程师
只是一个会生产CPU,另一个只会将CPU组装到一个槽里。
再比如索尼在大陆建厂生产锂电池,电芯是日本本土生产的
我们的5000多个无锡的小姑娘指挥拼装,包装,赚这微薄的工资,付出巨大的体力。
为了我们不都成为外国人的体力劳动者
多一些底层的思考很必要
同时呼吁抵制外包
 
后退
顶部