江湖告急:请救民于水火(100分)

  • 主题发起人 Delphi刘
  • 开始时间
D

Delphi刘

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾:
算法求解
有这样一些数据
序号 时间 优惠价额 汇入金额 期限(天) 利息
1 2003-1-1 8000 5000 30
2 2003-1-5 3000 2000 30
3 2003-2-6 1000 2000 30
4 2003-3-9 3000 4000 30
5 2003-4-6 2000
要求将利息算出来并保存到相应的记录
如:第一笔记录的利息是:
payoff:=第一笔优惠价额减去第一笔汇入价额 (8000-5000)
G_qixian:=第二笔汇入金额的时间减去第一笔的时间-30 (2003-1-5减去2003-1-1)
如果过期了(G_qixian>0),
Interest:=payoff*G_qixian*0.01/30;
如果没过期
Interest:=0;
如果没还清(payoff>0),继续找下一笔汇入金额
payoff:=payoff-第二笔汇入金额;(3000-2000)
G_qixian:=第三笔汇入金额的时间-第二笔汇入金额的时间
Interest:=Interest+payoff*G_qixian *利率 (0.01/30)
...
如果第一笔一直没还清
G_qixian:=今天减去最后一笔汇入金额的时间
Interest:=Interest+payoff*G_qixian;
如果还清了还有多就放到还下一笔帐上
...
一直到还清第一笔再来算第二笔的利息
多少笔记录是不固定的
本人数据结构没学好,总结不出一个好的算法,用死方法在算,可记录
一超过2条就把个脑袋给转晕了。所以非常希望各位大虾帮帮忙救急。
附:
case Rec of
//---------------------------------------------------------
//if only have one record
//---------------------------------------------------------
1:
begin
Interest:=0;
payoff:=Cal_Interest[0].yh_Price-Cal_Interest[0].hr_Money;
G_qixian:=Trunc(Date-Cal_Interest[0].DateTime)-30;
if G_qixian>0 then
begin
Interest:=Interest+payoff*G_qixian*0.01/30;
end
else
Interest:=Interest+0;
Edit;
FieldByName('Interest').AsCurrency:=Interest;
Post;
end;

//-----------------------------------------------
//if there are two records
//-----------------------------------------------
2:
begin
First;
Interest:=0;
payoff:=Cal_Interest[0].yh_Price-Cal_Interest[0].hr_Money;
if Cal_Interest[1].hr_Money>0 then
//if have remittance
begin
G_qixian:=Trunc(Cal_Interest[1].DateTime-Cal_Interest[0].DateTime)-30;
if G_qixian>0 then
//if the second remittance excess 30 days
begin
Interest:=Interest+payoff*G_qixian*0.01/30;
payoff:=payoff-Cal_Interest[1].hr_Money;
if payoff>0 then
//if not pay off
begin
G_qixian:=Trunc(Date-Cal_Interest[1].DateTime);
Interest:=Interest+payoff*G_qixian*0.01/30;
payoff1:=-1;
end;
if payoff=0 then
begin
G_qixian:=Trunc(Cal_Interest[1].DateTime-Cal_Interest[0].DateTime);
Interest:=Interest+payoff*G_qixian*0.01/30;
payoff1:=-1;
end;
if payoff<0 then
begin
payoff1:=payoff;
end;
end
else
//if the second remittance havn't excess 30 days
begin
payoff:=payoff-Cal_Interest[1].hr_Money;
if payoff>0 then
//if not pay off
begin
G_qixian:=Trunc(Date-Cal_Interest[0].DateTime)-30;
if G_qixian>0 then
Interest:=Interest+payoff*G_qixian*0.01/30
else
Interest:=0;
payoff1:=0;
end;
if payoff=0 then
begin
G_qixian:=Trunc(Date-Cal_Interest[0].DateTime)-30;
if G_qixian>0 then
Interest:=Interest+payoff*G_qixian*0.01/30
else
Interest:=0;
payoff1:=0;
end;
if payoff<0 then
begin
payoff1:=payoff;
end;
end;
//end else
G_qixian<30
end
else
//if have no hr_Money
begin
G_qixian:=Trunc(Date-Cal_Interest[0].DateTime)-30;
if G_qixian>0 then
Interest:=payoff*G_qixian*0.01/30
else
Interest:=0;
end;
Edit;
FieldByName('Interest').AsCurrency:=Interest;
Post;
Next;
begin
if (Cal_Interest[1].yh_Price>0) then
begin
G_qixian:=Trunc(Date-Cal_Interest[1].DateTime)-30;
if G_qixian>0 then
begin
if (payoff1<0) then
payoff:=Cal_Interest[1].yh_Price+payoff1
else
payoff:=Cal_Interest[1].yh_Price;
Interest:=payoff*G_qixian*0.01/30;
end
else
Interest:=0;
end
else
Interest:=0;
end;
Edit;
FieldByName('Interest').AsCurrency:=Interest;
Post;
end;
//end case 2
 
看了有些头晕,能解释一下
序号 时间 优惠价额 汇入金额 期限(天) 利息
的含义吗?特别是什么优惠价额
 
这是公司跟别的公司的业务。
就是说在哪一天一个公司在我们公司买了产品,公司给他的优惠价额是多少,然后他又汇入了
多少钱。他不一定要马上就把这笔钱给还了。可以分多次还。当然也可以再来做几笔生意。
不过每一笔还钱都给他个期限。一般是30天,过期就得给点利息(0.01/30的利率)。不算
利滚利的。意思就是说只要把利息算出来放在那里就行。不要加到后一笔去。
 
你的头晕不是你数据结构没学好,是你的数据库结构没有设计好,
我问几个问题:
1、你怎么区分是哪家公司的生意,是不是有相应的字段,(最后把所有的字段都列出来)
2、是一家公司的话,你怎么区分用户给你的钱是为了订新货还是想还哪一笔欠款的分期
付款。
如果这些东西你都有,那你要说出来,如果没有,那是你前期工作没做好,必须返工。
 
哪一家公司的生意我早就用查询找出来了,这点我觉得已经处理好了
列出的这些数据都是一个公司的
用户给的钱都是先还欠款
 
我明白你的意思了,我也有了一定的想法,你的算法有错误,我在构造新的算法,但这之前,
我有一个地方不明:
最后一条记录是用户另存的钱,还是你们结算时自动加上的???
 
序号 时间 优惠价额 汇入金额 期限(天) 利息
1 2003-1-1 8000 5000 30
2 2003-1-5 3000 2000 30
3 2003-2-6 1000 2000 30
4 2003-3-9 3000 4000 30
5 2003-4-6 2000
如果没有第三行,即如果用户第一笔欠款没有还清就又买了第二件东东,你的数据怎样??
(1)
1 2003-1-1 8000 5000 30
2 2003-1-5 3000 2000 30
3 2003-3-9 3000 4000 30
4 2003-4-6 2000
(2)
1 2003-1-1 8000 5000 30
2 2003-1-5 3000 2000 30
3 ????? 1000 0 30
4 2003-3-9 3000 4000 30
5 2003-4-6 2000
是(1)不是(2) 如果是(2) 第三行时间是多少 ,第5行是否变动,
即你把产生新记录的原则说一下。
 
var NewCalDate:TDataTime ;
//最近一次结算日期 ,每计算一笔生意,初始值为买货日期+30
1、//第一条记录
First;
利息:=0;
NewCalDate:=时间+30天;
Next //进行第二条记录

2、 while not eofdo

begin

if 时间<NewCalDate then
//没到期限
利息:=0
else
begin
利息:=(时间-NewCalDate)*优惠价格*0.01/30;
//这笔钱从上次算过之后又生的利息
NewCalDate:=时间;
//最近一次结算日期
end;

if 优惠价格 < 汇入金额 then
//还清了,开始一笔新生意。
//我不明白你每条记录产生的规则,所以不知道这么判断一笔生意完结是否合适
begin

newCalDate:=日期+30
end;

if 优惠价格=NULL then
... //是否能说明什么,我也不清楚,你该清楚吧
Next;
//记录下移
end;
 
如果用户两笔还钱都在买货内一个月,你的程序就是错的,因为你把第二笔还钱算了利息,
实际是不该算的。
 
haha,这里边问题多了,
1.还款是先进先出还是后进先出?
2.还款是先扣利息还是先扣货款?
 
第一笔没还清又买了第二件汇过来的钱都是先还第一笔的
我的记录产生规则是:如果你是单纯来还钱的。就像我写的第五笔记录。优惠价额为空算0。
不计期限。如果是又发生了第二笔,把记录记下来就行了。哪一天发生,优惠价额是多少,
汇入金额是多少。给他个期限。就这样。
还款当然是先进先出
还款是不扣利息的,利息只要算出来放到那里就行了。
 
你终于来了,我等了你两天, 周末修班真是不好。
按你的意思,你举的例子里,用户多能了你4000元了!!
你们有什么结算吗?象银行那样,每个月结算一下,或半年结算一次。
 
首先感谢你这么热心的帮助
我不大清楚,我所要做的事是把利息给他算出来放到那里。跟一个单位发生的也不多,
最多也就那么十来次。反正欠款是司空见惯的事情。欠就让他欠着,反正算利息的!
 
如果没有第三行,即如果用户第一笔欠款没有还清就又买了第二件东东,你的数据怎样??
(1)
1 2003-1-1 8000 5000 30
2 2003-1-5 3000 2000 30
3 2003-3-9 3000 4000 30
4 2003-4-6 2000
(2)
1 2003-1-1 8000 5000 30
2 2003-1-5 3000 2000 30
3 ????? 1000 0 30
4 2003-3-9 3000 4000 30
5 2003-4-6 2000
是(1)不是(2) 如果是(2) 第三行时间是多少 ,第5行是否变动,
 
没第三笔就是这样了:
序号 时间 优惠价额 汇入金额 期限(天) 利息
1 2003-1-1 8000 5000 30
2 2003-1-5 3000 2000 30
3 2003-3-9 3000 4000 30
4 2003-4-6 2000
 
按你的意思,你举的例子里,用户多给了你4000元了!!
 
多给也没关系啊,他可以以后再买,也可以过来把钱拿回去啊。我举的这个例子只不过是
想帮助说明以下问题。现实中这种情况也是有的。多给就不要算利息。
 
我不是说不能多给 , 我只是不能了解规则,所以让你确认一下
序号 时间 优惠价额 汇入金额 期限(天) 利息
1 2003-1-1 8000 5000 30
2 2003-1-5 3000 2000 30
这时应该还欠1000元吧,如果2003-2-6他又买了3000的东东,不过没有给钱!!
一个月之后还了3000元,你的数据怎样??
 
哈哈, 有意思 收分了
我曾经帮别的公司做过这么一个小系统. 不过是用vfp 做的.
他们现在还在用. 基本思路差不多. 不过 我的不是用天数 面是用 截止日期
就相当于 你的时间加 天数.
我看看不知道源代码在不在. 不知你能不能看懂
 
我还是无法接受你们规则,我总觉得这里面有很多的漏洞,
就拿前两条记录来说吧,2003-1-5日用户又买了3000元的东西,只给了2000元,你的意思
这2000元该去还第一笔欠款,那这样的话,我说的情况,你怎么表示。
 
顶部