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

Joqari darejeli programmalastiriwda C++ Last

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

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

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

{

121

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;

}

Kóp ólshemli massivler menen islew belgili bir quramalılıqqa iye, sebebi massivlerdiń yadta jaylasıw tártibi túrli variantta bolıwı múmkin. Máselen, funkciya parametrler diziminde ólshemdegi haqıyqıy tiptegi massivke sáykes keliwshi parametrdi

float sum(float x[n][n])

kórinisinde jazıwǵa bolmaydı. Mashqala sheshimi - bul massiv ólshemin parametr sıpatında uzatıw hám funkciya baslamasın tómendegishe jazıw kerek:

float sum(int n, float x[][]);

Kóp ólshemli massivlerdi parametr sıpatında isletiwde bir neshe usıllardan paydalanıw múmkin.

1-usıl. Massivtiń ekinshi ólshemin turaqlı ańlatpa (san) menen kórsetiw:

float sum(int n, float x[][10])

{

122

float s = 0.0;

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

s += x[i][j]; return s;

}

2-usıl. Eki ólshemli massiv kórsetkishler massivi kórinisinde anıqlanǵan

jaǵdaylar ushın kórsetkishler massivin (matrica qatarlar adreslerin) beriw arqalı:

float sum(int n, float *p[])

{

float s = 0.0;

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

s += p[i][j];//*p[i][j] emes, sebebi massivke múrajat

return s;

}

void main()

{

float x[][4] = {{11, -12, 13, 14}, {21, 22, 23, 24}, {31, 32, 33, 34}, {41, 42, 43, 44}};

float *ptr[4];

for(int i = 0; i < 4; i++) ptr[i] = (float *) &x[i];

cout << sum(4, ptr) << endl;

}

3-usıl. Kórsetkishlerge kórsetkish kórinisinde anıqlanǵan dinamikalıq

massivlerdi isletiw arqalı:

float sum(int n, float **x)

{

float s = 0.0;

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

s += x[i][j];

123

return s;

}

void main()

{

float **ptr; int n;

cin >> n;

ptr = new float *[n]; for(int i = 0; i < n; i++)

{

ptr[i] = new float [n]; for(int j = 0; j < n; j++)

ptr[i][j] = (float)((i + 1) * 10 + j);

}

cout << sum(n, ptr); for(int i = 0; i < n; i++)

delete ptr[i]; delete []ptr;

}

Náwbettegi programmada funkciya tárepinen nátiyje sıpatında eki ólshemli massivti qaytarıwǵa mısal keltirilgen. Massiv elementleriniń mánisleri dus kelgen (random) sanlardan quraladı. Dus kelgen sanlar «cmath» kitapxanasındaǵı random() funkciyası járdeminde jaratıladı:

#include <iostream> #include <cmath>

int **rmatr(int n, int m)

{

int **ptr;

ptr = new int *[n]; for(int i = 0; i < n; i++)

{

ptr[i] = new int[m]; for(int j = 0; j < m; j++)

ptr[i][j] = random(100);

124

}

return ptr;

}

int sum(int n, int m, int **ix)

{

float s = 0;

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

s += ix[i][j]; return s;

}

void main()

{

int n, m;

cin >> n >> m; int **matr; randomize(); matr=rmatr(n,m);

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

{

cout << endl << i << " - qatar:" for(int j = 0; j < m; j++)

cout << '\t' << matr[i][j];

}

cout << endl << "Summa = " <<sum(n, m, matr); for(int i = 0; i < n; i++)

delete matr[i]; delete []matr;

}

125

VII Bap. ASCIIZ qatarlar hám olar ústinde ámeller

8.1. Belgi hám qatarlar

Standart C++ tili eki tiptegi belgiler jıynaǵın qollap-quwatlaydı. Birinshi tipke

ádettegidey “tar” belgiler dep atalıwshı 8-bitli belgiler jıynaǵı kiredi, ekinshisine 16-bitli “keń’” belgiler kiredi. Til kitapxanasında hár bir topar belgileri ushın ayrıqsha funkciyalar toplamı anıqlanǵan.

C++ tilinde qatar ushın ayrıqsha tip anıqlanbaǵan. Qatar char - tipindegi belgiler massivi sıpatında qaraladı hám bul belgiler izbe-izligi qatar terminatorı dep atalıwshı 0 kodlı belgi menen tamamlanadı (‘\0’). Ádette nol-terminatorlar menen tawsılǵan qatarlar ASCIIZ-qatarlar dep ataladı.

Tómendegi tablicada C++ tilinde belgi sıpatında isletiliwi múmkin bolǵan turaqlılar toplamı keltirilgen.

8.1-tablica. C++ tilindegi belgi turaqlılar

Belgiler klassları

Belgi turaqlılar

 

 

 

Bas háripler

 

‘A’ …’Z’, ‘A’…’Я’

 

 

 

Kishi háripler

 

‘а’ …’z’, ‘á…’я’

 

 

 

Sanlar

 

‘0’ …’9’

 

 

 

Bos orın

 

Gorizontal tabulyaciya (ASCII kodı 9), qatardı

 

 

ótkeriw (ASCII kodı 10), vertikal tabulyaciya

 

 

(ASCII kodı 11), formanı ótkeriw (ASCII kodı

 

 

12), karetkani qaytarıw (ASCII kodı 13).

 

 

 

Punktuaciya

belgileri

! ” # $ & ‘ ( ) * + - , . / : ; < = > ? @ [ \ ] ^ _ { | } ~

(ajıratıwshılar)

 

 

 

 

 

Basqarıw belgileri

 

ASCII kodı 0...1Fh aralıǵında hám 7Fh bolǵan

 

 

belgiler

 

 

 

Probel

 

ASCII kodı 32 bolǵan belgi

 

 

 

On altılıq sanlar

 

‘0’…’9’, ‘Á…’F’, ‘á…’f’

 

 

 

 

 

126

Qatar massivin járiyalaw waqtında, qatar sońına terminator qoyılıwı hám nátiyjede qatarǵa qosımsha bir bayt bolıwın itibarǵa alıwımız kerek:

char qatar[10];

Bul járiyalawda qatar qatarı ushın jámi 10 bayt ajıratıladı, sonnan 9 bayt qatar payda etiwshi belgiler ushın hám 1 bayt terminator ushın.

Qatar ózgeriwshileri járiyalanǵanda baslanǵısh mánislerdi qabıl etiwi múmkin. Bunday jaǵdayda kompilyator avtomat túrde qatar uzınlıǵın esaplaydı hám qatar sońına terminatordı qosıp qoyadı:

char hapte_kuni[]=”Juma”;

bul járiyalaw tómendegi járiyalaw menen ekvivalent:

char hapte_kuni[]={’J’,’ú,’m’,’á,’\0’};

Qatar mánisin oqıwda aǵımlı oqıw operatorı “>>” ornına getline() funkcıyasın isletken maqul boladı, sebebi aǵımlı oqıwda probeller biykar etiledi (olar qatar belgisi bolıp esaplansada) hám oqılıp atırǵan belgiler izbe-izligi qatarda asıp ketkende de belgilerdi kiritiw dawam etiwi múmkin. Nátiyjede qatar ózine ajıratılǵan ólshemnen artıq belgilerdi “qabıl” etedi. Sol sebepli, getline() eki parametrge iye bolıp, birinshi parametr oqıw ámelge asırıp atırǵan qatarǵa kórsetkish, ekinshi parametrde bolsa oqılıwı kerek bolǵan belgiler sanı kórsetiledi. Qatardı getline() funkciyası arqalı oqıwına mısal kóreyik:

#include <iostream.h> int main()

{

char qatar[6];

cout << ”qatardı kiritiń “ << ’\n’; cin.getline(satr, 6);

cout << ”siz kiritken qatar: “ << qatar; return 0;

}

Programmada isletilgen qatar qatarı 5 belgini qabıl etiwi múmkin, artıqları taslap jiberiledi. getline() funkciyasına múráját etiwde ekinshi parametr mánisi oqılıp atırǵan qatar uzınlıǵınan úlken bolmawı kerek.

127

Qatar menen islesetuǵın funkciyanıń kópshiligi «string.h» kitapxanasında jaylasqan. Salıstırmalı kóp isletiletuǵın funkciyalar ańlatpaların keltiremiz.

8.2. Qatar uzınlıǵın anıqlaw funkciyaları.

Qatarlar menen islewde, kópshilik jaǵdaylarda qatar uzınlıǵın biliw zárúr boladı. Bunıń ushın «string.h» kitapxanasınan strlen() funkciyası anıqlanǵan bolıp, onıń sintaksisi tómendegishe boladı:

size_t strlen(const char* string)

Bul funkciya uzınlıǵı esaplanıwı kerek bolǵan qatar basına kórsetkish bolǵan jalǵız parametrge iye hám ol nátiyje sıpatında belgisiz (+,-) pútin sandı qaytaradı. strlen() funkciyası qatardıń haqıyqıy uzınlıǵınan bir kem mánis qaytaradı, yaǵnıy nol-terminator ornı esapqa alınbaydı.

Dál sonday maqsette sizeof() funkciyasınan da paydalanıw múmkin hám ol strlen() funkciyasınan parıqlı túrde qatardıń haqıyqıy uzınlıǵın qaytaradı. Tómendegi keltirilgen mısalda qatar uzınlıǵın esaplawdıń hár eki variantı keltirilgen:

#include <iostream.h> #include <string.h> int main()

{

char Str[] = "1234567890";

cout << "strlen(Str) = " << strlen(Str) << endl; cout << "sizeof(Str) = " << sizeof(Str) << endl; return 0;

}

Programma islewi nátiyjesinde ekranǵa

strlen(Str) = 10

sizeof(Str) = 11

xabarı shıǵadı.

Ádette sizeof() funkciyası getline() funkciyasınıń ekinshi argumenti sıpatında isletiledi hám qatar uzınlıǵın anıq kórsetpew imkanın beredi:

cin.getline(Qatar, sizeof(Qatar));

128

Mısalı ushın: Tek ǵana latın háriplerinen ibarat bolǵan qatar berilgen. Ondaǵı

hár túrli háripler muǵdarı anıqlansın.

int main()

{

const int n = 80; char qatar[n];

cout << "Qatardı kiritiń: "; cin.getline(qatar, sizeof(qatar)); float s = 0;

int k;

for(int i = 0; i < strlen(qatar); i++) if(qatar[i] != ' ')

{

k = 0;

for(int j = 0; j < strlen(qatar); j++) if(qatar[i]==qatar[j] ||

abs(qatar[i]- qatar[j]) == 32) k++;

s += 1. / k;

}

cout << "qatardaǵı túrli háripler muǵdari: " << (int)s; return 0;

}

Programmada qatar ushın 80 uzınlıǵındaǵı qatar belgileri massivi járiyalanǵan hám onıń mánisi klaviaturadan kiritiledi. Másele tómendegishe sheshiledi. Ishpe-ish jaylasqan tákirarlaw operatorı járdeminde qatar massiviniń hár bir elementi – qatar[i] massiviniń hámme elementleri - qatar[j] menen ústi-ústine túsiwi yamasa olar bir-birinen 32 sanına parıq etıwı (úlken hám kishi latın háripleriniń kodları ortasındaǵı parıq) jaǵdayları k ózgeriwshisinde sanaladı hám s ulıwmalıq jıyındıǵa 1/k mánisi menen qosıladı. Programma sońında bir-birinen ajıratıwshı probel belgisi sheklep ótiledi.

Programmaǵa

qatardaǵi túrli háripler muǵdarı

129

qatar kiritilse, ekranǵa juwap sıpatında

Qatardaǵı túrli háripler muǵdarı: 13

qatari shıǵarıladı.

8.3. Qatarlardı nusqalaw

Qatar mánisti birinen ekinshisine nusqalaw múmkin. Bul maqsette bir qatar standart funkciyalar anıqlanǵan bolıp, olardıń ayrımlarınıń anıqlamaların keltiremiz. strcpy() funkciyası prototipi.

char* strcpy(char* str1, const char* str2)

kórinisine iye hám bul funkciya str2 qatardaǵı belgilerdi str1 qatarına baytpa-bayt nusqalaydı. Nusqalaw str2 kórsetip turǵan qatardaǵı nol-terminal ushıraǵansha dawam etedi. Sol sebepli, str2 qatar uzınlıǵı str1 qatar uzınlıǵınan úlken emesligine isenim payda etiw kerek, keri jaǵdayda berilgen segmentte str1 qatardan keyin jaylasqan berilgenler “ústine” str2 qatarınıń “artıp qalǵan” bólegi jazılıwı múmkin.

Keyingı programma bólegi “Qatardı nusqalaw!” qatardı Str qatarına nusqalaydı:

char Str[20];

strcpy(Str, ”Qatardı nusqalaw!”);

Kerek bolǵanda qatardıń qandayda bir jerinen baslap, aqırına deyin nusqalaw múmkin. Mısal ushın: “Qatardı nusqalaw!” qatarınan 8-belgisinen baslap nusqa alıw zárúr bolsa, onı tómendegishe sheshiw múmkin:

#include <iostream.h> #include <string.h> int main()

{

char Str1[20] = ”Qatardı nusqalaw!”, Str2[20]; char *kórsetkish = Str1;

kórsetkish += 7; strcpy(Str2, kórsetkish); cout << Str2 << endl; return 0;

}

130