1、算法說明
累加形式:V=V+e
連乘形式:V=V*e
其中:V是變量,e是遞增表達(dá)式。累加和連乘一般通過循環(huán)結(jié)構(gòu)來實(shí)現(xiàn)。
注意:需在執(zhí)行循環(huán)體前對變量V賦初值。一般的,累加時置初值0;連乘時置初值為1.
舉例
求N!的結(jié)果。
Private Sub Command1_Click()
Dim n%, i%, s&
n = Val(InputBox("輸入n"))
s = 1
For i = 1 To n
s = s * i
Next i
Print s
End Sub
錯誤的寫法:
Private Sub Command1_Click()
Dim n%, i%, s&
n = Val(InputBox("輸入n"))
For i = 1 To n
s = 1 ‘賦初值語句位置不對!
s = s * i
Next i
Print s ‘輸出s的值為n,而不是n!
End Sub
應(yīng)用舉例
根據(jù)下列公式,求自然對數(shù)e的的近似值。
要求:誤差小于0.00001
Private Sub Command1_Click()
Dim i%, n&, t!, e!
e = 2
i = 1
t = 1
Do While t > 0.00001
i = i + 1
t = t / i
e = e + t
Loop
Print "計(jì)算了"; i; "項(xiàng)目和是:"; e
Print Exp(1) ‘與上句輸出值進(jìn)行對比以證明算法的正確性
End Sub
解題技巧
1) 由于這類題目往往是根據(jù)精度要求來求值,因此我們不能預(yù)知具體循環(huán)次數(shù),所以這類題目一般用Do循環(huán),很少用For循環(huán)。設(shè)定循環(huán)變量和通項(xiàng)變量,注意各變量的初值;
2) 分解通項(xiàng)表達(dá)式中各因子,并分別將各因子用循環(huán)變量表示;
3) 如果步驟2中有的因子比較復(fù)雜,難以直接用變量表示,此時可以考慮使用Function過程;
4) 根據(jù)步驟1、2、3,寫出通項(xiàng)表達(dá)式;
5) 根據(jù)精度要求(往往是通項(xiàng)小于10負(fù)多少次方這樣一個關(guān)系表達(dá)式),寫出一條滿足精度要求后跳出循環(huán)的語句。通常是用:if 通項(xiàng)表達(dá)式>10^(-N) then exit do ,注意這句話一般需放在累加或者連乘式之前。
實(shí)例說明
以2002年春上機(jī)試卷06編程題為例
根據(jù)X值計(jì)算:
n=1,2,……
要求:n項(xiàng)絕對值小于等于10-6為止。
1、由于循環(huán)次數(shù)不確定,因此確定用Do循環(huán)結(jié)構(gòu)并定義循環(huán)變量用n表示(初值1);用戶輸入的值用x表示;通項(xiàng)用dblCos表示;累加值用sum表示,初值為0;
2、分解通項(xiàng)式的組成
可以分解為三部分:
可以表示為:(-1)^(n+1)
可以表示為:x^(2*(n-1))
比較復(fù)雜,難以直接表示
3、由于步驟2中復(fù)雜, 此時考慮使用過程。
于是定義過程,輸入值是n,返回值是
于是有:
private Function comp(n as long)as long
dim I as long
dim result as long
result=1 ‘此處注意,由于是連乘,初值為1
for I=1 to 2*(n-1)
result=result*I
next I
comp=result
End Function
注意:由于是參數(shù)按地址傳遞,因此對于本題,實(shí)參的值不能在過程中被改變!(也是改錯題??嫉牡胤剑。。?BR> 4、根據(jù)步驟1、2、3,寫出通項(xiàng)dblCos的表達(dá)式:
dblCos=(-1)^(n+1)* x^(2*(n-1))/comp(n)
5、根據(jù)精度要求知:
If abs(dblCos)<=10^(-6) then exit do
最后程序?yàn)椋?BR> Private Sub Command1_Click()
Dim n As Long, dblCos As Double, x As Double
x = Val(Text1.Text)
n = 1
Do
dblCos = (-1) ^ (n + 1) * x ^ (2 * (n - 1)) / comp(n)
If Abs(dblCos) <= 10 ^ (-6) Then Exit Do
Sum = Sum + dblCos
n = n + 1
Loop
Print Sum
End Sub
Private Function comp(n As Long) As Long
Dim I As Long
Dim result As Long
result = 1 '此處注意,由于是連乘,初值為1
For I = 1 To 2 * (n - 1)
result = result * I
Next I
comp = result
End Function
注意:如果調(diào)試運(yùn)行時死循環(huán),可以按Ctrl+Break中斷死循環(huán),不需要重新啟動機(jī)器。(或者Ctrl+Scroll Lock)
2、實(shí)戰(zhàn)練習(xí)
1) 補(bǔ)充代碼(2003秋二(7))
本程序的功能是求下面數(shù)列前n項(xiàng)之和。
S(x,n)=x/2+2!*x^3/2*4+3!*x^5/2*4*6+……+n!*x^2n-1/2*4*6……2n
Option Explicit
Private Sub Command1_Click()
Dim x As Single,s As Single
Dim n As Integer,i As Integer
x=InputBox("輸入X:","求數(shù)列和",1)
n=InputBox("輸入N:","求數(shù)列和",1)
For i=1 To n
s=s+fun(x,i)
Next i
Label1.Caption= _(1)_
Text1=s
End Sub
Private Function fun(x As Single,n As Integer)As Single
__(2)__
p=1
For i=1 To n
__(3)___
Next i
fun=x^(2*n-1)*p
End Function
累加形式:V=V+e
連乘形式:V=V*e
其中:V是變量,e是遞增表達(dá)式。累加和連乘一般通過循環(huán)結(jié)構(gòu)來實(shí)現(xiàn)。
注意:需在執(zhí)行循環(huán)體前對變量V賦初值。一般的,累加時置初值0;連乘時置初值為1.
舉例
求N!的結(jié)果。
Private Sub Command1_Click()
Dim n%, i%, s&
n = Val(InputBox("輸入n"))
s = 1
For i = 1 To n
s = s * i
Next i
Print s
End Sub
錯誤的寫法:
Private Sub Command1_Click()
Dim n%, i%, s&
n = Val(InputBox("輸入n"))
For i = 1 To n
s = 1 ‘賦初值語句位置不對!
s = s * i
Next i
Print s ‘輸出s的值為n,而不是n!
End Sub
應(yīng)用舉例
根據(jù)下列公式,求自然對數(shù)e的的近似值。
要求:誤差小于0.00001
Private Sub Command1_Click()
Dim i%, n&, t!, e!
e = 2
i = 1
t = 1
Do While t > 0.00001
i = i + 1
t = t / i
e = e + t
Loop
Print "計(jì)算了"; i; "項(xiàng)目和是:"; e
Print Exp(1) ‘與上句輸出值進(jìn)行對比以證明算法的正確性
End Sub
解題技巧
1) 由于這類題目往往是根據(jù)精度要求來求值,因此我們不能預(yù)知具體循環(huán)次數(shù),所以這類題目一般用Do循環(huán),很少用For循環(huán)。設(shè)定循環(huán)變量和通項(xiàng)變量,注意各變量的初值;
2) 分解通項(xiàng)表達(dá)式中各因子,并分別將各因子用循環(huán)變量表示;
3) 如果步驟2中有的因子比較復(fù)雜,難以直接用變量表示,此時可以考慮使用Function過程;
4) 根據(jù)步驟1、2、3,寫出通項(xiàng)表達(dá)式;
5) 根據(jù)精度要求(往往是通項(xiàng)小于10負(fù)多少次方這樣一個關(guān)系表達(dá)式),寫出一條滿足精度要求后跳出循環(huán)的語句。通常是用:if 通項(xiàng)表達(dá)式>10^(-N) then exit do ,注意這句話一般需放在累加或者連乘式之前。
實(shí)例說明
以2002年春上機(jī)試卷06編程題為例
根據(jù)X值計(jì)算:
n=1,2,……
要求:n項(xiàng)絕對值小于等于10-6為止。
1、由于循環(huán)次數(shù)不確定,因此確定用Do循環(huán)結(jié)構(gòu)并定義循環(huán)變量用n表示(初值1);用戶輸入的值用x表示;通項(xiàng)用dblCos表示;累加值用sum表示,初值為0;
2、分解通項(xiàng)式的組成
可以分解為三部分:
可以表示為:(-1)^(n+1)
可以表示為:x^(2*(n-1))
比較復(fù)雜,難以直接表示
3、由于步驟2中復(fù)雜, 此時考慮使用過程。
于是定義過程,輸入值是n,返回值是
于是有:
private Function comp(n as long)as long
dim I as long
dim result as long
result=1 ‘此處注意,由于是連乘,初值為1
for I=1 to 2*(n-1)
result=result*I
next I
comp=result
End Function
注意:由于是參數(shù)按地址傳遞,因此對于本題,實(shí)參的值不能在過程中被改變!(也是改錯題??嫉牡胤剑。。?BR> 4、根據(jù)步驟1、2、3,寫出通項(xiàng)dblCos的表達(dá)式:
dblCos=(-1)^(n+1)* x^(2*(n-1))/comp(n)
5、根據(jù)精度要求知:
If abs(dblCos)<=10^(-6) then exit do
最后程序?yàn)椋?BR> Private Sub Command1_Click()
Dim n As Long, dblCos As Double, x As Double
x = Val(Text1.Text)
n = 1
Do
dblCos = (-1) ^ (n + 1) * x ^ (2 * (n - 1)) / comp(n)
If Abs(dblCos) <= 10 ^ (-6) Then Exit Do
Sum = Sum + dblCos
n = n + 1
Loop
Print Sum
End Sub
Private Function comp(n As Long) As Long
Dim I As Long
Dim result As Long
result = 1 '此處注意,由于是連乘,初值為1
For I = 1 To 2 * (n - 1)
result = result * I
Next I
comp = result
End Function
注意:如果調(diào)試運(yùn)行時死循環(huán),可以按Ctrl+Break中斷死循環(huán),不需要重新啟動機(jī)器。(或者Ctrl+Scroll Lock)
2、實(shí)戰(zhàn)練習(xí)
1) 補(bǔ)充代碼(2003秋二(7))
本程序的功能是求下面數(shù)列前n項(xiàng)之和。
S(x,n)=x/2+2!*x^3/2*4+3!*x^5/2*4*6+……+n!*x^2n-1/2*4*6……2n
Option Explicit
Private Sub Command1_Click()
Dim x As Single,s As Single
Dim n As Integer,i As Integer
x=InputBox("輸入X:","求數(shù)列和",1)
n=InputBox("輸入N:","求數(shù)列和",1)
For i=1 To n
s=s+fun(x,i)
Next i
Label1.Caption= _(1)_
Text1=s
End Sub
Private Function fun(x As Single,n As Integer)As Single
__(2)__
p=1
For i=1 To n
__(3)___
Next i
fun=x^(2*n-1)*p
End Function