Integrované prostředí rubriky Visual Basic

Autor: Ján Hanák

Začínáme s VB .NET

Úvod do světa .NET (11. díl)

Časová náročnost

(min):

45

Začátečník

Pokročilý

Profesionál

Použitý operační systém : Hlavní vývojový nástroj :

Další vývojový software :

Jiný software :

Windows 2000 SP3

Visual Basic .NET 2002

Žádný

Žádný

 

Nepřehlédněte exkluzivní Speciál pro programátory, který pojednává o jazykové interoperabilitě mezi jazyky Managed Extensions for C++ a Visual Basic .NET.

 

Vážení čtenáři,

 

v jedenácté lekci budeme pokračovat v problematice použití operátorů ve Visual Basicu .NET. Nejprve si představíme klasifikaci operátorů v přehledné formě, abyste získali základní přehled o všech kategoriích operátorů, s nimiž se můžete v nové verzi programovacího jazyka setkat. Poté přejdeme na bližší výklad aritmetických a porovnávacích operátorů. Přeji vám příjemné počtení.

 

Obsah

Klasifikace operátorů

Aritmetické operátory

Pro zvídavé programátory: Použití operátoru \ při centrování formuláře

Porovnávací operátory

Pro zvídavé programátory: Generování náhodných čísel pod drobnohledem

 

 

Klasifikace operátorů

 

Visual Basic .NET obsahuje značné množství operátorů, které můžete použít při různých příležitostech. Abyste měli ihned ze začátku základní přehled o operátorech, rozdělíme si je na několik homogenních skupin (tab. 1).

 

Kategorie operátorů

Charakteristika

Aritmetické operátory

 

Mezi aritmetické operátory patří tyto:

 

·          operátor pro sčítaní (+)

·          operátor pro odčítaní (-)

·          operátor pro násobení (*)

·          operátor pro dělení (/)

·          operátor pro celočíselné dělení (\)

·          operátor zbytku po dělení (Mod)

·          operátor pro umocňování (^)

 

Aritmetické operátory se používají při běžných matematických operacích s celými čísly, nebo s čísly s desetinnou částí.  

 

Porovnávací operátory

 

Porovnávací operátory se využívají při porovnávání hodnot dvou, nebo i více výrazů. Mezi porovnávací operátory zařazujeme tyto:

 

·          operátor rovnosti (=)

·          operátor nerovnosti (<>)

·          operátor menší než (<)

·          operátor větší než (>)

·          operátor menší nebo rovno (<=)

·          operátor větší nebo rovno (>=)

·          operátor Is

·          operátor Like

 

Přiřazovací operátory

 

Skupina přiřazovacích operátorů se ve Visual Basicu .NET značně rozrostla v důsledku zavedení tzv. zkrácených tvarů operátorů. Do této kategorie patří následující operátory:

 

·          operátor přiřazení (=)

·          zkrácený operátor pro sčítaní a přiřazení (+=)

·          zkrácený operátor pro odečítaní a přiřazení (-=)

·          zkrácený operátor pro násobení a přiřazení (*=)

·          zkrácený operátor pro dělení a přiřazení (/=)

·          zkrácený operátor pro celočíselné dělení a přiřazení (\=)

·          zkrácený operátor pro umocňování a přiřazení (^=)

·          zkrácený operátor pro zřetězení a přiřazení (&=)

 

Logické operátory

 

Logické operátory se vkládají do logických výrazů, přičemž pomocí operátorů lze získat pravdivostní hodnotu daného logického výrazu. Tato pravdivostní hodnota může posléze posloužit pro řízení jiných programových konstrukcí (např. rozhodovací konstrukce If či cyklů). Mezi logické operátory patří tyto:

 

·          operátor And

·          operátor AndAlso

·          operátor Or

·          operátor OrElse

·          operátor Not

·          operátor Xor

 

Operátory pro zřetězení

 

Operátory této kategorie se uplatňují při zřetězení dvou, nebo i několika operandů (tyto operandy mohou být řetězcového typu (String), nebo i jiného typu). Mezi operátory pro zřetězení patří:

 

·          operátor pro zřetězení (&)

·          operátor pro zřetězení (+)

 

Bitové operátory

 

Bitové operátory se používají při provádění operací nad jednotlivými bity hodnot celočíselných datových typů. Do skupiny bitových operátorů patří následující zástupci:

 

·          bitový operátor And

·          bitový operátor Or

·          bitový operátor Not

·          bitový operátor Xor

 

Jak si můžete všimnout, bitové operátory mají stejné názvy jako některé logické operátory. Ve skutečnosti ovšem existuje pouze jedna verze těchto operátorů, ovšem způsob práce operátorů je determinován na základě typu dodaných operandů. Operátorům, kterých činnost závisí od určitého kontextu (v tomto případě od typu operandů) se říká přetížené operátory. Přetížené operátory jsou užitečnou programovací technikou, protože operátory „vědí“, co mají provést se svými operandy.

 

Speciální operátory

 

Visual Basic .NET má v rukávu rovněž dvě esa, kterými jsou dva speciální operátory:

 

·          operátor AddressOf

·          operátor GetType

 

Operátor AddressOf umožňuje přístup k runtime adrese procedury nebo funkce. Operátor AddressOf se používá např. při tvorbě delegátů, nebo při programování vícevláknových aplikací.

 

Operátor GetType vrací typ vstupního objektu.

 

 

 

Aritmetické operátory

 

Aritmetické operátory můžete použít, kdykoliv budete potřebovat realizovat jistou aritmetickou operaci. Pravděpodobně nejčastěji se budete setkávat se základními aritmetickými operátory, mezi které patří operátory pro sčítaní, odčítání, násobení a dělení. Všechny tyto operátory pracují tak, jak byste čekali: Vezmou hodnoty svých operandů a provedou příslušnou matematickou operaci. Zde můžete vidět několik příkladů:

 

        Dim a, b, c, d As Integer

        a = 11 + 88

        b = 111 - 55

        c = b * 10

        d = CInt(c / 3)

        Me.Text = "a=" & a & " b=" & b & " c=" & c & " d=" & d

 

V uvedeném fragmentu zdrojového kódu se střetáváme s proměnnými a, b, c a d datového typu Integer. V dalších krocích jsou proměnné inicializované vypočtenými hodnotami. Tyto hodnoty představují výsledek práce aritmetických operátorů. Kdybyste tento kód umístili do událostní procedury Click tlačítka a spustili byste projekt, v titulkovém pruhu aktuální instance formuláře by se objevili pozměněné hodnoty použitých proměnných: a=99, b=56, c=560 a d=187. I když jsou výsledné hodnoty proměnných a, b a c vskutku pochopitelné, jisté pochybnosti byste mohli mít u proměnné d. Hodnota proměnné d je totiž 187, a to i přesto, že podíl čísel 560 a 3 je 186,6667. Jak je to možné? Tato skutečnost je způsobena použitím konverzní funkce CInt, která převede návratovou hodnotu operátoru pro dělení do podoby celého čísla. Připomínám, že konverzní funkci CInt je nutné použít v případě, kdy pracujete s aktivovanou volbou Option Strict On. Když operátor / dokončí svou práci, vrací zvyčejně výslední hodnotu v podobě desetinného čísla s dvojitou přesností (datový typ Double). Návratovou hodnotu operátoru převezme konverzní funkce CInt, která přetypuje předanou hodnotu na hodnotu datového typu Integer. Jelikož hodnoty typu Integer nemohou uchovávat desetinnou část čísla, je číslo zaokrouhleno. Tedy z přesné hodnoty 186,6667 se stane hodnota 187.

 

Pokud při programování nepoužíváte volbu Option Strict On, nemusíte konverzní funkci CInt volat explicitně. Visual Basic převede přetypování implicitně, ovšem výsledná hodnota uložená v proměnné d bude stejná (187).

   

Budete-li chtít získat přesnou hodnotu podílu, můžete použít tento programový kód:

 

        Dim a, b, c As Integer

        Dim d As Double

        a = 11 + 88

        b = 111 - 55

        c = b * 10

        d = c / 3

        Me.Text = "a=" & a & " b=" & b & " c=" & c & " d=" & d

 

Zcela jistě zajímavé bude použití operátoru pro celočíselné dělení (\):

 

        Dim x As Short = 100

        Dim y As Short = 26

        Me.Text = "Výsledek celočíselného dělení je " & x \ y

 

Operátor pro celočíselné dělení (\) vydělí hodnotu levého operandu hodnotou pravého operandu a vrátí podíl v podobě celočíselní hodnoty (v našem případě jde o hodnotu 3). Jelikož po „zavolání“ operátoru obdržíme celočíselnou hodnotu, není zapotřebí použít žádnou konverzní funkci. Kromě toho, celočíselné dělení je výpočetně méně náročné jako přesné dělení, při kterém je výsledkem číslo s pohyblivou desetinnou čárkou.

 

Správné použití operátoru pro celočíselné dělení může v jistých situacích znatelně ovlivnit rychlost vykonávání programového kódu. Nepotřebujete-li přílišnou přesnost, dalo by se říci, že operátor \ je pro vás „to pravé“.

 

Mnozí programátoři operátor pro celočíselné dělení neznají. Když jej proto použijete ve vhodné chvíli, můžete ukázat, jak znalí programátoři jste. Jestliže se budete ucházet o místo programátora ve Visual Basicu a ukážete znalost operátoru pro celočíselné dělení, vaše hodnota v očích vašeho budoucího zaměstnavatele zcela jistě stoupne. Z tohoto pohledu lze použití operátoru \ přirovnat pomyslné třešničce na dortu.  

 

Pro zvídavé programátory: Použití operátoru \ při centrování formuláře

 

Formulář (instance třídy Form1) lze umístit do středu obrazovky pomocí následujících řádků zdrojového kódu:

 

   Me.Top = (Screen.PrimaryScreen.Bounds.Height - Me.Height) \ 2

   Me.Left = (Screen.PrimaryScreen.Bounds.Width - Me.Width) \ 2

 

Při centrování formuláře použijeme třídu Screen. Třída Screen však nedisponuje veřejným konstruktorem, a proto nelze přímo vytvořit její instanci. Instance třídy Screen se vytvoří v okamžiku, kdy zavoláme veřejné metody nebo vlastnosti této třídy. V našem případě voláme vlastnost PrimaryScreen, která vrátí instanci třídy Screen. Vlastnost PrimaryScreen je sdílená (shared) a určena jenom pro čtení (readonly). Když zavoláme vlastnost PrimaryScreen, zjistíme primární zobrazovací jednotku (pokud počítač disponuje pouze jednou zobrazovací jednotkou, je vrácena tato, v opačném případě je vrácena ta zobrazovací jednotka, která je nakonfigurována jako hlavní). Dále voláme vlastnost Bounds, která vrátí instanci třídy Rectangle (také vlastnost Bounds je určena jenom pro čtení). Tato instance představuje obdélníkový region, jenž reprezentuje viditelnou plochu primární zobrazovací jednotky. Výšku, resp. šířku obdélníkového regionu získáme prostřednictvím vlastností Height a Width. Aby byl formulář vystředěn, je nutné od výšky, resp. šířky obdélníkového regionu odečíst výšku, resp. šířku formuláře a následně získané hodnoty vydělit dvěmi pomocí operátoru pro celočíselné dělení (\).

 

Předpokládejme, že používáte 17palcový monitor s rozlišením 1024x768 obrazových bodů. Spustíte-li uvedený kód, bude vlastnost Top formuláře rovna hodnotě 234 a vlastnost Left zase hodnotě 362. Při tomto výpočtu vycházíme ze skutečnosti, že rozměry formuláře mají implicitní velikost 300x300 obrazových bodů (viz obrázek).

 

   

 

Budete-li chtít získat zbytek po dělení, použijte operátor Mod. Kupříkladu následující kód vytiskne do titulku okna hlášení „Zbytek po dělení je 3“:

 

        Dim m, n As Byte

        m = 23

        n = 4

        Me.Text = "Zbytek po dělení je " & m Mod n

 

Podívejme se, proč je tomu tak. Algoritmus práce operátoru Mod probíhá přibližně v těchto krocích:

 

  1. Operand m je vydělen operandem n, tedy 23 / 4 = 5,75.
  2. Desetinná část podílu je ořezána, získáváme tedy celé číslo 5.
  3. Modifikovaná hodnota podílu je vynásobená operandem n, tedy 5 * 4 = 20.
  4. Od operandu m je odečten vypočtený součin, tedy 23 - 20 = 3.

 

Aby byl náš výklad aritmetických operátorů úplný, ukažme si ještě příklad operátoru pro umocňování:

 

        Dim k As Integer = 2, l As Integer = 8

        Me.Text = CStr(k ^ l)

 

Všeobecní forma použití operátoru pro umocňování je:

 

Číselná hodnota ^ exponent

 

V našem případě je vypočtena osmá mocnina čísla 2, která je rovna hodnotě 256. Operátor ^ před samotným výpočtem převede všechny operandy do datového typu Double a na takto upravených operandech je posléze provedena operace umocnění. Návratová hodnota operandu je opět datového typu Double, takže používáte-li volbu Option Strict On, budete muset v případě potřeby uskutečnit explicitní přetypování získané hodnoty.

 

Exponentem přitom může být jakýkoliv numerický výraz:

 

        Dim k As Integer = 2, l As Integer = 8

        Me.Text = CStr(k ^ (l * 2 - 6))

 

Tento programový kód vypočítá desátou mocninu čísla 2, což je 1024.

 

 

Porovnávací operátory

 

Porovnávací operátory porovnávají výrazy nebo části výrazů a na základě výsledků porovnání vracejí jistou pravdivostní hodnotu (buď hodnotu True nebo False). Více informací nabízí tab. 2.

 

Porovnávací operátor

Operandy

Výsledkem je pravdivostní hodnota True

Výsledkem je pravdivostní hodnota False

Operátor rovnosti (=)

a, b

a = b

a <> b

Operátor nerovnosti (<>)

a, b

a <> b

a = b

Operátor menší než (<)

a, b

a < b

a >= b

Operátor větší než (>)

a, b

a > b

a <= b

Operátor menší nebo rovno (<=)

a, b

a <= b

a > b

Operátor větší nebo rovno (>=)

a, b

a >= b

a < b

 

Ukázku použití porovnávacích operátorů přináší další fragment zdrojového kódu:

 

        Dim q, v As Short

        Randomize()

        q = CShort(Int((10 * Rnd()) + 1))

        If q >= 1 And q <= 5 Then

            For v = 1 To q

                Debug.WriteLine("Bylo vygenerováno číslo " & q)

            Next v

        End If

 

V tomto kódu jsou deklarované dvě proměnné (q, v) datového typu Short. Příkaz Randomize inicializuje generátor náhodných čísel, čili je patrné, že se budeme pokoušet o získání náhodných čísel z jistého číselného intervalu. Tento interval je tvořen čísly 1 až 10, přičemž pro vygenerování náhodných čísel používáme funkci Rnd. Funkce Rnd je v našem případě vnořena do funkce Int (pokud byste se chtěli dozvědět o generování náhodných čísel více, nepřehlédněte ostrůvek pro zvídavé programátory dále v tomto textu). Získané náhodné číslo je přetypováno do datového typu Short a přiřazeno do proměnné q. Pokud hodnota proměnné q z intervalu <1,5> je aktivován cyklus For-Next, který do okna Output vypíše uvedenou zprávu (zpráva bude vypsaná n-krát, kde n je obdržené náhodné číslo z intervalu <1,5>).

 

Pro zvídavé programátory: Generování náhodných čísel pod drobnohledem

 

Pro generování náhodných čísel se zvyčejně používá funkce Rnd společně s příkazem Randomize. Není-li příkaz Randomize následován numerickou hodnotou, která by inicializovala generátor náhodných čísel, je generátor inicializován na základě hodnoty získané prostřednictvím systémového času (přesněji jde o návratovou hodnotu funkce Timer). Příkaz Randomize nemusí být vůbec aplikován; v tomto případě je funkce Rnd inicializována posledně vygenerovaným číslem.

 

Funkce Rnd vrací hodnotu, která může být větší nebo rovna než nula, ovšem je vždy menší než 1. Takto získaná hodnota ovšem není zvyčejně použitelná, a proto je nějak smysluplně upravena. Vygenerovaná hodnota tak může být třeba vynásobena jistým číslem (nejčastěji mocninou čísla 10). Číslo, které bylo vytvořeno pomocí funkce Rnd, je uloženo ve tvaru datového typu Single (jde tedy o číslo s desetinnou částí). Protože při generování náhodných čísel se ve většině experimentů nepoužívá právě ona desetinná část čísla, bývá tato odstraněna. Existují dva způsoby, pomocí kterých lze „zlikvidovat“ desetinnou část náhodného čísla:

 

1. Zaokrouhlení náhodného čísla       

2. Ořezání desetinné části náhodného čísla

 

K zaokrouhlení náhodného čísla podle známých matematických pravidel dochází při následujících příležitostech:

 

1.      Při přiřazení náhodného čísla do celočíselné proměnné. V tomto okamžiku je implicitně realizována konverze náhodného čísla z datového typu Single do cílového celočíselného datového typu.   

2.      Při explicitně realizované konverzi použitím vhodné konverzní funkce, např. CInt nebo CShort.

 

Ořezaní desetinné části náhodného čísla lze uskutečnit zavoláním funkce Int nebo funkce Fix. Obě funkce odstraňují desetinnou část náhodného čísla, ovšem při práci se zápornými čísly se chovají poněkud odlišně (tato odlišnost nás ale nemusí zajímat, protože my pracujeme pouze s kladnými čísly).

 

Budete-li chtít získat náhodné celé číslo z jistého intervalu, použijte tuto magickou formulku:

 

Proměnná = Int ((Horní hranice intervalu – Dolní hranice intervalu + 1) * Rnd() + Dolní hranice intervalu)

 

Pro interval <0, 100> bude programový kód vypadat takto:

 

        Proměnná = CInt(Int((100 - 1 + 1) * Rnd()) + 1)

 

Aby kód vypadal uhlazeně, upravíme jej takto:

 

 

        Proměnná = CInt(Int(100 * Rnd()) + 1)

       

Algoritmus generování náhodného čísla má přibližně tuto podobu:

 

1.      Funkce Rnd vrátí náhodně vybranou numerickou hodnotu typu Single z intervalu <0, 1). Povězme, že funkce Rnd vybere hodnotu 0.234.

2.      Hodnota 0.234 je vynásobena hodnotou 100, čímž získáváme mezihodnotu 23.4.

3.      Funkce Int odstraní desetinnou část mezihodnoty, na což se z čísla s desetinnou částí stane celé číslo 23.

4.      K hodnotě 23 je připočtena hodnota dolní hranice zvoleného intervalu (v našem případě 1). Dostáváme tak konečnou podobu náhodného čísla 24.   

 

 

 

Právě jste dočetli 11. díl seriálu Začínáme s VB .NET. 

 

Jestliže se chcete dozvědět více informací o programování ve Visual Basicu .NET, neváhejte a navštivte také další sekce rubriky Visual Basic. A jakáže je dnešní nabídka?

Téma měsíce

Programování vícevláknových aplikací

Programátorská laboratoř

Tvorba zapečetěné třídy

Přístup k registrům operačního systému Windows

Vytváření vlastního delegáta

 

Nepřehlédněte exkluzivní Speciál pro programátory, který pojednává o jazykové interoperabilitě mezi jazyky Managed Extensions for C++ a Visual Basic .NET.