1. Sissejuhatus
1.1 Muutujate olulisus C keeles
C keeles on muutujad väga olulised elemendid andmete hoidmiseks ja dünaamiliseks töötlemiseks. Muutujate abil saab programmi andmeid tõhusalt hallata ning sama väärtust saab vajadusel korduvalt kasutada ja lihtsalt muuta. Eriti suurtes programmides parandab muutujate õige kasutamine märkimisväärselt kogu koodi tõhusust ja loetavust.
2. Mis on muutuja?
2.1 Muutuja definitsioon
Muutuja on mäluruum, mida kasutatakse andmete ajutiseks hoidmiseks programmis. C keeles tuleb muutuja kõigepealt deklareerida enne selle kasutamist. Allolevas näites deklareeritakse muutuja age
ning talle omistatakse väärtus 25.
int age;
age = 25;
Muutujate abil saab andmeid taaskasutada ja hiljem lihtsalt muuta või programmi laiendada.
2.2 Muutuja roll
Muutujad võimaldavad andmete salvestamist ja taaskasutamist, mis suurendab programmi paindlikkust. Näiteks allolevas koodis kasutatakse char
tüüpi muutujat tekstisõnumi kuvamiseks.
char message[] = "こんにちは";
printf("%sn", message);
Selliselt muutujate kasutamine lihtsustab andmete haldamist ning võimaldab sama infot tõhusalt kasutada erinevates kohtades programmis.
3. Muutujate deklareerimine ja initsialiseerimine
3.1 Muutujate deklareerimise viisid
C keeles tuleb muutuja enne kasutamist alati deklareerida. Deklareerimine broneerib vastava mäluruumi. Järgmises näites deklareeritakse täisarvuline muutuja number
.
int number;
3.2 Muutujate initsialiseerimine
Muutujaid on soovitatav initsialiseerida juba deklareerimisel. Initsialiseerimata muutujate kasutamine võib põhjustada ettearvamatuid vigu, seega on alati hea tava neid kohe väärtustada.
int age = 30;
See kood deklareerib age
nimelise täisarvulise muutuja ja omistab talle kohe väärtuse 30. Initsialiseerimata muutujatega seotud vead selgitatakse hiljem.
4. Andmetüübid ja nende piirangud
4.1 Peamised andmetüübid C keeles
C keeles on mitmeid andmetüüpe ning õige tüübi valimine sõltub sellest, milliseid väärtusi on vaja käsitleda. Allpool on toodud peamiste andmetüüpide kirjeldused.
int
(täisarvuline tüüp): Salvestab täisarve. 32-bitistes süsteemides on vahemik-2,147,483,648
kuni2,147,483,647
. Tavaliselt kasutatakse märgiga täisarve. Näide:int age = 25;
.double
(ujukomaarvuline tüüp): Salvestab arvud, millel on koma.double
tüüpi muutujad säilitavad tavaliselt kuni 15 kohta täpsusega, võimaldades väga suuri või väikseid väärtusi täpselt esitada. Näide:double pi = 3.14159;
.char
(märgitüüp): Salvestab ühe märgi. Märgid vastavad ASCII koodile ning vahemikus0
kuni255
. Näide:char grade = 'A';
.
4.2 Andmetüüpide näited ja ettevaatusabinõud
Andmetüübi valik tuleb teha olenevalt väärtuste vahemikust ja omadustest. Näiteks char
tüüpi muutuja kasutab 1 baiti mälu ning võimaldab kasutada numbreid märkidena järgmiselt.
char letter = 65;
printf("%cn", letter); // Väljund: A
Selles näites väljastatakse ASCII koodiga 65 vastav täht ‘A’. Õige andmetüübi kasutamine on oluline programmi stabiilsuse ja efektiivsuse jaoks.

5. Muutujate ulatus (scope)
5.1 Kohalikud ja globaalsed muutujad
C keeles määrab muutujate ulatus, kus neid saab kasutada. Peamised ulatused on lokaalsed ja globaalsed muutujad.
- Kohalik muutuja: Funktsiooni või ploki sees deklareeritud muutuja, mis kehtib vaid selles ulatuses. Teistest funktsioonidest või plokkidest sellele ligi ei pääse.
void example() {
int localVar = 10;
printf("%d", localVar); // Kohalik muutuja kasutuses
}
- Globaalne muutuja: Funktsioonist väljaspool deklareeritud muutuja, mis on saadaval kogu programmis. Seda saab kasutada kõikjal koodis.
int globalVar = 20;
void example() {
printf("%d", globalVar); // Globaalne muutuja kasutuses
}
5.2 Scope’i halduse olulisus
Kohalike ja globaalsete muutujate õige kasutus parandab koodi loetavust ja turvalisust. Kuigi globaalsed muutujad on mugavad, võivad need ülemäärasel kasutamisel põhjustada vigu, mistõttu on soovitatav kasutada neid vaid konkreetsetel juhtudel.
6. Muutujate kasutusnäited ja parimad tavad
6.1 Muutuja väärtuse muutmine ja taaskasutus
Muutujale omistatud väärtust saab hiljem uue väärtusega üle kirjutada. Järgmine kood näitab selle võimalust.
int age = 20;
age = 21; // Uue väärtusega üle kirjutamine
Muutujad võimaldavad programmi käigus väärtusi dünaamiliselt muuta, mis muudab koodi paindlikumaks.
6.2 Muutujate nimetamisreeglid
Hea loetavusega koodi kirjutamiseks on oluline järgida nimetamisreegleid. Siin on mõned levinud näited.
int userAge = 30; // CamelCase
int user_age = 30; // Snake_case
Muutujate nimed peaksid olema tähendusrikkad ja vastama programmi eesmärgile, et teised programmeerijad saaksid koodi hõlpsasti mõista.
7. Levinumad vead ja nende lahendused
7.1 Initsialiseerimata muutujate kasutamisest tingitud vead
Initsialiseerimata muutuja kasutamine võib põhjustada ettearvamatut käitumist. Järgmises koodis kasutatakse initsialiseerimata muutujat number
, mille tulemuseks on määramatu väärtus.
int number;
printf("%d", number); // Initsialiseerimata muutuja kasutus
Selle vältimiseks tuleks muutujad alati initsialiseerida.
int number = 0; // Initsialiseeritud muutuja
printf("%d", number); // Korrektselt väljastatud väärtus
7.2 Andmetüüpide erinevustest tulenevad vead
Vale tüüpi muutujale väärtuse määramine võib põhjustada andmekadu. Näiteks allolevas koodis omistatakse ujukoma väärtus int
tüüpi muutujale, mille tõttu komaosa läheb kaotsi.
int number = 3.14; // Ujukoma väärtus omistatakse täisarvule
printf("%dn", number); // Tulemus: 3 (komaosa kaob)
Selle vältimiseks tuleks kasutada sobivat tüüpi muutujat. Ujukoma jaoks kasuta double
või float
tüüpi.
double number = 3.14;
printf("%fn", number); // Tulemus: 3.140000
8. Praktilised ülesanded
8.1 Ülesanne 1: Aritmeetika teostamine
Selles ülesandes kasuta kahte täisarvulist muutujat ning kirjuta programm, mis teostab liitmise, lahutamise, korrutamise ja jagamise ning kuvab tulemused.
#include <stdio.h>
int main() {
int a = 10;
int b = 5;
// Aritmeetiliste tehete tulemuste väljastamine
printf("Liitmine: %dn", a + b);
printf("Lahutamine: %dn", a - b);
printf("Korrutamine: %dn", a * b);
printf("Jagamine: %dn", a / b);
return 0;
}
Nipp: Pane tähele, et jagamisel kuvatakse ainult täisarvuline tulemus. Näiteks a / b
annab tulemuseks 2
ning komakohtasid ei kuvata. Kui soovid komakohti, kasuta double
tüüpi muutujat.
8.2 Ülesanne 2: Muutujate ulatuse mõistmine
Järgmises ülesandes õpid eristama kohalikke ja globaalseid muutujaid. Kohalikud muutujad kehtivad vaid funktsiooni sees, globaalseid saab kasutada kõikjal programmis.
#include <stdio.h>
int globalVar = 10; // Globaalne muutuja
void function() {
int localVar = 20; // Kohalik muutuja
printf("Funktsiooni sees: kohalik muutuja: %dn", localVar);
printf("Funktsiooni sees: globaalne muutuja: %dn", globalVar);
}
int main() {
function();
// Globaalne muutuja on kättesaadav
printf("Põhifunktsioonis: globaalne muutuja: %dn", globalVar);
// Kohaliku muutujale ligipääs (annab vea)
// printf("Põhifunktsioonis: kohalik muutuja: %dn", localVar);
return 0;
}
Nipp: Kui üritad põhifunktsioonist kohalikule muutujale ligi pääseda, tekib viga. Proovi kommentaar eemaldada ja vaata tulemust.
8.3 Ülesanne 3: Muutujate initsialiseerimine ja vigade käsitlemine
Selles ülesandes kontrolli, mis juhtub initsialiseerimata muutuja kasutamisel. Järgmises koodis ei ole number
initsialiseeritud ning tulemus võib olla ettearvamatu.
#include <stdio.h>
int main() {
int number; // Initsialiseerimata muutuja
printf("Initsialiseerimata muutuja väärtus: %dn", number);
return 0;
}
Seejärel käivita kood, kus muutuja on õigesti initsialiseeritud, ja vaata tulemust.
#include <stdio.h>
int main() {
int number = 0; // Initsialiseeritud muutuja
printf("Initsialiseeritud muutuja väärtus: %dn", number);
return 0;
}