这个算法怎么写? |
答題得分者是:lijenyun
|
zhouying82
高階會員 發表:150 回覆:272 積分:189 註冊:2004-03-16 發送簡訊給我 |
首先我通过函数得到2个DATETIMEPICKER间的相差的天数为N
实现以下功能: 第1天..第10天 取值为5 第11天..第20天 取值为10 第21天..第40天 取值为20 第40天以上... 取值为40 并且通过定义下面函数可以得到
但是现在问题来了。比如说从1/1到2/24,他们间相差了n天,这天包括从第1天到第10天取值为5,又从第11天到第20天,所取的值10,以此类推。都是不同的。上面的那个函数要怎么改才可以满足此功能呢?
------
断断续续的学了几年,还是一个初学者,永远支持Delphi ! |
zhouying82
高階會員 發表:150 回覆:272 積分:189 註冊:2004-03-16 發送簡訊給我 |
|
alvin26
初階會員 發表:24 回覆:41 積分:28 註冊:2005-04-12 發送簡訊給我 |
===================引 用 zhouying82 文 章=================== 首先我通过函数得到2个DATETIMEPICKER间的相差的天数为N 实现以下功能: 第1天..第10天 取值为5 第11天..第20天 取值为10 第21天..第40天 取值为20 第40天以上... 取值为40 并且通过定义下面函数可以得到
但是现在问题来了。比如说从1/1到2/24,他们间相差了n天,这天包括从第1天到第10天取值为5,又从第11天到第20天,所取的值10,以此类推。都是不同的。上面的那个函数要怎么改才可以满足此功能呢? ------------------ 看不太懂耶... 你要的是怎樣的回傳值? 以 1/1到 2/24為例,共55天, 你要 function 回傳 1到10天的(5) 11到20的(10) 21到40的(20) 超過40天的(40) = 75 呢? 還是只要回傳 超過40天的(40) 呢?
------
弟子規,聖人訓,首孝悌,次謹信,泛愛眾,而親仁,有餘力,則學文。 |
zhouying82
高階會員 發表:150 回覆:272 積分:189 註冊:2004-03-16 發送簡訊給我 |
|
borland_delphi70
中階會員 發表:8 回覆:50 積分:51 註冊:2002-12-06 發送簡訊給我 |
長官:
您要的 function 應該是這樣吧: [code delphi] function cqf(n: integer):integer; begin result:=0; if n div 40>0 then result:=result 40; if n div 20>0 then result:=result 20; if n div 10>0 then result:=result 10; if n >0 then result:=result 5; end; [/code] ===================引 用 zhouying82 文 章=================== 首先我通过函数得到2个DATETIMEPICKER间的相差的天数为N 实现以下功能: 第1天..第10天 取值为5 第11天..第20天 取值为10 第21天..第40天 取值为20 第40天以上... 取值为40 并且通过定义下面函数可以得到
但是现在问题来了。比如说从1/1到2/24,他们间相差了n天,这天包括从第1天到第10天取值为5,又从第11天到第20天,所取的值10,以此类推。都是不同的。上面的那个函数要怎么改才可以满足此功能呢? |
zhouying82
高階會員 發表:150 回覆:272 積分:189 註冊:2004-03-16 發送簡訊給我 |
|
lijenyun
一般會員 發表:3 回覆:19 積分:9 註冊:2003-06-22 發送簡訊給我 |
可以用遞迴來作
[code delphi] function TForm1.cqf(n: Integer): integer; begin case n of 1..10: Result := 5; 11..20: Result := 10; 21..40: Result := 20; 41..MaxInt: Result := 40; end; end; function TForm1.f(a: Integer): integer; var t: Integer; begin if a in [1..10] then //若a in [1..10]則遞迴結束 begin Result := 5; //若cqf(1...10)是0則要改為Result := 0 Exit; end; t := a; case a of 11..30: a := a - 10; //因為 11..20和1..10相差10, 21..30和11..20相差10 31..40: a := a - 20; //因為 31..40和11..20相差20, 41..和21..40相差20 41..MaxInt: a := 40; //修正第40天以上...取值為40 end; Result := cqf(t) f(a); end; procedure TForm1.btn1Click(Sender: TObject); var s: integer; n: integer; //相差了n天 begin n:=60; s := f(n); //n代入f結果 s=75 // edt1.Text := IntToStr(s); end; [/code] |
zhouying82
高階會員 發表:150 回覆:272 積分:189 註冊:2004-03-16 發送簡訊給我 |
|
borland_delphi70
中階會員 發表:8 回覆:50 積分:51 註冊:2002-12-06 發送簡訊給我 |
您老要顯示出來的結果為何? 是顯示 計算後的結果還是計算公式 ?
1.直接顯示 75 2.顯示 5 10 20 40 [code delphi] function cqf(n: integer): string; var i: integer; begin i:=0; result:=''; if n div 40>0 then begin result:=' 40' result; i:=i 40; end; if n div 20>0 then begin result:=' 20' result; i:=i 20; end; if n div 10>0 then begin result:=' 10' result; i:=i 10; end; if n >0 then begin result:='5' result; i:=i 5; end else result:='0' result; result:=result '=' inttostr(i); end; [/code] ===================引 用 zhouying82 文 章=================== 楼上的,不行啊,你这个N的变量是不是就是代替我上面的DAY? 试过了。不管怎么弄,最终的结果都是一个数值,这个肯定是不对的啊。
編輯記錄
borland_delphi70 重新編輯於 2008-01-02 18:27:38, 註解 無‧
|
lijenyun
一般會員 發表:3 回覆:19 積分:9 註冊:2003-06-22 發送簡訊給我 |
|
borland_delphi70
中階會員 發表:8 回覆:50 積分:51 註冊:2002-12-06 發送簡訊給我 |
長官:
請笑納。 [code delphi] function cqf(vEdit: tEdit; n: integer): string; var i: integer; begin i:=0; result:=''; if n div 40>0 then begin result:=' 40' result; i:=i 40; end; if n div 20>0 then begin result:=' 20' result; i:=i 20; end; if n div 10>0 then begin result:=' 10' result; i:=i 10; end; if n >0 then begin result:='5' result; i:=i 5; end else result:='0' result; result:=result '=' inttostr(i); if Assigned(vEdit) then vEdit.Text:=inttostr(i); end; [/code] |
zhouying82
高階會員 發表:150 回覆:272 積分:189 註冊:2004-03-16 發送簡訊給我 |
|
zhouying82
高階會員 發表:150 回覆:272 積分:189 註冊:2004-03-16 發送簡訊給我 |
|
alvin26
初階會員 發表:24 回覆:41 積分:28 註冊:2005-04-12 發送簡訊給我 |
===================引 用 zhouying82 文 章=================== 还是不太对,如果之间的日期相差很多呢?比如说100天,但是他的值好像还是最大的75,这个明显不对诶,各位有办法发? --------------------- 依照您的敘述 borland_delphi70 大大這樣寫是沒錯的, 因為您的需求指出超過40的就一律取得75了, 如果這個不是您的需求,可否再詳細完整一點說明呢? 因為需求不明確,大家無法為您提供正確意見的。
------
弟子規,聖人訓,首孝悌,次謹信,泛愛眾,而親仁,有餘力,則學文。 |
zhouying82
高階會員 發表:150 回覆:272 積分:189 註冊:2004-03-16 發送簡訊給我 |
|
zhouying82
高階會員 發表:150 回覆:272 積分:189 註冊:2004-03-16 發送簡訊給我 |
|
lijenyun
一般會員 發表:3 回覆:19 積分:9 註冊:2003-06-22 發送簡訊給我 |
傳回值稍作修改,若数字会有变化,則改用變數(case不支持變數條件,所以要改用if)
[code delphi] function TForm1.cqf(n: Integer): integer; begin case n of 1..10: Result := 0; 11..20: Result := 9 * 5; 21..40: Result := 19 * 10; 41..MaxInt: Result := (n - 40) * 20; end; end; function TForm1.f(a: Integer): integer; var t : Integer; begin if a in [1..10] then //若a in [1..10]則遞迴結束 begin Result := 0; //若cqf(1...10)是0則要改為Result := 0 Exit; end; ... [/code] |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |