Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Joqari darejeli programmalastiriwda C++ Last

.pdf
Скачиваний:
9
Добавлен:
03.12.2023
Размер:
2.03 Mб
Скачать

eger 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

bul jerde

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