Väärtustüüpi muutujad CSharp programmeerimiskeeles
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");
}
}