Strukturlar
İndiyə qədər biz dəyişən elan edərkən int, double, char, long kimi standart tiplərdən istifadə edirdik. Əlbəttə, bu tiplə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. Bu zaman strukt tiplərdən və ya siniflərdən istifadə olunur. Strukt tipi bizə bir neçə müxtəlif tipdən olan dəyişəni bir ad altında birləşdirməyə imkan verir.
Yeni strukt tipi təyin etmək üçün sintaksis aşağıdakı kimidir.
struct yeni_tip {
tip1 dey1;
tip2 dey2;
tip3 dey3;
.
.
tipk deyn; };
Bu zaman biz yeni_tip adlı tip yaratmış oluruq, hansı ki, özündə tip1, tip2 və s. tiplərdən olan dəyişənləri saxlayır. Bu elandan sonra, artıq biz standart tiplərdə olduğu kimi, dəyişən elan edə bilərik.
Aşağıdakı kimi:
yeni_tip st1;
Bu elanda biz yeni yaratmış olduğumuz yeni_tip strukt tipindən st1 adlı dəyişən elan etdik. Sadə nümunəyə baxaq. Özündə int və char tipli dəyişənlər saxlayan str adlı yeni strukt tipi yaradaq. Daha sonra, bu tipdən dey adlı dəyişən elan edək.
struct str{
int x;
char c;
};
str dey;
Strukt tiplərinin tətbiqinə aid aşağıdakı kimi məsələyə baxaq. 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əzifəsi barədə məlumatlar qeyd edilməlidir. Bunun üçün yeni struct tipi təyin edək.
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 işçi 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. Məsələn: işçi dey1, işçi1, *mühəndis, yeni_işçilər[100];
Yuxaridakı elanda biz ishci tipindən olan dey1 və işçi1 dəyişənləri, mühəndis ünvan dəyişəni və 100 elementli yeni_işçiler cərgəsi yaratdıq. 100 000 işçi barəsində məlumat saxlamaq üçün biz yeni yaratdığımız işçi tipindən olan 100 000 elementli cərgədən istifadə edə bilərik.
İşçi işçiler[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 onların təşkil olunduqları 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:
işçi rəis;
reis.yash = 50;
strcpy(reis.ad,"Anar");
Yuxarıdakı kod hissəsində biz ishci tipindən olan rəis dəyişəni elan elədik və onun yaş həddinə 50, ad həddinə isə ”Anar”qiymətlərini mənimsətdik. Artıq strukt tipindən istifadə etməklə proqram tərtibinin vaxtı çatıb.
Proqram nümunəsi:
//prog_8_1.c
#include <iostream>
#include <string.h>
struct str{
int x;
char söz[30];
};
int main(int argc, char *argv[])
{
str str_dey;
str_dey.x=50;
strcpy(str_dey.soz,"Ali");
std::cout<<"str_dey-in hədləri \nx - "<<str_dey.x<<"\nsöz - "<<str_dəy.söz<<"\n";
return 0;
}
Nümunə
Proqramı yerinə yetirək.
C:\cpp\prog2\Debug>
C:\cpp\prog2\Debug>./prog2.exe
str_dəy-in hədləri
x – 50
soz – Ali
C:\cpp\prog2\Debug>
C:\cpp\prog2\Debug>
8.1 Strukt tipindən olan ünvan dəyişənləri
strukt tipindən aşağıdakı kimi ünvan dəyişəni təyin edək:
ishci *muhendis;
Əgər biz strukt tipdən adi yox ünvan 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.
Paraqraf 4-dən bilirik ki, hər hansı bir tipdən olan unvan dəyişəninə yaddaşda yer ayırmaq üçün
tip *dəy; dəy = new işçi;
sintaksisindən istifadə edirik.
Bu sintaksisə əsasən, yuxarıda təyin etdiyimiz mühəndis ü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.
mühəndis = new işçi;
Bu operatordan sonra biz artıq mühəndis dəyişəninin istənilən elementinə -> operatoru vasitəsilə müraciət edə bilərik.
mühəndis->yash=33;
strcpy(mühəndis->ad,"Rustem");
Proqram nümunəsi:
//prog_8_2.c
#include <iostream>
#include <string.h>
struct yeni_tip
{
char ad[20];
int x;
};
int main(int argc, char *argv[])
{
yeni_tip *dəy;
dəy = new yeni_tip;
dəy->x=50;
strcpy(dey->ad,"Veli");
std::cout<<dey->ad<<" "<<dəy->x<<"\n";
return 0;
}
Nümunə
Nəticə:
C:\cpp\prog2\Debug>
C:\cpp\prog2\Debug>./prog2.exe
Veli 50
C:\cpp\prog2\Debug>
C:\cpp\prog2\Debug>