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

Joqari darejeli programmalastiriwda C++ Last

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

kórinisinde járiyalanǵan bir ólshemli massiv elementleri yadta tómendegishe

jaylasadı:

 

 

 

 

 

 

 

 

Adres

 

Mánisler

 

 

 

 

 

 

 

 

 

 

m

m[0]

m[1]

m[2]

m[3]

m[4]

m[5]

 

 

 

 

 

 

 

 

 

7.1-súwret. Bir ólshemli massivtiń yadtaǵı jaylasıwı.

Massivtiń i – elementine m[i] yáki *(m+i) – qurallı múráját etiw múmkin. Massiv uzınlıǵı sizeof(m) ámeli arqalı anıqlanadı.

Massiv járiyalanıwında onıń elementlerine baslanǵish mánisler beriw múmkin hám onıń bir neshe variantları bar.

1) ólshemi kórsetilgen massiv elementlerin tolıq inicializacialaw:

int t[5] = {-10, 5, 15, 4, 3};

Bunda 5 elementten ibarat bolǵan “t” atlı pútin tiptegi bir ólshemli massiv járiyalanǵan hám onıń barlıq elementlerine baslanǵısh mánisler berilgen. Bul járiyalaw tómendegi járiyalaw menen ekvivalent:

int t[5];

t[0] = -10; t[1] = 5; t[2] = 15; t[3] = 4; t[4] = 3;

2) ólshemi kórsetilgen massiv elementlerin tolıq emes inicializacialaw:

int t[5] = {-10, 5, 15};

Bul jerde tek ǵana massiv basındaǵı úsh elementke baslanǵısh mánisler berilgen. Sonı aytıp ótiw kerek, massivtiń basındaǵı yáki ortasındaǵı elementlerine mánisler bermesten, onıń aqırındaǵı elementlerge baslanǵısh mánis beriw múmkin emes. Egerde massiv elementlerine baslanǵısh mánis berilmese, onda kelisim boyınsha static hám extern modifikatorı menen járiyalanǵan massiv ushın elementleriniń mánisi 0 sanına teń dep, automatic massivler elementleriniń baslanǵısh mánisleri belgisiz esaplanadı.

3) ólshemi kórsetilmegen massiv elementlerin tolıq inicializacialaw:

int t[] = {-10, 5, 15, 4, 3};

Bul mısalda massivtiń barlıq elementlerine mánisler berilgen esaplanadı, massiv uzınlıǵı kompilyator tárepinen baslanǵısh mánisler sanına qarap anıqlanadı. Egerde

111

massiv uzınlıǵı berilmese, baslanǵısh mánisi beriliwi shárt. Massivti járiyalawǵa

mısallar:

char ch[4] = {‘a’, ‘b’, ‘c’, ‘d’}; //belgiler massivi int in[6] = {10, 20, 30, 40}; //pútin sanlar massivi

char str[]=”abcd”; //qatar uzınlıǵı 5 ke teń, sebebi onıń

//aqırına ‘\0’ belgisi qosıladı char str[] = {‘a’, ‘b’, ‘c’, ’d’};

//joqarıdaǵı qatardıń basqasha jazılıwı

Másele. Bir ay ishindegi kúndelik temperaturalar berilgen. Ay ushın ortasha

temperaturanı esaplaw programması dúzilsin. Programma teksti:

int main()

{

const int n = 30; int temp[n];

int i, s, temp_ortasha;

cout << “Kúnlik temperaturanı kiritiń:\n” for(i = 0; i < n; i++)

{

cout << “\n temp[“ << i << ”]=”; cin >> temp[i];

}

for(i = 0, s = 0; i < n; i++) s += temp[i];

temp_ortasha = s / n;

cout << “Kúnlik temperatura:\n”; for(i = 0; i < n; i++)

cout << “\ttemp[“ << i << ”]=” << temp[i];

cout << ”Aydaǵı ortasha temperature = “ << temp_ortasha; return 0;

}

112

7.2. Kóp ólshemli statikalıq massivler

C++ tilinde massivler elementiniń tipine sheklewler qoyılmaydı, biraq bul tipler shekli ólshemdegi obyektlerdiń tipi bolıwı kerek. Sebebi, kompilyator massivtiń yadtan qansha orın (bayt) iyelewin esaplay alıwı kerek. Ásirese, massiv komponentası massiv bolıwı múmkin (vektorlar-vektorı), nátiyjede matrica dep atalıwshı eki ólshemli massiv payda boladı.

Eger matricanıń elementi de vektor bolsa, úsh ólshemli massivler – kub payda boladı. Usı jol menen sheshilip atırǵan máselege baylanıslı túrde qálegen

ólshemdegi massivlerdi jaratıw múmkin.

Eki ólshemli massivtiń sintaksisi tómendegi kóriniste boladı: <tip> <at> [<uzınlıq>] [<uzınlıq>]

Máselen, 10x20 ólshemli haqıyqıy sanlar massiviniń járiyalanıwı:

float a[10][20];

Járiyalanǵan A matricanıń kórinisi 7.2-súwrette keltirilgen.

7.2-súwret. Eki ólshemli massivtiń yadtaǵı jaylasıwı.

Endi adres kóz-qarasınan kóp ólshemli massiv elementlerine múráját etiwdi kórsek. Tómendegi járiyalawlar berilgen bolsin:

int a[3][2];

float b[2][2][2];

Birinshi mısalda, eki ólshemli massiv, yaǵnıy 2 qatar hám 3 baǵanadan ibarat matrica járiyalanǵan, ekinshisinde úsh ólshemli 3 dana 2x2 matricadan ibarat bolǵan

massiv berilgen. Onıń elementlerine múráját sxeması:

Adres

 

Kórsetkishler massivi

 

 

 

 

 

 

 

a

 

a[0]

a[1]

 

a[2]

 

 

 

 

 

 

 

 

 

113

 

Mánisler

a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1] 7.3-súwret. Eki ólshemli massiv elementlerine múráját.

Bul jerde a[i] kórsetkishinde i-shi qatardıń baslanǵısh adresi jaylasadı, massiv elementine a[i][j] kórinisindegi tiykarǵı múrájáttan tısqarı úskeneli múráját etiw

múmkin: *(*(a+i)+j) yáki *(a[i]+j).

 

 

Adres

 

Kórsetkishler massivi

 

 

 

 

 

 

 

 

b

 

b[0]

b[1]

 

 

 

 

 

 

Kórsetkishler massivi

 

 

 

 

 

 

 

 

 

 

 

 

b[0][0]

b[0][1]

b[1][0]

b[1][1]

 

 

 

 

 

 

Mánisler

b[0][0][0] b[0][0][1] b[0][1][0] b[0][1][1] b[1][0][0] b[1][0][1] b[1][1][0] b[1][1][1]

7.4-súwret. Úsh ólshemli massivtiń yadta shólkemlesiwi.

Massiv elementlerine múráját etiw ushın attan keyin kvadrat qawısta hár bir

ólshem ushın indeks jazılıwı kerek, máselen b[i][j][k]. Bul elementke úskeneli múráját etiwge de boladı hám onıń variantlari:

*(*(*(b+i)+j)+k) yáki *(*(b[i]+k) yáki *(b[i][j]+k).

7.3. Kóp ólshemli massivlerdi inicializacialaw

Massivlerdi inicializacialaw tómendegi mısallarda kórsetilgen:

int a[2][3] = {0, 1, 2, 10, 11, 12};

int b[3][3] = {{0, 1, 2}, {10, 11, 12}, {20, 21, 22}}; int c[3][3][3] = {{{0}}, {{100, 101}, {110}},

{{200, 201, 202}, {210, 211, 212}, {220, 221, 222}};

Birinshi operatorda baslanǵısh mánisler izbe-iz jazılǵan, ekinshi operatorda mánisler toparlasqan, úshinshi operatorda da toparlasqan, biraq ayrım toparlarda aqırǵı mánisler berilmegen.

Mısal ushın, matricalar hám vektorlar kóbeymesin – esaplaw máselesin kóreyik. Bul jerde

Esaplaw formulası -

114

Sáykes programma teksti:

int main()

{

const int n = 4, m = 5; float a[m][n], b[n], c[m]; int i, j; float s;

for(i = 0; i < m; i++) for(j = 0; j < n; i++)

cin >> a[i][j]; for(i = 0; i < m; i++)

cin>>b[i];

for(i = 0; i < m; i++)

{

for(j = 0, s = 0; j < n; j++) s += a[i,j] * b[j];

c[i] = s;

}

for(i = 0; i < m; i++)

cout << ”\tc[“ << i << ”]=” << c[i]; return 0;

}

7.4. 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ıqalıq

115

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()

{

116

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;

}

Keyingi programmada ólshemli haqıyqıy sanlar massiviniń bas dioganalınan joqarıda jaylasqan elementler qosındısın esaplaw máselesi sheshilgen.

#include <iostream.h>

 

 

 

 

#include <alloc.h>

 

 

 

 

 

int main()

 

 

 

 

 

{

 

 

 

 

 

int n;

 

 

 

 

 

float *pMatr, s = 0;

 

 

 

 

cout << ”A(n,n): n = ”; cin >> n;

 

 

 

if((pMatr

=

(float*)malloc(n

*

n

*

sizeof(float)))==NULL)

{

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

}

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

cin >> *(pMatr + i * n + j); for(int i = 0; i < n; i++)

117

for(int j = i + 1; j < n; j++) s += *(pMatr + i * n + j);

cout << ”Matrica bas diagonalınan joqaridaǵi“; cout << ”elementler qosındısı S = ” << s << endl; return 0;

}

new operatorı járdeminde, massivke yad ajıratıwda obyekt tipinen keyin kvadrat qawıs ishinde obyektler sanı kórsetiledi. Máselen, pútin tiptegi 10 dana sannan ibarat massivke orın ajıratıw ushın

pVector = new int[10];

ańlatpası jazılıwı kerek. Buǵan qarama-qarsı túrde, bul usılda ajıratılǵan yadtı bosatıw ushın

delete [] pVector;

kórsetpesin beriw kerek boladı.

Eki ólshemli dinamikalıq massivti payda etiw ushın

int **a;

kórinisindegi «kórsetkishke kórsetkish» isletiledi.

Dáslep massiv qatarları sanına qarap kórsetkishler massivine dinamikalıq yadtan orın ajıratıw kerek:

a = new int *[m] //bul jerde m massiv qatarları sanı

Sońınan, hár bir qatar ushın tákirarlaw operatorı járdeminde yad ajıratıw hám olardıń baslanǵısh adreslerin a massiv elementlerine jaylastırıw zárúr boladı:

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

a[i] = new int[n]; //n baǵanalar sanı

Sonı aytıp ótiw kerek, dinamikalıq massivtiń hár bir qatarı yadtıń túrli orınlarında jaylasıwı múmkin.

Eki ólshemli massivti óshiriwde aldın massivtiń hár bir elementi (qatarı), keyin ala massivtiń ózi joq qılınadı (óshiriledi):

for(i = 0; i < m; i++)

delete []a[i];

delete []a;

118

Matricanı vektorǵa kóbeytiw máselesi ushın dinamikalıq massivlerden paydalanıwǵa mısal:

int main()

{

int n, m; int i, j; float s;

cout << ”\nn = ”; cin >> n; //matrica qatarları sanı cout << ”\nm = ”; cin >> m; //matrica baǵanaları sanı float *b = new float[m];

float *c = new float[n];

//kórsetkishler massivke yad ajıratıw float **a = new float *[n];

for(i =0; i <n; i++) //hár bir qatar ushın

a[i] = new float[m]; //dinamikalıq yad ajıratıw for(j = 0; j < m; j++)

cin >> b[j]; for(i = o; i < n; i++)

for(j = 0; j < m; j++) cin >> a[i][j];

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

{

for(j = 0, s = 0; j < m; j++) s += a[i,j] * b[j];

c[i] = s;

}

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

cout << ”\tc[“ << i << ”]=” << c[i]; delete []b;

delete []c;

for(i = 0; i < n; i++) delete []a[i];

delete []a; return 0;

}

119

7.5. 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ı. Misalı ushın:

#include<iostream.h>

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++)

120