Joqari darejeli programmalastiriwda C++ Last
.pdfs += 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