Pytania, kody i porady dotyczące nie tylko Bascom.
-
sp3ots
- Posty: 42
- Rejestracja: 08 wrz 2018, 10:26
Post
autor: sp3ots » 11 gru 2019, 21:59
Witam !
Bawię się dodając ułamki "zwykłe".
'dodawanie ułamków 11.12.2019
$sim
$regfile "m8def.dat"
$crystal = 8000000
$hwstack = 50
$swstack = 50
$framesize = 100
Config Lcd = 16 * 2
Config Lcdpin = Pin , Rs = Pc.5 , E = Pc.4 , Db4 = Pc.3 , Db5 = Pc.2 , Db6 = Pc.1 , Db7 = Pc.0
Cursor Off
Cls
Dim L_1 As Byte
Dim L_2 As Byte
Dim L_3 As Byte
Dim M_1 As Byte
Dim M_2 As Byte
Dim M_3 As Byte
' licznik_1 + licznik_1 licznik_3
'mianowni_1 +mianownik_2 = mianownik_3
L_1 = 2
M_1 = 4
L_2 = 4
M_2 = 5
L_3 = 0
M_3 = 0
M_3 = M_1 * M_2
L_3 = L_1 + L_2
Locate 1 , 1
Lcd L_1 ; " +"
Locate 1 , 5
Lcd L_2
Locate 1 , 9
Lcd L_3
Locate 2 , 1
Lcd M_1 ; " *"
Locate 2 , 5
Lcd M_2
Locate 2 , 8
Lcd M_3 ; " "
Po dodaniu 2/4 do 4/5 otrzymałem wynik 6/20.
Jak ułożyć program by był uniwersalny i skracał inne ułamki np. 7/21 itp. ?
Czy w Bascomie da radę taki program napisać ?
Założenia:
Bascom AVR DEMO ( max 4kB ) LCD 2x16, może kiedyś klawiatura 12to polowa.
Pozdrawiam. Stefan
ps. Dodawanie ułamków zwykłych KL 5 SP.
-
niveasoft
- Posty: 1216
- Rejestracja: 17 sie 2015, 12:13
-
Kontakt:
Post
autor: niveasoft » 11 gru 2019, 23:39
Jest trochę późno i głowa już nie ta więc błąd mógł się wkraść niemniej wychodzi na to że działa. Potestuj
Nie żałujesz, że ktoś rozwiązał krzyżówkę za Ciebie?
'dodawanie ułamków 11.12.2019
$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 64
$swstack = 16
$framesize = 64
$baud = 19200
$sim
Config Submode = New 'konfiguruje Bascom. Najpierw piszesz funkcje i sub`y a dopiero potem kod i uzywasz funkcji
Config Lcd = 16x2
Config Lcdpin = Pin , Rs = Portc.5 , E = Portc.4 , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0
Cursor Off
Cls
Dim L_1 As Byte , L_2 As Byte , M_1 As Byte , M_2 As Byte
Dim Temp1 As Byte , Temp2 As Byte , Temp3 As Byte 'zmienne pomocnicze
Dim Ll_1 As Byte , Ll_2 As Byte , Mm_1 As Byte , Mm_2 As Byte
L_1 = 2 'licznik
M_1 = 4 'mianownik
L_2 = 4 'licznik
M_2 = 5 'mianownik
'----[ sub skraca ułamek jeśli to mozliwe]--------
Sub Skracaj(byval Licz As Byte , Byval Mian As Byte)
Print "Skracam " ; Licz ; "/" ; Mian
Temp1 = Licz : Temp2 = Mian 'zapamiętaj wprowadzone dane na wypadek gdyby nie udało się skrócić to będzie wynik
If Licz > Mian Then 'jeśli licznik większy niz mianownik np.21/7
Temp3 = Licz Mod Mian 'sprawdź czy jak podzielimy L/M czy zostanie reszta
If Temp3 = 0 Then 'tylko jeśli nie ma reszty to możemy podzielic
Temp1 = Licz / Mian 'to nowy Licznik '
Temp2 = 1 'to nowy mianownik
End If
Else 'jeśli jednak mianownik większy od licznika np 7/21
Temp3 = Mian Mod Licz 'sprawdź czy jak podzielimy M/L czy zostanie reszta
If Temp3 = 0 Then 'tylko jeśli nie ma reszty to możemy podzielic
Temp1 = 1 'to nowy Licznik
Temp2 = Mian / Licz 'to nowy mianownik
End If
End If
Print "Wynik skracania to " ; Temp1 ; "/" ; Temp2
End Sub
'---------------------------------------------------
'skracanie wstepne
Call Skracaj(l_1 , M_1) 'wysyłamy ułamek do skrócenia podając licznik i mianownik
Ll_1 = Temp1 : Mm_1 = Temp2 'wyniki sa w zmiennych Temp1 i Temp2
Call Skracaj(l_2 , M_2)
Ll_2 = Temp1 : Mm_2 = Temp2
If Mm_1 <> Mm_2 Then 'jeśli mianowniki się różnią
Temp1 = Ll_1 * Mm_2 'mnozymy liczniki na krzyż
Temp2 = Ll_2 * Mm_1
Temp1 = Temp1 + Temp2 'dodawanie liczników
Temp2 = Mm_1 * Mm_2 'policz mianownik
Else 'lub jeśli mianowniki są już równe
Temp1 = Ll_1 + Ll_2 'dodaj tylko liczniki
Temp2 = Mm_1 'przepisz mianowniki
End If
Call Skracaj(temp1 , Temp2) 'ostatecznie skróć nowy ułamek
Print ""
Print "Wynikiem dodawania " ; L_2 ; "/" ; M_2 ; " do " ; L_1 ; "/" ; M_1 ; " jest " ; Temp1 ; "/" ; Temp2
End
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
-
sp3ots
- Posty: 42
- Rejestracja: 08 wrz 2018, 10:26
Post
autor: sp3ots » 12 gru 2019, 8:47
Witam !
DZIĘKUJĘ
Oczywiście że żałuję, że sam do rozwiązania nie doszedłem.
Na szybko widzę że wynik dodawania 2/4 i 4/5 jest zły, jest 13/10, a powinien być 3/10.
Teraz muszę zapoznać się z nieznajomymi dla mnie całymi liniami programu, np. ta:
Sub Skracaj(byval Licz As Byte , Byval Mian As Byte)
Sub - podprogram ( domyślam się ), ale to:
byval ? określenie zakresy zmiennej ? jeśli tak to jaki zakres ?
Zastanawiam się dlaczego zaczynasz od skracania ułamków przed dodawaniem.
Dzisiaj postaram się poznać zasadę działania programu, co kolejna linia wykonuje, to dla mnie najważniejsze.
Dziękuję.
Bardzo proszę nie dawaj całych rozwiązań, wystarczy nakierowanie.
-
niveasoft
- Posty: 1216
- Rejestracja: 17 sie 2015, 12:13
-
Kontakt:
Post
autor: niveasoft » 12 gru 2019, 8:56
Kolego przyjrzyj się moim obliczeniom "na piechotę" bez wstępnego skracania. Coś mi się wydaje że ktoś z nas nie odrobił lekcji
Nie przesądzam sprawy. Pokaż jak to liczysz
Wstępne skracanie to po to by nie mnożyć dużych liczb. Ogólnie kod jest ograniczony do wartości które zmieszczą się w bajcie czyli do 255
O
Byval i
Byref napisałem tutaj ->
viewtopic.php?f=16&t=168
Na początku napisałem wersję
Byref, która operowała bezpośrednio na podanych danych i byłaby bardziej optymalna, ale potem na końcu nie mogłem napisać co było do czego dodawane i tylko dlatego przerobiłem na
Byval
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
-
sp3ots
- Posty: 42
- Rejestracja: 08 wrz 2018, 10:26
Post
autor: sp3ots » 12 gru 2019, 11:07
Masz rację, ale mnie zaćmiło !
Przecież pół i prawie całość 4/5 nie może być mniejsze od 1.
A z wnukiem robiłem to tak:
a/b+c/d
mnożyłem mianowniki, potem mnożyłem na krzyż a X d, b X c, potem już oba liczniki dodałem
2/4+4/5= 2x5+4x4 = 26- licznik =
4x5=20 - mianownik
Teraz sią zgadza 26/20=13/10
Wstępne skracanie to po to by nie mnożyć dużych liczb. Ogólnie kod jest ograniczony do wartości które zmieszczą się w bajcie czyli do 255---------ok, rozumiem.
To: Byval i Byref napisałem tutaj -> viewtopic.php?f=16&t=168 popatrzę trochę później, ze spokojem.
Możesz mi oczywiście postawić jedynkę za dodawanie ułamków zwykłych, chyba za szybko chciałem napisać działający program !
Ja się poprawię.
-
niveasoft
- Posty: 1216
- Rejestracja: 17 sie 2015, 12:13
-
Kontakt:
Post
autor: niveasoft » 12 gru 2019, 11:23
W takim razie dodałem do kodu więcej komentarzy.
-
sp3ots
- Posty: 42
- Rejestracja: 08 wrz 2018, 10:26
Post
autor: sp3ots » 12 gru 2019, 12:40
SUPER, przydadzą się, DZIĘKUJĘ
Do Twojego programu doałem:
Dim temp4 as byte
If Temp1 > Temp2 Then
Temp4 = Temp1 / Temp2
Temp1 = Temp1 Mod 10
End If
Print Temp4 ; " " ; Temp1 ; "/" ; Temp2
Chciałbym zamienić ułamek 13/10 na 1 i 3/10 to działa, ale jak zamieniam 27/9 to już tak pięknie nie jest.
Proszę, na razie nie podpowiadaj.
Już mam poprawiony program dział też z ułamkami nieskracalnymi np. 3/4, maksymalna wartość licznika lub mianownika 255 ( Byte )
'skracanie ułamka 13.12.2019
$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 64
$swstack = 16
$framesize = 64
$baud = 19200
$sim
Dim Temp1 As Byte , Temp2 As Byte , Temp3 As Byte , Temp4 As Byte
Temp1 = 255
Temp2 = 5
Print Temp1 ; "/" ; Temp2
If Temp1 > Temp2 Then
Temp3 = Temp1 / Temp2
Temp4 = Temp2 * Temp3
Temp4 = Temp1 - Temp4
If Temp2 < 10 Then
Temp2 = Temp2 Mod 10 ' dla mianwnika do 9
Elseif Temp2 < 100 Then
Temp2 = Temp2 Mod 100 ' dla mianownika do 99
Elseif Temp2 < 200 Then
Temp2 = Temp2 Mod 1000 ' dla mianownika większego
End If
Else
Temp4 = Temp1
End If
Print Temp3 ; " i " ; Temp4 ; "/" ; Temp2
End
Ostatnio zmieniony 13 gru 2019, 12:02 przez
sp3ots, łącznie zmieniany 1 raz.
-
sp3ots
- Posty: 42
- Rejestracja: 08 wrz 2018, 10:26
Post
autor: sp3ots » 13 gru 2019, 11:40
Wczoraj nic nie wymyśliłem, ale dzisiaj napisałem to:
'skracanie ułamka 13.12.2019
$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 64
$swstack = 16
$framesize = 64
$baud = 19200
$sim
Dim Temp1 As Byte , Temp2 As Byte , Temp3 As Byte , Temp4 As Byte
Temp1 = 25
Temp2 = 13
Print Temp1 ; "/" ; Temp2
If Temp1 > Temp2 Then
Temp3 = Temp1 / Temp2
Temp4 = Temp2 * Temp3
Temp4 = Temp1 - Temp4
If Temp2 > 9 Then
Temp2 = Temp2 Mod 100 ' dla mianwnika większego od 9
Else
Temp2 = Temp2 Mod 10 ' dla mianownika do 9
End If
End If
Print Temp3 ; " i " ; Temp4 ; "/" ; Temp2ownik
End
Problem występuje gdy wpiszę ułamek nieskracalny, wtedy jest zły wynik.
Jeśli wpiszę taki ułamek:
Temp1 = 250- licznik
Temp2 = 130- mianownik
to mianownik mam obcięty z lewej strony, ale to wiem jak poprawić.
-
niveasoft
- Posty: 1216
- Rejestracja: 17 sie 2015, 12:13
-
Kontakt:
Post
autor: niveasoft » 13 gru 2019, 17:38
Coś tam Pan chyba śpi.
Jak można napisać "Temp2 = Temp2 Mod 1000" jak Temp2 to Byte który ma maks 255?
Mod to reszta z dzielenia i prosiłbym by poczytał Pan Helpa do danej instrukcji.
Proszę o inny zestaw pytań
Co do zamiany 13/10 na 1 i 3/10 to proste
Piszę warunek If Licznik > Mianownik Then ...
Liczba_całkowita = Licznik / Mianownik
Nowy_licznik = Licznik Mod Mianownik
Przepraszam jeśli się gdzieś pomylę, ja to pisze z głowy... a jest piątek
-
sp3ots
- Posty: 42
- Rejestracja: 08 wrz 2018, 10:26
Post
autor: sp3ots » 13 gru 2019, 19:44
"Co do zamiany 13/10 na 1 i 3/10 to proste
Piszę warunek If Licznik > Mianownik Then"
To już mam zrobione w drugim kodzie.
"Temp2 = Temp2 Mod 1000"
Wiem że byte jest do 255,
"Temp2 = Temp2 Mod 1000" nie zgłasza błędu, tak zostawię.
Zamiast byte można dać long, integer, w tej chwil to nie jest problem.
Przyszłość to dodanie LCD 2x16, potem klawiatura matrycowa.