Jak wyciągnąć poszczególne cyfry z liczby trzycyfrowej ?


Słuchajcie, mam pewne pytanie. Jest taki kawałek kodu który służy jak wiadomo do zmiany liczny wielocyfrowej na liczbę z dwoma miejscami po przecinku. Ogólnie jest to kawałek kodu miernika napięcia.

Wartosc_wyniku = Srednia
Wartosc_wyniku = Wartosc_wyniku / 204
Wartosc_wyniku = Wartosc_wyniku * 3
V = Fusing(wartosc_wyniku , "#.&&")

I teraz moje główne pytanie. jak ze zmiennej wartosc_wyniku wyciągnąć poszczególne cyfry ? Wiadomo że w tej postaci wyświetlę wynik tylko w normalnej postaci małych cyferek a chciałbym wyświetlać wynik za pomocą dużych cyferek jak niżej. Myślałem o użyciu instrukcji mod...




Portret użytkownika EDC

Odp. Jak wyciągnąć poszczególne cyfry z liczby trzycyfrowej ?

Ja się tego nauczyłem tutaj u Mirleja :D

$sim
 
Dim Help As Integer
Dim X As Integer
Dim A(3) As Byte
Dim I As Byte
 
Cls
 
X = 587
 
For I = 1 To 3
 Help = X Mod 10
 A(i) = Help
 X = X / 10
Next I
 
Lcd "A1=" ; A(1) ; " A2=" ; A(2) ; " A3=" ; A(3)

Za granicą gość napisał że ten kod " work like a charm" :P

Chodzi o to że o wyciąganie osobnych cyfr dla wyświetlania dużych powalczyłbym wcześniej.
Jeśli otrzymujesz wynik z dwoma znaczącymi dla Ciebie cyframi po przecinku..to pomnożyłbym wynik przez sto..
To z przykładowego wyniku 3,75 zrobi 375 .. potem powyższym kodem wyciągniesz każda cyfrę..
Wynik jednak powinieneś zapisać od razu do zmiennej nie obsługującej przecinków czyli Word albo Integer..
Czyli Wynik_typu Word = Wynik_typu Single * 100
Nie ma tu całego kodu ale ja wcześniej w kodzie próbowałbym pracować na zmiennych powiększonych o 100 ale nie wymagających użycia Single

-

BARTek
Moja strona

Portret użytkownika matrix

Re: Jak wyciągnąć poszczególne cyfry

Niestety ten kod nie wyciąga mi poprawnie cyferek ze zmiennej...
Kod mam taki:

Dim Srednia as Word
Dim Wynik as Word
Dim Wartosc_wyniku as Single
Dim Temp as Byte
Dim V as String * 3
Dim Zmienna as Single
 
 
Wynik = Getadc(2)   'tu mam wynik 3 lub cztery cyfry zaleznie od ADC
Srednia = Srednia * Ilosc_probek   'tu na początku jest zero ale później dociąga do ADC
Srednia = Srednia + Wynik   'ciąg dalszy linii wyżej
  Temp = Ilosc_probek + 1   'zakładając że ilość próbek mamy 4 to wartość Temp zawsze będzie o 1 większa
Srednia = Srednia / Temp   'czyli dzielimy ostateczną średnią przez o 1 większą liczbę próbek
 
Wartosc_wyniku = Srednia   'tu przepisujemy wartość średniej do zmiennej Wartość_wyniku,
                           'czyli mamy średnią wartość ADC w zmienne Wartosc_wyniku
 
Wartosc_wyniku = Wartosc_wyniku / 204   'tu następuję standardowe obliczanie napięcia
Wartosc_wyniku = Wartosc_wyniku * 3   'i mnożenie x3 bo mam dzielnik 200-100k
 
V = Fusing(watrtosc_wyniku , "#.#")   'tu obcinam wszystko poza jednym miejscem po przecinku

I dotąd wszystko działa mi poprawnie.
Napięcia do około 15V wyświetlane są w miarę poprawnie (błąd 0.06V) przy zmiennej Ilosc_probek = 4

Następnie do mojego kodu dopisuję Twój w ten sposób:

Zmienna = Wartosc_wyniku   'czyli przepisuję zmienną single do zmiennej single
Zmienna = Zmienna * 100   'rozszerzam zmienną tak żeby na przodzie przed przecinkiem mieć 3 cyfry
For I = 1 To 3
    Help = Zmienna Mod 10   'i tu wywala błąd Invalid Datatype
    A(i) = Help
    Zmienna = Zmienna / 10
Next I

Może wydawać się że skomplikowałem mocno szczególnie przy uśrednianiu, ale prościej się nie dało bo mi błędy się sypały. Powalczył bym też z liczbami trzycyfrowymi przed rzucaniem na przecinek ale nie mogę znaleźć miejsca gdzie można je pobrać.

W zasadzie zmienna trzycyfrowa jest po linii:

Wartosc_wyniku = Wartosc_wyniku / 4

Ale mam też cyfry po przecinku.

Wiem że ogólnie Twój kod działa bo jak na sztywno wpiszę jakąś cyfrę trzycyfrową to wyświetla poprawnie poza drobnym szczegółem, cyfra na przykład 234 po podaniu dyrektywy Lcd A(1); A(2); A(3) wyświetli się odwrotnie czyli 432 więc wystarczy podać wyświetlanie od końca. Najgorsze jest to że nie mogę pogodzić tego fajnego kawałka kodu ze swoim.

Poradziłem sobie dla 5V ale dla 12V nie działa.

Portret użytkownika EDC

Odp. Jak wyciągnąć poszczególne cyfry

Nigdy nie wpadłbym na pomysł żeby wyciągać Modulo ze zmiennej typu Single :D Pomijając to jednak..w opisie do instrukcji Modulo można przeczytać że zmienna której przypisujemy wynik dzialania Modulo musi być takiego samego typu. Dlatego u mnie są to dwa Integer. Czyli dzielę Integer przez 10 i patrzę ile zostało reszty i wynik zapisuję też do Integer. Linijkę niżej następuje rzutowanie czyli taka zmiana typu w locie :P Przepisuję wartość zmiennej Integer do takiej o typie Byte.

Powinno to wiec wyglądać mniej więcej tak:

Dim Help As Word
 
Dim Zmienna As Word ' zmienna potrafiąca przechować wynik do wart. 65535, ale nie obsługuje przecinków, przez co sa one automatycznie odcinane przy rzutowaniu.
 
Zmienna = Wartośc_wyniku * 100  ' zapisując do Word musze od razu pomnożyć bo potem nie mam już dostępu do informacji co znajdowało sie po przecinku.

Reszty juz nie pisze żeby się nie powtarzać. Dobrym prostym sposobem jest wyświetlenie sobie wartości zmiennych jako Debug. Zawsze wiesz na czym stoisz ;)

-

BARTek
Moja strona