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

9-lekciya

.pdf
Скачиваний:
3
Добавлен:
25.12.2023
Размер:
340.53 Кб
Скачать

9-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);

Соседние файлы в предмете Программирование на C++