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 çıxarı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;
}
Massivin adından fərqli olaraq, strukturun qiyməti – ünvan deyil. Ona görə də strukturu funksiya parametri kimi ötürdükdə onun dəyişənlərinin qiymətini dəyişmək üçün strukturu ü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 daxilində və bir dövr operatorunun digər dövr operatoru daxilində yerləşməsi hallarına rast gəlmişdik. Bu qayda ilə bir strukturu 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ə tarixdir. Tarix isə strukturda təyin oluna bilər: gün, ay və il. Belə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əndirə bilərik:
struct Person
{
string name ;
int height;
Date bday;
};
Qeyd edək ki, Date strukturu proqramda Person strukturdan ə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əaiddir. 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 bununla 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 elanı 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əkompilyatorunbir neçə səhvi alınacaq. Belə ki, hər bir pers.name və pers.qrup müraciəti nəticəsində “Person sinfində 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) olduqları 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 funksiyaları Person konstruktoru kimi Person sinfinin funksiya – hədləri deyil. getValues və setValues funksiyaları sinfin hüdudlarından kənarda yerləşdiklərindən, onlar name və height nümunəsinin 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şənləri ilə işləmək üçün açıq funksiya-hədd yaratmaq lazımdır. Bu funksiya – hədlər açıq olduğundan onlara sinfin hüdudlarından xaricdə müraciət etmək olar.
Oxumaq və yazmaq üçün nümunələrin xüsusi dəyişənlərinin və funksiya-hədlərin istifadə olunmasının əsas üstünlüyü girişin yoxlanı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 tamamilə iştirak etmir. Qrafiklə işləmək üçün bütün konkret imkanlar 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 parametrlərini qurur. |
initqraph | void far initqraph(int far *qraphidriver, int far*graphmode, char far* pathto driver); Sistemin mətn rejimindən qrafik rejimə keçirilməsi, qrafikin adlandırılması |
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ığı yerdə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 color); 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 endangle, int radius); (x,y) mərkəzli çevrənin qövsünün çəkilmə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 yradius); (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 çəkilmə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 drayverin cari rejimində rəngin ən böyük nömrəsini qaytarır. |
getmaxmode | int far getmaxmode (void); cari qrafik drayver üçün qurulması mümkün olan rejimin ən böyük nömrəsini qaytarır |
getmodename | char *far getmodename (int mode_number); 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) ekranın ölçüsünə bərabər olan tam qiymə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 | funksiyası | operandın tipi | yazılışı | izahat | yenidən yüklənmə imkanı | |||
I. Hesabi operatorlar | ||||||||
+ | əlavə etmək | ədəd və ya simvol (char) | a+b | a və b-ni toplamaq | hə | |||
- | çıxmaq | ədəd və ya simvol (char) | a-b | a-dan b-ni çıxmaq | hə | |||
* | vurmaq | ədəd və ya simvol (char) | a*b | a və b –ni vurmaq | hə | |||
/ | bölmək | ədəd və ya simvol (char) | a/b | a-nı b-yə bölmək | hə | |||
++ | artım,artırma,inkrement | ədəd və ya simvol (char) | a++ | a-nı nəticə kimi vermək və sonra onu 1 vahid artırmaq | hə | |||
++ | artım, artırma, inkrement | ədəd və ya simvol (char) | ++a | a-nı 1 vahid artırmalı və artırılmış qiyməti nəticə kimi verməli | hə | |||
-- | azalma, dekrement | ədəd və ya simvol (char) | a-- | a-nı nəticə kimi vermək və sonra onu 1 vahid azaltmaq | hə | |||
-- | azalma, dekrement | ədəd və ya simvol (char) | --a | a-nı1vahid azaltmalı və azaldılmış qiyməti nəticə kimi verməli | hə | |||
& | modul, bölmədən alınan qalıq | ədəd və ya simvol (char) | a&b | a-nın b-yə bölünməsindən alınan qalıq | hə | |||
II. Mənimsətmə operatorları | ||||||||
= | mənimsətmək | istənilən | a=b | a-nın məzmununu b-nin məzmunu kimi etmək | hə | |||
+= | hesabi mənimsətmə | ədəd və ya simvol (char) | a+= | a=a+b-yə ekvivalent | hə | |||
-= | hesabi mənimsətmə | ədəd və ya simvol (char) | a-=b | a=a-b-yə ekvivalent | hə | |||
*= | hesabi mənimsətmə | ədəd və ya simvol (char) | a*=b | a=a*b-yə ekvivalent | hə | |||
/= | hesabi mənimsətmə | ədəd və ya simvol (char) | a/=b | a=a/b-yə ekvivalent | hə | |||
III. Müqayisə və məntiqi operatorlar | ||||||||
! | inkar | məntiqi (boolean) | !a | əgər a doğru(true) qiymətə malikdirsə, ona yalan (false) qiyməti mənimsətməli və tərsinə | hə | |||
== | bərabərdir | istənilən | a==b | əgər a-nın məzmunu b-nin məzmununa bərabərdirsə, onda bu ifadə doğru (true), əks halda isə yalan(false) qiyməti alır | hə | |||
!= | bərabər deyil | istənilən | a!=b | əgər a-nın məzmunu b-nin məzmununa bərabər deyilsə, onda bu ifadə doğru(true) , əks halda isə yalan (false) qiyməti alır | hə | |||
> | böyükdür | istənilən | a>b | əgər a-nın məzmunu b-nin məzmunundan böyükdürsə, onda bu ifadə doğru(true) , əks halda isə yalan(false) qiyməti alır | hə | |||
< | kiçikdir | istənilən | a<b | əgər a-nın məzmunu b-nin məzmunundan kiçikdirsə, onda bu ifadə doğru(true), əks halda isə yalan(false) qiyməti alır | hə | |||
>= | böyükdür və ya bərabərdir | istənilən | a>=b | əgər a-nın məzmunu b-nin məzmunundan böyükdürsə və ya ona bərabərdirsə, onda bu ifadə doğru(true), əks halda isə yalan(false) qiyməti alır | hə | |||
<= | kiçikdir və ya bərabərdir | istənilən | a<=b | əgər a-nın məzmunu b-nin məzmunundan kiçikdirsə və ya bərabərdirsə, onda bu ifadə doğru(true) , əks halda isə yalan(false) qiyməti alır | hə | |||
&& | və | məntiqi (boolean) | a&&b | əgər a və b doğru(true) qiymət alırsa, bu ifadə doğru(true), əks halda yalan (false) qiymət alır | ||||
|| | və ya | məntiqi (boolean) | a||b | əgər a və b doğru(true) qiymət alırsa, bu ifadə doğru(true), əks halda yalan (false) qiymət alır | ||||
IV. Bitlər üzərində operatorlar | ||||||||
& | və | 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. | hə | |||
| | 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. | hə | |||
^ | 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. | hə | |||
<< | sola 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 sola sürüşdürülür | hə | |||
>> | 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 | hə | |||
mərtəbə üzrə inkar | 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 olarsa nəticə 1, əks halda isə 0 olur | hə | ||||
&= | mərtəbə üzrə və mənimsə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 | hə | |||
|= | mərtəbə üzrə və ya mənimsətmə operatoru | 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ə yetirildikdən sonra alınır | hə | |||
^= | mərtəbə üzrə istisna və ya mənimsə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ərində istisna və ya əməliyyatı yerinə yetirildikdən sonra alınan ədəd olur | hə | |||
>>= | mərtəbə üzrə sağa hərəkətlə mənimsətmə operatoru | Tam ədəd, simvol (char) və ya məntiqi (boolean) | a>>=b | Nəticə a –nın mövqeləri b qədər sağa sürüşdrülmüş ədəd olur | hə | |||
<<= | mərtəbə üzrə sola hərəkətlə mənimsətmə operatoru | Tam ədəd, simvol (char) və ya məntiqi (boolean) | a<<=b | Nəticə a –nın mövqeləri b qədər sola sürüşdrülmüş ədəd olur | hə | |||
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 | hə | |||
-- | azaldılma, dekrement | Göstərici | a-- | Nəticə a olur, sonra isə a elə azaldılır ki, o, yaddaşda həmin tip əvvəlki elementi göstərir | hə | |||
& | ü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 ünvanında saxlanı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ə qaydalarına görə mümkündürsə, a-nı <tip>-ə çevirir | yox (lakin ənənəvi gətirməni istifadə etmək olar) | |||
cast | ənənəvi gətirmə | Istənilən | <tip>(a) | Tiplərin çevrilməsi qaydasından asılı olmayaraq a-nı <tip> -ə gətirir | hə | |||
dinamic ... cast | dinamik çevirmə və ya sinfin çevrilməsi | Sinfə və ya müraciətə istənilən göstə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 (konstanta) 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 qiymətli məntiqi qiymətdirsə, onda nəticə olaraq b-nin qiyməti qaytarılır | yox | |||
VIII. Yaddaşın paylanması operatorları | ||||||||
new | operator new() | Istənilən göstərici | new <tip> | Yaddaş oblastına göstərici | hə | |||
delete | silmək | Istənilən göstərici | delete a | Yaddaşın dinamik oblastına a dəyişəni ilə tutulan yaddaş qaytarır | hə | |||
delete | Silmək | Istənilən göstərici | delete [] a | Yaddaşın dinamik oblastına a massivi ilə tutulan yaddaş qaytarır | hə | |||
IX. Görünmə oblastı operatoru | ||||||||
: : | görünmə oblastının həlli operatoru | add | ad..fəza... adlar : :ad | Adların konfiliktini həll edir,baxılan adın kompilyator tərəfindən tapıla biləcəyı adlar fəzasını və ya sinfini göstərir | yox | |||
X. Həddə giriş operatorları | ||||||||
∙ | nöqtənin və ya həddin seçilməsi operatoru | Struktur tip və ya sinfin tipi və hədd | obyekt. hədd | Nəticə həddin tutumudur və ya onun çağrılmasıdır | yox | |||
→ | göstəici üzrə həddin seçilməsi operatoru | Struktur tip və ya sinfin tipi və hədd | göstərici- obyekt →ad...hədd | Göstəricinin göstərdiyi yaddaş oyuğunun məzmununu götürür | yox | |||
XI. Həddə göstəriş operatorları | ||||||||
∙* | həddə göstərici | Sinfin(obyektin) nümunəsinə 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ə sinfin həddinə göstərici | a→*b | *a sinfinin b-nin göstərdiyi həddinin tutumunu alır | yox | |||
XII. Funksiyanın çağrılması və indekslənmə operatorları | ||||||||
( ) | funksiyaya müraciət operatoru | Funksiyanın adı və ya yenidən yüklənməli obyekt | ad() | Sinifdə yüklənə bilən funksiyanı çağırır | hə | |||
[ ] | indeksləmə operatoru | Ad | ad[ ] | Massivin elementini alır və ya sinifdə yüklənmiş funksiyanı çağırır | hə | |||
Əlavə 3