Joqari darejeli programmalastiriwda C++ Last
.pdfeger funkciyalar parametrleriniń tipi tek “const” hám “&” belgileri menen parıqlanatuǵın bolsa, bul funkciyalar qayta júklenbeydi.
91
VI Bap. Kórsetkishler hám adres alıwshı ózgeriwshiler
6.1. Kórsetkishler
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>);
92
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. |
|
|
||||||
Másele. |
Berilgen |
pútin n=100 |
hám |
a, b – |
haqıyqıy |
sanlar |
ushın |
|
f 1 x 5 sin( |
3 x ) x |
, |
f 2 x cos x |
hám |
f 3 x x 2 1 funkciyalar |
ushın |
||
b |
|
|
|
|
|
|
|
|
f ( x ) dx integraldı |
tuwrı tórtmúyeshlikler |
formulası |
menen |
shama |
menen |
a
esaplansın:
b
f ( x ) dx h [ f ( x 1 ) f ( x 2 ) ... f ( x n )] ,
a
h b a , x i a ih h / 2 , i 1 .. n . n
Programma bas funkciya, integral esaplaw hám eki matematikalıq funkciyalar
- f1(x) hám f3(x) ushın anıqlanǵan funkciyalardan quralǵan, f 2 x cos x funkciyanıń adresi «math.h» faylınan alınadı. Integral esaplaw funkciyasına kórsetkish arqalı integrallı esaplanatuǵın funkciya adresi, a hám b – integral shegara mánisleri uzatıladı. Aralıqtı bóliwler sanı – n global turaqlı bolıp járiyalanadı.
#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++)
93
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;
94
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
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ár bir
kórsetkish ushın ‘*’ belgisi qoyılıwı shárt:
95
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ı.
6.2. 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
96
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 |
beriw
2. Ashıq túrde yadtıń absolyut adresin beriw:
char *vp = (char *)0xB8000000;
97
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ı.
6.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 – 10 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.
98
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.
6.3. 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;
99
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];
100