vbamania.pl
login:
hasło:
 
  *Rejestracja *Zapomniane hasło
 Dziś jest sobota, 26 kwietnia 2025 roku.
Ustaw jako stronę startową Ulubione Napisz
PowrótPowrót do serwisu  RegulaminRegulamin rssRSS

  tytuł wątku:
Wątki dyskusji

Obliczanie silni


otwartyotwarty rozpoczął: sebolubek postów: 10



napisał: Trebor
postów: 1209


umieszczony:
5 kwietnia 2011
20:29

  
Ja się nie zirytowałem, ale lubię czuć, że szukający pomocy wkłada trochę swojej pracy. U Ciebie tego nie czułem.
Trochę mało napisałeś na temat pojawiającego się błędu. Jeśli na początku (przed procedurą) masz zapis typu:
Option Explicit

to znaczy, że zobowiązujesz się do deklarowania wszystkich zmiennych. Zapis ten można pominąć i deklaracje nie będą wymagane, ale nie jest to dobre przyzwyczajenie. W linku który dałem na początku pod koniec strony zmienna ta jest deklarowana przed procedurą
Const strNazwaMakra As String = "Obliczanie silni"


Jeśli uzupełnisz swój kod o powyższy zapis "edytor" czepi się pozostałych nie zadeklarowanych zmiennych. Stała strNazwaMakra służy do wyświetlenie tytułu wyskakującego okienka.

Jeśli chodzi o coś innego napisz jaki pojawia się komunikat - generalnie dokładniej opisz problem.
napisał: sebolubek
postów: 13


umieszczony:
5 kwietnia 2011
19:46

edytowany:
5 kwietnia 2011
19:47

  
Przepraszam kolego Trebor że cię z irytowałem ale bez waszej pomocy nie dał bym rady nic zrobić. Dzięki waszej pomocy coś zaczynam rozumieć po analizie dogłębnej. Proszę cię tylko jeszcze o podpowiedź czemu wyskakuje mi błąd przy uruchamianiu programu i zaznacza miejsce strNazwaMakra? pozdrawiam.
strLiczba = InputBox("Podaj liczbę dodatnią, mniejszą od stu", strNazwaMakra)
napisał: Trebor
postów: 1209


umieszczony:
5 kwietnia 2011
16:43

  
Część stała dla wszystkich pętli jest do linii
lngLiczba = CLng(Val(strLiczba))

włącznie.
Do tego tego doklejasz kolejne pętle i zmieniasz nazwę procedury na unikatową.
I tak aż wyczerpiesz wszystkie pętle. To tak w dużym skrócie.
Coś musi być w tym Twojej pracy.

Hej
napisał: sebolubek
postów: 13


umieszczony:
4 kwietnia 2011
19:46

edytowany:
5 kwietnia 2011
15:00

  
Z całego serca dziękuje, czy chodziło o taką pętle to okaże się jak zobaczy i oceni, ale powinny to być cztery osobne programy. Czy da się i jak to zrobić aby każda pętla była w innym programie? Pozdrawiam i przepraszam za dołączony post. Trebor też ci bardzo dziękuje i pozdrawiam
napisał: Trebor
postów: 1209


umieszczony:
1 kwietnia 2011
20:21

edytowany:
1 kwietnia 2011
20:27

  
Pozostaje podatek. Potraktowałem to dość po macoszemu tzn. uprościłem obsługę błędów.
Proszę nie łączyć tematów odnoszących się do różnych problemów.
Sub podatek_2010_1()
Dim dochód As Long, podatek As Currency
On Error Resume Next
dochód = InputBox("Podaj Twój dochód w 2010 r. po zaokrągleniu do pełnych złotych.")
On Error GoTo 0
If dochód <= 85528 Then
    podatek = 0.18 * dochód - 556.02
        Else
            podatek = 14839.02 + 0.32 * (dochód - 85528)
                End If
If podatek < 0 Then podatek = 0
MsgBox "Twój podatek wynosi " & podatek
End Sub

Sub podatek_2010_2()
Dim dochód As Long, podatek As Currency
On Error Resume Next
dochód = InputBox("Podaj Twój dochód w 2010 r. po zaokrągleniu do pełnych złotych.")
On Error GoTo 0
Select Case dochód
Case Is <= 85528
    podatek = 0.18 * dochód - 556.02
Case Else
    podatek = 14839.02 + 0.32 * (dochód - 85528)
End Select
If podatek < 0 Then podatek = 0
MsgBox "Twój podatek wynosi " & podatek
End Sub

napisał: admin
postów: 613


umieszczony:
1 kwietnia 2011
16:35

  
Prosze nie powtarzac postow!
To prowadzi do irytacji admina!


A oto program:

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))


'Panu doktorowi chodzi pewnie o cos takiego:
'---------------------------------------------
'------------- pierwsza petla ----------------
'---------------------------------------------
lngSilnia = 1
lngLicznik = 2

If lngLiczba > 0 Then
   Do While lngLicznik <= lngLiczba
      lngSilnia = lngSilnia * lngLicznik
      lngLicznik = lngLicznik + 1
   Loop
End If

'wys'wietlenie wyniku.
MsgBox "Wynik: " & lngLiczba & "! = " & lngSilnia, vbInformation

'---------------------------------------------
'-------- koniec pierwszej petli -------------
'---------------------------------------------


'---------------------------------------------
'--------------- druga petla -----------------
'---------------------------------------------
lngSilnia = 1
lngLicznik = 2

If lngLiczba > 0 Then
   Do Until lngLicznik > lngLiczba
      lngSilnia = lngSilnia * lngLicznik
      lngLicznik = lngLicznik + 1
   Loop
End If

'wys'wietlenie wyniku.
MsgBox "Wynik: " & lngLiczba & "! = " & lngSilnia, vbInformation

'---------------------------------------------
'---------- koniec drugiej petli -------------
'---------------------------------------------

'---------------------------------------------
'--------------- trzecia petla ---------------
'---------------------------------------------
lngSilnia = 1
lngLicznik = 2

If lngLiczba > 0 Then
   Do
      lngSilnia = lngSilnia * lngLicznik
      lngLicznik = lngLicznik + 1
   Loop While lngLicznik <= lngLiczba
End If

'wys'wietlenie wyniku.ilnia
MsgBox "Wynik: " & lngLiczba & "! = " & lngSilnia, vbInformation

'---------------------------------------------
'---------- koniec trzeciej petli ------------
'---------------------------------------------

'---------------------------------------------
'--------------- czwarta petla ---------------
'---------------------------------------------
lngSilnia = 1
lngLicznik = 2

If lngLiczba > 0 Then
   Do
      lngSilnia = lngSilnia * lngLicznik
      lngLicznik = lngLicznik + 1
   Loop Until lngLicznik > lngLiczba
End If

'wys'wietlenie wyniku.ilnia
MsgBox "Wynik: " & lngLiczba & "! = " & lngSilnia, vbInformation

'---------------------------------------------
'---------- koniec czwartej petli ------_-----
'---------------------------------------------
End Sub

napisał: sebolubek
postów: 13


umieszczony:
29 marca 2011
07:44

edytowany:
29 marca 2011
07:54

  
Witam. Serdecznie dziękuje za pomoc, jestem bardzo wdzięczny, ale Doktor podał polecenie Napisz program liczący wartość funkcji silnia liczby n (podanej przez użytkownika) używając czterech wersji pętli Do Loop (cztery programy):
A może ma ktoś pomysł na takie coś?
Napisz program obliczający podatek według aktualnych progów podatku od dochodu osób fizycznych.
Użyj instrukcji warunkowych:
If Then Else
Select Case
napisał: admin
postów: 613


umieszczony:
27 marca 2011
20:01

  
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

napisał: Trebor
postów: 1209


umieszczony:
27 marca 2011
19:52

  
Na początek zerknij tu http://www.vbamania.estrefa.pl/?go=artykuly&id=23493&show=czytaj
Stworzone jakby wprost dla Ciebie.
napisał: sebolubek
postów: 13


umieszczony:
27 marca 2011
18:45

  
Witam serdecznie. Jestem nowym na tym forum i z pisaniem programów w VBA nie miałem nigdy do czynienia. Rozpocząłem studia w sędziwym już wieku i przyszło mi zaznać tej męki. Proszę o pomoc Fachowców z tej dziedziny bo sam nie dam rady. Potrzebne mi są 4 programy do liczenia silni na czterech pętlach, każdy program na osobnej pętli. Czy byłby ktoś tak dobry i napisał takie programy? Wiem że to dla speców jest kilka minut a ja nie mam szans przy obecnych umiejętnościach. Bardzo proszę i z góry dziękuje


<-wstecz  1  dalej->
wszystkich stron: 1


Sortuj posty: z