Seštevanje v binarnem številskem sistemu!

Pomoč pri izdelavi makrov
Odgovori
missy
Prispevkov: 40
Pridružen: To Apr 11, 2006 7:03 pm

Seštevanje v binarnem številskem sistemu!

Odgovor Napisal/-a missy »

Pozdravljeni, prosila bi vas če mi lahko napišete rešitev naslednje naloge, ker se ne vidim iz nje! Ne zanam niti začeti, no razen glave funkcije, to pa je tko kot nič!

Naloga pravi: Seštevanje v binarnem številskem sistem je podobno seštevanju v desetiškem. Seštevamo, tako kot v desetiškem sistemu, od desne proti levi. Kadar seštejemo dve enici (v spodnjem primeru se to zgodi na tretjem mestu z desne), je rezultat 0, 1 pa gre naprej.

101100110
+ 0110101
---------------------
110011011

Napišite funkcijo za seštevanje binarnih števil. Funkcija naj prejme seštevanca kot niza (string) in tudi rezultat naj bo niz.


Hvala, pa lep dan še naprej.
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Pozdravljeni,

Kje pa dobite te naloge? Da vam jaz slučajno ne rešujem kakšnih domačih nalog?

No kakorkoli, zaenkrat se ustaviva pri algoritmu, ki je, če malce premislite skrajno preprost. Obe števili je potrebno poravnati desno in seštevati pripadajoče indekse... Še mnogo lažje pa je, če:
  1. Obe števili obrnete.
  2. Sedaj lepo seštevate od indeksa 1 do največjega indeksa.
  3. Rezultat še enkrat obrnete.
Za izvedbo algoritma torej poterbujete le še dvoje:
  1. Napisati funkcijo, ki niz obrne
  2. Ugotoviti, kako iz niza dobiti poljuben indeks... to vam naredi funkcija MID.
Poskusite, ko se bo ustavilo, pa zopet vprašajte.
lp,
Matjaž Prtenjak
Administrator
missy
Prispevkov: 40
Pridružen: To Apr 11, 2006 7:03 pm

Odgovor Napisal/-a missy »

Koda: Izberi vse

Function obrni(s As String) As String

For i = Len(s) To 1 Step -1
    obrni = Mid(s, i, 1)
Next

End Function
To bi bla funkcija ki obrne, upam da je prau napisana!

Drugače pa so te naloge iz prejšnjih izpitov, ki jih rešujem za vajo ker bom imela čez dober teden izpit! Ne bi vas izkoriščala, da bi mi vi reševali domače naloge!!!

Vesela pa sem pomoči, ker se učim sama oz sošolec mi pomaga prek msn-ja, kolikor pač zna. So pa kake naloge take, ker ne vem kako bi jih rešila in se pol zapletem in tko gre pol cel dan mimo in ne rešim nič!

Tako mam kar nekaj nalog, ki naj bi mi za rezultat vračale true, če je neki npr pravilno in false če ni, sam ne morem ugotoviti kako naj bi to napisala tko da navasno pristanem pol kar pri navadni proceduri, ker ne znam napisati funkcije, ki bi mi vračala tak rezultat!

Še enkrat hvala za vso vašo pomoč, Missy.
missy
Prispevkov: 40
Pridružen: To Apr 11, 2006 7:03 pm

Odgovor Napisal/-a missy »

Če sem funkcijo obrni prav napisala pa imam velike probleme z frunkcijo seštej! Moja koda se mi zdi da je kar neki, ne vem kako naj v primeru rezultata 1, ki je pol 0, tisto 1 prištejem naprej!

Koda: Izberi vse

Function bin(niz1 As String, niz2 As String) As String
Dim m As String

obrni (niz1)
obrni (niz2)
m = ""
If niz1 > niz2 Then
    For i = 1 To Len(niz1)
        n = Mid(Cint(niz1), i, 1) + Mid(Cint(niz2), i, 1)
        If n = 2 Then
            m = m & 0
        End If
        m = m & n
        
    Next
Else
    For i = 1 To Len(niz2)
        n = Mid(Cint(niz1), i, 1) + Mid(Cint(niz2), i, 1)
    Next
End If
obrni (m)
End Function
Kak nasvet bi prišel prav!

Lp.
missy
Prispevkov: 40
Pridružen: To Apr 11, 2006 7:03 pm

Odgovor Napisal/-a missy »

Tko bom rekla nad to nalogo sem obupala, sem pa zato rešila eno drugo, ki mi je tud včeri delala težave!

Sam pr tej se pa ne vidim ven! Ne znam razmišljat kot programerji to je moj problem!! :(
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Pozdravljeni,

no ja, ne vem kaj točno se učite oz. zakaj se morate učiti programiranja; toda če boste tako hitro obupali potem to ravno ne bo najbolje... Pa še naloga je tako preprosta je :(. Na kateri šoli se učite VBA-ja in s kakšno literaturo?

Funkcijo obrni ste skoraj napisali pravilno. Zanimivo mi je, da pišete: "Ne vem če je pravilna"... Ja preizkusite ne! Postavite se lepo v okno 'immediate' in napišite:

Koda: Izberi vse

print obrni("12345")
in videli boste da vaša funkcija ne deluje pravilno. Potem pa jo pač popravljate tako dolgo, da je pravilna! Napaka je seveda v tem, da vi niza ne gradite; torej znakov mu ne dodajate, temveč mu vedno priredite samo en znak in zato vaša funkcija vrno vrne samo en znak in to je (algoritmično gledano zadnji znak v algoritmu), vsebinsko pa je to prvi znak niza. Niz morate sestavljati, tako kot je prikazano spodaj:

Koda: Izberi vse

Function obrni1(s As String) As String
  For i = Len(s) To 1 Step -1
    obrni1 = obrni1 & Mid(s, i, 1)
  Next
End Function
No kar pa se tiče seštevanja dveh nizov pa tudi ne razumem čemu obopujete. Spodaj imate funkcijo, ki je pisana z vsemi komentarji in je tako preprosta, da je že kar boleče :)

Koda: Izberi vse

Function Sestej(niz1 As String, niz2 As String) As String
  ' najprej oba niza obrnem
  niz1 = obrni1(niz1)
  niz2 = obrni1(niz2)
  
  ' poiščem daljši niz
  Dim dol As Integer
  If Len(niz2) > Len(niz1) Then
    dol = Len(niz2)
  Else
    dol = Len(niz1)
  End If
  
  ' deklariram izhod
  Dim izhod As String
  
  ' pri seštevanju lahko imam prenos
  Dim prenos As Integer
  
  ' na začetku je prenos 0
  prenos = 0
  
  ' v zanki se zapeljem skozi najdaljši niz in ustrezne indekse
  ' preprosto seštevam
  Dim i As Integer
  For i = 1 To dol
    Dim cifra1 As Integer
    Dim cifra2 As Integer
    
    ' ali smo že na koncu prvega niza, potem lahko tam privzamemo kar ničle!
    If (i > Len(niz1)) Then
      cifra1 = 0
    Else
      cifra1 = CInt(Mid(niz1, i, 1))
    End If
    
    ' enako za niz2
    If (i > Len(niz2)) Then
      cifra2 = 0
    Else
      cifra2 = CInt(Mid(niz2, i, 1))
    End If
    
    ' seštejam obe cifri in prenos
    Dim rezultat As Integer
    
    rezultat = cifra1 + cifra2 + prenos
    
    ' če je seštevek enak 3 potem moram zapisati 1 in prenos postaviti na 1
    If (rezultat = 3) Then
      izhod = izhod & "1"
      prenos = 1
    Else
      ' če je seštevek enak 2 potem moram zapisati 0 in prenos postaviti na 1
      If (rezultat = 2) Then
        izhod = izhod & "0"
        prenos = 1
      Else
        ' sicer zapišem izračunan seštevek, prenos pa postavim na 0
        izhod = izhod & rezultat
        prenos = 0
      End If
    End If
  Next
  
  ' ko sem na koncu moram še upoštevati poseben primer, ko je rezultat
  ' daljši od obeh števil; to je takrat, ko je prenos enak 1.
  ' V tem primeru moram dodati še enico!
  If (prenos = 1) Then izhod = izhod & "1"
  
  ' izhod še samo obrnem in to je rezultat
  Sestej = obrni1(izhod)
End Function
Pri tem vas opozarjam, da je ta funkcija dolga zato, ker je pisana povsem začetniško in ima vse komentarje, ter vam prikaže tudi dve pasti algoritma (vmesni rezltat je lahko tudi 3!) in na koncu lahko ostane še prenos!

Ampak ko gledam vašo kodo vidim, da vam kar nekako gre, toda res obupate na pol poti, dajte se malo potrudit. No seveda pa je koda v stilu:

Koda: Izberi vse

  obrni (niz1)
popolnoma brezvezna!!! Ja čemu pa ste priredili obrnjen niz? Računalniku ste zaukazali, naj niz obrne, rezultata pa niste shranili nikamor!
lp,
Matjaž Prtenjak
Administrator
Odgovori