Strukturların funksiya parametri kimi ötürülməsi

Aşağıdakı proqram Person struktur nümunəsini iki funksiya parametri kimi ötürür. setValues funksiyası struktur nümunəsinin dəyişənlərinə qiymətlər mənimsədir, getValues funksiyası isə həmin qiymətləri ekrana çıxa­rır:

Misal 10.4.

#include <cstdlib>

#include <iostream>

#include<string>

#include<conio.h>

using namespace std;

struct Person{

string name;

int qrup;

};

void setValues(Person&);

void getValues(const Person&);

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

{

Person P1;

setValues(P1);

cout<<"Telebeler haqqinda melumat\n";

cout<<"=======================\n";

getValues(P1);

getch();

return 0;

}

void setValues(Person& pers)

{

cout<<"Telebenin soyadini daxil et:\n";

getline(cin,pers.name);

cout<<"telebenin qrupunun nomresini daxil et:-";

cin>>pers.qrup;

cin.ignore();

}

void getValues(const Person& pers)

{

cout<<"Telebenin soyadi - "<<pers.name<<"\n qrup nomresi - "<<pers.qrup<<endl;

}

Strukturların funksiya parametri kimi ötürülməsi - student2.ru

Massivin adından fərqli olaraq, strukturun qiyməti – ün­van deyil. Ona görə də strukturu funksiya parametri kimi ötür­dükdə onun dəyişənlərinin qiymətini dəyişmək üçün struk­turu ünvana və ya müraciətə görə ötürmək lazımdır. Belə­liklə, setValues funksiyasında struktur müraciətə görə ötü­rülür. Həmçinin getValues funksiyasında da struktur mü­raciətə görə ötürülür.

Bir-birinə daxil olan strukturlar

Əvvəllər biz if şərt operatorunun digər if operatoru da­xi­lin­də və bir dövr operatorunun digər dövr operatoru da­xi­lin­­də yerləşməsi hallarına rast gəlmişdik. Bu qayda ilə bir struk­turu da digər struktur daxilində yerləşdirmək olar.

Məsələn, hər bir insanın ad günü var, ad günü isə ta­rix­dir. Tarix isə strukturda təyin oluna bilər: gün, ay və il. Be­lə­liklə, aşağıdakı strukturu elan etmək olar:

struct Date

{

int day;

int month;

int year;

};

Bundan sonra biz yuxarıdakı Person strukturunu geniş­lən­di­rə bilərik:

struct Person

{

string name ;

int height;

Date bday;

};

Qeyd edək ki, Date strukturu proqramda Person struk­tur­dan əvvəldə elan olunmalıdır. Əks halda Date strukturundan sonra Person strukturunun dəyişənlərinin elanında bDay nümunəsinin yerləşməsini kompilyator başa düşməyəcək.

Siniflər

Strukturlar haqqında deyilənlərin əksər hissəsi siniflərə dəaid­dir. Bunun üçün siniflərin elanında sadəcə olaraq struct xidməti sö­zünü class xidməti sözü ilə əvəz etmək lazımdır. Lakin bu­nun­la belə sinif və struktur arasında çox mühüm bir fərq var. Onu şərh etmək üçün 10.4 bəndindəki proqramın strukturun ela­nı bölməsinin əvəzinə class yazaraq aşağıdakı kimi dəyişək:

class Person{

string name;

int qrup;

}

Proqramın işləməsi nəticəsində getValues və setValues –dəkom­pilyatorunbir neçə səhvi alınacaq. Belə ki, hər bir pers­.nam­e və pers.qrup müraciəti nəticəsində “Person sin­fində elan olunmuş hər bir xüsusi nümunəyə müraciət etmək olmaz” məzmunlu səhv alınacaq. Bu səhv onunla əlaqədardır ki, sinfin nümunəsinin dəyişənləri susmaya görə xüsusi (özəl) ol­duqları halda, struktur nümunəsinin dəyişənləri açıqdırlar. Nümunənin açıq dəyişənlərinə isə proqramın istənilən yerində müraciət etmək olar. Ona görə də Person sinif deyil struktur olduqda kompilyator getValues və setValues funksiyalarında pers.name və pers.height müraciətlərinə qarşı çıxmırdı, çünki name və height – açıq dəyişənlər idi.

Nümunənin xüsusi dəyişəninə yalnız bu sinfin funksiya –həddi ilə müraciət etmək olar. getValues və setValues funk­siyaları Person konstruktoru kimi Person sinfinin funksiya – hədləri deyil. getValues və setValues funksiyaları sinfin hü­dud­la­rın­dan­ kənarda yerləşdiklərindən, onlar name və height nü­munə­si­nin xüsusi dəyişənlərinə müraciət edə bilməzlər.

Bu problemin həll olunması üçün nümunənin xüsusi dəyi­şən­ləri ilə iş­ləmək üçün açıq funksiya-hədd yaratmaq la­zımdır. Bu funk­si­ya – hədlər açıq olduğundan onlara sinfin hüdud­larından xa­ric­də müraciət etmək olar.

Oxumaq və yazmaq üçün nümunələrin xüsusi dəyişən­ləri­nin və funk­siya-hədlərin istifadə olunmasının əsas üstünlüyü girişin yox­lanılmasındadır.

Əlavə 1

Borland C/C++ -un qrafik kitabxanası

C++ dilində və onun sələfi olan C dilində qrafik vasitələr ta­mamilə iştirak etmir. Qrafiklə işlə­mək üçün bütün konkret im­kanlar qrafik funksiyaların əlavə kitabxanası şəklində verilir.

Qrafik kitabxana ilə işləmək üçün proqrama qraphice.h başlıq faylını daxil etmək lazımdır.

Funksiya Prototip və əməllərin qısa təsviri
closegraph void far closegraph(void); Sistemin qrafik rejimdən mətn rejiminə keçirilməsi;
graphdefaults void far graphdefaults(void); Susmaya görə qrafik sistemin bütün pa­ra­metrlərini qurur.
initqraph void far initqraph(int far *qraphidriver, int far*graphmode, char far* pathto driver); Sistemin mətn rejimindən qrafik rejimə ke­çi­ril­məsi, qrafikin adlan­dırıl­ma­sı
installuserfont int far installuserfont(char far *name); Name(.chr) faylında yerləşən şriftləri qurur
restorecrtmode void far restorecrtmote(void); Initgraph() funksiyasının çagırıldığı yer­dən­ mətn rejiminə müvəqqəti keçid
setactivepage void far setactivepage(int, page); Qrafikin çıxarılması üçün aktiv page səhifəsi qurur
setbkcolor void far setbkcolor(int color); Fonun rəngini qurur
setcolor void far setcolor(int color); Nöqtənin (təsvirin) rənginin qurulması
setgraphmode void far setgraphmode(int mode); initgraph() funksiyasının qurduğundan fərqli qrafik rejimə keçid
setallpalette void far setallpalette(struct palettype far*palette); Palitranın bütün rənglərini qurur
setpalette void far setpalette(int colornum, int co­lor); Palitranın rənglərindən birini qurur.
setusercharsize void far setusercharsize(int multx, int divx,­ int multy, int divy); Qrafik rejimdə çıxarılan simvolların ölçüsünün qurulması.
setvisualpage void far setvisual(int page); page qrafik səhifəsini görünən edir.
arc void far arc(int x, int y, int stangle, int end­angle, int radius); (x,y) mərkəzli çevrənin qövsünün çəkil­mə­si.
bar void far bar(int left, int top, int right, int bottom); Rənglənmiş düzbucaqlının çəkilməsi.
bar3d void far bar3d (int left, int top, int right, int bottom, int depth, int topflag); Rənglənmiş paralelepipedin çəkilməsi.
cleardevice void far cleardevice(void); Ekranın fonun rəngi ilə təmizlənməsi
clearvewport void far clearviewport (void); Əvvəlcədən qurulmuş qrafik ekran pəncə­rə­­sinin təmizlənməsi
ellipse void far ellipse(int x, int y, int stangle, int endangle, int xradius, int yradi­us­); (x,y) radiuslu ellipsin qövsünün çəkilməsi.
line void far line (int x1, int y1, int x2,int y2); (x1,y1)-dən (x2,y2)-yə qədər xəttin çəkilməsi.
putpixel void far putpixel (int x, int y, int color); (x,y) koordinatlarına görə nöqtənin çəkil­mə­si.
rectangle void far rectangle (int left, int top, int rigth­, int buttom); Təpələri verilmiş düzbucaqlının çəkilməsi.
getmaxcolor int far getmaxcolor(void); setcolor() funksiyasının köməyi ilə qrafik dray­verin cari rejimində rəngin ən böyük nömrəsini qaytarır.
getmaxmode int far getmaxmode (void); cari qrafik drayver üçün qurulması müm­kün olan rejimin ən böyük nöm­rəsini qay­tarır
getmodename char *far getmodename (int mo­de­_­num­ber); Göstəricini qrafik rejimin mode_number adlı sətrinə qaytarır.
getmaxx int far getmaxx(void); Horizontal üzrə (x –in maksimal qiyməti) ekranın ölçüsünə bərabər olan tam qiymət qaytarır.
getmaxy int far getmaxy(void); vertikal üzrə (y –in maksimal qiyməti) ek­ra­nın ölçüsünə bərabər olan tam qiy­mət qaytarır.
getpixel unsigned far getpixel (int x,int y); Verilmiş(x,y) nöqtəsinin rəngini qaytarır.
getpalettesize   int far getpalettesize (void); Cari qrafik rejimdə aydın olan rənglərin sayını qaytarır.
getx int far getx(void) ekranda cari vəziyyətdə x koordinatının tam qiymətini qaytarır
gety int far gety(void); Ekranda cari vəziyyətin y koordinatının tam qiymətini qaytarır.
imagesize unsigned far imagesize (int lefft,int top, int right, int bottom); Verilmiş koordinatlı ekran pəncərəsində qrafik informasiyanın saxlanması üçün buferin həcmini qaytarır.
textwidth int far textwidth (char far* textstring); textstring simvollar sətrinin eninin piksellə tam qiymətini qaytarır.
textheight int far textheight(char far*textstring); Textstring sətrindən simvolların piksellə hündürlüyünün tam qiymətini qaytarır.

Əlavə2

Operatorlar

Opera-tor funksi­yası operan­­dın tipi yazı­lı­şı izahat yenidən yüklənmə imkanı  
I. Hesabi operatorlar  
+ əlavə etmək ədəd və ya­­­­­ sim­vol (char) a+b a və b-ni toplamaq  
- çıxmaq ədəd və ya­­­­­ simvol (char) a-b a-dan b-n­­­i­­ çıx­maq  
* vurmaq ədəd və ya­­­­­ sim­vol (char) a*b a və b –ni vur­­maq  
/ bölmək ədəd və ya­­­­­ simvol (char) a/b a-nı b-yə bölmək  
++ artım,artırma,inkrement ədəd və ya­­­­­ simvol (char) a++ a-nı nəti­c­ə­ ki­m­i ver­mək və son­ra onu 1 va­hid ar­tır­­­maq  
++ artım, artırma, inkrement ədəd və ya­­­­­ simvol (char) ++a a-nı 1 va­hid ar­­tır­­­malı və­ artırıl­mış qiyməti nə­ti­cə kimi ver­mə­­li  
-- azalma, dekrement ədəd və ya­­­­­ simvol (char) a-- a-nı nəti­c­ə­ ki­m­i ver­mək və son­ra onu 1 va­hid azalt­maq  
-- azalma, dekrement ədəd və ya­­­­­ simvol (char) --a a-nı1va­hid azalt­­­­­malı və­ azal­dılmış qiy­mə­ti nə­ti­cə kimi ver­mə­li  
& modul, bölmədən alınan qalıq ədəd və ya­­­­­ simvol (char) a&b a-nın b-yə bö­­­­­­lün­­­­­mə­sin­dən alı­nan qa­­lıq  
II. Mənimsətmə operatorları  
= mənimsətmək istənilən a=b a-nın məz­mu­nu­nu b-nin məz­mu­nu kimi et­mək
+= hesabi mənimsət­mə ədəd və ya­­­­­ simvol (char) a+= a=a+b-yə ekvivalent
-= hesabi mənimsətmə ədəd və ya­­­­­ simvol (char) a-=b a=a-b-yə ekvivalent
*= hesabi mənimsətmə ədəd və ya­­­­­ simvol (char) a*=b a=a*b-yə ekvivalent
/= hesabi mənimsətmə ədəd və ya­­­­­ simvol (char) a/=b a=a/b-yə ekvivalent
III. Müqayisə və məntiqi operatorlar  
! inkar məntiqi (boolean) !a əgər a doğru­(tru­­e)­ qiy­mətə ma­­­­­­lik­dir­sə, ona ya­­lan (false) qiy­­­mə­ti mə­nim­­sət­mə­li və tərsinə
==   bərabərdir istənilən a==b əgər a-nın məz­mu­­nu b-nin məz­mu­nuna bə­ra­bər­dir­sə, onda bu ifa­­də doğru (true), əks hal­da isə ya­lan(false) qiyməti alır
!= bərabər deyil istənilən a!=b əgər a-nın məz­mu­­nu b-nin məz­mu­­nuna bə­ra­bər­ deyil­sə, onda bu ifa­­də doğru(true) , əks hal­da isə ya­lan (false) qiyməti alır   hə
> böyükdür istənilən a>b əgər a-nın məz­mu­­­­nu b-nin məz­mu­nundan bö­yük­dür­sə, onda bu ifa­­də doğru(true) , əks halda isə ya­lan(false) qiyməti alır
< kiçikdir istənilən a<b əgər a-nın məz­mu­­nu b-nin məz­mu­nundan kiçik­dirsə, onda bu ifa­də doğru(true), əks halda isə ya­lan(false) qiyməti alır
>= böyükdür və ya bərabərdir istənilən a>=b əgər a-nın məz­mu­­nu b-nin məz­mu­nundan bö­yük­dür­sə və ya ona bə­­ra­­bər­dir­sə, on­da bu ifa­də doğ­ru­­(true), əks halda isə yalan(false) qiy­­məti alır
<= kiçikdir və ya bərabərdir istənilən a<=b əgər a-nın məz­mu­­­nu b-­­nin məz­mu­nundan ki­­çik­dirsə və ya bəra­bə­r­­­­dir­sə, onda bu ifa­də doğru(true) , əks halda isə ya­lan­(false) qiy­mə­ti alır
&& məntiqi (boolean) a&&b əgər a və b doğ­ru­(tru­e­) qiymət alır­sa, bu ifa­də doğ­ru­­­(true), əks halda ya­la­n (fal­se­) ­qiy­mət­ alır­  
|| və ya məntiqi (boolean) a||b əgər a və b doğru­(tru­e­) qiymət alır­sa, bu ifa­də doğ­ru­­(true), əks halda ya­la­n (fal­se­) ­qiy­mət­ alır­  
IV. Bitlər üzərində operatorlar  
& Tam ədəd, simvol (char) və­ ya məntiqi (boolean) a&b nəticə ədəd olur və 1 –də yalnız a və b-də 1 olan mövqelər yerləş­dirilir.
| və ya Tam ədəd, simvol (char) və ya məntiqi (boolean) a|b nəticə ədəd olur, belə ki,1 –də a və ya b-də 1 olan mövqelər yerləş­dirilir.
^ istisna və ya Tam ədəd, simvol (char) və ya məntiqi (boolean) a ^ b Nəticə ədəd olur, və onda1 –də a və b-də müxtəlif qiymətləri olan mövqelər yerləş­dirilir.
<< sola hərəkət Tam ədəd, simvol (char) və ya­­­ mən­tiqi (boolean) a<< b Nəticə ədəd olur, belə ki, a-nın mövqeləri b qədər sola sürüş­dü­rü­lür
>> sağa hərəkət Tam ədəd, simvol (char) və ya­­­ məntiqi (boolean) a>>b Nəticə ədəd olur, belə ki, a-nın mövqeləri b qədər sağa sürüş­dü­rü­lür­
  mərtəbə üzrə in­kar Tam ədəd, simvol (char) və ya­­­ məntiqi (boolean) -a Nəticə ədəd olur,əgər a-nın mərtəbəsi 0 olar­sa nəticə 1, əks halda isə 0 olur
&= mərtəbə üzrə və mə­­nim­sətmə operatoru Tam ədəd, simvol (char) və ya­­­ məntiqi (boolean) &= Nəticə ədəd olur və onun mərtəbəsi a və b-nin uyğun mərtə­bə­ləri üzərində və əməli yerinə yetirildikdən sonra alınır
|= mərtəbə üzrə və ya mə­­nim­sətmə opera­toru Tam ədəd, simvol (char) və ya­­­ məntiqi (boolean) a|=b Nəticə ədəd olur və onun mərtəbəsi a və b-nin uyğun mərtə­bə­ləri üzərində və ya əməli yerinə yetiril­dik­dən sonra alınır
^= mərtəbə üzrə istis­na ­və ya mə­­nim­sətmə operatoru Tam ədəd, simvol (char) və ya­­­ məntiqi (boolean) a^=b Nəticə a və b-nin uy­ğun mərtəbələri üzə­rin­də istisna və ya əmə­liyyatı yerinə ye­ti­rildikdən sonra alı­nan ədəd olur
>>= mərtəbə üz­rə sağa hə­rəkətlə mənimsətmə opera­to­ru Tam ədəd, simvol (char) və ya­­­ məntiqi (boolean) a>>=b Nəticə a –nın mövqe­ləri b qədər sağa sü­rüş­drülmüş ədəd olur
<<= mərtəbə üz­rə sola hə­rəkətlə mənimsətmə opera­to­ru Tam ədəd, simvol (char) və ya­­­ məntiqi (boolean) a<<=b Nəticə a –nın möv­qeləri b qədər sola sürüşdrülmüş ədəd olur
V. Göstəricilərlə əlaqəli operatorlar  
++ artım, artırılma, inkrement Göstərici ++a Nəticə elə artırılmış a olur ki, o yaddaşda hə­min tip sonrakı elementi göstərir
-- azaldılma, dekrement Göstərici a-- Nəticə a olur, son­ra isə a elə azal­dı­lır ki, o, yad­daş­­da həmin tip əvvəlki elementi göstərir
& ünvan Istənilən &a Nəticə a-nın ünvanı olur hə (lakin məsləhət deyil)
*   Istənilən *a Nəticə a ünva­nında saxla­nı­lan tutum olur hə (lakin məsləhət deyil)
VI. Gətirmə operatorları (bir tipin digərinə)  
static... cast statik çevirmə Istənilən static... cast <tip>(a) əgər gətirmə qayd­alar­ı­na gö­rə müm­kün­dürsə, a-nı <tip>-ə çevirir yox (la­kin ənə­nəvi gə­tirməni isti­fadə et­mək olar)
cast ənənəvi gətirmə Istənilən <tip>(a) Tiplərin çev­ril­mə­si qay­da­sın­dan ası­lı olma­ya­raq a-nı <tip> -ə gətirir
dinamic ... cast dinamik çevirmə və ya sinfin çevrilməsi Sinfə və ya müra­ciətə istə­nilən gös­tərici dinamic ... cast <başqa sinif*>(&a) və ya dinamic ... cast <başqa sinif&>(a) Göstəricini verilən sinfin üzərinə və ya müraciəti göstəriciyə gətirir. yox
const... cast sabitin (kon­stan­ta) kö­mə­­yilə çevirmə istənilən dəyişən const... cast <tip>(a) Verilmiş sinif və ya göstəriciyə const kimi və ya çevirmədən asılı olaraq qeyri sabit kimi baxır yox
VII. Şərt operatoru  
?: şərti ifadə Istənilən a? b:c əgər a true qiy­mət­­li məntiqi qiy­mətdir­sə­, on­­­­­­­­­­da nə­­ticə ol­a­­­­­­­­­raq b-nin qiy­­mə­­ti qay­­ta­rı­­lır yox
VIII. Yaddaşın paylanması operatorları  
new operator new() Istənilən göstərici new <tip> Yaddaş oblastına gös­tə­­ri­ci
delete silmək Istənilən göstərici delete a Yaddaşın dina­mik oblastına a dəyi­şə­ni ilə tutu­lan yad­daş qay­tarır
delete Silmək Istənilən göstərici delete [] a Yaddaşın dina­mik oblas­tına a mas­si­vi­ ilə tutu­lan yad­daş qay­ta­rır
IX. Görünmə oblastı operatoru  
: : görünmə oblastının həlli opera­toru add ad..fəza... adlar : :ad Adların konfi­lik­­­ti­ni həll edir­­,baxı­lan adın kompil­ya­t­or tərəfindən ta­­­­pı­la biləcəyı ad­­lar fəzasını və ya sinfini gös­tərir yox
X. Həddə giriş operatorları  
nöqtənin və ya həd­di­n seçil­məsi ope­ratoru Struktur tip və ya sinfin tipi və hədd obyekt. hədd Nəticə həddin tu­tu­mudur və ya onun­­ çağrıl­ma­sı­dır yox
göstəici üzrə həd­din seçil­məsi ope­ra­toru Struktur tip və ya sin­fin tipi və hədd göstərici- obyekt →ad...hədd Göstəricinin göstərdiyi yad­daş oyu­ğunun məz­mu­nunu gö­türür yox
XI. Həddə göstəriş operatorları  
∙* həddə göstərici Sinfin(obyektin) nümunə­si­nə və həddə göstərici a∙*b a sinfinin b-ni göstərəcək həddinin tutumunu alır yox
→* həddə göstərici Sinfə və sin­fin həd­­­dinə göstərici a→*b *a sinfinin b-nin göstər­diyi həddinin tutumunu alır yox
XII. Funksiyanın çağrılması və indekslənmə operatorları  
( ) funksiya­ya mü­ra­ci­ət ope­ra­toru Funksiya­nın adı və­ ya ye­ni­dən yük­­lən­mə­li ob­yekt ad() Sinifdə yük­lə­nə bi­lən funk­siyanı çağırır  
[ ] indeksləmə opera­toru Ad ad[ ] Massivin ele­mentini alır və ya sinifdə yük­­lənmiş funk­­siyanı ça­ğırır  
                 

Əlavə 3

Наши рекомендации