MUUTTUJAT
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.
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.const int speed = 50; const float pi = 3.1415; const char ch = 'P';
/* 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.

Taulukoiden alustaminen:
Taulukoiden alkioille voidaan antaa arvo samalla kun taulukko määritellään. Arvojen luettelo kirjoitetaan aaltosulkujen sisään ja erotetaan toisistaan pilkulla.
Taulukkoa alustettaessa voidaan taulukon koko jättää avoimeksi. Kääntäjä laskee taulukon koon alkioiden lukumäärän perusteella.int numerot[5] = {1, 32, 10, 4, 65};
Moniulotteiset taulukot:int numerot[] = {1, 23, 65, 8, 56};
Moniulotteiset taulukot määritellään samoin kuin yksiulotteiset taulukot paitsi jokaista indeksiä kohti tarvitaan oma hakasulkuparinsa.
Moniulotteisen taulukon alustaminen:int numerot[4][5]; /* neljä riviä ja viisi saraketta */
Alustus toimii samalla periaatteella kuin yksiuloitteisessa taulukossa. Mikäli taulukolle ei määritellä sen kokoa, kääntäjä laskee taulukon koon alkioiden perusteella.
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.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}};
/* 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:Luetellut tyypit määritellään ohjelman alussa heti include-määrittelyjen jälkeen. Lista luetelluista tyypeistä koostuu:#include<stdio.h> enum tyyppi_ryhmän_nimi { vakio1, vakio2, vakio3, ..., vakioN }; int main()
- 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.

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