main proqramın əsas funksiyasını elan edirik.
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.
ekrana setir çap edirik.
y -in istinad etdityi elementi çapa veririk.
ədədi ortanı çap edib proqramı bitiririk.
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# 0>
Dostları ilə paylaş: