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

Dinamikalıqalıq massivler menen islew

Statikalıq massivlerdiń kemshiligi sonda, olardıń ólshemleri aldınnan belgili bolıwı kerek, bunnan tısqarı bul ólshemler berilgenlerge ajıratılǵan yad segmentiniń ólshemi menen shegaralanǵan. Ekinshi tárepten, jeterli dárejede úlken ólshemdegi massiv járiyalanıp, konkret másele sheshiliwinde ajıratılǵan yad tolıq isletilmewi múmkin. Bul kemshilikler dinamikalıqalıq massivlerden paydalanıw arqalı saplastırıladı, sebebi olar programma islewi waqtında kerek bolǵan ólshemdegi massivlerdi jaratıw hám zárúrlik qalmaǵanda óshiriw imkanyatın beredi.

Dinamikalıqalıq massivlerge yad ajıratıw ushın malloc(), calloc() funkсiyalarınan yamasa new operatorınan paydalanıw múmkin. Dinamikalıq obyektke ajıratılǵan yadtı bosatıw ushın free() funkсiyası yáki delete operatorı isletiledi.

Joqarıda berilgen funkсiyalar «alloc.h» kitapxanasında jaylasqan.

malloc() funkсiyasınıń sintaksisi

void * malloc (size_t size);

kórinisinde bolıp, ol yadtıń uyım bóleginen size bayt ólshemindegi úzliksiz aymaqtı ajıratadı. Eger yad ajıratıw sátli bolsa, malloc() funkciyası ajıratılǵan aymaqtıń baslanıw adresin qaytaradı. Talap etilgen yadtı ajıratiw sátsiz bolsa, funkciya NULL mánisin qaytaradı.

Sintaksisten kórinip turıptı, funkciya void tipindegi mánis qaytaradı. Ámelde bolsa konkret tiptegi obyekt ushın yad ajıratıw zárúr boladı. Bunıń ushın void tipin konkret tipke keltiriw texnologiyasınan paydalanıladı. Máselen, pútin tiptegi uzınlıǵı 3 ke teń massivke orın ajıratıwdı tómendegishe ámelge asırıw múmkin:

int * pInt = (int*)malloc(3 * sizeof(int));

calloc() funkciyası malloc() funkciyasınan parıqlı túrde massiv ushın orın ajıratıwdan tısqarı massiv elementlerin 0 mánisi menen inicializaciya qıladı. Bul funkciya sintaksisi

void * calloc(size_t num, size_t size);

kórinisinde bolıp, num parametri ajıratılǵan aymaqta neshe element barlıǵın, size hár bir element ólshemin bildiredi.

free() yadtı bosatıw funkciyası óshiriletuǵın yad bólegine kórsetkish bolǵan jalǵız parametrge iye boladı:

void free(void * block);

free() funkciyası parametriniń void tipinde bolıwı qálegen tiptegi yad bólegin óshiriw imkanın beredi.

Tómendegi programmada 10 dana pútin sannan ibarat dinamikalıqalıq massiv jaratıw, oǵan mánis beriw hám óshiriw ámelleri orınlanǵan.

#include <iostream.h>

#include <alloc.h>

int main()

{

int *pVector;

if((pVector = (int*)malloc(10 * sizeof(int))) == NULL)

{

cout << ”yad jeterli emes!!!”;

return 1;

}

/

/ajıratılǵan yad aymaǵın toltırıw

for(int i = 0; i < 10; i++)

(pVector + i) = i;

/vektor elementlerin shıǵarıw

*

/

for(int i = 0; i < 10; i++)

cout << *(pVector + i) << endl;

//ajıratılǵan yad bólegin óshiriw

free(pVector);

return 0;

}

Funkciya hám massivler

Funkciyalar massivti parametr sıpatında isletiwi hám onı funkciyanıń nátiyjesi sıpatında qaytarıwı múmkin.

Eger massiv parametr arqalı funkciyaǵa uzatılsa, elementler sanın anıqlaw mashqalası júzege keledi, sebebi massiv atınan onıń uzınlıǵın anıqlawdıń ilájı joq. Ayrım jaǵdaylarda, máselen, belgiler massivi sıpatında anıqlanǵan qatar (ASCIIZ qatarlar) menen islegende massiv uzınlıǵın anıqlaw múmkin, sebebi qatarlar ‘\0’ belgisi menen tamamlanadı.

Mısalı ushın:

#include<iostream>

int len(char s[]) //massivti parametr sıpatında isletiw

{

int m = 0;

while(s[m++])

return m-1;

}

void main()

{

char z[] = ”Usı qatar uzınlıǵı = ”;

cout << z << len(z);

}

Funkciya parametri qatar bolmaǵan jaǵdaylarda fiksirlengen uzınlıqtaǵı massivler isletiledi. Eger túrli uzınlıqtaǵı massivlerdi uzatıw zárúr bolsa, massiv ólshemlerin parametr sıpatında uzatıw múmkin yáki bul maqsette global ózgeriwshiden paydalanıwǵa tuwrı keledi.

Mısalı:

#include<iostream.h>

float sum(int n, float *x)

{

float s = 0;

for(int i = 0; i < n; i++)

s += x[i];

return s;

}

void main()

{

float E[] = {1.2, 2.0, 3.0, 4.5, -4.0};

cout << sum(5, E);

}

Massiv atı kórsetkish bolǵanlıǵı sebepli massiv elementlerin funkciyada ózgertiw múmkin hám bul ózgertiwler funkciyadan shıqqannan keyin de saqlanıp qaladı.

#include<iostream>

void vector_01(int n, int *x, int *y)

{

for (int i = 0; i < n; i++)

y[i] = x[i] > 0 ? 1 : 0;

}

void main()

{

int a[] = (1, 2, -4, 3, -5, 0, 4};

int c[7];

vector_01(7, a, c);

for(int i = 0; i < 7; i++)

cout << ’\t’ << c[i];

}

Másele. Pútin tiptegi hám elementleri kemeymeytuǵın halda tártiplengen bir ólshemli eki massivlerdi jalǵız massivke, tártipleniwi saqlanǵan halda birlestiriw ámelge asırılsın.

Programma kodı:

#include<iostream.h>

//pútin tiptegi massivke kórsetkish qaytaratuǵın funkciya

int *massiv_jalǵaw(int, int*, int, int*);

void main()

{

int c[] = {-1, 2, 5, 10}, d[] = {1, 7, 8};

int *h;

h = massiv_jalǵaw(5, c, 3, d);

for(int i = 0; i < 8; i++)

cout << ’\t’ << h[i];

delete []h;

}

int *massiv_jalǵaw(int n, int *a, int m, int *b)

{

int *x = new int[n + m];

int ia = 0, ib = 0, ix = 0;

while(ia < n && ib < m)

a[ia]> b[ib] ? x[ix++] = b[ib++] : x[ix++] =

a[ia++];

while(ib < m)

x[ix++] = b[ib++];

while(ia < n)

x[ix++] = a[ia++];

return x;

}

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