flickr galerie | Twitter @Padáček | Facebook profil | Foursquare profil | LinkedIn profil

Zápisky.info


03.05. 2005

Lameřím s Vižuálem

A je to tady! Od pátku jsem doma na svaťáku a „válím si šunky“ ... teda spíš ležím v učení. Musím se do středy 12.5. naučit maximum z matematiky, anglického jazyka, informatiky a literatury. Dneska jsem se zase chtěl na chvíli mrknout na informatiku, protože Visual Basic 6.0 a některé algoritmy jsou pro mě i po 3 letech semináře tak trochu „španělská vesnice“. Moc nepomáhají ani některé studijní materiály od naší profesorky ... ani by jste nevěřili, čemu všemu lze říkat studijní materiál.

Tak třeba Algoritmy celých čísel skrývají několik jednoduchých úloh, jako detekci prvočísel, rozklad čísla na součin prvočísel, nalezení největšího společného dělitele. Zní to jednoduše, ale zkuste najít jasnou a ovřeenou definici prvočísla. Pracoval jsem se čtyřmi a každá tvrdila něco jiného o číslech 1 a 2. Myslím, že asi nejpravděpodobnější bude ta z Wikipedie, tak jsem se podle ní zařídil.

Private Function IsPrime(ByVal n As Long) As Boolean
  Dim i As Long
  ' zvlastni osetreni pro 1 a 2 
  If n = 1 Then IsPrime = False
  If n = 2 Then IsPrime = True
  ' kontrola ostatnich cisel    
  If n > 2 Then
    If n Mod 2 = 0 Then
      IsPrime = False
    Else
      For i = 3 To Sqr(n) Step 2
        If n Mod i = 0 Then
          IsPrime = False
          Exit Function
        End If
      Next i
      IsPrime = True
    End If
  End If
End Function

Během psaní této funkce jsem zjistil, že VB6 divně provádí vracení hodnot z funkce a ukončování běhu, tzn. zapamatuje si návratovou hodnotu a klidně pokračuje v provádění, takže se vám může stát, že funkce vrátí něco jiného, než jste čekali ... pak tu byla další věc, která mě celou dobu vytáčela. Ty zdrojáky, co jsme od profesorky dostaly, nebyly špatné, ale formátování bylo pod psa, používaly zbytečně pole (které v podání VB nesnáším), algoritmy nešly použít samostatně, protože si navzájem předávaly data a taky pletly dohromady logiku a GUI (to sice někdy oddělit nejde, ale všeho moc škodí).

Proti tomu vypsání všech menších prvočísel, než je zadané číslo, patří mezi odpočinkové úlohy, pokud jste tu předešlou již zvládli. Samozřejmě to lze napsat tak, aby funkce vracela pole, ale tohle bylo nejrychlejší řešení:

Private Sub SmallerPrimes(ByVal n As Long, ByRef viewer As TextBox)
    Dim i As Long
    For i = 1 To n - 1
        If IsPrime(i) = True Then
            viewer.Text = viewer.Text & " " & i
        End If
    Next i
End Sub

Nakonec jsem musel nějak napsat rozklad přirozeného čísla na součin prvočísel. Profesorka k tomu použila Erastotenovo síto (a pole), já jsem to udělal trošku jinak:

Private Sub Rozklad(ByVal n As Long, ByRef viewer As TextBox)
    Dim i As Long
    ' inicializace
    i = 2
    ' vypocet
    Do While n > 1
        If n Mod i = 0 Then
            viewer.Text = viewer.Text & "." & i
            n = n / i
        Else
            i = NextPrime(i)
        End If
    Loop
End Sub

Celý fígl je v tom, že jsem si pole prvočísel nahradil voláním funkce NextPrime, kterou jsem si také sám napsal:

Private Function NextPrime(ByVal n As Long) As Long
    Dim i As Long
    ' vypocet
    i = n + 1    
    Do While Not IsPrime(i)
      i = i + 1     
    Loop
    NextPrime = i
End Function

A to je vše dámy a pánové, další maturitní otázky čekají.

12.12. 2004

Základy grafiky ve Visual Basic 6

Moje peripetie s Microsoft Visual Basic 6.0 se zdají být nekonečné. Ani si nedovedete představit, jak se těším na chvíli, kdy se zbavím „vižuálu“ natrvalo. Ale na to si budu muset minimálně do května počkat. Protože to máme ještě nějakých pět měsíců, je stále co se učit a probírat. Zrovna tento čtvrtek jsme začali „blbnout“ s grafikou. To je snad jediné, na co se tenhle jazyk dá pořádně použít.

Byl to však den poněkud zamotaný a nic mi nešlo, jak mělo. Nejvíce se to projevilo ve chvíli, kdy jsme měli napsat „aplikaci“, která podle dvou počátečních bodů kreslí na kliknutí do „plátna“ rovnoběžné stejně dlouhé úsečky. Psal jsem psal, ale vyšlo mi z toho tohle:

Aplikace kreslící přímky se společným počátečním bodem

No, hodně dlouhou dobu jsem na obrazovku hleděl a nechápal. Pak jsem si řekl, že ve škole už asi nic kloudného nevymyslím a raději jsem kecal s Dagim po ICQ. Jediné, co jsem ještě v hodině udělal, je, že jsem nenápadně od profesorky získal kód jednoho „bezvýznamného“ modulu:

' Datovy typ bodu
Public Type Point
  X As Single
  Y As Single
End Type
' Funkce pocitajici smerovy vektor
Public Function Vector(a As Point, b As Point) As Point
  Vector.X = a.X - b.X
  Vector.Y = a.Y - b.Y
End Function
' Procedura k nakresleni rovnobezne usecky
Public Sub DrawLine(a As Point, b As Point, c As Point, v As Point)
  Form1.Picture1.Line (a.X, a.Y)-(b.X, b.Y)
  Form1.Picture1.Line (c.X, c.Y)-(c.X + v.X, c.Y + v.Y)
End Sub

Doma jsem „uháčkoval“ projekt nový a s chladnou hlavou jsem napsal pár řádek, které konečně dělají to, co jsem si představoval:

Aplikace kreslící rovnoběžné úsečky

Jak jednoduché, že? Stačilo dopsat těchto pár řádek:

Option Base 1
' Globalni promnenne
Dim i As Integer
Dim points() As Point
' Procedura „mazajici“ platno
Private Sub Command2_Click()
  Picture1.Cls
  ReDim points(1)
  i = 1
End Sub
' Procedura ukoncujici aplikaci
Private Sub Command3_Click()
  End
End Sub
' „Konstruktor“ formulare
Private Sub Form_Load()
  i = 1
End Sub
' Procedura reagujici na kliknuti na platno
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  ReDim Preserve points(i)
  points(i).X = X
  points(i).Y = Y
  ' Na vykreslena usecky potrebujeme min. 2 body    
  If i > 2 Then
    Module1.DrawLine points(1), points(2), points(i), Module1.Vector(points(1), points(2))
  End If    
  i = i + 1
End Sub

To víte, potřeboval jsem si trochu zamachrovat, že „vižuál“ 6 umím. Faktem je, že k ničemu jinému mi tento jazyk není. Kdyby jste viděli, jak pracuje s textovými soubory a jaké fórky nám někdy připraví, tak ho máte „rádi“ minimálně jako já. Newmi a všichni ostatní, doufám, že jste si ten program opsali a spustili ...

P.S.: Pro ty, co Visual Baisc neznají, chci jen poznamenat, že všechny událostní procedury se jednoduše generují poklepáním na příslušný widget a vyjma inteligentního tooltipu, Visual sám opravuje malá písmena na velká, kde je to nutné a formátuje zdrojový kód.

Vložil Padacek v 19:52 | Visual Basic, C# .NET | Komentář: 1 [15.07.07 17:24]


Obsah © 2004 – 2006 Josef Petrák

Grafika © 2004 Dlouhý Webdesign

Redakční systém BLOG:CMS