Joqari darejeli programmalastiriwda C++ Last
.pdfkó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