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

Joqari darejeli programmalastiriwda C++ Last

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

long *q = new long[5];

 

p++;

//p mánisi 2

ge artadı

q++;

//q mánisi

4

ge artadı

q += 3;

//q mánisi

3

* 4 = 12 ge artadı

Kórsetkishlerdiń ayırması dep, olardıń ayırmasınıń tip ólshemine bóliniwine aytıladı. Kórsetkishlerdi óz-ara qosıw múmkin emes.

6.4. Adresti alıw ámeli

Adresti alıw tómendegishe járiyalanadı: <tip> & <atı>;

Bul jerde <tip> - adresi alınatuǵın túri, <atı> - adresti alıwshı ózgeriwshi atı. Ortadaǵı ‘&’ belgisine adresti alıw ámeli delinedi.

Bul kóriniste járiyalanǵan ózgeriwshi sol túrdegi ózgeriwshiniń sinonimi dep qaraladı. Adresti alıw ámeli arqaǵa bir ózgeriwshige hár túrli at penen múráját etiw múmkin boladı.

Mısal:

int kol;

int &pal = kol; //pal múrájáti ol kol ózgeriwshisi

alternativi

const char &cr = ’\n’; //cr - turaqlıǵa múráját

Adresti alıw ámelin qollanıwda tómendegi qaǵıydalarǵa ámel etiw kerek: adres alıwshı ózgeriwshi funkciya parametri retinde qollanılǵan yaki extern menen anıqlanǵan yaki klass maydanına múráját qılınǵәn jaǵdaylarınan tısqarı barlıq jaǵlarda baslanǵısh mániske iye bolıwı kerek.

Adresti alıw ámeli tiykarınan funkciyalarda adres arqalı uzatılıwshı parametrler retinde qollanıladı.

Adres alıwshı ózgeriwshiniń kórsetkishten parıqı sonda, ol óz aldına yadtı iyelemeydi hám tek óz mánisi bolǵan ózgeriwshiniń basqa atı retinde qollanıladı.

101

6.5. Kórsetkishler hám adres alıwshı ózgeriwshiler funkciya parametri retinde

Funkciya prototipinde yaki anıqlanıw betinde kórsetilgen parametrler formal parametrler delinedi, funkciya shaqırıwda kórsetilgen argumentlerge faktik parametrler delinedi.

Funkciya shaqırılıwda faktik parametrlerdiń túri sáykes orındaǵı formal parametr tipine durıs kelmese yaki sol tipke keltiriwdiń ilájı bolmasa kompilyaciya qátesi júz beredi.

Faktik parametrlerdi funkciyaǵa eki túrli usıl menen uzatıw múmkin: mánisi yaki adresi menen.

Funkciya shaqırılıwında argument mánis penen uzatılǵánda, argument yaki onıń ornındaǵı kelgen ańlatpa mánisi hám basqa argumentlerdiń nusqası (mánisleri) stek yadına jazıladı. Funkciya tek sol nusqalar menen ámel etedi, kerek bolsa bul nusqalarǵa ózgerisler kiritiw múmkin, lekin bul ózgerisler argumenttiń ózine tásir etpeydi, sebebi funkciya óz jumısın juwmaqlawı menen nusqalar óshiriledi (stek tazalanadı).

Eger parametr adresi menen uzatılsa, stekke adres nusqası jazıladı hám tap sol adres boyınsha mánisler oqıladı (jazıladı). Funkciya óz jumısın tamamlaǵannan keyin, sol adres boyınsha qılınǵan ózgerisler saqlanıp qalınadı hám bul mánislerdi basqa funkciyalar qollanıwı múmkin.

Argument mánis penen uzatılıwı ushın sáykes formal parametr retinde ózgeriwshiniń tip hám atı jazıladı. Funkciya shaqırılıwında sáykes argument retinde ózgeriwshiniń atı yaki ańlatpa bolıwı múmkin.

Faktik parametr adres penen uzatılǵanda oǵan sáykes keliwshi formal parametrdi eki túrli usıl menen jazıw múmkin: kórsetkish arqalı yaki adresti 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.

102

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ı.

103

Eger funkciya ishinde adres penen uzatılatuǵın parametr mánisi ózgermey qalıwı zárúr bolsa, bul parametr const modifikator menen jazılıwı kerek:

fun(int n, const char *str);

Egerde funkciyanı shaqırıwda argumentler tek atları menen berilgen bolsa, kelisiw boyısha massivler hám funkciyalar adresi menen, qalǵan túrdegi parametrler mánisleri menen uzatılǵan dep esaplanadı.

Mısal retinde, diskriminanttı esaplaw usılı járdeminde ax2+bx+c=0 kórinisindegi kvadrat teńleme korenlerin funkciya parametrleri retinde alıw máselesin kórip shıǵayıq.

#include <iostream.h> #include <math.h>

int Kvadrat_Koren(float a, float b,float c, float &x1, float

&x2)

{

float D;

D = b * b – 4 * a * c; if(D < 0) return 0; if(D == 0)

{

x1 = x2 = -b / (2 * a); return 1;

}

else

{

x1 = (-b + sqrt(D)) / (2 * a); x2 = (-b - sqrt(D)) / (2 * a); return 2;

}

}

int main()

{

float a, b, c, D, x1, x2;

cout << ”ax^2 + bx + c = 0 teńleme korenin tabıw.”;

104

cout << ”\n a - koefficientti kiritiń: ”; cin >> a; cout << ”\n b - koefficientti kiritiń: ”; cin >> b; cout << ”\n c - koefficientti kiritiń: ”; cin >> c; switch(Kvadrat_Koren(a, b, c, x1, x2))

{

case 0: cout << “Teńleme haqıyqıy korenge iye emes!”;

break;

case 1: cout << “Teńleme jalǵız korenge iye: ”; cout << ”\n x = “ << x1;

break;

default: cout << “Teńleme eki korenge iye: ”; cout << ”\nx1 = “ << x1;

cout << ”\nx2 = “ << x2;

}

return 0;

}

Programmadaǵı Kvadrat_Koren() funkciyası kvadrat teńleme korenin esaplamaydı. Onıń qaytaratuǵın mánisi teńlemeniń neshe koreni bar ekenligin ańlatadı. Eger teńlemeniń haqıyqıy koreni bar bolmasa (D<0), funkciya 0 mánisin qaytaradı. Eger D=0 bolsa, funkciya 1 mánisin qaytaradı. Bar bolǵan korenler – x1 hám x2 adres alıwshı parametrlerde qaytarıladı.

6.6. Ózgeriwsheń parametrli funkciyalar

С++ tilinde parametrler sanı belgisiz bolǵan funkciyalardı da qollanıw múmkin. Bunnan tısqarı olardıń tipleri de belgisiz bolıwı múmkin. Parametrler sanı hám tipi funkciyanı shaqırıwdaǵı argumentler sanı hám olardıń tipine qarap anıqlanadı. Bunday funkciyalar kórinsi tómendegi formatta jazıladı:

<funkciya tipi> <funkciya atı> (<ashıq parametrler dizimi>, …)

Bul jerde (<ashıq parametrler dizimi> - áshıq túrde jazılǵan parametrler atı hám tipi. Bul parametrler májbúriy parametrler delinedi. Bunday parametrlerden

105

keminde birewi bolıwı shárt. Qalǵan parametrler sanı hám tipi belgisiz bolıp tabıladı. Olardı aniqlaw hám qollanıw tolıq túrde programma dúziwshi moynına júklenedi.

Ózgeriwsheń sandaǵı parametrlerdi dúziw usılı ulıwma alǵanda ekew:

1-usıl. Parametrler dizimi sońında jáne bir arnawlı parametr jazıladı hám onıń mánisi parametrler tawsılǵanlıǵın bildiredi. Kompilyator tárepinen funkciya denesinde parametrler birme-bir anıqlastırıladı. Barlıq parametrler tipi sońǵı arnawlı parametr tipi menen ústine túsedi dep esaplanıladı;

2-usıl. Qandayda bir arnawlı parametr retinde belgisiz parametrler sanı kiritiledi hám oǵan qarap parametrler sanı anıqlanadı.

Eki usılda da parametrlerge múráját etiw ushın kórsetkishler qollanıladı. Mısallar keltiremiz.

1 - usıl:

#include <iostream.h>

float Sanlar_Kóbeymesi(float arg,...)

{

float p = 1.0; float *ptr = &arg;

if(*prt == 0.0) return 0.0; for(; *prt; prt++) p *= *prt; return p;

}

void main()

{

cout << Sanlar_Kóbeymesi(2e0, 3e0, 4e0, 0e0) << ’\n’; cout << Sanlar_Kóbeymesi(1.0, 2.0, 3.0, 10.0, 8.0, 0.0);

}

Nátiyje:

24

480

2 - usıl:

106

#include <iostream.h> int Qosındı(int,...); void main()

{

cout << “\nQosındı(2, 6, 4) = ” << Qosındı(2,6,4); cout << “\nQosındı(6, 1, 2, 3, 4, 5, 6) = ”;

cout << Qosındı(6, 1, 2, 3, 4, 5, 6);

}

int Qosındı(int k,...)

{

int *ptr = &k; int s = 0; for(; k; k--)

s += *(++ptr); return s;

}

Nátiyje:

Qosındı(2, 6, 4) = 10

Qosındı(6, 1, 2, 3, 4, 5, 6) = 21

Eki mısalda da belgisiz parametrler berilgen arnawlı parametr tipin qabıl etken. Hár

túrli tiptegi parametrlerdi qollanıw ushın tipti anıqlaytuǵın parametr kiritiw kerek:

#include <iostream.h> float Summa(char, int,…); void main()

{

cout << Summa(’i’, 3, 10, 20, 30); cout << Summa(’f’, 3, 10.0, 20.0, 5.0); cout << Summa(’d’, 3, 10, 20, 30);

}

int Summa(char z, int k,…)

{

switch(z)

{

case ’i’:

107

{

int *ptr = &k + 1; int s=0; for(; k--; ptr++) s += *(ptr); return (float)s;

} break; case ’f’:

{

float *ptr = (float *) (&k + 1); float s =

0.0;

for(; k--; ptr++) s += *(ptr); return s;

} break; default:

{

cout << ”\n parametr qáte berilgen”; return 9999999.0;

}

}

}

Joqarıda keltirilgen mısalda belgisiz parametrlerdiń tipin aniqlaw máselesi

kompilyator tárepinen emes, al programma dúziwshi tárepinen sheshilgen.

108

VII Bap. Massivler

7.1. Massiv túsinigi

Yadta izbe-iz jaylasqan bir qıylı tiptegi mánislerge massiv delinedi. Ádette massivlerge bolǵan talap, úlken kólemdegi, biraq sheklengen muǵdardaǵı hám tártiplengen mánislerdi qayta islew menen baylanıslı máselelerdi sheshiwde júzege keledi. Máselen, studentler toparınıń reyting balları menen islesiw máselesi qoyılǵan. Bunda topardıń ortasha reytingin anıqlaw, reytinglerdi kemeyiwi boyınsha tártiplestiriw, konkret studenttiń reytingi haqqında maǵlıwmat beriw hám basqa máselelerdi sheshiw zárúr bolsın. Belgilengen máselelerdi sheshiw ushın berilgenlerdiń tártiplengen izbe-izligi zárúr boladı. Bul jerde tártiplengenlik mánisi sonda, izbe-izliktiń hár bir mánisi óz ornına iye boladı. Berilgenler izbe-izligin eki túrli usılda payda etiw múmkin. Birinshi jol –hár bir reyting ushın óz aldına

ózgeriwshi anıqlaw: Reyting1,…, ReytingN. Biraq, topardaǵı studentler sanı jeterli dárejede úlken bolǵanda, bul ózgeriwshiler qatnasqan programmanı dúziw úlken qıyınshılıqlardı júzege keltiredi. Ekinshi jol – berilgenler izbe-izligin jalǵız at penen anıqlap, onıń mánislerine múrájáttı, sol mánislerdiń izbe-izlikte jaylasqan ornınıń nomeri (indeksi) arqalı ámelge asırıw esaplanadı. Reytingler izbe-izligin Reyting dep atap, onıń mánislerine Reyting1,…,ReytingN kórinisinde múráját etiw múmkin.

Ádette berilgenlerdiń bunday kórinisine massivler delinedi. Massivlerdi matematikadaǵı sanlar vektorına uqsatıw múmkin, sebebi vektor da óziniń individual atına iye hám ol fiksirlengen muǵdardaǵı bir tiptegi mánislerden – sanlardan ibarat.

Demek, massiv – bul fiksirlengen muǵdardaǵı ayrım mánislerdiń (massiv elementleriniń) tártiplengen jıynaǵı esaplanadı. Barlıq elementler birdey tipte bolıwı kerek hám bul tip element tipi yáki massiv ushın tayanısh tipi dep ataladı. Joqarıdaǵı keltirilgen mısalda Reyting – haqıyqıy tiptegi vektor dep ataladı.

Programmada isletiletuǵın hár bir konkret massiv óziniń individual atına iye bolıwı kerek. Bul atqa tolıq ózgeriwshi delinedi, sebebi onıń mánisi massivtiń ózi

109

boladı. Massivtiń hár bir elementi massiv atı, hámde kvadrat qawısqa alınǵan hám element selektorı dep atalıwshı indeksti kórsetiw arqalı áshıq túrde belgilenedi.

Múráját sintaksisi:

<massiv atı>[<indeks>]

bul kóriniske jeke ózgeriwshi delinedi, sebebi onıń mánisi massivtiń óz aldına elementi. Bizlerdiń mısalda, Reyting massiviniń óz aldına komponentlerine

Reyting[1],…,Reyting[N] jeke ózgeriwshiler arqalı múráját etiw múmkin. Basqasha aytqanda bul ózgeriwshiler indeksli ózgeriwshiler dep ataladı.

Massiv indeksi sıpatında pútin san qollanıladı. Ulıwma alǵanda indeks sıpatında pútin san mánisin qabıl qılatuǵın qálegen ańlatpa isletiliwi múmkin hám onıń mánisi massiv elementi nomerin anıqlaydı. Ańlatpa sıpatında ózgeriwshi de alınıwı múmkin, ózgeriwshiniń mánisi ózgeriwi menen múráját etilip atırǵan massiv elementin anıqlawshı indeks te ózgeredi. Solay etip, programmadaǵı bir indeksli

ózgeriwshi arqalı massivtiń barlıq elementlerin belgilew múmkin boladı. Máselen,

Reyting[i] ózgeriwshisi arqalı i ózgeriwshiniń mánisine baylanıslı túrde Reyting massiviniń qálegen elementine múráját etiw múmkin.

Haqıyqıy tiptegi (float, double) mánisler toplamı sheksiz bolǵanlıǵı sebepli olar indeks sıpatında isletilmeydi.

C++ tilinde indeks barqulla 0 den baslanadı hám onıń eń úlken mánisi massiv járiyalanıwındaǵı uzınlıqtan birge kem boladı.

Massiv járiyalanıwı tómendegishe boladı:

<tip> <at> [<uzınlıq>]={baslanǵish mánisler}

Bul jerde <uzınlıq> - turaqlı ańlatpa. Mısallar:

int m[6] = {1, 4, -5, 2, 10, 3];

float a[4];

Massiv statikalıq hám dinamikalıqalıq bolıwı múmkin. Statikalıq massivtiń uzınlıǵı aldınnan belgili bolıp, ol yadta belgili adresten baslap izbe-iz jaylasadı.

Dinamikalıqalıq massivtiń uzınlıǵı programma orınlanıw waqtında anıqlanıp, ol dinamikalıqalıq yadta usı waqıtta bos bolǵan adreslerge jaylasadı. Máselen:

int m[6];

110