Väärtustüüpi muutujad CSharp programmeerimiskeeles

From ICO wiki


Eesmärk

Antud õpiobjekti eesmärgiks on tutvustada väärtustüüpi muutujatüüpide olemust ning kasutamisvõimalusi C# programmeerimiskeeles.

  • Muutujad ja muutujatüübid
  • Väärtustüüpi muutujad
  • Väärtustüüpi muutujatüübid C# programmeerimiskeeles
  • Struktuurid
  • Tüübiteisendused
  • Koodinäited
  • Praktilised ülesanded

Materjalid

Muutujad ja muutujatüübid

Programmeerimise käigus on reeglina vaja hoida meeles mingit hulka andmeid (vahetulemused, toimunud sündmused, sisendväärtused, väljundväärtused jne). Neid väärtused tuleb hoida mälus. Selleks defineeritakse koht mälus, mida kasutatakse andmete hoidmiseks ning seda defineeritud kohta nimetatakse muutujaks. Kuna andmed, mida hoitakse võivad olla väga erinevad, siis öeldakse ka muutuja defineerimisel, mis tüüpi andmeid selles muutujas hoidma hakatakse (muutujatüüp).


Muutujatüübi vajadus tuleneb eelkõige selles, et erinevad andmed võtavad mälus erineva koguse mäluruumi. Näiteks 8 biti ehk ühe baidi mäluruumi abil on võimalik meeles hoida 28=256 erinevat seisu. 256 erineva seisu abil on võimalik: hoida meeles täisarve 0..255, märgiga täisarve -128..127, ASCII kooditabeli abil ühe sümboli jne. Kahendsüsteemi arv 111111112 võib tähistada näiteks täisarvu 255 või ka -1, et teada millena seda väärtust käsitleda peab olema öeldud, mis tüüpi andmetega on tegu.

Tuntumad muutujatüübid on: tõeväärtus, märgita täisarv, märgiga täisarv, reaalarv (komakohaga), tähemärk, tekst jne. Kuna erinevad andmed võtavad erinevalt mäluruumi, siis on ka erinevat tüüpi muutujad mälus erineva suurusega. Kõige vähem mäluruumi nõuab tõeväärtusmuutuja (kaks seisu õige/vale) – 1 bitt ja täisarvud (2-8 baiti), reaalarvulised muutujad nõuavad juba rohkem mälu ja teksti hoidmiseks on vaja vähemalt 1 bait ühe sümboli kohta.

Muutujatüübid võib jaotada: väärtustüübid (muutujad, millel on konkreetne suurus ja koht) ja viitetüüpi. Selles õpiobjektis vaatleme eelkõige väärtustüüpi muutujatüüpe.


Väärtustüüpi muutujatüübid

Väärtustüüpi muutujad on muutujad, millistele eraldatakse initsialiseerimise käigus konkreetne mäluruum.

Näide:

int a;
//deklareeritakse 32 bitine täisarvtüüpi muutuja a

int b=2;
//deklareeritakse ja initsialiseeritakse muutuja b

Initsialiseerimise käigus reserveeritakse väärtustüüpi muutuja hoidmiseks vajalik mäluruum ning väärtustüüpi muutuja korral on muutuja seotud alati just sellele mäluosaga. Initsialiseerimata muutuja poole pöördudes saadakse viga koodi kompileerimise käigus. Muutuja initsialiseeritakse esimese väärtustamise käigus (ehk siis, kui muutujale omistatakse esimest korda väärtus).


Näide:

int a;
//deklareeritakse 32 bitine täisarvtüüpi muutuja a

Console.WriteLine(a); //siin tekib viga

Eelnevast järeldub, et väärtustüüpi muutujad on C# programmeerimiskeeles algväärtustamata!

Levinumad väärtustüüpi muutujatüübid

C# programmeerimiskeeles on levinumad muutujatüübid järgmised:


Nimi Selgitus Suurus Väärtuste vahemik Kasutamine
bool

System.Boolean

Tõeväärtustüüp 8 bitti true / false bool seis;

seis = false;

byte

System.Byte

Bait 8 bitti 0 kuni 255 byte bait;

bait = 8;

char

System.Char

Tähemärk 16 bitti U+0000 kuni U+ffff char taht;

taht = ’a’;

decimal

System.Decimal

Rahaliste suuruste hoidmiseks mõeldud muutujatüüp 128 bitti 28-29 numbrikohta, märgiga, kaks komakohta decimal raha;

raha = 99.9m;

double

System.Double

64 bitine reaalarv 64 bitti ±5.0 × 10−324 kuni

±1.7 × 10308

double reaal;

reaal = 6,5454221;

float

System.Single

32 bitine reaalarv 32 bitti ±1.5 × 10−45 kuni

±3.4 × 1038

float arv

arv = 6,5454221f;

int

System.Int32

32 bitine täisarv 32 bitti -2 147 483 648 kuni 2 147 483 647 int i;

i = 321;

long

System.LOng

64 bitine täisarv 64 bitti –9 223 372 036 854 775 808

kuni

9 223 372 036 854 775 807

long pikkI;

pikkI = 823111331131312;



sbyte

System.SByte

Märgiga 8 bitine täisarv 8 bitti -128 kuni 127 sbyte sbait;

sbait = -8;

short

System.Int16

16 bitine täisarv 16 bitti -32768 kuni 32767 Short lyhike;

lyhike = 321;

uint

System.UInt32

32 bitine märgita täisarv 32 bitti 0 kuni 4 294 967 295 uint positiivne;

positiivne = 321;

Lisalugemist: http://msdn.microsoft.com/en-us/library/s1ax56ch(VS.80).aspx

Struktuurid

Hoidmaks erinevate tüüpi andmeid, mis moodustavad koos mingi seostatud kogumi kasutatakse struktuure. Näiteks moodustub struktuur inimene järgmistest andmetest: eesnimi (tekst), perenimi (tekst), sugu (tõeväärtus, 0- naine, 1 -mees), kaal (reaalarv). Sellised andmed moodustavad ühtse terviku ühe inimese kirjeldamiseks, kuid eraldiseisvana on väga erinevat tüüpi.

Näide

struct inimene
{
    public string eesnimi;
    public string perenimi;
    public bool sex;
    public float weight;
}

Sellise struktuuriga saame luua uue muutuja kasutaja ja anda kasutajale, eesnime, perenime, soo ja kaalu:


Näide

inimene kasutaja;
kasutaja.eesnimi = "Jaan";
kasutaja.perenimi = "Mets"; 
kasutaja.sex = 1;
kasutaja.weight = 80.0;

Tüübiteisendused

Tüübiteisendusteks on kasutada kahte liiki vahendeid: konverteerimine ja vormimine.

Konverteerimine on võimaluse korral ühes andmeformaadis oleva väärtuse teisendamine teise andmeformaati. Näiteks: kui meil on olemas string taht, milline hoiab väärtust „3“, siis me ei saa, seda väärtust omistada otse täisarvtüüpi muutujale. Eelnevalt tuleb teostada tüübiteisendus.

Näide

string lause = "33";
int arv = lause; //tekib viga

Üks võimalus konverteerimiseks on kasutada System.Convert nimeruumi tööriistu:

Näide

string lause = "33";
int arv = System.Convert.ToInt32(lause); // ei teki viga

System.Convert nimeruumis on olemas kõik vajalikud tööriistad kõigi enamlevinud väärtustüüpi muutujatüüpide tüübiteisendusteks.


GetTypeCode Tagastab tüübikoodi
ToBoolean Tagastab tõeväärtustüübi
ToByte Tagastab bait-tüüpi väärtuse
ToChar Tagastab tähemärgi
ToDateTime Tagastab DateTime tüüpi väärtuse
ToDecimal Tagastab decimal tüüpi väärtuse
ToDouble Tagastab double tüüpi väärtuse
ToInt16 Tagastab short tüüpi väärtuse
ToInt32 Tagastab int tüüpi väärtuse
ToInt64 Tagastab long tüüpi väärtuse
ToSByte Tagastab sbyte tüüpi väärtuse
ToSingle Tagastab single tüüpi väärtuse
ToString Tagastab string tüüpi väärtuse
ToUInt16 Tagastab ushort tüüpi väärtuse
ToUInt32 Tagastab int tüüpi väärtuse

Bottom of Form

Bottom of Form



ToUInt64 Tagastab ulong tüüpi väärtuse

Bottom of Form

Bottom of Form

Väärtuste vormimine

Teatud juhtudel on võimalik muutujate väärtuste vormimine (ik cast). See on võimalik eelkõige siis, kui muutujatüübid on lahedased, kuid täpsus (või väärtuste võimalik vahemik) erinev. Vormimiseks tuleb muutuja nime ette sulgudesse kirjutada sobiv muutujatüüp, millele vastavaks soovitakse väärtus vormindada.

Näide

Int64 SuurArv = 645433;
int arv = SuurArv; //saadakse viga

Näide

Int64 SuurArv = 645433;
int arv = (int)SuurArv; //toimub väärtuse vormindamine

Näide

double komaArv = 2.4;
int arv = (int)komaArv; //toimub väärtuse vormindamine

NB! Viimases näites toimub väärtuse täpsuse kadu!

Koodinäited

Järgnevalt mõned näited väärtustüüpi muutujate kasutamisest:

Kahe arvu liitmine

Kõik Console.ReadLine() meetodi abil loetud väärtused on string tüüpi ehk tekst.

class Program
{
   static void Main(string[] args)
   {
      Console.WriteLine("Sisesta esimene arv: ");
      int a = Convert.ToInt32(Console.ReadLine());
      Console.WriteLine("Sisesta teine arv: ");
      int b = Convert.ToInt32(Console.ReadLine());
      int summa = a + b;
       Console.WriteLine("Arvude " + a + " ja " + b + " summa on: " + summa);
    }
}

Kahe arvu korrutamine

Kasutaja sisestatud väärtus ei pruugi alati olla teisendamiskõlbulik!

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Sisesta arv");
        double arv;
        string tmp = Console.ReadLine();

        if (double.TryParse(tmp, out arv))
            Console.WriteLine(arv * arv);
        else
            Console.WriteLine("Sisestatud väärtus oli vales formaadis");
    }
}