Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

Yleistä

Muuttujiin talletaan talletetaan tiedot, joita ohjelma käsittelee. Tieto voi olla lukuja ja merkkejä, tieto voi olla esitetty yksittäinä arvoina , vektoreina tai taulukkomuodossa. tai taulukkomuodossa.

Muuttujan määritteleminen tapahtuu seuraavasti:

No Format
tyyppi muuttujan_nimi;

, missä tyyppi on tiedon tyyppi ja muuttujan_nimi on muuttujan nimi.

Esimerkiksi yhden kokonaislukumuuttujan määritteleminen:

Code Block
int muuttuja1;

Muuttujan tyyppi

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  Unicode-merkistössä merkit esitetään kahdella tavulla, jollin jolloin voidaan esittää 65535 erilaista merkkiä, jolloin miltei kaikki maailman merkit saadaan esitettyä ilman erillisiä kooditaulukoita)

C-kielen muuttujien tyypit ja arvoalueet 32 bittisessä järjestelmässä:

tyyppi

merkitys

tavuja

etumerkitön lukualue

etumerkillinen lukualue

char

merkki

1

0...255

-128...+127

short

lyhyt kokonaisluku

2

0...65536

-32767...+32768

int

kokonaisluku

4

0...4294967296

-2147483647...+2147483648

long

pitkä kokonaisluku

8

0...18446744073709551615

-9223372036854775808...+9223372036854775807

float

reaaliluku

4

-

?

double

kaksoistarkkuuden reaaliluku

8

-

?

void

tavuosoitin (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,:

Code Block
char OmaMuuttuja = 'a'; // huom\! yksittäiset merkit laitetaan heittomerkkien väliin.

Toinen esimerkki.:

Code Block
int iLukuLuku = 5; // kokonaislukumuuttuja, joka voi tallettaa etumerkillisen luvun 

Muuttuja voidaan haluttaessa myös alustaa esittelyn yhteydessä, esim.

Code Block

int Luku=5;
char Merkki='a';

Muuttujalle voidaan antaa lisämääreitä:

Määre

Merkitys

Käy seuraaviin tyyppeihin

signed

etumerkillinen

char, int

unsigned

etumerkitön

char, int

long

pitkä

int, double

short

lyhyt

int

Esim.

Code Block
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:

...

Muuttujan eri sanat voidaan erotella  erotella toisistaan esimerkiksi alaviivalla.

...

Code Block
int AutonNopeus;

Monet ohjelmoitsijat ohjelmoijat liittävät muuttujan eteen kirjaimen kuvaamaan muuttujan tyyppiä seuraavasti:

...

Muuttuja voi olla käytettävissä ainoastaan ohjelmalohkossa, yhdessä funktiossa (paikallinen), yhdessä tiedostossa tai koko ohjelmassa. Riippuen siitä missä kohtaa ohjelmaa muuttuja esitellään, sitä voidaan käyttää ohjelmassa eri tavoin.

Yhteinen

...

muuttuja (global variable)

Yhteinen, tai 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.

Code Block

...


#include <stdio.h>

int x=0; // Yhteinen (globaali) muuttuja
int y=0; // Yhteinen (globaali) muuttuja

int main()
{
   return 1;
}

Paikallinen muuttuja (local variable)

Paikallinen muuttuja esitellään ohjelmalohkon (tai funktion) sisällä ja se on käytettävissä ainoastaan siinä funktiossalohkossa, jossa se on määritelty. Alkuarvokseen paikallinen muuttuja saa satunnaisarvon, siksi paikalliset muuttujat monesti alustetaan tulee alustaa johonkin alkuarvoon esittelyn yhteydessä.
Paikallinen muuttuja katoaa (ja siten kadottaa arvonsa), kun ohjelmalohko (tai funktio) päättyy.

Paikallinen staattinen muuttuja

Jos halutaan paikallisen muuttujan muistavan arvonsa siitä, kun funktio suoritettiin edellisen kerran, täytyy muuttuja esitellä staattisena esim. seuraavastiEsimerkki funktion paikallisesta muuttujasta:

Code Block

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:

Code Block

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:

Code Block

int lukuja\[100\];

tai

Code Block

int lukuja[100]= { 0 }; // nyt kaikille alkioille annetaan alkuarvoksi 0

Vektorin alkioiden tyyppi voi olla mikä tahansa C:n tyypeistä.

Code Block

char Merkkijoono[100]; // merkkijonoon voidaan laittaa 99 merkkiä ja lopetusmerkki

tai

Wiki Markup
&nbsp;&nbsp;&nbsp; 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:

Wiki Markup
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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:

Wiki Markup
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int Arvo;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; Arvo = OmaTaulukko\[1\]\[2\];

Pelkkä taulukon nimi on osoitin taulukon alkuun. Eli kaksi seuraavaa tapaa osoittaa samaan alkioon:

Wiki Markup
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Arvo = \*OmaTaulukko;
tai
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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;


float funktio()
{
    float f;                               // Funktion paikallinen muuttuja
    printf("Anna liukuluku: ");
    scanf("%f", &f);
    printf("Annoit luvun %.2f\n", f);
    return f;
}

int main()
{
    int i;
    float a=0.0;                           // Main-funktion paikallinen muuttuja
    for (i=0; i<100; i++) {
        a=funktio();
        printf("a on %f",a);
    }
    return i;
}

Esimerkki ohjelmalohkon paikallisesta muuttujasta:

Code Block

int main()
{
    int i;                                 // Main-funktion paikallinen muuttuja

    for (i=0; i<100; i++) {
        float f;                           // For-toistorakenteen sisäinen paikallinen muuttuja
        printf("Anna liukuluku: ");
        scanf("%f", &f);
        printf("Annoit luvun %.2f\n", f);
    }
}

Samannimiset muuttujat

Ohjelmassa ei saa olla saman nimisiä muuttujia, paitsi jos ne on määritelty eri näkyvyysalueelle. Eli ohjelmassa voi olla globaali muuttuja int x sekä myös mainissa muuttuja int x. Tämä on sallittua, tosin ei suositeltavaa ilmiselvän sekaannusvaaran takia.

Code Block

#include <stdio.h>

int x = 5;                                // Globaali muuttuja

int main()
{
    int x = -100;                         // Main-funktion paikallinen muuttuja

    printf("x = %d\n", x);
}

Minkä arvon ohjelma tulostaa?

No Format

Vastaus: x = -100

Jos ohjelmassa on saman nimisiä muuttujia, viitataan aina 'lähinnä olevaan' eli rajatuimmalla näkyvyydellä olevaanOsoitin "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: Wiki Markup&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

Code Block

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ä: Wiki Markup&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

Code Block

char Sukunimi

...

[100

...

] = "Jokunen";

tai &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

Code Block

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

Wiki Markup
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.
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct TyontekijaTiedot
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
\{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;char Sukunimi\[50\]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;char Etunimi\[50\]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;char Sotu\[15\]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;int Palkka; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
;
\\

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:

Wiki Markup
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct Varastohyllyt
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
\{ &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char Nimike\[50\]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int Kolliluku; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void main(void)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

Wiki Markup
\{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  int Paikka=0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct Varastohyllyt Hylly\[1000\]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(Hylly\[Paikka\].Nimike,"Kossu"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hylly\[Paikka\].Kolliluku=10; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
\\
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 haluttuun tietueen kohtaan toisen tyyppistä tietoa, esim:

union Luku// esitellään union:
{
  int iArvo; //
&nbsp 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.

...

Staattiset muuttujat

Paikallinen staattinen muuttuja

Jos halutaan paikallisen muuttujan muistavan arvonsa siitä, kun funktio suoritettiin edellisen kerran, täytyy muuttuja esitellä staattisena esim. seuraavasti:

Code Block

void funktio()
{
    static int Laskuri; // Paikallinen staattinen muuttuja, säilyttää tietonsa funktiokutsujen välillä
}

int main()
{
}

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:

Code Block

static long Summa; // Globaali staattinen muuttuja

int main()
{
}

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. Wiki Markupstruct TyontekTiedot \{ &nbsp; char sSukunimi\[50\]; &nbsp; char sEtunimi\[50\]; &nbsp; union ID &nbsp;\{ &nbsp; char sSotu\[15\]; &nbsp; int HenkiloID; &nbsp;\}; &nbsp; int Palkka; \} \\ \\