MUUTTUJAT

Tietokonekielten perusosia ovat muuttujat, operaattorit ja funktiot. Muuttuja on symbolinen nimi, jolla viitataan "järjestelmästä varattuun muistipaikkaan". Muuttujaan voidaan sijoittaa ohjelmassa arvo. Laajemmin, muuttujiin voidaan sijoittaa numero-arvoja, kirjaimia tai merkkejä. Muuttujaksi voidaan määritellä myös taulukko.

Operaattorit operoivat operandeja joiden kautta ne panevat ohjelman tekemäään toimintoja muuttujille. Funktio taas on koodijakso, joka suorittaa tietyn operaation. Muuttuja talletetaan tietokoneen muistiin. Kun muuttuja arvotetaan, asetetaan sen arvo muistitilaan, jota kuvaa muuttujan nimi. Muuttujia on eri tyyppisiä ja muistitilaa tarvitaan eri määrätiedon tyypin perusteella.

Esimerkki käytännön muuttujasta, lompakko. Lompakkoon (= muuttujaan) voidaan laittaa (sijoittaa) rahaa ( = numeroarvo) ja lompakosta voidaan ottaa rahaa, mikäli lompakossa on rahaa.


MUUTTUJIEN KÄYTTÖ

C-kielessä on kaikki muuttujat esiteltävä ennen niiden käytöä. Muuttujien esitteleminen tapahtuu funktion (ohjelman) alussa. Muuttujien esitteleminen tai määitteleminen on tarpeellista, jotta käätäjä tietäisi minkä tyyppistä tietoa muuttujaan voi tallettaa. C-kielessä on neljä perustietotyyppiä:

Muuttuja-tyyppi Selite Arvot Ohjainmerkki esimerkki
int kokonaisluku (integer) -32786 ... +32767 %i tai %d
short kokonaisluku (integer) %i tai %d
long kokonaisluku (integer) %i tai %d
float desimaaliluku (floating point) 3.4*10 -38 ... 3.4*10+38 %f
double desimaaliluku (double precision) 1.7*10 -308 ... 1,7*10+308 %f
long double desimaaliluku 3.4*10 -4932 ... 3,4*10+4932 %lf
char merkki (character) 256 eri merkkiä (kirjaimia yms) %c (tai %s)


Esiteltäessä muuttujia ohjelman alussa on tiedettävävä minkä tyyppistä tietoa muuttujaan tullaan tallentamaan. Esimerkiksi jos ohjelmassa lasketaan keskiarvoja suoritetaan jakolasku, käsitellään aikaa tai painoja kyseessä on desimaalilukuja, jolloin valitaan muuttujien tyypiksi float tai double. Laskettaessa esimerkiksi kierroksia tai kappalemääriä on kyseessä kokonaislukuja eli valitaan int muuttujien tyypiksi. Muuttujan tietotyyppi määrää sen, minkä tyyppistä tietoa muuttuja voi pitää sisällään samoin kuin arvoalueen, jonka muuttuja voi tallentaa.


MUUTTUJIEN KÄYTTÖ

Muuttujien määrittelyn yleismuoto on:

tyyppi nimilista;

Tyyppi on tietotyyppi ja nimilista on yhden tai useamman samantyyppisen muuttujan nimi eroteltuna pilkulla. Määrittelylause päättyy puolipisteeseen. Alla, esimerkkejä erityyppisten muuttujien määrittelyistä ohjelman alussa.

int luku, potenssi;
char tiku, taku;
float liuku, maki;
double tupla;

Muuttujan nimi koostuu kirjaimista tai numeroista. Ensimmäisen merkin on oltava kirjain (myös alaviiva on sallittu). Kirjaimina voi käyttää sekä isoja että pieniä kirjaimia mutta ne merkitsevät eri asiaa. Alla, sama sana muuttujan nimenä erilailla kirjoitettuna, joten kyseessä on eri muuttujat.

int max, Max, MAX;
float Luku_1, luku1, luku_1;

HUOM! Muuttujien nimissä ei saa käyttää ä, Ä, ö, Ö, å tai Å kirjaimia !


KOKONAISLUKUMUUTTUJAT

Kokonaisluku on positiivinen tai negatiivinen luku jossa ei ole desimaaliosaa. Kokonaisluvun määrittelyssä kirjoitetaan varattu sana int ennen muuttujan nimeä. Mikäli muuttujalle halutaan antaa alkuarvo ohjelmoitaessa ohjelmaa, on ohjelmoijan se annettava.

int pyorat = 123, valssit = 23;

Alustamattomien muuttujien käyttöä tulee välttää. Muuttujalla voi olla määrittelyvaiheessa mikä arvo tahansa ellei ohjelmoija alusta muuttujaa. Muuttujiin joita käytetään lukujen käsittelyssä alkuarvoksi kannattaa sijoittaa 0.

Alla esimerkki ohjelmassa, ohjelman alussa kokonaislukumuuttujaan x sen määrittelyn yhteydessä sijoitetaan alkuarvoksi 646. Ohjelma näyttää näytölle tekstin X:n arvo on 654.

Huom ! Funktiolla getch() saadaan ohjelma suoritus pysähtymään siksi aikaa, että voidaan tarkastella testiohjelman suoritusta näytöllä. Ohjainmerkeiksi kutsutaan merkkiyhdistelmiä joilla ohjelmassa näytöllä esimerkiksi vaihdetaan rivi, esimerkkiohjelmassa \n -merkkiyhdistelmä.

/* Kokonaislukumuuttujan käyttö */ #include <stdio.h> int main() { int x; x = 654; /* = -merkki on sijoitusoperaattori */ printf(”X:n arvo on %d\n”, x); getch(); return 0; }





LIUKULUKUMUUTTUJAT eli desimaaliluvut

Esimerkkiohjelmassa pääohjelman alussa (main()) on määrittelyn neljä float-tyyppistä liukuluku-muuttujaa eli desimaalilukumuuttujaa, keskiarvo, paino1, paino2 ja paino3. Muuttujien nimen edessä oleva sana float kertoo, että muuttujat voivat ottaa vastaan liukulukuarvoja eli desimaalilukuja. Muuttujien nimillä ohjelmoitsija kuvaa niihin ohjelman suorituksen aikana tallenettavaa asiaa, kuten esimerkissä laskussa käytettävää ympyrän sädettä ja laskun lopputuloksena saatavaa pinta-alaa.

/* Liukulukumuuttujien käyttö */ #include <stdio.h> int main() { float keskiarvo; float paino1, paino2, paino3; printf(”Anna ensimmäinen paino\n”); scanf(”%f”, &paino1); printf(”Anna toinen ja kolmas paino\n”); scanf(”%f %f”,&paino2, &paino3); keskiarvo = (paino1 + paino2 + paino3) / 3; printf(”Painojen keskiarvo on %.2f\n”, keskiarvo); getch(); return 0; }





MERKKIMUUTTUJAT

Merkkimuuttuja tarkoittaa yleisesti kirjainta, numeroa tai näppäimistöltä annettua muuta merkkiä esim sulkumerkkiä. Merkkimuuttuja ilmoitetaan char -tunnuksella jonka jälkeen annetaan muuttujan nimi tai pilkuin eroteltuna useita muuttujien nimiä. Merkki voi olla myös yksittäinen kirjain (numeromerkki) heittomerkkien sisällä. Merkkimuuttujaan voidaan sijoittaa kahdeksan bitin kokoisia ASCII- , tai muita merkkejä. ASCII-koodi on numero, jota käytetään esittämään symbolia.

/* Merkkimuuttujien käyttö */ #include <stdio.h> int main() { char A; char B = '\n'; printf("Anna kirjain: \n"); scanf("%c",&A); printf("Annoit kirjaimen %c. %c ", A, B); getch(); return 0; }





Joitain erikoismerkkejä:

Koodi Selite
\a äänimerkki
\b "Backspace", vastaa toiminnaltaan ko painikkeen painallusta (Enter-painikkeen yläpyolella)
\r "vaununpalautus", kursorin siirtäminen rivin lopusta rivin alkuun
\" Lainausmerkki
\f "Sivunsyöttö", siirtää kursorin "toiselle sivulle"
\n Rivinvaihto
\0 Null-arvo
\' Heittomerrki
\t Vaakatabulointi, siirtää kursoria oikealla
\v Pystytabulointi, siirtää kursoria alas



VAKIOT

Vakiot ovat tunnisteita, joita ei voi muuttaa ohjelman ajon aikana. Vakio voi olla minkä perustietotyypin mukainen. Vakio määrtellään käyttämällä const -ilmaisua, jota seuraa tunniste eli vakion nimi ja annettu vakion arvo.
Esimerkissä määritellään speed-nimisen kokonaisluku-vakion arvoksi 50, pi-nimisen likulukuvakion arvoksi 3,1415 ja ch-nimiseen merkkimuuttujaan P-kirjain.

const int speed = 50; const float pi = 3.1415; const char ch = 'P';

Muuttujien ja vakioiden määrittelyssä on erona varatun sanan const käyttäminen sekä vakiolle annettu arvo. Vakion arvoa ei voi muuttaa ohjelman suorituksen aikana. Muuttujille annettuja alkuarvoja voidaan muuttaa ohjelman suorituksen aikana.

/* vakiot käytössä */ #include <stdio.h> int main() { const char letter = 'X'; const float pi = 3.1415; const int value = 1234; printf(”Vakiot ovat:\n\merkki = %c\n\ liukuluku = %f\n\ kokonaisluku = %d\n”, letter, pi, value); getch(); return 0; }




/* muuttujien käyttö */ #include <stdio.h> int main() { char letter; int number; float amount; const double pi = 3.1415; printf(”Anna merkki, kokonaisluku ja liukuluku\n”); scanf(”%c %d %f”, &letter, &number, &amount); printf(”\n\n”); printf(”Merkki: %c\n\ Kokonaisluku: %d\n\ Liukuluku: %.2f\n\ Vakio: %.2lf\n”, letter, number, amount, pi); getch(); return 0; }




TAULUKOT

Taulukko on "luettelo", joka koostuu samantyyppisistä muuttujista. Taulukon muuttujilla on yleinen nimi, taulukon nimi. Jokaiseen yksittäiseen alkioon liittyy kokonaislukunumero, indeksi. Indeksien arvot ovat aina positiivisia kokonaislukuja. C-kielen taulukon ensimmäinen indeksi on nolla (0).

Taulukon käyttöön ja määrittelyyn liityvät säännöt:
• taulukon koko on määriteltävä aina ensin
• taulukossa voi olla yksi tai useampia ulottuvuuksia

Yksiulotteisen taulukon yleismuoto:

tietotyyppi muuttujannimi[koko];

Tietotyyppi määrittää taulukon alkioiden tietotyypin ja koko määrittää sen montako alkiota taulukko voi sisältää. Taulukon alkioihin viitataan indeksiarvolla jotka alkavat nollasta.


Example pic

Taulukoiden alustaminen:
Taulukoiden alkioille voidaan antaa arvo samalla kun taulukko määritellään. Arvojen luettelo kirjoitetaan aaltosulkujen sisään ja erotetaan toisistaan pilkulla.

int numerot[5] = {1, 32, 10, 4, 65};

Taulukkoa alustettaessa voidaan taulukon koko jättää avoimeksi. Kääntäjä laskee taulukon koon alkioiden lukumäärän perusteella.

int numerot[] = {1, 23, 65, 8, 56};

Moniulotteiset taulukot:
Moniulotteiset taulukot määritellään samoin kuin yksiulotteiset taulukot paitsi jokaista indeksiä kohti tarvitaan oma hakasulkuparinsa.

int numerot[4][5]; /* neljä riviä ja viisi saraketta */

Moniulotteisen taulukon alustaminen:
Alustus toimii samalla periaatteella kuin yksiuloitteisessa taulukossa. Mikäli taulukolle ei määritellä sen kokoa, kääntäjä laskee taulukon koon alkioiden perusteella.

int numerot[3][5] = { {23,43, 5,45, 8}, {21, 4, 2, 6, 7}, { 2, 6, 3, 7, 1} }; int numerot[][] = { {23,43, 5,45, 8}, {21, 4, 2, 6, 7}, { 2, 6, 3, 7, 1}};

Esimerkissä (alla) on ossi-niminen kokonaisluku-taulukko, johon sijoitetaan alkuarvot ohjelman alussa. Seuraavana on nimi-niminen merkkejä sisältävä taulukko, johon mahtuu 80 merkkiä (esim kirjaimia). Seuraavaksi määritellään long-tyyppinen eli kokonaislukumuuttuja nimeltään keskiarvo. Aluksi ohjelma laskee taulukkoon sijoitettujen lukujen keskiarvon. Seuraavaksi ohjelma pyytää käyttäjää antamaan nimen ja ohjelma lukee annetun nimen merkkijonona sijoittaen sen nimi-taulukkoon. Lopussa näytetään %s -osoittamassa kohdassa annettu nimi sekä %d kohdalla taulukon lukujen keskiarvo.

/* Taulukoiden käyttö */ #include <stdio.h> int main() { int ossi[] = {10, 20, 30, 40, 50}; char nimi[80]; long keskiarvo; keskiarvo=(ossi[0]+ossi[1]+ossi[2]+ossi[3]+ossi[4])/5; printf("Anna nimesi: "); scanf("%s", &nimi); printf("\n\n"); printf("Nimesi on %s, keskiarvo on %d",nimi,keskiarvo); return 0; }




Taulukkoon voidaan sijoittaa sekä sieltä voidaan käsitellä ohjelmassa lukuja viittaamalla taulukon indeksiin muuttujalla, esimerkissä käytetään rivi-muuttujaa. Esimerkissä ohjelman tekijä on huomioinut käyttäjän antavan yhtä suuremman rivinumeron kuin C-kielen syntaksin mukaan taulukon alkiot ovat. Tämä tarkoittaa, että ohjelman käyttäjän tarkoittama rivi 1 tarkoittaakin ohjelmassa riviä 0.

/* taulukoiden käyttö ja näyttö */ #include <stdio.h> int main() { int ossi[] = {10, 20, 30, 40, 50}; int rivi; printf("%i \n %i \n %i \n %i \n %i \n", ossi[0],ossi[1],ossi[2],ossi[3],ossi[4]); printf("Anna rivinumero: "); scanf("%i", &rivi); printf("\n"); printf("Ossi-nimisen taulukon rivilla %i oli luku %i",rivi, ossi[rivi-1]); getch(); return 0; }




Esimerkissä (alla) ohjelman käyttäjä antaa luvut 2*5 kokoiseen taulukkoon, joka näytetään näytöllä täytön jälkeen sekä näytetään yhden taulukon solun sisältö ohjelmoitsijan määräämästä paikasta.

/* taulukoiden käyttö */ #include <stdio.h> int main() { int numerot[2][5]; printf("Anna luku: "); scanf("%i", &numerot[0][0]); printf("Anna luku: "); scanf("%i", &numerot[0][1]); printf("Anna luku: "); scanf("%i", &numerot[0][2]); printf("Anna luku: "); scanf("%i", &numerot[0][3]); printf("Anna luku: "); scanf("%i", &numerot[0][4]); printf("Anna luku: "); scanf("%i", &numerot[1][0]); printf("Anna luku: "); scanf("%i", &numerot[1][1]); printf("Anna luku: "); scanf("%i", &numerot[1][2]); printf("Anna luku: "); scanf("%i", &numerot[1][3]); printf("Anna luku: "); scanf("%i", &numerot[1][4]); printf("\n%i %i %i %i %i \n", numerot[0][0],numerot[0][1], numerot[0][2],numerot[0][3], numerot[0][4]); printf("%i %i %i %i %i \n", numerot[1][0],numerot[1][1], numerot[1][2],numerot[1][3], numerot[1][4]); printf("\n"); printf("Taulukossa 1.rivilla ja sarakkeeessa 3 on luku %i", numerot[1][3]); getch(); return 0; }




Edellinen esimerkki havainnollistaa kuinka helposti koodia kertyy pelkän taulukon täyttämisestä. Toisaalla oppaassa esimerkissä käsitellään taulukoita toistolauseiden avulla, jolloin ohjelmarivien määrä vähenee huomattavasti.

Seuraavassa esimerkissä käytetään puts()- ja gets()-funktioita nimien lukemiseen kolmeen eri merkkitaulukkoon. Esimerkissä fflush(stdin) -fuktiolla tyhjennetään sopivissa paikoissa ohjelmaa näppäimistöpuskuri. Jollei tyhjentämistä suoriteta välillä, ei gets()-funktio toimi toivotulla tavalla.

/* taulukoiden käyttö */ #include <stdio.h> int main() { char nimi1[50], nimi2[50], nimi3[50]; //Ensimmäinen opiskelija puts("Opiskelijan nimi\n"); gets(nimi1); fflush(stdin); //tyhjennetään näppäimistöpuskuri //Toinen opiskelija puts("\nOpiskelijan nimi\n"); gets(nimi2); fflush(stdin); //Kolmas opiskelija puts("\nOpiskelijan nimi\n"); gets(nimi3); //Lopputulostus näytölle printf("\nOpiskelijoiden nimet olivat:\n"); printf("%s\n", nimi1); printf("%s\n", nimi2); printf("%s\n", nimi3); getch(); return 0; }




LUETELLUT TYYPIT

Luetellut tyypit ( enum ) on joukko kokonaislukuvakioita, jotka määrittävät tietyn tyyppisen muuttujan mahdolliset arvot. Lueteltuja tyyppejä ovat usein samaan asiaan liittyvät kokonaislukuvakiot, viikonpäivät voi ilmaista numerolla, elektroniikan värikoodeissa väri vastaa numeroa. Lueteltujen tyyppien rakenne on seuraava:

#include<stdio.h> enum tyyppi_ryhmän_nimi { vakio1, vakio2, vakio3, ..., vakioN }; int main()

Luetellut tyypit määritellään ohjelman alussa heti include-määrittelyjen jälkeen. Lista luetelluista tyypeistä koostuu:

- termistä enum,
- vakioryhmää kuvaasta nimestä,
- aaltosulkeiden väliin kirjoitetuista vakioiden nimistä sekä lopuksi puolipisteestä.

Nikäli luetteltujen tyyppien listan ensimmäiselle vakioon ei sijoiteta alkuarvoa on sen arvo nolla, kuvassa varikoodi. Antamalla lueteltujen tyyppien ensimmäiselle vakiolle arvo, muiden vakioiden arvo suurenee numerolla 1, kuvassa viikonpaivat. Huomaa, lueteltujen vakioiden alkuarvoksi kuuluu asettaa kokonaisluku.

Example pic

Esimerkkiohjelmassa viikonpaivat-vakioiden ensimmäiselle vakiolle Su annetaan arvoksi 1, jolloin vakion Ma on 2, Ti on 3 jne. Pääohjelmassa for-toistolauseen rakenteessa käytetään viikon ensimmäistä päivää (Su) ja viimeistä päivää (La). Toisessa esimerkissä tulostetaan varikoodi-vakioiden arvot käyttämällä vakioiden nimiä.
 

/* Luetellut tyypit eli kokonaislukuvakiot */ #include <stdio.h> enum viikonpaivat{ Su = 1, Ma, Ti, Ke, To, Pe, La }; enum varikoodi{ musta, ruskea, punainen, oranssi, keltainen, vihrea, sininen, violetti, harmaa, valkoinen }; int main() { int paiva; for( paiva = Su; paiva <= La; paiva++) { printf("Paiva on %d\n", paiva); } printf("\n Vastusten varikoodit:\n\n"); printf("%d Musta \n", musta); printf("%d Ruskea \n", ruskea); printf("%d Punainen \n", punainen); printf("%d Oranssi \n", oranssi); printf("%d Keltainen \n", keltainen); printf("%d Vihrea \n", vihrea); printf("%d Sininen \n", sininen); printf("%d Violetti \n", violetti); printf("%d Harmaa \n", harmaa); printf("%d Valkoinen \n", valkoinen); getch(); return 0; }