Yleistä
Muuttujiin talletaan tiedot, joita
ohjelma käsittelee. Tieto voi olla lukuja ja merkkejä, tieto voi olla
esitetty yksittäinä arvoina, vektoreina tai taulukkomuodossa. Muuttujat
ovat siis tietovarastoja, tietovarastot ovat erilaiselle tiedolle
erikokoisia. Siksi C-kielessä tiedolla on aina tyyppi, tyyppi kertoo
muuttujan tarvitseman muistin määrän. Tietokoneen muistia kuvataan
tavuilla. Tavun pituus on kahdeksan bittiä. Kahdeksalla
bitillä voidaan kuvata luvut 0...255 tai -128...+127. Esimerkiksi
ASCII-taulukossa,
joka sisältää tietokoneen esittämät merkit, jokainen kirjoitettava
merkki edustaa lukua 0...255. Täten yksi merkki varaa tietokoneelta
muistia yhden tavun. (UNI-koodissa merkkit esitetään kahdella tavulla,
jollin voidaan esittää 65535, jolloin
miltei kaikki maailman merkit saadaan esitettyä ilman erillisiä
kooditaulukoita)
C-kielessä muuttujilla voi olla seuraava tyyppi:
• char
= merkki
• int
=
kokonaisluku
• float
= reaaliluku
• double =
kaksoistarkkuuden
reaaliluku
• void
= tavuosoitin, (alussa
voidaan ajatella, että tämä ei tarkoita mitään)
Muuttujan tyyppi kertoo sen, millaista tietoa muuttujaan voi tallentaa,
esimerkiksi
char OmaMuuttuja voi tallettaa yhden merkin.
Eli muuttujaan OmaMuuttuja voidaan sijoittaa yksi merkki,
esimerkiksi,
OmaMuuttuja = ’a’; //huom! yksittäiset merkit laitetaan heittomerkkien
väliin.
Toinen esimerkki.
int iLuku; // kokonaislukumuuttuja, joka voi tallettaa 16-bittisen etumerkillisen luvun
Muuttuja voidaan haluttaessa myös alustaa esittelyn yhteydessä, esim.
int Luku=5;
char Merkki='a';
Muuttujalle voidaan antaa lisämääreitä:
• signed = etumerkillinen
• unsigned = etumerkitön
• long = pitkä
• short = lyhyt
Esim.
unsigned int Luku = 65535; //Muuttuja voi olla ainoastaan positiivinen
kokonaisluku
Lisämääreillä tarkennetaan tyyppiä. Lisämääreiden merkitys on
kääntäjäkohtaista ja siksi ne on syytä tarkastaa ko. kääntäjän
käsikirjoista.
Muuttujan nimeäminen
Muuttuja kannattaa nimetä selkeällä nimellä, joka kertoo muuttujan
käyttötarkoituksen. Huom! isot ja pienet kirjaimet tarkoittavat eri asiaa.
Puhdas C-kielen esittelytapa on seuraava:
int auton_nopeus;
Muuttujan eri sanat voidaan erotella toisistaan esimerkiksi
alaviivalla.
C++:ssa käytetään tyypillisesti tapaa, jossa muuttujassa olevat sanat
aloitetaan isoilla kirjaimilla seuraavasti:
int AutonNopeus;
Monet ohjelmoitsijat liittävät muuttujan eteen kirjaimen kuvaamaan
muuttujan tyyppiä seuraavasti:
int iAutonNopeus;
Tyypistä otetaan yksi kirjain muuttujan eteen muistuttamaan
ohjelmoitsijaa muuttujalle annetusta tyypistä. (tätä sanotaan
unkarilaiseksi notaatioksi)
Edellä mainitut muuttujien nimeystavat eivät vaikuta millään tapaa
muuttujan käyttöön tai ohjelman toimintaan.
Muuttujan näkyvyysalue
Muuttuja voi olla käytettävissä ainoastaan yhdessä funktiossa (paikallinen), yhdessä
tiedostossa tai koko ohjelmassa. Riippuen siitä missä kohtaa ohjelmaa
muuttuja esitellään, sitä voidaan käyttää ohjelmassa eri tavoin.
Yhteinen eli public muuttuja
Yhteinen, globaali, public muuttuja esitellään
kaikkien funktioiden
ulkopuolella ja se "näkyy" eli se on käytettävissä kaikissa
funktioissa, jotka ovat samassa tiedostossa kuin muuttuja. Yhteistä
muuttujaa on hyvin helppo käyttää, koska sen arvoon päästään käsiksi
kaikista funktioista. Kun ohjelma kasvaa suureksi, siinä voi olla
tuhansia muuttujia, jolloin yhteisten muuttujien käyttö tulee
hankalaksi ja ohjelmasta tulee altis virheille.
Paikallinen eli local muuttuja
Paikallinen muuttuja esitellään funktion sisällä ja se on käytettävissä
ainoastaan siinä funktiossa, jossa se on määritelty. Alkuarvokseen
paikallinen muuttuja saa satunnaisarvon, siksi paikalliset muuttujat
monesti alustetaan johonkin alkuarvoon esittelyn yhteydessä.
Paikallinen muuttuja katoaa (ja siten kadottaa arvonsa), kun funktio
päättyy.
Paikallinen staattinen muuttuja
Jos halutaan paikallisen muuttujan muistavan arvonsa siitä, kun funktio
suoritettiin edellisen kerran, täytyy muuttuja esitellä staattisena
esim. seuraavasti:
static int Laskuri;
Staattinen muuttuja saa automaattisesti alkuarvokseen nollan, joten
sitä ei alusteta esittelyn yhteydessä. Staatisena esitellyllä
muuttujalla voidaan esim. laskea, kuinka monta kertaa ko. funktiossa on
käyty.
Yhteinen staattinen muuttuja
Haluttaessa rajata yhteisen muuttujan näkyvyys ainoastaan siihen
tiedostoon, jossa se on esitelty, täytyy yhteinen muuttuja esitellä
staattisena esim. seuraavasti:
static long Summa;
Edellä oleva määrittely kannatta tehdä esim. silloin kun samaa
ohjelmistoprojektia tekee useita henkilöitä ja halutaan estää
samanimisten eri tiedostoissa olevien muuttujien vaikutus toisiinsa.
Nämäkin muuttujat täytyy tietysti esitellä funktioiden ulkopuolella.
Vektori
Vektori on yksiuloitteinen taulukko. Vektorissa kaikkien
jsenten tyyppi on sama. Vektori esitellään esimerkiksi seuraavasti:
int lukuja[100];
tai
int lukuja[100]={0}; // nyt kaikille
alkioille annetaan alkuarvoksi 0
Vektorin alkioiden tyyppi voi olla mikä tahansa C:n tyypeistä.
char Merkkijoono[100]; // merkkijonoon
voidaan laittaa 99 merkkiä ja lopetusmerkki
tai
char Merkkijono[]="sdfadfasd";//nyt
varataan merkkien määrä +1 nollamerkkiä varten joka lopettaa
merkkijonon
Taulukkomuuttujat
C-kieli käsittelee taulukoita indeksien avulla. Indeksointi alkaa
nollasta. C-kieli ei sisällä taulukon ylivuodon tarkastusta vaan se on
ohjelmoitsijan tehtävä. Taulukon kaikki alkiot ovat samaa tyyppiä
keskenään. Taulukko esitellään seuraavasti:
int OmaTaulukko[5][4];
Voidaan ymmärtää että ensimmäinen on rivi-indeksi ja toinen on
sarakeindeksi. Huomaa, että ensimmäinen indeksi on välillä 0...4 ja
toinen 0...3. Taulukon haluttuun paikkaan päästään indeksien avulla
seuraavasti:
int Arvo;
Arvo=
OmaTaulukko[1][2];
Pelkkä taulukon nimi on osoitin taulukon alkuun. Eli kaksi seuraavaa
tapaa osoittaa samaan alkioon:
Arvo=*OmaTaulukko;
tai
Arvo= OmaTaulukko[0][0];
Haluttaessa osoittaa toista taulukon alkiota, voidaan se tehdä
seuraavasti:
int
*Osoitin;
Osoitin=
OmaTaulukko;
Osoitin++;//lisätään
osoitetta yhdellä
Arvo=*Osoitin;
Osoitin ”juoksee” taulukon läpi rivi kerrallaan.
Merkkijonot
Merkkijono on vektori eli yksiulotteinen taulukko. C-kielessä ei merkkijonoille ole valmista
muuttujaa, vaan merkkijonot on esiteltävä vektoreina seuraavasti:
char Sukunimi[100];
Merkkijono on tyyppiä char ja merkkijonon perään laitetaan
hakasulkuihin merkkien suurin sallittu määrä +1. Viimeinen merkkijonon
merkki on varattu lopetusmerkille \0, jonka ascii arvo on nolla, siitä
kääntäjä tietää, mihin merkkijono loppuu. Merkkijonon esittelyssä
muistista varattu alue ei tyhjene vaan sinne jää aikaisempi sisältö.
Merkkijono voidaan alustaa esittelyn yhteydessä:
char Sukunimi[100]="Jokunen";
tai
char Sukunimi[]="Jokunen";
Viimeisessä vaihtoehdossa merkkijonon suurimmaksi sallituksi pituudeksi tulee 8 eli kun
merkkijono alustetaan esittelyn yhteydessä ilman hakasulkujen välissä
olevaa lukua, kääntäjä laskee merkkijonon pituuden automaattisesti.
Tietue, struct
Tietue (struct) on erilaisten tietojen joukko, joka on yhdistetty yhden
nimen alle. Tietueita käytetään tietokantojen yhteydessä, kun samaan
tietojoukkoon täytyy tallettaa erityyppistä tietoa. Seuraavassa on
esimerkki tietuemäärittelystä työntekijälle.
struct TyontekijaTiedot
{
char Sukunimi[50];
char Etunimi[50];
char Sotu[15];
int Palkka;
};
TyontekijaTiedot tietuerakenne voidaan ottaa käyttöön seuraavasti:
struct TyontekijaTiedot Tyontekija;
Nyt voidaan antaa työntekijälle nimi
strcpy(Tyontekija.Sukunimi,”Jokunen”);
ja palkka
Tyontekija.Palkka=15000;
Edellä olevassa tavassa on se ongelma, miten esitellä 1000 työntekijää?
Seuraavassa kappaleessa on osittainen vastaus tähän.
Tietuetaulukot
Tietuetaulukon avulla voidaan esitellä monta tietuetta sisältävä
tietokokonaisuus seuraavasti:
struct Varastohyllyt
{
char Nimike[50];
int Kolliluku;
};
void main(void)
{
int Paikka=0;
struct Varastohyllyt Hylly[1000];
strcpy(Hylly[Paikka].Nimike,”Kossu”);
Hylly[Paikka].Kolliluku=10;
}
Esitetty taulukkomäärittely soveltuu tapauksiin, joissa etukäteen
tiedetään, kuinka monta
jäsentä taulukkoon kuuluu. Osoittimien avulla voidaan käsitellä
tietuetaulukoita joustavam-
min, palaamme niihin myöhemmin.
Union
union on vaihtoehtorakenne, jolla voidaan vaihtoehtoisesti tallettaa
tiettyyn tietueen kohtaan
vaihtoehtoisen tyyppistä tietoa,esim:
union Luku// esitellään union:
{
int iArvo; //
double dArvo; //
};
void JokuFunktio()
{
struct Luku Eka,Toka;
int iLuku=5;
double dLuku=10.45;
Eka.iArvo=iLuku;
Toka.dArvo=dLuku;
...
}.
Union tietueen osana
Sellaisissa tapaksissa, joissa samaan tietueen kenttään halutaan
tallettaa erityyppistä tietoa,
unionia käytetään tietueen osana.
struct
TyontekTiedot
{
char sSukunimi[50];
char sEtunimi[50];
union ID
{
char sSotu[15];
int HenkiloID;
};
int Palkka;
}