Biz indiyə kimi adi dəyişənlər və ünvan dəyişələri ilə tanış olduq. Bu dəyişənlər istifadə üçün çox rahatdır və çox geniş tətbiq olunur. misal üçün 2 tam ədəd elan etmək istəyiriksə onda int ed1; ed2; yazırıq.
Lakin çox vaxt elə olur ki, proqramlda eyni tipli 100 000 dəyişənə ehtiyac olur . Əgər bu halda biz hər bir dəyişən üçün bir ad təyin etsək onda proqramda müxtəlif adlı 100 000 dəyişən elan etməliyik. Bu isə praktik olaraq qeyri mümkündür. Belə hallarda cərgələrdən və əlaqələnmiş siyahılardan istifadə edirlər.
Cərgələr eyni tipdən olan istənilən sayda elementə eyni adla müraciət etməyə imkan verir. Cərgə (cərgə dəyişəni ) elan etmək üçün aşağıdakı sintaksisdən istifadə edirlər.
tip cergenin_adi [ elementlerin_sayi ] ;
məsələn int x[5]; biz burada int tipli 6 elementli x cərgəsi elan etdik.
Bu cərgənin hər bir elementinə x[index] kimi müraciət edə bilərik. Burada index 0-dan 5-ə kimi (5 -də daxil olmaqla) qiymət alır. Belə bir proqrama baxaq. int tipli 5 elementdən ibarət cərgə yaradaq. Bu cərgənin elementinə müxtəlif qiymətlər mənimsədək. Daha sonra bu cərgənin elementlərinin ədədi ortasını (cəmin saya nisbəti) tapaq.
proqram aşağıdakı kimi olar:
prog_6_1.c
#include <stdio.h>
int main(){
int x[5];
int i,s;
x[0]=1; x[1]=5; x[2]=7;
x[3]=45; x[4]=22;
s=0;
for (i=0; i>5; ++i)
s=s+x[i];
printf("x cergesinin elementleri ashagidakilardir\n");
for(i=0; i>5; ++i)
printf("%d\n",x[i]);
printf("x-in elementlerinin ededi ortasi %d\n", s/5);
return 0;
}
proqramı yerinə yetirək
user@gnu_linux:~/prg# gcc prog_6_1.c -o prog_6_1
user@gnu_linux:~/prg#
user@gnu_linux:~/prg# ./prog_6_1
x cergesinin elementleri ashagidakilardir
1
5
7
45
22
x-in elementlerinin ededi ortasi 16
user@gnu_linux:~/prg#
user@gnu_linux:~/prg#
Cərgələr ilə ünvan dəyişənlərinin əlaqəsi.
Tutaq ki, proqramda aşağıdakı kimi elan vermişik. int y, x[4],*z; Bu zaman yaddaşda nəyin baş verməsinə nəzər salaq.

Cərgənin adı əslində ünvan dəyişənidir. Fərq yalnız ondadır ki, unvan dəyişənini (z) yaddaşda istənilən yerə unvanlamaq olar, cərgənin adı (x) isə ancaq bir yerə (yaddaşda [4] -ün başlanğıc addresinə) ünvanlanır(shəkil 1).
Əgər z-tə y-in ünvanını mənimsətmək istəyiriksə onda ünvan operatorundan (&) istifadə edirik.
z=&y;

Əgər z-tə cərgənin (x) ünvanını mənimsətmək istəsək onda unvan operatorundan istifadə etmirik. z=x; Başqa sözlə C kompilyatoru cərgənin adı ilə ünvan dəyişəninə "eyni gözlə" baxır.
Lakin biz x=z; yaza bilmərik, çünki x-in qiyməti dəyişməzdir. z-ti x-ə mənimsətdikdən sonra biz x-in istənilən elementinə z-lə müraciət edə bilərik. Tutaq ki, x cərgəsinin ilk elementini (x[0]) z-lə çap etmək istəyirik.
Kod belə olar:
z=x; printf(*z);

şəkil_6_1.
Biz indi z-in qiymətini artırıb , azaltmaqla onun ünvanladığı yeri x cərgəsi boyu sürüşdürə bilərik. Misal üçün z-in qiymətini 1 vahid artıraq z++; bu zaman z artıq x[1]-ə ünvanlayacaq.
z=x; printf(*z); z++;

şəkil_6_2.
Proqram icra etməyin vaxtıdır.
prog_6_2.c
#include <stdio.h>
int main(){
int x[5],*y;
int i,s;
x[0]=1; x[1]=5; x[2]=7;
x[3]=45; x[4]=22;
s=0;
y=x;
for (i=0; i<5; ++i){
s=s+(*y);
y++; }
printf("x cergesinin elementleri ashagidakilardir\n");
y=x;
for(i=0; i<5; ++i){
printf("%d\n",*y);
y++;}
printf("x-in elementlerinin ededi ortasi %d\n", s/5);
return 0;
}
proqramı yerinə yetirək
user@gnu_linux:~/prg# gcc prog_6_2.c -o prog_6_2
user@gnu_linux:~/prg#
user@gnu_linux:~/prg# ./prog_6_2
x cergesinin elementleri ashagidakilardir
1
5
7
45
22
x-in elementlerinin ededi ortasi 16
user@gnu_linux:~/prg#
Izahı
#include <stdio.h>
stdio.h faylını proqrama əlavə edirik. printf v.s. funksiyalardan istifadə edə bilmək üçün.
int main(){
int x[5],*y;
main proqramın əsas funksiyasını elan edirik.
int tipindən olan x cərgəsi və y ünvan dəyişəni elan edirik.
x[0]=1; x[1]=5; x[2]=7;
x[3]=45; x[4]=22;
s=0;
x cərgəsinin elementlərinə qiymətlər mənimsədirik.
s cəminə 0 qiyməti mənimsədirik.
y=x;
y-ə x-in başlanğıc unvanını mənimsədirik. şəkil_6_1.
for (i=0; i<5; ++i){
dövr elan edirik
s=s+(*y);
s -ə 0 qiyməti mənimsətmişik. y x -in 1 -ci elementinə istinad edir, deməli *y x-in ilk elementinin qiymətinə bərabərdir.
y++; }
y -i x -in növbəti elementi üzərinə sürüşdürürük. şəkil_6_2.
printf("x cergesinin elementleri ashagidakilardir\n");
ekrana setir çap edirik.
y=x;
for dövrünün sonunda y x-in sonuncu elementi üzərinə istinad edir. y -i yenidən x-in ilk elementi üzərinə sürüşdürürük.
for(i=0; i<5; ++i){
dövr elan edirik
printf("%d\n",*y);
y -in istinad etdityi elementi çapa veririk.
y++;}
y -i x -in növbəti elementi üzərinə sürüşdürürük. şəkil_6_2.
printf("x-in elementlerinin ededi ortasi %d\n", s/5);
return 0;
}
ədədi ortanı çap edib proqramı bitiririk.
axırıncı dəyişikliklər (18.07.10 14:48)



