Добавил:
bekan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:1-semestr / 9-LEKCIYA
.pdf
9-lekciya. Dinamikalıq yad penen islew. Kórsetkishler. Dinamikalıq
massivler. Yadtı bólistiriwshi funkciyalar.
Programma tekstinde ózgeriwshi járiyalanǵanda, kompilyator ózgeriwshige
yadtan orın ajıratadı. Basqasha aytqanda, programma kodı yadqa júklengen waqıtta
berilgenler ushın, olar jaylasqan segmenttiń basına qarata jıljıwı, yaǵnıy
salıstırmalı adresti anıqlaydı hám obyekt kod payda etiwde ózgeriwshi ushıraǵan
orınǵa onıń adresin jaylastıradı.
Ulıwma alǵanda, programmadaǵı turaqlılar, ózgeriwshiler, funkciyalar hám
klass obyektler adreslerin yadtıń óz aldına orında saqlaw hám olar ústinen ámeller
orınlawı múmkin. Mánisleri adres bolǵan ózgeriwshilerge kórsetkish ózgeriwshiler
delinedi.
Kórsetkish úsh túrde bolıwı múmkin:
- qandayda bir obyektke, atap ótsek ózgeriwshige kórsetkish;
- funkciyaǵa kórsetkish;
- void kórsetkish.
Kórsetkishtiń bul qásiyetleri onıń qabıl etiliwi múmkin bolǵan mánislerde
parıqlanadı.
Kórsetkish álbette qandayda bir tipke baylanısqan bolıwı kerek, yaǵnıy ol
kórsetken adreske qandayda bir mánis jaylasıwı múmkin hám bul mánistiń yadta
qansha orın iyelewi aldınnan belgili bolıwı shárt.
Funkciyaǵa kórsetkish. Funkciyaǵa kórsetkish programma jaylasqan
yadtaǵı funkciya kodınıń baslanǵısh adresin kórsetedi, yaǵnıy funkciya
shaqırılǵanda basqarıw mine usı adreske uzatıladı. Kórsetkish arqalı funkciyanı
ápiwayı yaki qurallı shaqırıw arqalı ámelge asırıw múmkin. Bunda funkciya onıń
atı boyınsha emes, al funkciyaǵa kórsetiwshi ózgeriwshi arqalı shaqırıladı.
Funkciyanı basqa funkciyaǵa argument retinde uzatıw hám funkciya kórsetkishi
arqalı orınlanadı. Funkciyaǵa kórsetkishtiń jazılıw sintaksisi tómendegishe:
< tip> (* <atı>) (<parametr dizimi>);

Bunda <tip> - funkciyanı qaytarıwshı mánis túri; *<atı> - kórsetkish
ózgeriwshiniń atı; <parametr dizimi> - funkciya parametrleriniń yaki olardıń
tipleriniń dizimi.
Máselen:
int (*fun)(float,float);
Bul jerde pútin san tipinde mánis qaytaratuǵın fun atındaǵı funkciyaǵa
kórsetkish járiyalanǵan hám ol eki haqıyqıy tiptegi parametrlerge iye.
#include <iostream>
#include <cmath>
const int n = 100;
double f1(double x){return 5 * sin(3 * x) + x;}
double f3(double x){return x * x + 1;}
double Integral(double(*f)(double), double a, double b)
{
double x, s = 0;
double h = (b - a) / n;
x = a – h / 2;
for(int i = 1; i <= n; i++)
s += f(x += h);
s *= h;

return s;
}
int main()
{
double a, b;
int menu;
while(1)
{
cout << "\nIs rejimin tańlań:\n";
cout <<"1:f1(x)=5*sin(3*x)+x integralın esaplaw\n";
cout << "2:f2(x)=cos(x) integralın esaplaw\n";
cout << "3:f3(x)=x^2+1 integralın esaplaw\n";
cout << "0:Programmadan shıǵıw\n";
do
{
cout << "Is rejimi-> ";
cin >> menu;
}while(menu < 0 || menu > 3);
if(!menu) break;
cout << "Integral aralıǵınıń tómengi shegarası a =";
cin >> a;
cout << "Integral aralıǵınıń joqarı shegarası b =";
cin >> b;
cout << "Funkciya integralı S = ";
switch(menu)
{
case 1: cout << Integral(f1, a, b) << endl;
break;
case 2: cout << Integral(f2, a, b) << endl;
break;
case 3: cout << Integral(f3, a, b) << endl;
}
}
return 0;
}
Programmanıń orınlanıwı sheksiz tákirarlaw operatorı denesin orınlawdan
ibarat. Tákirarlaw denesinde paydalanıwǵa is rejimin tańlaw boyınsha menyu
usınıs etiledi:
Is rejimin tańlań:
1: f1(x) = 5 * sin(3 * x) + x integralın esaplaw

int *i, j,*k;
float x, *y, *z;
2: f2(x) = cos(x) integralın esaplaw
3: f3(x) = x^2 + 1 integralın esaplaw
0: Programmadan shıǵıw
Is rejimi->
Paydalanıwshı 0 hám 3 aralıǵındaǵı pútin sandı kiritiwi kerek. Eger
kiritilgen san (menu ózgeriwshi mánisi) 0 bolsa, break operatorı járdeminde
tákirarlawdan keyin, programmadan shıǵıladı. Eger menu mánisi 1 hám 3
aralıǵında bolsa, integraldıń tómengi hám joqarǵı shegaraların kiritiw soraladı,
hámde integral() funkciyası sáykes funkciya adresi menen shaqırıladı hám nátiyje
baspaǵa shıǵarıladı. Soǵan itibar beriw kerek, integral shegaralarınıń mánislerin
durıs kiritiliwine paydalanıwshı juwapker.
Obyektke kórsetkish. Qandayda bir obyektke kórsetkish (sonıń qatarında
ózgeriwshige). Bunday kórsetkishte belgili túrdegi (tayanısh yaki tuwındılıq
tipindegi) berilgenlerdiń yadtaǵı adresi jaylasadı. Obyektke kórsetkish
tómendegishe járiyalanadı:
< tip> *<atı>;
Bul jerde <tip> - kórsetkishti anıqlaytuǵın adreslerdegi mánistiń túri, <atı> obyekt atı (identifikator). Eger bir tipte bir neshe kórsetkishler járiyalanǵan bolsa,
hárbir kórsetkish ushın „*‟ belgisi qoyılıwı shárt:
int *i, j,*k;
float x, *y, *z;
Keltirilgen mısalda i hám k – pútin tiptegi kórsetkishler hám j – pútin tiptegi
ózgeriwshi, ekinshi operatorda x – haqıyqıy ózgeriwshi hám y, z – haqıyqıy tiptegi
kórsetkishler járiyalanǵan.
void kórsetkish. Bul kórsetkish obyekt tipi aldınan belgisiz bolǵanda
qollanıladı. void kórsetkishiniń zárúr qolaylıqlarınan biri - oǵan hár qanday túrdegi
kórsetkish mánisin júklew múmkinliginde. void kórsetkish adresindegi mánisti
qollanıwdan aldın, onı anıq bir tipke ashıq túrde keltiriw kerek boladı. void
kórsetkishin járiyalaw tómendegishe boladı:
void *<atı>;

Kórsetkishtiń ózi turaqlı yaki ózgeriwsheń bolıwı hám turaqlı yaki
ózgeriwshiler adresine kórsetiwi múmkin, máselen:
int i; //pútin ózgeriwshi
const int ci = 1; //pútin turaqlı
int *pi;//pútin ózgeriwshige kórsetkish
const int *pci; //pútin turaqlıǵa kórsetkish
int *const cp = &i; //pútin ózgeriwshige turaqlı kórsetkish
const int *const cpc = &ci; //pútin turaqlıǵa turaqlı
kórsetkish
Mısallardan kórinip turǵanınday, „*‟ hám kórsetkish atı arasında turǵan
const modifikatorı tek kórsetkishtiń ózine tiyisli boladı hám onı ózgertiw múmkin
emesligin bildiredi, „*‟ belgisinen shepte turǵan const bolsa kórsetilgen adrestegi
mánis turaqlı ekenligin bildiredi.
Kórsetkishke mánis beriw ushın „&‟ – adresti alıw ámeli qollanıladı.
Kórsetkish ózgeriwshilerdiń ámel etiw tarawı, ómir cikli hám kóriniw tarawındaǵı
ulıwma qaǵıydalarǵa boysınadı.
Kórsetkishke baslanǵısh mánis beriw
Kórsetkishler kóbinese dinamikalıqalıq yad (basqasha atı “birlespe” yaki
“heap”) penen baylanısqan halda qollanıladı. Yadtıń dinamikalıqalıq deliniwine
sebep, bul tarawdaǵı bos yad programma islew processinde, kerekli ornında
ajıratıp alınadı hám mútájlik qalmaǵanda qaytarıladı (bosatıladı). Keyin, bul yad
bólegi programma tárepinen basqa maqsette jane qollanılıwı múmkin.
Dinamikalıqalıq yadqa tek kórsetkishler járdeminde múráját etiw múmkin. Bunday
ózgeriwshiler dinamikalıqalıq ózgeriwshiler delinedi hám olardıń ómirlik cikli
jaratılǵan noqattan baslap programma aqırına shekem yaki ashıq túrde joytılǵan
(baylanısqan yad bosatılǵan) orınǵa shekem boladı.
Kórsetkishlerdi járiyalaǵanda oǵan baslanǵısh mánisler beriw múmkin.
Baslanǵısh mánis (inicializator) kórsetkish atınan keyin yaki qawsırma ishinde
yamasa „=‟ belgisinen keyin beriledi. Baslanǵısh mánisler tómendegi usıllar menen
beriliwi múmkin:
1. Kórsetkishke bar bolǵan obyekttiń adresin beriw:

a) adresti alıw ámeli arqalı:
int i = 5, k = 4; //pútin ózgeriwshiler
int *p = &i; //p kórsetkishine i ózgeriwshiniń adresi
jazıladı
int *p1(&k); //p1 kórsetkishke k ózgeriwshiniń adresi
jazıladı
b) basqa, inicializaciyalanǵan kórsetkish mánisin beriw:
int *r=p;//p aldın járiyalanǵan hám mániske iye bolǵan kórsetkish
v) massiv yaki funkciya atın beriw:
int b[10]; //massivti járiyalaw
int *t = b; //massivtiń baslanǵısh adresin beriw
void f(int a){/* … */} //funkciyanı anıqlaw
void (*pf)(int); //funkciyaǵa kórsetkishti járiyalaw
pf = f; //funkciya adresin kórsetkishke
2. Ashıq túrde yadtıń absolyut adresin beriw:
char *vp = (char *)0xB8000000;
Bunda 0xB8000000 – on altılıq turaqlı san hám (char*) – tipke keltiriw
ámeli bolıp, ol vp ózgeriwshini yadtıń absolyut adresindegi baytlardı char retinde
qayta islewshi kórsetkish túrine aylandırılıwın ańlatadı.
3. Bos mánis beriw:
int *suxx=NULL;
int *r=0;
Birinshi qatarda arnawlı NULL turaqlısı qollanılǵan, ekinshi qatarda 0 mánis
qollanılǵan. Eki jaǵdayda da kórsetkish hesh qanday obyektke múráját etpeydi.
Bos kórsetkish tiykarınan kórsetkishti anıq bir obyektke kórsetip atırǵan yaki joq
ekenligin anıqlaw ushın qollanıladı.
4. Dinamikalıqalıq yadta new ámeli menen orın ajıratıw hám onı adres
kórsetkishke beriw:
int *n = new int; //birinshi operator
int *m = new int(10); //ekinshi operator
int *q = new int[5]; //úshinshi operator
Birinshi operatorda new ámeli járdeminde int ushın jeterli orın ajıratılıp,
onıń adresi n kórsetkishke júklenedi. Kórsetkishtiń ózi ushın orın kompilyaciya
waqtında ajıratıladı.

1-súwret Dinamikalıqalıq yadtan orın ajıratıw
Ekinshi operatorda orın ajıratıwdan tısqarı m adresine baslanǵısh mánis – 0
sanın jaylastıradı. Úshinshi operatorda int tipindegi 5 element ushın orın ajıratılǵan
hám onıń baslanǵısh adresi q kórsetkishke berilip atır.
Yad new ámeli menen ajıratılǵan bolsa, y delete ámeli menen bosatılıwı
kerek. Joqarıdaǵı dinamikalıqalıq ózgeriwshiler menen baylanısqan yad
tómendegishe bosatıladı:
delete n; delete m; delete[]q;
Egerde yadta new[] ámeli menen ajıratılǵan bolsa, onı bosatıw ushın delete
[] ámelin ólshemi kórsetilmegen halda qollanıw kerek. Yad bosatılǵanlıǵına
qaramastan kórsetkishtiń ózin keyinirek qayta isletiw múmkin.
Kórsetkish ústinde ámeller
Kórsetkish ústinde tómendegi ámeller orınlanıwı múmkin:
1) obyektke qurallı múráját etiw ámeli;
2) mánis beriw ámeli;
3) kórsetkishke turaqlı mánisti qosıw ámeli;
4) alıw ámeli;
5) inkrement hám dekrement ámelleri;
6) salıstırıw ámeli;
7) tipke keltiriw ámeli.
Qurallı múráját etiw ámeli kórsetkishtegi adres boyınsha jaylasqan mánisti
alıw yaki mánis beriw ushın qollanıladı:
сhar a; //char tipindegi ózgeriwshi
сhar *p = new char; //kórsetkishti járiyalap,oǵan
//dinamikalıqalıq yadtan ajıratılǵan
//yadtıń adresin beriw

*p = ’b’; //p adresine mánis jaylastırıw
a = *p; // a ózgeriwshige p adrestegi mánisti beriw
Sonı belgilep ótiw orınlı, yadtıń anıq bir orındaǵı adresin bir waqıttıń ózinde
bir neshe hám hár qıylı tiptegi kórsetkishlerge beriw múmkin hám olar arqalı
múráját qılınǵanda berilgenlerdiń hár túrli tipindegi mánislerin alıw múmkin:
unsigned long int A = 0Xcc77ffaa;
unsigned short int *pint = (unsigned short int*)&A;
unsigned char *pchar = (unsigned char*)&A;
cout<<hex<<A<<’ ’<<hex<<*pint<<’
’<<hex<<(int)*pchar;
Ekranǵa hár túrli mánisler shıǵarıladı:
cc77ffaa ffaa aa
Ózgeriwshiler bir adreste jaylasqan halda anıq mánistiń túrli bóleklerin
ózlestiredi. Bunda, bir bayttan úlken orın iyelegen san mánisiniń yadta “keri”
jaylasıwın esapqa alıw kerek.
Eger hár qıylı tiptegi kórsetkishlerge mánisler berilse, álbette tipke keltiriw
ámelinen paydalanıw kerek:
int n = 5;
float x = 1.0;
int *pi = &n;
float *px = &x;
void *p;
int *r, *r1;
px = (float *)&n;
p = px;
r = (int *)p;
r1 = pi;
Kórsetkish tipin void túrine keltiriw ámelde mániske iye emes. Tap sonday,
tipleri bir qıylı bolǵan kórsetkishler ushın tipti keltiriw ámelin orınlawǵa zárúrlik
joq. Kórsetkish ústinen orınlanatuǵın arifmetikalıq ámellerde avtomatlı túrde
tiplerdiń ólshemi (diapazonı) esapqa alınadı.
Arifmetikalıq ámeller tek bir tiptegi kórsetkishler ústinen orınlanadı hám
olar tiykarınan, massiv strukturalarına kórsetkishler ústinde orınlanadı. Inkrement

ámeli kórsetkishti massivtiń keyingi elementine, dekrement bolsa, bir aldıńǵı
elementtiń adresine kóshiriledi. Bunda kórsetkishtiń mánisi sizeof(<massiv
elementiniń tipi>) parametrine ózgeredi.
Máselen:
short int *p = new short[5];
long *q = new long[5];
p++;
q++;
//p mánisi 2 ge artadı
//q mánisi 4 ge artadı
q += 3; //q mánisi 3 * 4 = 12 ge artadı
Kórsetkishlerdiń ayırması dep, olardıń ayırmasınıń tip ólshemine bóliniwine
aytıladı. Kórsetkishlerdi óz-ara qosıw múmkin emes.
Adresti alıw ámeli
Adresti alıw tómendegishe járiyalanadı:
< tip> & <atı>;
Bul jerde <tip> - adresi alınatuǵın túri, <atı> - adresti alıwshı ózgeriwshi atı.
Ortadaǵı „&‟ belgisine adresti alıw ámeli delinedi.
Bul kóriniste járiyalanǵan ózgeriwshi sol túrdegi ózgeriwshiniń sinonimi
dep qaraladı. Adresti alıw ámeli arqaǵa bir ózgeriwshige hár túrli at penen múráját
etiw múmkin boladı.
Mısal:
int kol;
int &pal = kol; //pal múrájáti ol kol ózgeriwshisi
alternativi
const char &cr = ’\n’; //cr - turaqlıǵa múráját
Adresti alıw ámelin qollanıwda tómendegi qaǵıydalarǵa ámel etiw kerek:
adres alıwshı ózgeriwshi funkciya parametri retinde qollanılǵan yaki extern menen
anıqlanǵan yaki klass maydanına múráját qılınǵәn jaǵdaylarınan tısqarı barlıq
jaǵlarda baslanǵısh mániske iye bolıwı kerek.

Adresti alıw ámeli tiykarınan funkciyalarda adres arqalı uzatılıwshı
parametrler retinde qollanıladı.
Adres alıwshı ózgeriwshiniń kórsetkishten parıqı sonda, ol óz aldına yadtı
iyelemeydi hám tek óz mánisi bolǵan ózgeriwshiniń basqa atı retinde qollanıladı.
Kórsetkishler hám adres alıwshı ózgeriwshiler funkciya parametri
retinde
Funkciya prototipinde yaki anıqlanıw betinde kórsetilgen parametrler formal
parametrler delinedi, funkciya shaqırıwda kórsetilgen argumentlerge faktik
parametrler delinedi.
Funkciya shaqırılıwda faktik parametrlerdiń túri sáykes orındaǵı formal
parametr tipine durıs kelmese yaki sol tipke keltiriwdiń ilájı bolmasa kompilyaciya
qátesi júz beredi.
Faktik parametrlerdi funkciyaǵa eki túrli usıl menen uzatıw múmkin: mánisi
yaki adresi menen.
Funkciya shaqırılıwında argument mánis penen uzatılǵánda, argument yaki
onıń ornındaǵı kelgen ańlatpa mánisi hám basqa argumentlerdiń nusqası
(mánisleri) stek yadına jazıladı. Funkciya tek sol nusqalar menen ámel etedi, kerek
bolsa bul nusqalarǵa ózgerisler kiritiw múmkin, lekin bul ózgerisler argumenttiń
ózine tásir etpeydi, sebebi funkciya óz jumısın juwmaqlawı menen nusqalar
óshiriledi (stek tazalanadı).
Eger parametr adresi menen uzatılsa, stekke adres nusqası jazıladı hám tap
sol adres boyınsha mánisler oqıladı (jazıladı). Funkciya óz jumısın tamamlaǵannan
keyin, sol adres boyınsha qılınǵan ózgerisler saqlanıp qalınadı hám bul mánislerdi
basqa funkciyalar qollanıwı múmkin.
Argument mánis penen uzatılıwı ushın sáykes formal parametr retinde
ózgeriwshiniń tip hám atı jazıladı. Funkciya shaqırılıwında sáykes argument
retinde ózgeriwshiniń atı yaki ańlatpa bolıwı múmkin.
Faktik parametr adres penen uzatılǵanda oǵan sáykes keliwshi formal
parametrdi eki túrli usıl menen jazıw múmkin: kórsetkish arqalı yaki adresti
Соседние файлы в папке 1-semestr
