Добавил:
bekan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:1-semestr / 9-LEKCIYA
.pdf
alıwshı parametr arqalı. Kórsetkish arqalı jazılǵanda formal parametr tipinen
keyin „*‟ belgisi jazıladı, sáykes argumentte bolsa ózgeriwshiniń adresi (& ámel
arqalı) yaki massiv atı, yaki funkciya atı bolıwı múmkin.
Adresti alıw ámeli arqalı parametr uzatıwda formal parametrde tipinen keyin
„&‟ belgisi jazıladı hám funkciya shaqırılıwında sáykes argument retinde
ózgeriwshi atı keledi.
Mısal:
#include <iostream.h>
void f(int, int*, int &)
void main()
{
int i = 1, j = 2, k = 3;
cout << I << ” “ << j << ” “ << k;
f(i, &j, k);
cout << i << ” “ << j << ” “ << k;
}
void f(int i, int *j, int &k)
{
i++;
(*j)++;
k++;
*j = i + k;
k = *j + i;
}
Programma islewi nátiyjesinde ekranǵa tómendegi parametrler shıǵarıladı:
1 2 3
1 6 8
Bul mısalda birinshi parametr i mánis penen uzatıladı (“int i"). Onıń mánisi
funkciya ishinde ózgeredi, lekin sırttaǵı i ózgeriwshisiniń mánisi ózgermeydi.
Ekinshi parametrdi kórsetkish arqalı adresi menen uzatılıwı talap etiledi (“int *j”),
adresti uzatıw ushın „&‟ – adresin alıw ámeli qollanılǵan (“&j”). Funkciya
denesinde argument adresinen mánis alıw ushın „*‟ – mánis alıw ámeli qollanılǵan.
Úshinshi parametrde múráját arqalı (“&k”) argumentiniń adresin uzatıw kózde
tutılǵan. Bul jaǵdayda funkciya shaqırılıwında sáykes argument ornında
ózgeriwshi atı turadı, funkciya ishinde bolsa mánis alıw ámelin qollanıwdıń qájeti

joq. Funkciya qollanıw nátiyjesindegi mánislerdi argumentler dizimi arqalı alıw
qolaylı hám túsinerli usıl bolıp tabıladı.
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;
}
Соседние файлы в папке 1-semestr
