9-lekciya
.pdf9-LEKCIYA. QATARLAR HÁM KEŃEYTILGEN BELGILER (CHAR TIPINDE). QATAR STANDART FUNKCIYALARÍ HÁM OLAR JÁRDEMINDE QATARLARDÍ QAYTA ISLEW.
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 nolterminatorlar 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.
1-keste. 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‟ |
|
|
|
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.
Qatar menen islesetuǵın funkciyanıń kópshiligi «string.h» kitapxanasında jaylasqan. Salıstırmalı kóp isletiletuǵın funkciyalar ańlatpaların keltiremiz.
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));
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ı
qatar kiritilse, ekranǵa juwap sıpatında
Qatardaǵı túrli háripler muǵdarı: 13
qatari shıǵarıladı.
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 baytpabayt 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;
}
strncpy() funkciyasınıń strlen() funkciyasınan parıqlı jeri sonnan ibarat, onda bir qatardan ekinshisine nusqalanatuǵın belgiler sanı kórsetiledi. Onıń prototipi tómendegi kóriniske iye:
char* strncpy(char *str1, const char *str2, size_t num);
Eger str1 qatar uzınlıǵı str2 uzınlıǵınan kishi bolsa, artıqsha belgiler “kesip” taslanadı. strncpy() funkciyasınıń isletiliwine mısal keltireyik:
#include <iostream.h> #include <string.h> int main()
{
char Uzın_str[] = "01234567890123456789"; char Qısqa_str[] = "ABCDEF"; strncpy(Qısqa_str, Uzın_str, 4);
cout << "Uzın_str = " << Uzın_str << endl; cout << "Qısqa_str = " << Qısqa_str << endl; return 0;
}
Programmada Uzın_str qatarı basınan 4 belgi Qısqa_str qatarına, onıń aldınǵı mánisleri ústine jaylasadı hám nátiyjede ekranǵa
01234567890123456789
0123EF
qatarlar shıǵarıladı.
strdup() funkciyasına jalǵız uzatıladı. Funkciya qatarǵa sáykes hám júzege kelgen qatar-nusqa funkciyası sintaksisi:
parametr sıpatında qatar deregine kórsetkish yadtan orın ajıratadı, oǵan qatardı
nusqalaydı adresin juwap sıpatında qaytaradı. strdup()
char* strdup(const char* source)
Tómendegi programma bóleginde qatar1 qatardıń nusqası yadtıń qatar2 kórsetken jerinde payda boladı:
char *qatar1 = ”Qatar nusqasın alıw.”;
char* qatar2;
qatar2 = strdup(qatar1);
Qatarlardı jalǵaw
Qatarlardı jalǵaw (konkatenaciya) ámeli jańa qatarlardı payda etiwde keń qollanıladı. Bul maqsette «string.h» kitapxanasınan strcat() hám strncat() funkciyaları anıqlanǵan.
strcat() funkciyası sintaksisi tómendegi kóriniske iye:
char* strcat(char *str1, const char *str2)
Funkciya |
islewi nátiyjesinde str2 qatar, |
funkciya qaytarıwshı |
qatar – |
||
str1 qatar izine |
jalǵanadı. Funkciyanı shaqırıwdan aldın str1 qatar |
uzınlıǵı, |
|||
oǵan str2 qatarı jalǵanıwı ushın jeterli bolıwı esapqa alınǵan bolıwı kerek. |
|||||
Tómende |
keltirilgen |
ámeller |
izbe-izliginiń |
orınlanıwı |
|
nátiyjesinde qatar qatarına qosımsha qatar jalǵanıwı kórsetilgen: |
|
|
char qatar[80];
strcpy(qatar, ”bul qatarǵa”);
strcat(qatar, ”qatar astı jalǵanadı.”);
Ámeller izbe-izliginiń orınlanıwı nátiyjesinde qatar kórsetip atırǵan orında “Bul qatarǵa qatar astı jalǵanadı” qatarı payda boladı.
strncat() funkciyası strcat() funkciyasınan |
parıqlı |
túrde str1 qatarǵa str2 qatarınıń kórsetilgen uzınlıqtaǵı |
qatar bólegin jalǵaydı. |
Jalǵanatuǵın qatar bólegi uzınlıǵı funkciyanıń úshinshi parametri sıpatında beriledi.
Funkciya sintaksisi:
char* strncat(char *str1, const char *str2, size_t num)
Tómende keltirilgen programma bóleginde str1 qatarına str2 qatarınıń
baslanǵish 10 belgiden ibarat qatar bólegi jalǵanadı:
char qatar1[80] = ”programmalastırıw tillerine misal bul-“;
char qatar2[80] = ”C++, Pascal, Basic”;
strncat(qatar1, qatar2, 10);
cout << qatar1;
Ámeller orınlanıwı nátiyjesinde ekranǵa
programmalastırıw tillerine misal bul-C++, Pascal
qatarı shıǵarıladı.
Másele. Nol-terminator menen tawsılıwshı S, S1 hám S2 qatarlar berilgen. S qatardaǵı S1 qatar astıları S2 qatar astı menen almastırılsın. Máseleni sheshiw ushın tómendegi másele astıların sheshiw zárúr boladı:
1.S qatarında S1 qatar astınıń kiriw ornın anıqlaw;
2.S qatarınan S1 qatar astın óshiriw;
3.S qatarında S1 qatar astı ornına S2 qatar astın ornatıw.
Bul másele astılarınıń sheshimleri C++ tiliniń standart kitapxanalarında funkciyalar kórinisinde bar bolsa da, olardıń kodın qayta jazıw paydalanıwshıǵa bul
ámellerdiń ishki mánislerin túsiniwge imkan beredi. Tómende másele sheshiminiń programma teksti keltirilgen:
#include <iostream.h> #include <string.h> const int n = 80; int Izlew(char *,char *);
void Qırqıw(char *, int, int);
void Jaylastırıw(char *, char *, int); int main()
{
char Qatar[n], Qatar1[n], Qatar2[n]; cout << "Qatardı kiritiń:
"; cin.getline(Qatar, n);
cout << "Almastırılatuǵın qatar astın kiritiń: "; cin.getline(Qatar1, n);
cout << Qatar1 << " Qoyılatuǵın qatardı kiritiń: "; cin.getline(Qatar2, n);
int qatar1_uzınlıǵı = strlen(Qatar1); int qatar_astı_ornı; do
{
qatar_astı_ornı = Izlew(Qatar, Qatar1); if(qatar_astı_ornı != - 1)
{
Qırqıw(qatar, qatar_astı_ornı, qatar1_uzınlıǵı); Jaylastırıw(Qatar, Qatar2, qatar_astı_ornı);
}
}while(qatar_astı_ornı != -1);
cout << "Almastırıw nátiyjesi: " << Qatar; return 0;
}
int Izlew(char qatar[], char qatar_astı[])
{
int qatar_parıqı = strlen(qatar) - strlen(qatar_astı); if(qatar_parıqı >= 0)
{
for(int i = 0; i <= qatar_parıqı; i++)
{
bool ústi_ústine = true;
for(int j=0; qatar_astı[j]!=’\0’&&ústi_ústine;
j++)
if(qatar[i + j] != qatar_astı[j])
ústi_ústine = false; if(ústi_ústine)
return i;
}
}
return -1;
}
void Qırqıw(char qatar[], int orın, int qırqıw_sanı)
{
int qatar_uzınlıǵı = strlen(qatar); if(orın < qatar_uzınlıǵı)
{
if(orın + qırqıw_sanı >= qatar_uzınlıǵı) qatar[orın] = '\0';
else
for(int i = 0; qatar[orın + i - 1] != '\0';
i++)
qatar[orın + i] = qatar[orın + qırqıw_sanı+i];
}
}
void Jaylastırıw(char qatar[], char qatar_astı[], int orın)
{
char waqtınsha[n]; strcpy(waqtınsha, qatar + orın); qatar[orın] = '\0'; strcat(qatar, qatar_astı); strcat(qatar, waqtınsha);
}
Programmada hár bir másele astına sáykes funkciyalar dúzilgen: |
|
|||||
1. |
int |
Izlew(char |
qatar[], |
char |
qatar_astı[]) |
– |
funkciyası qatar qatarına qatar_astı qatarınıń shep tárepinen birinshi kiriwiniń
ornın |
qaytaradı. |
Eger qatar qatarında qatar_astı ushıramasa -1 |
mánisin |
||||
qaytaradı. |
|
|
|
|
|
|
|
2. |
void |
Qırqıw(char qatar[], int |
orın, int qırqıw_sanı) |
– |
|||
funkciyası qatar qatarınıń orın ornınan baslap |
qırqıw_sanı |
sandaǵı |
belgilerdi |
||||
qırqıp taslaydı. Funkciya nátiyjesi qatar qatarında payda boladı. |
|
|
|||||
3. |
void Jaylastırıw(char qatar[], char qatar_astı[], int |
orın) |
– |
||||
funkciyası qatar qatarına, |
onıń orın ornınan |
baslap |
qatar_astı |
qatarın |
|||
jaylastıradı. |
|
|
|
|
|
|
Bas funkciyada qatar (S), onda almastırılatuǵın qatar (S1) hám S1 ornına jaylastırılatuǵın qatar (S2) aǵımınan oqıladı. Tákirarlaw operatorı orınlanıwınıń hár bir qádeminde S qatarınıń shep tárepinen baslap S1 qatarı izlenedi. Eger S qatarında S1 qatarı bar bolsa, ol qırqıladı hám sol orınǵa S2 qatarı jaylastırıladı. Tákirarlaw processi Izlew() funkciyası -1 mánisin qaytaraman degenshe dawam etedi.
Qatarlardı salıstırıw
Qatarlardı salıstırıw olardaǵı sáykes orında jaylasqan belgiler kodların ózara salıstırıw menen anıqlanadı. Bunıń ushın «string.h» kitapxanasında standart
funkciyalar bar. strcmp() funkciyası sintaksisi:
int strcmp(const char *str1, const char *str2)
kórinisine iye bolıp, funkciya str1 hám str2 salıstırıw nátiyjesi sıpatında san mánisin qaytaradı hám olar tómendegishe ańlatıladı:
a)i < 0 - eger str1 qatarı str2 qatarınan kishi bolsa; b)i = 0 - eger str1 qatarı str2 qatarına teń bolsa; c)i > 0 - eger str1 qatarı str2 qatarınan úlken bolsa.
Funkciya háriplerdiń registrin parıqlaydı. Bunı mısalda kóriwimiz múmkin:
char qatar1[80] = ”Programmalastırıw tilleri: C++, pascal.“; char qatar2[80] = ”Programmalastırıw tilleri: C++, Pascal.“; int i;
i = strcmp(qatar1, qatar2);
Nátiyjede i ózgeriwshisi oń mánis qabıl etedi, sebebi salıstırılıp atırǵan qatarlardaǵı “pascal” hám “Pascal” qatar bóleklerinde birinshi háripler parıq qıladı. Keltirilgen mısalda i mánisi 32 boladı. Bul parıqlanıwshı háripler kodlarınıń ayırması. Eger funkciyaǵa
i = strcmp(qatar2, qatar1);
kórinisinde múráját etilse, i mánisi teris san -32 boladı.
Eger qatarlardaǵı bas yamasa kishi háriplerdi parıqlamastan salıstırıw ámelin orınlaw zárúr bolsa, bunıń ushın strcmpi() funkciyasınan paydalanıw múmkin. Joqarıda keltirilgen mısaldaǵı qatarlar ushın
i = strcmpi(satr2, satr1);
ámeli orınlanǵanda i mánisi 0 boladı. strncmp() funkciyası sintaksisi
int strncmp(const char *str1, const char *str2, size_t num);
kórinisinde bolıp, str1 hám str2 qatarlardı baslanǵısh num sanındaǵı belgilerdi salıstıradı. Funkciya háripler registrin itibarǵa aladı. Joqarıdaǵı mısalda anıqlanǵan qatar1 hám qatar2 qatarlar ushın
i = strncmp(qatar1, qatar2, 31);