A ja tylko uzupełnię, że istnieją dwa algorytmy obliczania silni.
1. Algorytm iteracyjny:
Sub Silnia_Iteracja()
'Deklaracje zmiennych lokalnych
Dim lngSilnia As Double
Dim strLiczba As String
Dim lngLiczba As Long
Dim i As Long
'Pętla Do...Loop, wykonywana dopóty użytkownik poda prawidłowe dane
Do
'Wyświetlenie okienka do pobrania danych.
strLiczba = InputBox("Podaj liczbę dodatnią, mniejszą od stu", strNazwaMakra)
'Jeżeli użytkownik nie podał żadnego ciągu
'lub wcisnął przycisk "Cancel" kończymy pracę programu.
If strLiczba = vbNullString Then End
'Wychodzimy z pętli Do...Loop, jeżeli użytkownik podał prawidłą liczbę
If Not IsNumeric(strLiczba) Then
MsgBox "To nie jest liczba.", vbInformation, strNazwaMakra
Else
If Val(strLiczba) < 0 Or Val(strLiczba) > 100 Or _
(Val(strLiczba) <> CLng(Val(strLiczba))) Then _
MsgBox "Nieprawidłowa liczba.", vbInformation, strNazwaMakra _
Else Exit Do
End If
Loop
'Zamieniamy ciąg (typ String) na liczbę typu Long (całkowitą)
lngLiczba = CLng(Val(strLiczba))
'ustawienie wartości początkowej zmiennej dblSilnia
lngSilnia = 1
'Jeżeli liczba jest większa od zera, obliczamy silnię w pętli.
'Pytanie za sto punktów:
'Dlaczego napisałem pętlę For i = 2 ... a nie
'For i = 1 ..., tak jak jest w definicji silni?
If lngLiczba > 0 Then
For i = 2 To lngLiczba
lngSilnia = lngSilnia * i
Next i
End If
'wyświetlenie wyniku.
MsgBox "Wynik: " & lngLiczba & "! = " & lngSilnia, vbInformation
End Sub
2. Algorytm rekurencyjny:
Sub Silnia_Rekurencja()
'Deklaracje zmiennych lokalnych
Dim lngSilnia As Long
Dim strLiczba As String
Dim lngLiczba As Long
Dim i As Long
'Pętla Do...Loop, wykonywana dopóty użytkownik poda prawidłowe dane
Do
'Wyświetlenie okienka do pobrania danych.
strLiczba = InputBox("Podaj liczbę dodatnią, mniejszą od stu", strNazwaMakra)
'Jeżeli użytkownik nie podał żadnego ciągu
'lub wcisnął przycisk "Cancel" kończymy pracę programu.
If strLiczba = vbNullString Then End
'Wychodzimy z pętli Do...Loop, jeżeli użytkownik podał prawidłą liczbę
If Not IsNumeric(strLiczba) Then
MsgBox "To nie jest liczba.", vbInformation, strNazwaMakra
Else
If Val(strLiczba) < 0 Or Val(strLiczba) > 100 Or _
(Val(strLiczba) <> CLng(Val(strLiczba))) Then _
MsgBox "Nieprawidłowa liczba.", vbInformation, strNazwaMakra _
Else Exit Do
End If
Loop
'Zamieniamy ciąg (typ String) na liczbę typu Long (całkowitą)
lngLiczba = CLng(Val(strLiczba))
lngSilnia = Silnia(lngLiczba)
'wyświetlenie wyniku.
MsgBox "Wynik: " & lngLiczba & "! = " & lngSilnia, vbInformation
End Sub
Function Silnia(n As Long) As Long
Select Case n
Case 0
Silnia = 1
Case 1
Silnia = 1
Case Else
Silnia = n * Silnia(n - 1)
End Select
End Function |