Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
8-LEKCIYA-1.docx
Скачиваний:
0
Добавлен:
22.12.2023
Размер:
319.42 Кб
Скачать

8-LEKCIYA. KÓRSETKISHLER HÁM DINAMIKALÍQ YAD PENEN ISLEW. DINAMIKALÍQ MASSIV HÁM OLARDÍ FUNKCIYA PARAMETRI RETINDE QOLLANÍW. 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

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;

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.

Соседние файлы в предмете Программирование на C++