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

...

Muuttujat ovat siis tietovarastoja, tietovarastot ovat erilaiselle tiedolle erikokoisia.

Siksi CRobotC-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.

...

tyyppi

merkitys

tavuja

etumerkitön lukualue

etumerkillinen lukualue

bool

boolean-arvo

1?

true...false

true...false

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)

?

-

-

string

merkkijono (kts. alla)

?

-

-

Muuttujan tyyppi kertoo sen, millaista tietoa muuttujaan voi tallentaa, esimerkiksi char OmaMuuttuja voi tallettaa yhden merkin.

...

Tyypistä otetaan yksi kirjain muuttujan eteen muistuttamaan ohjelmoitsijaa muuttujalle annetusta tyypistä. (tätä sanotaan unkarilaiseksi notaatioksi)

Note

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 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, tai globaali, 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

inttask main()
{
   return 1;
}

Paikallinen muuttuja (local variable)

...

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

inttask 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
inttask 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

...

Code Block
#include <stdio.h>

int x = 5;                                // Globaali muuttuja

inttask 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ä olevaan.

Merkkijonot

Merkkijono on vektori eli yksiulotteinen taulukko. C-kielessä ei merkkijonoille ole valmista muuttujaa, vaan merkkijonot on esiteltävä vektoreina seuraavasti:

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ä:

Code Block

char Sukunimi[100] = "Jokunen";

tai

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.

...

C-kielestä poiketen, RobotC-kielessä on oma muuttujatyyppi merkkijonoille. Se on nimeltään string. Se voidaan alustaa kuten muutkin muuttujat, mutta arvo tulee laittaa lainausmerkeissä (merkkijonot ovat aina lainausmerkeissä (Robot)C-kielessä.

Code Block

string str1 = "ROBOT";

Merkkijono voidaan näyttää ruudulla seuraavasti:

Code Block

nxtDisplayCenteredTextLine(3, "%s", str1);

Hyödyllisiä funktioita:

strcat(pToBuffer, pFromBuffer)

Lisää jälkimmäisen parametrin ensimmäisen loppuun

strcmp(pString1, pString2)

Vertailee parametreina saatuja merkkijonoja keskenään, palauttaa 0 jos merkkijonot samat

strcpy(pToBuffer, pFromBuffer)

Kopioi jälkimmäisen ensimmäisen tilalle

StringDelete(sDest, nIndex, nSize)

Poistaa sDest-merkkijonon nIndex:in osoittamasta kohdasta nSize määrän merkkejä

StringFind(sSrce, sSearch)

Etsii jälkimmäistä merkkijonoa ensimmäisestä ja palauttaa sen indeksin

StringFormat(sDest, sFmtSpec, nParm1, nParm2)

Muodostaa merkkijonon C-kielestä tuttujen sääntöjen perusteella, kts. dokumentaatio

StringFromChars(sToString, FromChars)

Muuttaa merkkitaulukon (char array) merkkijonoksi (string)

strncat(pToBuffer, pFromBuffer, nMaxBufferSize)

Sama kuin strcat, mutta siirtää maksimissaan vain nMaxBufferSize määrän merkkejä

strncmp(pString1, pString2, nMaxBufferSize)

Sama kuin strcpy, mutta kopioi maksimissaan vain nMaxBufferSize määrän merkkejä

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ä
}

inttask 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.