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

14-ameliy

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

14-ÁMELIY SABAQ. QATARLARDÍ JALǴAW, SALÍSTÍRÍW, BELGILERDI IZLEWGE BAYLANÍSLÍ MÁSELELER SHESHIW.

Jumıstıń maqseti: Qatarlar boyınsha C++ tilinde programma dúziw. Qatarlardı jalǵaw, salıstırıw hám belgilerdi izlewge baylanıslı máseleler sheshiw.

Teoriyalıq bólim:

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’};

Ámeliy bólim:

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

ámeli orınlanıwında i mánisi 0 boladı, sebebi qatarlar basindaǵı 31 belgiler birdey.

strncmpi() funkciyası strncmpi() funkciyasınday orınlanadı, ózgeshe tárepi sonnan ibarat, salıstırıwda háriplerdiń registri esapqa alınbaydı. Dál usı qatarlar ushın

i=strncmpi(qatar1, qatar2, 32);

ámeli orınlanıwı nátiyjesinde i ózgeriwshi mánisi 0 boladı.

Qatarda belgini izlew funkciyası

Qatarlar menen islewde ondaǵı qandayda bir belgini izlew ushın «string.h» kitapxanasında bir qatar standart funkciyalar bar.

Qanday da bir belginiń berilgen qatarda bar yamasa joq ekenligin anıqlap beriwshi strchr() funkciyasınıń prototipi

char* strchr(const char *string, int c);

kórinisinde bolıp, ol c belgisin string qatarında izleydi. Eger izlew sátli bolsa, funkciya sol belginiń qatardaǵı ornın funkciya nátiyjesi sıpatında qaytaradı, keri jaǵdayda, yaǵnıy belgi qatarda ushıramasa funkciya NULL mánisin qaytaradı. Belgini izlew qatar basınan baslanadı.

Tómende keltirilgen programma bólegi belgini qatardan izlew menen baylanıslı.

char qatar[] = ”0123456789”;

char *pQatar;

pQatar = strchr(qatar, ’6’);

Programma islewi nátiyjesinde pQatar kórsetkishi qatar qatarınıń “6” belgisi jaylasqan ornı adresin kórsetedi.

strrchr() funkciyası berilgen belgini berilgen qatar aqırınan baslap izleydi. Eger izlew sátli bolsa, belgini qatarǵa aqırǵı kiriwiniń ornın qaytaradı, keri jaǵdayda NULL mánis qaytaradı.

Mısal ushın

char qatar[] = ”0123456789101112”;

char *pqatar;

pqatar = strrchr(qatar,’0’);

ámeller orınlanıwında pqatar kórsetkishi qatar qatarınıń “01112” qatar bóleginiń

baslanıwın kórsetedi.

strspn() funkciyası eki qatardaǵı belgilerdi salıstıradı. Funkciya tómendegishe

size_t strspn(const char *str1, const char *str2);

kórinisine iye bolıp, ol str1 qatarǵa kiriwshi qanday da bir belgini izleydi hám bunday element tabılsa, onıń indeksin funkciya mánisi sıpatında qaytaradı, keri jaǵdayda funkciya qatar uzınlıǵınan bir artıq mánisti qaytaradı. Máselen:

char qatar1[] = "0123ab6789012345678"; char qatar2[] =

"a32156789012345678"; int parıqlı_belgi; parıqli_belgi = strspn(qatar1, qatar2);

cout << "qatar1 qatarındaǵı qatar2 qatarına kirmeytuǵın\ birinshi belgi indeksi = " << parıqlı_belgi;

cout << "ham ol '" << qatar1[parıqlı_belgi] <<"' belgisi.";

ámeller orınlanıwı nátiyjesinde ekranǵa

Qatarlarǵa sáykes túspegen belgi indeksi = 5

qatarı shıǵarıladı.

strcspn() funkciyasınıń prototipi

size_t strcspn(const char *str1, const char *str2);

kórinisinde

bolıp,

ol str1 hám str2 qatarların

salıstıradı

hám str1 qatarınıń str2 qatarına

kirgen birinshi belginiń indeksin

qaytaradı.

Máselen:

 

 

 

char qatar[] = ”Birinshi qatar”; int indeks; index = strcspn(qatar, ”sanaq sisteması”);

ámelleri orınlanǵannan soń indeks ózgeriwshisi 1 mánisti qabıl etedi, sebebi birinshi qatardıń birinshi orındaǵı belgisi ekinshi qatarda ushıraydı.

strpbrk() funkciyanıń prototipi

char* strpbrk(const char *str1, const char *str2);

kóriniske iye bolıp, ol str1 qatarındaǵı str2 qatarına kiriwshi qanday da bir belgini izleydi hám eger bunday element tabılsa, onıń adresi funkciya mánisi sıpatında qaytarıladı, keri jaǵdayda funkciya NULL mánis qaytaradı. Tómendegi mısal funkciyanıń qanday islewin kórsetedi.

char qatar1[] = ”0123456789ABCDEF”;

char qatar2[] = ”ZXYabcdefABC”; char *element;

element = strpbrk(qatar1, qatar2);

cout << element << ’\n’;

Programma islewi nátiyjesinde ekranǵa str1 qatarınıń

ABCDEF

qatar astı shıǵarıladı.

Qatar bóleklerin izlew funkciyası

Qatarlar menen islewde bir qatarǵa ekinshi bir qatardıń (yamasa onıń qaysıdur bóleginiń) tolıq kiriwin anıqlaw menen baylanıslı máseleler salıstırmalı kóp ushıraydı. Máselen, tekst redaktorlarındaǵı qatardaǵı qanday da bir qatar bólegin ekinshi qatar bólegi menen almastırıw máselesin mısal etip keltiriwimiz múmkin.

Standart «string.h» kitapxanası bul tiptegi máseleler ushın bir neshe funkciyalardı usınadı.

strstr() funkciyası tómendegishe járiyalanadı:

char *strstr(const char *str, const char *substr);

Bul

funkciya str qatarına substr qatar

bólegi

kiriwi

tekseriledi,

eger substr qatar bólegi str qatarına tolıq kiriwi bar

bolsa,

qatardıń shep

tárepininen birinshi kiriwdegi birinshi belginiń adresi juwap retinde qaytarıladı,

keri

jaǵdayda

funkciya

NULL

mánisti

qaytaradı.

Tómendegi

mısal strstr() funkciyasınıń isletiliwin kórsetedi:

 

 

char qatar[]= ”qatradan qatar astı izlenip atır, qatar asti bar”;

char qatar2[] = ”qatar astı”; char *qatar_astı;

qatar_astı = strstr(qatar1, qatar2); cout << qatar_astı <<’\n’;

Programma buyrıqları orınlanıwı nátiyjesinde ekranǵa

qatar astı izlenip atır, qatar astı bar

qatarı shıǵarıladı.

Keyingi programma bóleginde qatarda basqa bir qatar bólegi bar yamasa joq

ekenligin baqlaw jaǵdayı kórsetilgen:

char Atlar[] = ”Alisher, Farxad, Munisa, Erkin, Akmal, Nadira”;

char At[10];

char *qatardaǵı_at;

cout << ”Attı kiritiń: “; cin >> At; qatardaǵı_at = strstr(Atlar, At); cout << ”bunday at dizimde “; if(qatardaǵı_at

== NULL)

cout << ”joq.” << ’\n’; else

cout << ”bar.” <’\n’;

Programmada paydalanıwshıdan qatar bólegi sıpatında qanday da bir attı kiritiw talap etiledi hám bul mánis At qatarına oqıladı. Kiritilgen at programmada anıqlanǵan dizimde bar yamasa joq ekenligi anıqlanadı hám xabar beriledi.

strtok() funkciyasınıń sintaksisi

char* strtok(char *str, const char *delim);

kóriniste bolıp, ol str qatarında delim qatar-diziminde berilgen ayırıwshılar aralıǵına alınǵan qatar bóleklerin ajıratıp alıw imkániyatın beredi. Funkciya birinshi qatarda ekinshi qatar-dizimindegi ayırıwshını ushıratsa, onnan keyin nol-terminatordı qoyıw arqalı str qatardı ekige ajıratadı. Qatardıń ekinshi bóleginen ajıratıwshılar menen

“orap alınǵan” qatar bóleklerin tabıw ushın funkciyanıń keyingi shaqırılıwında birinshi parametr ornına NULL mánisin qoyıw kerek boladı. Tómendegi mısalda qatarlardı bóleklerge ajıratıw mısalı keltirilgen:

#include <iostream.h>

#include <string.h>

int main()

{

char Atlar[]= "Alisher,Farxad Munisa, Erkin? Akmal0, Nadira";

char Ajıratıwshı[] = " ,!?.0123456789"; char *qatardaǵı_at;

qatardaǵı_at = strtok(Atlar, Ajıratıwshı); if(qatardaǵı_at) cout<< qatardaǵı_at << '\n’; while(qatardaǵı_at)

{

qatardaǵı_at = strtok(NULL, Ajıratıwshı); if(qatardaǵı_at) cout<< qatardaǵı_at <<'\n’;

}

return 0;

}

Programma islewi nátiyjesinde ekranǵa Atlar qatarındaǵı „ ‟ (probel), „,‟

(útir), „?‟ (soraw belgisi) hám „0‟ (san) menen ajıratılgán qatar bólekleri - atlar shıǵarıladı:

Alisher

Farxad

Munisa

Erkin

Akmal

Nadira

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