.


:




:

































 

 

 

 


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. namepers.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 getValuessetValues funksiyalarında pers.namepers.height müraciətlərinə qarşı çıxmırdı, çünki nameheight 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. getValuessetValues funksiyaları Person konstruktoru kimi Person sinfinin funksiya hədləri deyil. getValuessetValues funksiyaları sinfin hüdudlarından kənarda yerləşdiklərindən, onlar nameheight 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  
- çıxmaq ədəd və ya simvol (char) a-b a-dan b-ni çıxmaq  
* vurmaq ədəd və ya simvol (char) a*b a və b ni vurmaq  
/ 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əticə kimi vermək və sonra onu 1 vahid artırmaq  
++ 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  
-- azalma, dekrement ədəd və ya simvol (char) a-- a-nı nəticə kimi vermək və sonra onu 1 vahid azaltmaq  
-- azalma, dekrement ədəd və ya simvol (char) --a a-nı1vahid azaltmalı və azaldılmış qiyməti nəticə kimi vermə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ünməsindən alınan qalıq  
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
+= hesabi mənimsətmə ə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(true) qiymətə malikdirsə, ona yalan (false) qiyməti mənimsətməli və tərsinə
==   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
!= 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
< 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
>= 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
<= 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
&& 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  
& 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ə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
>> 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ə 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
&= mərtəbə üzrə 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ə əməli yerinə yetirildikdən sonra alınır
|= 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
^= 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
>>= 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
<<= 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
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, sonra isə a elə azaldılır ki, o, yaddaş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 ü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
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
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
delete Silmək Istənilən göstərici delete [] a Yaddaşın dinamik oblastına a massivi ilə tutulan yaddaş qaytarır
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  
[ ] indeksləmə operatoru Ad ad[ ] Massivin elementini alır və ya sinifdə yüklənmiş funksiyanı çağırır  
                 

 

Əlavə 3





:


: 2017-01-21; !; : 565 |


:

:

, , .
==> ...

1592 - | 1510 -


© 2015-2024 lektsii.org - -

: 0.031 .