C Proqramlaşdırma Dili

Operatorlar

Operatorlar

Əvvəlki paraqrafda biz mənimsətmə operatoru ilə tanış olduq, bu paraqrafda isə şərt (if, switch) və dövr (for, while, do while) operatorları ilə tanış olacağıq.

Şərt operatorları - if, switch
Bildiyimiz kimi, operator proqramda hansı əməliyyatın yerinə yetirilməli olduğunu bildirir. Bir çox hallarda bu və ya digər əməliyyatın yerinə yetirilməsi hansısa şərtdən asılı olur. Bu zaman if operatorundan istifadə olunur.

if operatoru
if operatorunun sintaksisi aşağıdakı kimidir:


if ( şərt ) {
        yerinə yetirilməli əməliyatlar
    }

else {
        digər əməliyyatlar
    }

Qeyd edək ki, əgər cəmi bir əməliyyat yerinə yetirilirsə, onda {} mötərizələrinə ehtiyac yoxdur.
İzahı:
Əvvəlcə şərt yoxlanılır, əgər doğrudursa, onda {} arasında olan əməliyatlar yerinə yetirilir, əks halda, else–dən sonrakı {} mötərizələr arasında olan əməliyyatlar yerinə yetirilir. Məsələn:


int x;
if (x<5)
printf("%d 5-dən kiçikdir",x);
else
printf("%d 5-dən böyükdür",x);

Nümunə proqram:


//prog3_1.c

#include <stdio.h>

int main(int argc, char *argv[]){

int x;

printf("zəhmət olmasa, x-in qiymətini daxil edin\n");
scanf("%d",&x);

if (x<5) 
printf("%d 5-dən kiçikdir\n",x);
else 
printf("%d 5-dən böyükdür\n",x);

return 0; 
}

Nümunə

Proqramı kompilyasiya edək və hər dəfə müxtəlif qiymətlər daxil etməklə, bir neçə dəfə yerinə yetirək.


user@gnu_linux:~/progs/3$ gcc prog3_1.c -o prog3_1
user@gnu_linux:~/progs/3$ ./prog3_1
zəhmət olmasa, x-in qiymətini daxil edin
7
7 5-dən böyükdür
user@gnu_linux:~/progs/3$ ./prog3_1
zəhmət olmasa, x-in qiymətini daxil edin
3
3 5-dən kiçikdir
user@gnu_linux:~/progs/3$ ./prog3_1
zəhmət olmasa, x-in qiymətini daxil edin
45
45 5-dən böyükdür
user@gnu_linux:~/progs/3$ 


Dövr operatorları
for, while, do while

Dövr operatorları müəyyən əməliyyatların bir neçə dəfə təkrar yerinə yetirilməsinə imkan verir. Bu operatorlardan proqramlaşdırmada çox geniş istifadə olunur.

for operatoru
for operatorunun sintakisisi aşagıdakı kimidir:


for (sayğacın ilkin qiyməti; dövrün başa çatma şərti; sayğacın dəyişmə qaydası) {
əməliyyatlar;
}

Nümunə proqram:


//prog3_2.c

int main(int argc, char *argv[]){

int k;

for (k=0; k<10; k=k+1)
printf("Salam dünya\n");

return 0;
}

Nümunə

Programı kompilyasiya edib yerinə yetirək.


user@gnu_linux:~/progs$ 
user@gnu_linux:~/progs$ gcc -o prog3_2 prog3_2.c
user@gnu_linux:~/progs$ 
user@gnu_linux:~/progs$ ./prog3_2
Salam dünya
Salam dünya
Salam dünya
Salam dünya
Salam dünya
Salam dünya
Salam dünya
Salam dünya
Salam dünya
Salam dünya
user@gnu_linux:~/progs$ 
user@gnu_linux:~/progs$ 

İndi isə, proqramda for (k=0; k<10; k=k+1) sətrini for (k=5; k<10; k=k+1) ,for (k=0; k<3; k=k+1), for (k=0; k<10; k=k+7),
for (k=0; k<10; k=2) 
şərtləri ilə əvəz edib, proqramı icra edək. Hər dəfə müxtəlif nəticələr alacağıq. Sonuncu halda isə, ekranda "Salam dünya" ifadəsi sonsuz çap olunacaq (proqramın icrasını dayandırmaq üçün CTRL+Z düyməsini daxil edin).

Birinci halı təhlil edək. for (k=0; k<10; k=k+1)
Sayğac olaraq, k dəyişənindən istifadə olunur və ona başlanğıc qiymət olaraq, 0 mənimsədilir. k=0; dövrün sona çatması şərti kimi k<10; göstərilib. Bu o deməkdir ki, nə qədər ki, k < 10 şərti ödənir, dövr davam edəcək. Sayğacın qiymətinin dəyişmə qaydası kimi, k=k+1 (! sonda ; simvolunun yoxluğuna diqqət yetirin) göstərilib, yəni dövr hər dəfə təkrar olunduqda, sayğacın qiyməti 1 vahid artır.

Proses aşağıdakı şəkildə baş verir:
Əvvəlcə k dəyişəni 0 qiyməti alır. Sonra dərhal başa çatma şərti yoxlanılır. (k<10) Şərt ödənir, belə ki, 0 < 10 ifadəsi doğru qiymət alır və avtomatik olaraq {} arasında olan əməliyyatlar icra olunur. Bizim halda cəmi bir əməliyyatdan, printf("Salam dünya\n"); istifadə etdiyimizə görə, onu {} mötərizələri arasına almadıq. Daha sonra, növbə sayğacın qiymətinin dəyişməsinə gəlir.
Baxdığımız hal üçün (k-nın qiyməti 0 olan hal) k-nın yeni qiyməti 1 olur. Dərhal şərt yoxlanılır. (1 < 10). Hələ ki, hər şey qaydasında, əməliyyatlar yerinə yetirilir, sayğacın qiyməti dəyişdirilir və hər dəfə 1 vahid artaraq, 2, 3, ... 9 qiymətlərini alır. k-nın bütün bu qiymətlərində k<10 şərti ödənir və əməliyyatlar (printf("Salam dünya\n");) yerinə yetirilir. Növbəti qiymət isə, 10–dur. Bu halda isə, artıq 10 < 10 şərti ödənmir və for operatoru sona çatır.

while operatoru
for operatorunda biz sayğac təyin etdik, dövrün başa çatması şərtini və sayğacın dəyişmə qaydasını verdik. Bu zaman biz dövrün neçə dəfə təkrar olunacağını dəqiq bilirik. Bəzən isə elə olur ki, dövrün başa çatması şərtinin nə vaxt ödənəcəyi əvvəlcədən bilinmir. Bu zaman while operatorundan istifadə olunur. while operatorunun sisntaksisi aşağıdakı kimidir:


while (şərt) {
əməliyyatlar; 
}

Nümunə proqram:


char x;
x='b';
while (x!='a'){
printf("Salam dünya\n");
printf(" yeni simvol daxil edin\n");
scanf("%c",&x); 
}

Bu koddan proq3_3.c-də istifadə edilib. Bu proqramı kompilyasiya edib yerinə yetirək. Göründüyü kimi, dövr biz a simvolunu daxil edənə kimi davam edəcək.

while dövr operatorunun digər nadir hallarda istifadə olunan forması do while operatorudur. do while operatorunun sintaksisi belədir:


do {
əməliyyatlar;
} while (şərt);

Bu operatorun while operatorundan yeganə fərqi odur ki, bu halda şərtin nə zaman ödənməsindən asılı olmayaraq, əməliyyatlar ən azı 1 dəfə yerinə yetiriləcək.

switch operatoru
Əgər müəyyən halda proqramın icra istiqaməti bir neçə şərtdən asılıdırsa, bu zaman if operatoru ilə bu şərtlərin mürəkkəb konfiqurasiyasından istifadə etmək əvəzinə, switch operatorundan istifadə edirlər. switch operatorunun sintaksisi aşağıdakı kimidir:


switch (dəyişən) {
case qiymət1:
yerinə yetirilməli proqram hissəsi	/* əgər dəyişənin qiyməti == qiymət1 */
break;
case qiymət2:
yerinə yetirilməli proqram hissəsi	/* əgər dəyişənin qiyməti == qiymət2 */
break;
...
default:
yerinə yetirilməli proqram hissəsi	/* yuxarıdakı şərtlərin heç biri ödənmədikdə */
break;
}

switch operatoru dəyişənin qiymətini yuxarıdan aşağı case ifadəsinin qarşısında dayanan qiymətlə yoxlayır və bərabər olarsa, onda iki nöqtə :-dən sonra gələn bütün operatorları yerinə yetirir. Növbəti case ifadəsinə qədər. break rast gəlinən yerdə switch operatoru işini dayandırır və proqramda switch-dən sonra gələn operator yerinə yetirilir.
switch operatoru ilə bağlı mühüm məqamlardan biri də budur ki, case ifadələrində qiymət kimi ancaq tam tipli dəyişənlərdən istifadə etmək olar (int).
default seçimindən istifadə etmək vacib deyil. Əgər qiymətlərdən heç biri dəyişənə bərabər olmasa, onda default: seçimində göstərilən operatorlar yerinə yetiriləcək.

Nümunə proqram:


//prog3_4.c

#include <stdio.h>

int main(int argc, char *argv[]){
int color = 0;
printf("Hər hansı rəng seçin (qırmızı=1, yaşıl=2, qara=3):\n");
scanf("%d",&color); 
switch(color){
case 1: printf("Siz qırmızı rəngi seçdiniz\n");
break;
case 2:printf("Siz yaşıl rəngi seçdiniz\n");
break;
case 3:printf("Siz qara rəngi seçdiniz\n");
break;
default:printf("Siz heç bir rəng seçmədiniz\n");
}
return 0;
}

Nümunə

Proqramı kompilyasiya edib yerinə yetirək.


user@gnu_linux:~/progs$ 
user@gnu_linux:~/progs$ gcc -o prog3_4 prog3_4.c
user@gnu_linux:~/progs$ 
user@gnu_linux:~/progs$ ./prog3_4
Hər hansı rəng seçin (qırmızı=1, yaşıl=2, qara=3):
2
Siz yaşıl rəngi seçdiniz
user@gnu_linux:~/progs$ 
user@gnu_linux:~/progs$