線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1728
推到 Plurk!
推到 Facebook!

这个算法怎么写?

答題得分者是:lijenyun
zhouying82
高階會員


發表:150
回覆:272
積分:189
註冊:2004-03-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-12-25 16:32:08 IP:125.215.xxx.xxx 訂閱
首先我通过函数得到2个DATETIMEPICKER间的相差的天数为N
实现以下功能:
第1天..第10天 取值为5
第11天..第20天 取值为10
第21天..第40天 取值为20
第40天以上... 取值为40
并且通过定义下面函数可以得到

function cqf:integer;
var n:integer;
begin
case n of
1..10:edit1.text:=inttostr(5);
11..20:edit1.text:=inttostr(10);
21..40:edit1.text:=inttostr(20);
.
.
end;

但是现在问题来了。比如说从1/1到2/24,他们间相差了n天,这天包括从第1天到第10天取值为5,又从第11天到第20天,所取的值10,以此类推。都是不同的。上面的那个函数要怎么改才可以满足此功能呢?
------
断断续续的学了几年,还是一个初学者,永远支持Delphi !
zhouying82
高階會員


發表:150
回覆:272
積分:189
註冊:2004-03-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-12-29 21:28:46 IP:58.35.xxx.xxx 訂閱
no baby knows?
------
断断续续的学了几年,还是一个初学者,永远支持Delphi !
alvin26
初階會員


發表:24
回覆:41
積分:28
註冊:2005-04-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-12-31 09:23:01 IP:219.87.xxx.xxx 訂閱

===================引 用 zhouying82 文 章===================
首先我通过函数得到2个DATETIMEPICKER间的相差的天数为N
实现以下功能:
第1天..第10天 取值为5
第11天..第20天 取值为10
第21天..第40天 取值为20
第40天以上... 取值为40
并且通过定义下面函数可以得到

function cqf:integer;
var n:integer;
begin
case n of
1..10:edit1.text:=inttostr(5);
11..20:edit1.text:=inttostr(10);
21..40:edit1.text:=inttostr(20);
.
.
end;

但是现在问题来了。比如说从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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-12-31 16:14:42 IP:222.64.xxx.xxx 訂閱
对,我就是要得到5 20 50.。。。。=75,就要类似这种结果,有好的写法吗?
------
断断续续的学了几年,还是一个初学者,永远支持Delphi !
borland_delphi70
中階會員


發表:8
回覆:50
積分:51
註冊:2002-12-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-01-02 13:06:13 IP:59.124.xxx.xxx 訂閱
長官:

您要的 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
并且通过定义下面函数可以得到

function cqf:integer;
var n:integer;
begin
case n of
1..10:edit1.text:=inttostr(5);
11..20:edit1.text:=inttostr(10);
21..40:edit1.text:=inttostr(20);
.
.
end;

但是现在问题来了。比如说从1/1到2/24,他们间相差了n天,这天包括从第1天到第10天取值为5,又从第11天到第20天,所取的值10,以此类推。都是不同的。上面的那个函数要怎么改才可以满足此功能呢?
zhouying82
高階會員


發表:150
回覆:272
積分:189
註冊:2004-03-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-01-02 14:21:47 IP:125.215.xxx.xxx 訂閱
楼上的,不行啊,你这个N的变量是不是就是代替我上面的DAY? 试过了。不管怎么弄,最终的结果都是一个数值,这个肯定是不对的啊。
------
断断续续的学了几年,还是一个初学者,永远支持Delphi !
lijenyun
一般會員


發表:3
回覆:19
積分:9
註冊:2003-06-22

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-01-02 16:28:09 IP:211.74.xxx.xxx 訂閱
可以用遞迴來作

[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]
編輯記錄
lijenyun 重新編輯於 2008-01-02 17:58:10, 註解 無‧
lijenyun 重新編輯於 2008-01-03 17:01:02, 註解 無‧
zhouying82
高階會員


發表:150
回覆:272
積分:189
註冊:2004-03-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-01-02 16:43:34 IP:125.215.xxx.xxx 訂閱
楼上的,照我的想法,我根据2个日期的间的差,用一个DAY的变量来储存,该放在上面的这个代码的那里啊?
------
断断续续的学了几年,还是一个初学者,永远支持Delphi !
borland_delphi70
中階會員


發表:8
回覆:50
積分:51
註冊:2002-12-06

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-01-02 17:45:52 IP:59.124.xxx.xxx 訂閱
您老要顯示出來的結果為何? 是顯示 計算後的結果還是計算公式 ?

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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-01-03 17:13:40 IP:211.74.xxx.xxx 訂閱
程式已修正並加入注解,由於樓主的函數不太規則,所以在代入時要注意數字及遞迴停止的範圍
編輯記錄
lijenyun 重新編輯於 2008-01-03 19:36:09, 註解 無‧
borland_delphi70
中階會員


發表:8
回覆:50
積分:51
註冊:2002-12-06

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-01-04 10:32:42 IP:59.124.xxx.xxx 訂閱
長官:

請笑納。

[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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-01-04 16:48:55 IP:125.215.xxx.xxx 訂閱
也许是我还太笨,搞不清楚,但还是要谢谢大家的帮忙。
------
断断续续的学了几年,还是一个初学者,永远支持Delphi !
zhouying82
高階會員


發表:150
回覆:272
積分:189
註冊:2004-03-16

發送簡訊給我
#13 引用回覆 回覆 發表時間:2008-01-04 17:00:52 IP:125.215.xxx.xxx 訂閱
还是不太对,如果之间的日期相差很多呢?比如说100天,但是他的值好像还是最大的75,这个明显不对诶,各位有办法发?
------
断断续续的学了几年,还是一个初学者,永远支持Delphi !
alvin26
初階會員


發表:24
回覆:41
積分:28
註冊:2005-04-12

發送簡訊給我
#14 引用回覆 回覆 發表時間:2008-01-04 17:55:05 IP:61.63.xxx.xxx 訂閱

===================引 用 zhouying82 文 章===================
还是不太对,如果之间的日期相差很多呢?比如说100天,但是他的值好像还是最大的75,这个明显不对诶,各位有办法发?

---------------------
依照您的敘述 borland_delphi70 大大這樣寫是沒錯的,
因為您的需求指出超過40的就一律取得75了,
如果這個不是您的需求,可否再詳細完整一點說明呢?

因為需求不明確,大家無法為您提供正確意見的。
------
弟子規,聖人訓,首孝悌,次謹信,泛愛眾,而親仁,有餘力,則學文。
zhouying82
高階會員


發表:150
回覆:272
積分:189
註冊:2004-03-16

發送簡訊給我
#15 引用回覆 回覆 發表時間:2008-01-07 15:26:18 IP:125.215.xxx.xxx 訂閱
我要的程序目的为:比如说有100天的取值,我要的答案是:
1..10: 取值为0
11..20:取值为5
21..40:取值为10
41..以上取值为20.
100天的取值也就是说要=0 5*9(因为11到20是9天) 10*19(理由同前) 20*60(理由也同前)=1435,而不是最高的75这个值。
我是要这个结果,可能是我没有表达清楚,麻烦各位大大了。
------
断断续续的学了几年,还是一个初学者,永远支持Delphi !
zhouying82
高階會員


發表:150
回覆:272
積分:189
註冊:2004-03-16

發送簡訊給我
#16 引用回覆 回覆 發表時間:2008-01-07 15:30:13 IP:125.215.xxx.xxx 訂閱
还有,由于数字会有变化,比如说要求
1..5=7;
6..15:10;
是不是要写个过程会比较好?
------
断断续续的学了几年,还是一个初学者,永远支持Delphi !
lijenyun
一般會員


發表:3
回覆:19
積分:9
註冊:2003-06-22

發送簡訊給我
#17 引用回覆 回覆 發表時間:2008-01-08 17:32:49 IP:59.104.xxx.xxx 訂閱
傳回值稍作修改,若数字会有变化,則改用變數(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]
系統時間:2024-04-27 8:03:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!