Kompüterlər, proqramlaşdırma dilləri, əməliyyat sistemləri



Yüklə 395 Kb.
səhifə5/5
tarix26.11.2019
ölçüsü395 Kb.
#29694
1   2   3   4   5
C dili haqqinda

Cərgələr


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


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

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 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.


Sətirlər


Sətirlər cərgələrin xüsusi halıdır. Cərgə elementlərinin tipinin char olduğu hal. char tipi simvol tipi adlanır. Başqa sözlə sətirlər simvollar cərgəsidir. İlk baxışda sətirlər elə də əhəmiyyət kəsb etmir və onlarla işləmək üçün bir neçə standart funksiya təyin olunur. 
Sətirlərin tətbiq sahəsi çox genişdir, həm nüvədə, həm də istifadəçi proqramlaşdırmasında sətirlərdən çox geniş istifadə olunur. Misal üçün çat proqramında daxil etdiyimiz her-hansı sətir internet şəbəkəsinə qoşulmuş digər komputerdə yerinə yetirilən çat proqramına ötürülən zaman bir neçə dəfə bir yerdən(yaddaşda) digər yere köçürülür.
İstifadəçinin daxil etdiyi parolu yoxlamaq üçün biz proqramda sətirlərin müqaisəsi funksiyalarından istifadə edirik v.s. Sətirlərlə işləyən zaman diqqət verilməsi lazım gələn məsələlərdən biri də sətirin sonu məsələsidir. Sətirlərin sonunu bildirmək üçün '\0' simvolundan istifadə olunur. Sətir funksiyaları bu simvola rast gəldikdə sətrin yerdə qalan hissəsini inkar edirlər.

prog_7_1.c

#include

#include

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

char set[12]; /*12 elementden ibaret setir elan edirik*/

strcpy(set,"Azerbaycan");

printf("%s\n",set);

return 0;

}

proqramı yerinə yetirək



user@gnu_linux:~/prg# gcc prog_7_1.c -o prog_7_1

user@gnu_linux:~/prg#

user@gnu_linux:~/prg# ./prog_7_1

Azerbaycan

user@gnu_linux:~/prg#

Izahı


Burada biz 12 elementden ibaret set adlı setir elan edirik. Daha sonra strcpy funksiyası vasitəsilə set sətrinə"Azerbaycan" qiymətini mənimsədirik. strcpy funksiyasi string.h faylinda təyin olduğundan #include  vasitəsiləstring.h faylini proqrama əlavə edirik. strcpy funksiyasının sintaksisi aşağıdakı kimidir. 
char * strcpy(char *s1, char *s2); 
strcpy funksiyası s1 sətrinə s2 sətrini mənimsədir. Sətirlərlə işləyən digər funksiyalara baxaq. strlen funksiyası.

int strlen(char *s); 


s sətrində olan elementlərin sayını qaytarır. '\0' simvolunu hesaba almır.

char * strncpy(char *s1, char *s2, int n); 


s2 sətrinin ilk n elementini s1-ə köçürür(s1-in əvvəlindən başlayaraq).

int strcmp(char *s1, char *s2); 


bu funksiyadan sətirlərin müqaisəsi üçün istifadə edirlər. Əgər s1 sətri s2 sətri ilə eynidirsə onda funksiya 0 qiymətini qaytarır, əgər s1-in elementlərinin sayı s2-den azdırsa onda <0 əks halda >0 qiymətini qaytarır.

char * strcat (char *s1, char *s2); 


bu funksiya s1-in sonuna s2-ni əlavə edir.

Strukt tiplər


İndiyə qədər biz dəyişən elan edərkən int, double, char, long kimi standart tiplərdən istifadə edirdirk. Əlbətdə bu tpliər çox əlverişlidir, lakin çox vaxt məsələnin şərtinə uyğun olaraq proqramçının özü yaratdığı tiplərdən istifadə etmək lazım gəlir.
Tutaq ki hər-hansı zavodun 100 000 işçisi var. Bizdən tələb olunur ki, bu zavodun işçilərinin məlumatlar bazası proqramını yazaq. Hər bir işçi haqqında onun adı, soyadı, yaşı, maaşı, vəzifesi barədə məlumatlar qeyd edilməlidir. Bunun üçün yeni struct tipi təyin edək.
Yeni tip təyin etmək üçün sintaksis aşağıdakı kimidir.

struct yeni_tipin_adı {

tip dey1;

tip dey2;

tip dey3;

.

.



tip deyn; };

Məsələmizə uyğun təyin etməli olduğumuz yeni tip belə olar. Gəlin bu yeni yaradacağımız tipə ishci adını verək.

struct ishci {

int yash;

char ad[12];

char soyad[20];

char vezife[20];

double maash; };

Beləliklə biz yeni ishci tipi təyin etdik. Bu elandan sonra biz proqramımızda bu tipdən adi tiplər kimi dəyişənlər və ünvan dəyişənləri elan edə bilərik, lakin gərək tipin adından (ishici) əvvəl kompilyatora bu tipi bizim özümüz yaratdığımızı bildirmək üçün struct ifadəsini yerləşdirək.
Məsələn: struct ishci dey1, ishci1, *muhendis, yeni_ishciler[100]; 
yuxaridakı elanda biz ishci tipindən olan dey1 və ishci1 dəyişənləri, muhendis unvan dəyişəni və 100 elementliyeni_ishciler cərgəsi yatardıq. 
100 000 ishci barəsində məlumat saxlamaq üçün biz yeni yaratdığımız ishci tipindən olan 100 000 elementli cərgədən istifadə edə bilərik.
struct ishci ishciler[100000];
İndi isə maraqlı məqam. Tutaq ki, int tipindən olan x dəyişənimiz var.
int x; Əgər biz bu dəyişənə 4 qiyməti mənimsətmək istəyiriksə x=4; yazırıq. Bəs strukt tipindən olan dəyişənlərə və ya oların təşkil onlunduqları ayrı-ayrı elementlərə necə qiymət mənimsədək? strukt tipinin elementlərinə müraciət etmək üçün ( . ) və ya ( -> ) operatorlarından istifadə olunur. Aşağıdakı kimi:

struct ishci reis;

reis.yash = 50;

strcpy(reis.ad,"Anar");

... v.s.

Artıq strukt tipindən istifadə etməklə proqram tərtibinin vaxtı çatıb.

prog_8_1.c

#include

#include

#include

/* yeni_tip adli struct tipi yaradiriq*/

struct yeni_tip{

char ad[20];

int x; };

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

/* struct yeni_tip -den dey adli deyishen elan edirik*/

struct yeni_tip dey;

dey.x=50;

memset(dey.ad,0,20); /* memset (stdlib.h)

ad -in butun baytlarina 0 qiymeti yaziriq.

setirlerle ishleyerken bunu etmek vacibdir.*/

strcpy(dey.ad,"Ali");

printf("%s,%d\n",dey.ad,dey.x);

return 0;

}

proqramı yerinə yetirək



user@gnu_linux:~/prg#

user@gnu_linux:~/prg# gcc prog_8_1.c -o prog_8_1

user@gnu_linux:~/prg#

user@gnu_linux:~/prg# ./prog_8_1

Ali,50

user@gnu_linux:~/prg#



user@gnu_linux:~/prg#

Strukut tipindən olan ünvan dəyişənləri

strukt tipindən aşağıdakı kimi ünvan dəyişəni təyin edək:

strukt ishci *muhendis;

Əgər biz strukt tipdən adi yox unvan dəyişəni təyin ediriksə onda strukt tipinin elementlərinə müraciət zamanı ( .) əvəzinə (->) istifadə edirik. misal üçün:

muhendis->yash=45; kimi. 

DIQQƏT! ÜNVAN DƏYİŞƏNLƏRİ ÜÇÜN YADDAŞDA YER AYIRMADAN ONLARIN ELEMENTLƏRİNƏ MÜRACİƏT ETMƏK OLMAZ. 

Paraqraf 4-dən bilir ki, hər hansı bir tipdən olan unvan dəyişəninə yaddaşda yer ayırmaq üçün

tip *dey; 
dey = (tip *) malloc (sizeof(tip));

sintaksisindən istifadə edirik.

Bu sintaksisə əsasən yuxarıda təyin etdiyimiz muhendis ünvan dəyişəninin elementlərinə qiymət mənimsədə bilmək üçün əvvəlcə ona yaddaşda aşağıdakı kimi yer ayırmalıyıq.

muhendis = (struct ishci *)malloc(sizeof(struct ishci));

Bu operatordan sonra biz artıq muhendis dəyişəninin istənilən elementinə -> operatoru vasitəsilə müraciət edə bilərik.

muhendis->yash=33;

strcpy(muhendis->ad,"Rustem");

Proqram nümunəsi:

prog_8_2.c

#include

#include

#include

/* yeni_tip adli struct tipi yaradiriq*/

struct yeni_tip{

char ad[20];

int x; };

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

struct yeni_tip *dey;

/* malloc yaddashda yer ayirir, bu yerde evvelceden bashqa melumatlar ola biler ve bu bize

gozlenilmeyen problemler yarada biler. Ona gore malloc -la yaddashda yer ayiranda

onun butun baytlarini memset -le 0-ra menumsetmek meslehetdir. */

dey = malloc(sizeof(struct yeni_tip));

memset(dey,0,sizeof(struct yeni_tip));

dey->x=50;

strcpy(dey->ad,"Veli");

printf("%s,%d\n",dey->ad,dey->x);

return 0;

}

user@gnu_linux:~/prg#



user@gnu_linux:~/prg# gcc prog_8_2.c -o prog_8_2

user@gnu_linux:~/prg#

user@gnu_linux:~/prg# ./prog_8_2

Veli,50


user@gnu_linux:~/prg#

user@gnu_linux:~/prg#
Yüklə 395 Kb.

Dostları ilə paylaş:
1   2   3   4   5




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©azkurs.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin