Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

[VB6] Zaokrąglanie liczb



 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Visual Studio: C#, VB, VC++, …
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
ak



Dołączył: 13 Lut 2007
Posty: 164

PostWysłany: Pon Mar 12, 2018 6:54 pm  OP    Temat postu: [VB6] Zaokrąglanie liczb Odpowiedz z cytatem Pisownia

Witam
Jak należaloby uzupełnić formułę która zaokrąglałaby liczbę do takiej postaci:
14520 do 14500
16680 do 16700
18478 do 18500
14240 do 14200
9320 do 9300
Kod:

Text8.Text = Round(3.14 * ((c * c) - (b * b)) / (d * Text2.Text), 0)


Z góry dziekuję
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
samolot



Dołączył: 26 Sty 2006
Posty: 8288
Skąd: Toruń

PostWysłany: Pon Mar 12, 2018 7:56 pm      Temat postu: Odpowiedz z cytatem Pisownia

Chcesz zaokrąglać liczby całkowite. Ponieważ funkcja Round() zaokrągla liczby zmiennoprzecinkowe, a w nich to, to co po przecinku, to, przed podstawieniem liczby całkowitej do funkcji Round(), podziel liczbę całkowitą przez liczbę z taką liczbą zer, o ile pozycji planujesz zaokrąglać liczbę całkowitą. Po tym pomnóż wynik prze taka samą liczbę:

Kod:
Dim Calkowita As Integer
Calkowita = 14520
Dim Winik1 as Single
Winik1 = Calkowita/100

Dim Wynik2 as Single
Wynik2 = Round(Winik1,0)

Dim Wynik3 as Single
Wynik3 = Wynik2 * 100

_________________
Nie zadawaj bezcelowych pytań / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
losmac



Dołączył: 25 Maj 2005
Posty: 1559
Skąd: Białystok

PostWysłany: Pon Mar 19, 2018 10:17 pm      Temat postu: Odpowiedz z cytatem Pisownia

Działanie jest proste: musisz wiedzieć, co pozostaje z dzielenia danej liczby przez 100 i tę wartość odjąć, by uzyskać zaokrąglenie do pełnych setek:

Kod:
Dim liczby() As Integer = {14520, 16680, 18478, 14240, 9320}

For i As Integer = 0 To liczby.Length-1
    Dim liczba As Integer = liczby(i)
    Dim modulo As Integer = liczba Mod 100
    Dim wynik As Integer = liczba - modulo
    Console.WriteLine("{0}-{1}={2}", liczba, modulo, wynik)
Next i



Wynik:
Cytat:
14520-20=14500
16680-80=16600
18478-78=18400
14240-40=14200
9320-20=9300

_________________
książka o VBA dla Office'a
źródło wiedzy o programowaniu w VBA
UWAGA! Nie odpowiadam na PW, jeżeli wcześniej nie zostało to ze mną ustalone w ramach konkretnego wątku!
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora
samolot



Dołączył: 26 Sty 2006
Posty: 8288
Skąd: Toruń

PostWysłany: Wto Mar 20, 2018 12:04 am      Temat postu: Odpowiedz z cytatem Pisownia

To, co podałeś, to jest obcięcie do pełnych setek w dół, a pytającemu chodziło o zaokrąglenie:
mniej od 50 -> w dół
ponad 50 -> w górę

Pytająch chciał taki wynik:
Cytat:
14520 do 14500
16680 do 16700
18478 do 18500
14240 do 14200
9320 do 9300

A ty masz taki:
Cytat:
14520-20=14500
16680-80=16600
18478-78=18400
14240-40=14200
9320-20=9300

_________________
Nie zadawaj bezcelowych pytań / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
losmac



Dołączył: 25 Maj 2005
Posty: 1559
Skąd: Białystok

PostWysłany: Pon Kwi 09, 2018 12:02 pm      Temat postu: Odpowiedz z cytatem Pisownia

Główna idea się nie zmienia. Jeśli chodzi o zapis księgowy (do 50 w dół, od 50 w górę), to można to osiągnąć za pomocą prostej funkcji:
Kod:
Sub Main
    Dim liczby() As Integer = {14520, 16680, 18478, 14240, 9320}

    Dim ksiegowa = Function(inputValue As Integer) As Integer
        Dim modulo As Integer = inputValue Mod 100
        Return inputValue - If(modulo>50, modulo-100, modulo) 'TU!
    End Function

    For i As Integer = 0 To liczby.Length-1
        Console.WriteLine("{0} | {1}", liczby(i), ksiegowa(liczby(i)))
    Next i

End Sub


Rezultat jest dokładnie taki, jak oczekiwany:
Cytat:
14520 | 14500
16680 | 16700
18478 | 18500
14240 | 14200
9320 | 9300

_________________
książka o VBA dla Office'a
źródło wiedzy o programowaniu w VBA
UWAGA! Nie odpowiadam na PW, jeżeli wcześniej nie zostało to ze mną ustalone w ramach konkretnego wątku!
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora
ak



Dołączył: 13 Lut 2007
Posty: 164

PostWysłany: Sro Paź 24, 2018 8:21 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Witam
Powiedzcie mi w jaki sposób posłużyć się tą fukcją
Kod:

Sub Main
    Dim liczby() As Integer = {14520, 16680, 18478, 14240, 9320}

    Dim ksiegowa = Function(inputValue As Integer) As Integer
        Dim modulo As Integer = inputValue Mod 100
        Return inputValue - If(modulo>50, modulo-100, modulo) 'TU!
    End Function

    For i As Integer = 0 To liczby.Length-1
        Console.WriteLine("{0} | {1}", liczby(i), ksiegowa(liczby(i)))
    Next i

End Sub

Moja liczba oznaczona jest a=14520.Mam ich kilkanaście.Kod rozumiem zapisać w Module,ale co dalej.Nie jestem mocny w te klocki
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
samolot



Dołączył: 26 Sty 2006
Posty: 8288
Skąd: Toruń

PostWysłany: Sro Paź 24, 2018 10:26 pm      Temat postu: Odpowiedz z cytatem Pisownia

To zależy jak się chcesz nią posłużyć. Ta wyżej pokazana funkcja jest uruchamiana automatycznie w momencie uruchamiania programu i z twojego punktu widzenia może ci nie odpowiadać. Wszystko zależy od tego gdzie i kiedy musisz jej użyć.
Poza tym wydaje się skomplikowana, bo w jednym wierszu ma umieszczone wywołanie kilku różnych funkcji

Proponuję w module umieścić funkcję takiego kształtu (napisane w języku VB.NET):
Kod:
   Function Zaokraglanie(ByVal Liczby() As Integer) As Integer()
        Dim Modulo As Integer = 0, PoKonwersji(Liczby.Length - 1) As Integer

        For X As Integer = 0 To Liczby.Length - 1
            modulo = Liczby(X) Mod 100
            If Modulo < 50 Then PoKonwersji(X) = Liczby(X) - Modulo
            If Modulo >= 50 Then PoKonwersji(X) = Liczby(X) + (100 - Modulo)
        Next X

        Return PoKonwersji

    End Function

Przyjmuje ona w nagłówku tablicę twoich liczb całkowitych, które chcesz pozaokrąglać.
Następnie w pętli zaokrągla je do takich wartości liczb całkowitych , jakie potrzebujesz.
A wywołać tę funkcję możesz na przykład tak:
Kod:
Dim Liczby() As Integer = {14520, 16680, 18478, 14240, 9320}
        Dim Ksiegowe() As Integer = Nothing

        Ksiegowe = Zaokraglanie(Liczby)
,
która pobiera tablicę Liczby() z liczbami pierwotnymi,
a zwraca tablicę liczb Ksiegowe() z liczbami po zaokrągleniach
UWAGA: jeśli ty to chcesz mieć napisane w starszym języku VB6 , to pokazane tu deklaracje zmiennych mogą wymagać rozdzielenia samych deklaracji od podstawionych wartości na osobne wiersze, bo VB6 tak działa.

W pierwszym i drugim kodzie dotyczy to wierszy o numerze 2
Mam nadzieję, że kod jest na tyle przejrzysty, że łatwo zrozumeć co robią poszczególne polecenia.
Ten drugi kod możesz umieścić w kodzie zdarzenia Click przycisku, a tablicę liczb Liczby() pobrać z innej kontrolki.

_________________
Nie zadawaj bezcelowych pytań / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
Gość






PostWysłany: Czw Paź 25, 2018 10:07 am      Temat postu: Odpowiedz z cytatem Pisownia

Przeraża mie to.Czy nie da się tego prosciej zapisać.Mam Textbox i w niej wartośc np 14246,a w drugim textboxie chcę zaokraglenia tej liczby do 14240.
Procedurę chcę podpiąć po przycisk
Powrót do góry
samolot



Dołączył: 26 Sty 2006
Posty: 8288
Skąd: Toruń

PostWysłany: Czw Paź 25, 2018 8:05 pm      Temat postu: Odpowiedz z cytatem Pisownia

Cytat:
Nie jestem mocny w te klocki
Cytat:
Przeraża mie to.Czy nie da się tego prosciej zapisać

Twój problem polega na tym, że nie wystarczy zadać pytanie i czekać na odpowiedź, informując o swoich emocjach. Padły już ze trzy odpowiedzi i zero zaangażowania z twojej strony. Minęło ponad 6 miesięcy i przychodzisz właściwie z tym samym pytaniem.

Nie twierdzę, że nasze poprzednie odpowiedzi były do końca wyczerpujące ale dlatego teraz starałem się ci wytłumaczyć to bardziej krok po kroku. Ale zauważ, że TERAZ odpowiadałem Ci na ostatnie pytanie, w którym podałeś przykład funkcji, która dane początkowe otrzymuje w postaci tablicy liczb. Wiec mój kod to taka funkcja ale rozpisana bardziej łopatologicznie. I nie pisz , że cię to przeraża, bo napisałem Ci, jak z niej skorzystać.
Skoro teraz piszesz:
Cytat:
Procedurę chcę podpiąć po przycisk
, to zrób to tak:
1. Kliknij w formatce przycisk ,by Ci się otworzył jego kod zdarzenia Click

2. Wklej do tej procedury taki mój kod:
Kod:

  Dim Liczba As Integer
  Dim Ksiegowa As Integer

  Liczba = Cint(Text2.Text)    
  Ksiegowa = Zaokragl(Liczba)
  Text8.Text= Cint (Ksiegowa)

3. Funkcję Zaokragl() użytą powyżej w wierszu nr 6 postaraj się napisać sam wzorując się na tej mojej z ostatniej odpowiedzi:
Kod:
Function Zaokraglanie(ByVal Liczby() As Integer) As Integer()
        Dim Modulo As Integer = 0, PoKonwersji(Liczby.Length - 1) As Integer

        For X As Integer = 0 To Liczby.Length - 1
            modulo = Liczby(X) Mod 100
            If Modulo < 50 Then PoKonwersji(X) = Liczby(X) - Modulo
            If Modulo >= 50 Then PoKonwersji(X) = Liczby(X) + (100 - Modulo)
        Next X  

        Return PoKonwersji

    End Function

4. Tą funkcję możesz umieścić w tym samym module formatki, na której masz przycisk. Bez tej funkcji wiersz nr 6 w kodzie zdarzenia przycisku będzie zgłaszał błąd.
Zacznij od Tytułu funkcji i zakończenia funkcji:
 Function Zaokragl(ByVal Liczba As Integer) As Integer

End Function
Zwróć uwagę, że w jej nagłówku musi być pojedyńcza zmienna liczbowa a nie tablica liczb, bo teraz tworzymy funkcję zaokrąglającą jedną liczbę, a nie tablicę liczb.

5.Następnie wstaw do jej wnętrza deklaracje zmiennych, ale pamiętaj, żeby zmienna PoKonwersji nie była tablicą
Natomiast nie będzie potrzebna pętla z wierszy 4 i 8 a wiersze nr 5,6,7 trzeba przerobić.

Ale tę przeróbkę spróbuj napisać sam. W razie czego pytaj, ale tu twój wkład jest potrzebny, bo bez tego moje pisanie będzie daremne.

_________________
Nie zadawaj bezcelowych pytań / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Visual Studio: C#, VB, VC++, … Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.17958 sekund, zapytan = 11
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |