Väärtustüüpi muutujad CSharp programmeerimiskeeles: Difference between revisions

From ICO wiki
Jump to navigationJump to search
Htahis (talk | contribs)
Mposka (talk | contribs)
No edit summary
 
(13 intermediate revisions by one other user not shown)
Line 1: Line 1:
[[Category: Õppetöö]]
[[Category:Programmeerimine CSharp keeles]]
= Eesmärk =
= Eesmärk =
Antud õpiobjekti eesmärgiks on tutvustada väärtustüüpi muutujatüüpide olemust ning kasutamisvõimalusi C# programmeerimiskeeles.
Antud õpiobjekti eesmärgiks on tutvustada väärtustüüpi muutujatüüpide olemust ning kasutamisvõimalusi C# programmeerimiskeeles.
Line 9: Line 12:
* Koodinäited
* Koodinäited
* Praktilised ülesanded
* Praktilised ülesanded
= Materjalid =
** [http://msdn.microsoft.com/en-us/library/s1ax56ch.aspx Väärtustüüpi muutujad]


= Muutujad ja muutujatüübid =
= Muutujad ja muutujatüübid =
Line 25: Line 31:
= Väärtustüüpi muutujatüübid =
= Väärtustüüpi muutujatüübid =
'''Väärtustüüpi muutujad on muutujad, millistele eraldatakse initsialiseerimise käigus konkreetne mäluruum.'''
'''Väärtustüüpi muutujad on muutujad, millistele eraldatakse initsialiseerimise käigus konkreetne mäluruum.'''
===Näide:===
===Näide:===


Line 39: Line 43:




{| class="prettytable"
===Näide:===
| Näide:
 


<source lang="csharp">
int a;
int a;
//deklareeritakse 32 bitine täisarvtüüpi muutuja a
//deklareeritakse 32 bitine täisarvtüüpi muutuja a


Console.WriteLine(a); //siin tekib viga
Console.WriteLine(a); //siin tekib viga
</source>


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


Line 56: Line 58:




{| class="prettytable"
{|class="wikitable" border="1"
| Nimi
| Nimi
| Selgitus
| Selgitus
Line 201: Line 203:
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.
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===
<source lang=csharp>
struct inimene
{
    public string eesnimi;
    public string perenimi;
    public bool sex;
    public float weight;
}
</source>


{| class="prettytable"
| Näide:
'''&nbsp;&nbsp; '''struct''' '''inimene''' {'''
'''&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''public''' '''string''' eesnimi;'''
'''&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''public''' '''string''' perenimi;'''
'''&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''public''' '''bool''' sex;'''
'''&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''public''' '''float''' weight;'''
'''&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }'''
|}
Sellise struktuuriga saame luua uue muutuja kasutaja ja anda kasutajale, eesnime, perenime, soo ja kaalu:
Sellise struktuuriga saame luua uue muutuja kasutaja ja anda kasutajale, eesnime, perenime, soo ja kaalu:




{| class="prettytable"
===Näide===
| Näide:
<source lang=csharp>
 
 
inimene kasutaja;
inimene kasutaja;
 
kasutaja.eesnimi = "Jaan";
kasutaja.eesnimi = "Jaan"<nowiki>;</nowiki>
kasutaja.perenimi = "Mets";  
 
kasutaja.perenimi = "Mets"<nowiki>; </nowiki>
 
kasutaja.sex = 1;
kasutaja.sex = 1;
kasutaja.weight = 80.0;
kasutaja.weight = 80.0;
</source>


|}
= Tüübiteisendused =
= Tüübiteisendused =
Tüübiteisendusteks on kasutada kahte liiki vahendeid: konverteerimine ja vormimine.
Tüübiteisendusteks on kasutada kahte liiki vahendeid: konverteerimine ja vormimine.
Line 245: Line 231:
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.
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===
{| class="prettytable"
<source lang=csharp>
| Näide
string lause = "33";
 
int arv = lause; //tekib viga
string''' lause = '''"33"'''<nowiki>;</nowiki>'''
</source>
 
int''' arv = lause; '''//tekib viga
 
|}
Üks võimalus konverteerimiseks on kasutada System.Convert nimeruumi tööriistu:
Üks võimalus konverteerimiseks on kasutada System.Convert nimeruumi tööriistu:


 
===Näide===
{| class="prettytable"
<source lang=csharp>
| Näide
string lause = "33";
 
int arv = System.Convert.ToInt32(lause); // ei teki viga
string''' lause = '''"33"'''<nowiki>;</nowiki>'''
</source>
 
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.
System.Convert nimeruumis on olemas kõik vajalikud tööriistad kõigi enamlevinud väärtustüüpi muutujatüüpide tüübiteisendusteks.




{| class="prettytable"
{| class="wikitable" border="1"
| GetTypeCode
| GetTypeCode
| Tagastab tüübikoodi
| Tagastab tüübikoodi
Line 344: Line 322:


|}
|}
= Väärtuste vormimine =
= 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.
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===
<source lang=csharp>
Int64 SuurArv = 645433;
int arv = SuurArv; //saadakse viga
</source>


{| class="prettytable"
===Näide===
| Näide
<source lang=csharp>
 
Int64 SuurArv = 645433;
Int64''' SuurArv = 645433;'''
int arv = (int)SuurArv; //toimub väärtuse vormindamine
 
</source>
int''' arv = SuurArv; '''//saadakse viga
 
|}
 
{| class="prettytable"
| Näide
 
Int64''' SuurArv = 645433;'''
 
int''' arv = ('''int''')SuurArv; '''//toimub väärtuse vormindamine
 
|}
 
{| class="prettytable"
| Näide
 
double''' komaArv = 2.4;'''
 
int''' arv = ('''int''')komaArv; '''//toimub väärtuse vormindamine
 
|}
NB! Viimases näites toimub täpsuse kadu!


===Näide===
<source lang=csharp>
double komaArv = 2.4;
int arv = (int)komaArv; //toimub väärtuse vormindamine
</source>
'''NB! Viimases näites toimub väärtuse täpsuse kadu!'''


= Koodinäited =
= Koodinäited =
Line 382: Line 350:
== Kahe arvu liitmine ==
== Kahe arvu liitmine ==
Kõik Console.ReadLine() meetodi abil loetud väärtused on string tüüpi ehk tekst.
Kõik Console.ReadLine() meetodi abil loetud väärtused on string tüüpi ehk tekst.
 
<source lang="csharp">
class''' '''Program
class Program
 
{
'''{'''
  static void Main(string[] args)
 
  {
static''' '''void''' Main('''string'''<nowiki>[] args)</nowiki>'''
      Console.WriteLine("Sisesta esimene arv: ");
 
      int a = Convert.ToInt32(Console.ReadLine());
'''{'''
      Console.WriteLine("Sisesta teine arv: ");
 
      int b = Convert.ToInt32(Console.ReadLine());
'''Console.WriteLine('''"Sisesta esimene arv: "''');'''
      int summa = a + b;
 
      Console.WriteLine("Arvude " + a + " ja " + b + " summa on: " + summa);
int''' a = Convert.ToInt32(Console.ReadLine());'''
    }
 
}
'''Console.WriteLine('''"Sisesta teine arv: "''');'''
</source>
 
int''' b = Convert.ToInt32(Console.ReadLine());'''
 
int''' summa = a + b;'''
 
'''Console.WriteLine('''"Arvude "''' + a + '''" ja "''' + b + '''
 
" summa on: "''' + summa);'''
 
 
'''}'''
 
'''}'''


== Kahe arvu korrutamine ==
== Kahe arvu korrutamine ==
Kasutaja sisestatud väärtus ei pruugi alati olla teisendamiskõlbulik!
Kasutaja sisestatud väärtus ei pruugi alati olla teisendamiskõlbulik!


class''' '''Program
<source lang="csharp">
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);
static''' '''void''' Main('''string'''<nowiki>[] args)</nowiki>'''
        else
 
            Console.WriteLine("Sisestatud väärtus oli vales formaadis");
'''{'''
    }
 
}
'''Console.WriteLine('''"Sisesta arv"''');'''
</source>
 
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"''');'''
 
'''}'''
 
'''}'''
 
 
= Praktilised ülesanded =
== Eeldused ==
Vaata läbi teooria:
 
* MOC-2124C, moodul 2
* Microsoft Visual C# 2008 Step by Step, peatükk 1
 
== Käsi_hoitud tegevus ==
* Ülesanded 1-4 Blackboardis (inglisekeelsed juhendid)
 
== Käsi_mittehoitud tegevus ==
* Koosta rakendus, mis teisendab temperatuurinäidud Celsius-ühikutest Fahrenheit-Kelvin ühikutesse
** Lisainfo: [http://en.wikipedia.org/wiki/Celsius http://en.wikipedia.org/wiki/Celsius]
** Näide: [http://www.toidutare.ee/targadtabelid.php?show=temperatuur http://www.toidutare.ee/targadtabelid.php?show=temperatuur]
* Koosta sarnane rakendus ka formi- ja veebirakendusena
 
== Mul_on_igav_teeks_ka_midagi tegevus ==
* Koosta rakendus, mis võimaldaks konverteerida Eesti kroonis etteantud rahasummasid teistesse valuutatesse
** Näiteks kasutaja sisestab 10 -> väljund: 0,64 EUR; 0,9 USD; 1,54 GEL; 9204,71 IDR jne
** Kursid leiad [http://www.eestipank.info/dynamic/erp/erp_et.jsp http://www.eestipank.info/dynamic/erp/erp_et.jsp]
* Maasikas: lisa rakendusele funktsionaalsus, kus kursid loetakse dünaamiliselt programmi käivitamisel (et kasutaja saaks olla kindel, et kalkulaator töötab tänaste kurssidega)
** XML formaadis kursid: [http://www.eestipank.info/dynamic/erp/erp_xml.jsp http://www.eestipank.info/dynamic/erp/erp_xml.jsp]
** CVS formaadis kursid: [http://www.eestipank.info/dynamic/erp/erp_csv.jsp http://www.eestipank.info/dynamic/erp/erp_csv.jsp]

Latest revision as of 19:10, 7 October 2014


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");
    }
}