Menu

Daxil olun Qeydiyyat

C Proqramlaşdırma Dili

Cərgələr

Cərgələr

Biz indiyə kimi adi dəyişənlər və ünvan dəyişənlə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, proqramda 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 cərgəsinin elementləri aşağıdakılardır\n");
for(i=0; i>5; ++i)

printf("%d\n",x[i]);
printf("x-in elementlərinin ədədi ortası %d\n", s/5);

return 0;
}

Nümunə

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 cərgəsinin elementləri aşağıdakılardır
1
5
7
45
22
x-in elementlərinin ədədi ortası 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, ünvan dəyişənini (z) yaddaşda istənilən yerə ünvanlamaq olar, cərgənin adı (x) isə, ancaq bir yerə (yaddaşda [4]-ün başlanğıc addresinə) ünvanlanır.
Əgər z-ə y-in ünvanını mənimsətmək istəyiriksə, onda ünvan operatorundan (&) istifadə edirik.
z=&y;

Əgər z-ə cərgənin (x) ünvanını mənimsətmək istəsək, onda ünvan 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-i 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);

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

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 cərgəsinin elementləri aşağıdakılardır\n");
y=x;
for(i=0; i<5; ++i){
printf("%d\n",*y);
y++;}
printf("x-in elementlərinin ədədi ortası %d\n", s/5);
return 0;
}

Nümunə

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 cərgəsinin elementləri aşağıdakılardır
1
5
7
45
22
x-in elementlərinin ədədi ortası 16
user@gnu_linux:~/prg# 

İzahı:
#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 ünvanını mənimsədirik.

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.

printf("x cərgəsinin elementləri aşağıdakılardır\n");
Ekrana sətir ç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 etdiyi elementi çapa veririk.

y++;}
y-i x-in növbəti elementi üzərinə sürüşdürürük.


printf("x-in elementlerinin ededi ortasi %d\n", s/5);
return 0;
}

Ədədi ortanı çap edib proqramı bitiririk.


Bizi dəstəkləyənlər