Скачиваний:
0
Добавлен:
20.09.2026
Размер:
586 Кб
Скачать
☆
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