9. Satrlar va tuzilmalar


Download 244.41 Kb.
bet4/8
Sana12.03.2023
Hajmi244.41 Kb.
#1264900
1   2   3   4   5   6   7   8
Bog'liq
09.Satrlar va tuzilmalar

С-satrlarni taqqoslash uchun quyidagi funksiyalardan foydalaniladi:
strcmp() funksiyasi Str1 C-satrni Str2 C-satr bilan taqqoslaydi va quyidagi qiymatlardan birini qaytaradi:

  • Str1 < Str2 bo‘lsa, manfiy son;

  • Str1 = Str2 bo‘lsa, 0 qiymat;

  • Str1 > Str2 bo‘lsa, musbat son.

Taqqoslash belgilar registrni hisobga olgan holda amalga oshiriladi. Funksiyaning prototipi quyidagicha:
#include
int strcmp(const char *Str1, const char *Str2);
Misol:
char str1[] = "абв", str2[] = "абв";
int х = 0;
х = strcmp(str1, str2);
cout << x << endl; // 0
str1[2] = 'б'; // str1[] = "абб", str2[] = "абв";
x = strcmp(str1, str2);
cout << x << endl; // -1
str1[2] = 'г'; // str1[] = "абг", str2[] = "абв";
x = strcmp(str1, str2);
cout << x << endl; // 1
strncmp() funksiyasi Str1 va Str2 C-satrlardagi birinchi Count belgilarni taqqoslasydi. Agar nolinchi bayt avval uchrasa, Count parametrining qiymati e’tiborga olinmaydi. Funksiya quyidagi qiymatlardan birini qaytaradi:

  • Str1 < Str2 bo‘lsa, manfiy son;

  • Str1 = Str2 bo‘lsa, 0 qiymat;

  • Str1 > Str2 bo‘lsa, musbat son.

Taqqoslash belgilar registrni hisobga olgan holda amalga oshiriladi. Funksiyaning prototipi:
#include
int strncmp(const char *Strl, const char *Str2, size_t Count);
Misol:
char str1[]="абв", str2[]="абг";
int x = 0;
x=strncmp(str1, str2, 2);
cout << x << endl; // 0
x=strncmp(str1, str2, 3);
cout << x << endl; // -1
strcoll() funksiyasi strcmp() funksiyasi bilan bir xilda, ammo taqqoslash joriy lokalda LC_COLLATE qiymatni hisobga olgan holda amalga oshiriladi. Masalan, "ё" harfi "е" va "ж" oraliqqa tushmaydi chunki, ср1251 kodlashida "ё" harfi 184 kodiga ega, "е"229, "ж" harfi esa 230. Agar strcmp() funksiyasi yordamida taqqoslash amalga oshirilsa, "е" harfi "ё" harfidan katta bo‘ladi (229 > 184). strсоll() funksiyasidan foydalanilganda lokalning "Russian_Russia.1251" sozlanishida "ё" harfi "е" va "ж" harflari oralig‘iga tushadi, chukni lokal alifbo bo‘yicha sozlanadi. Lokal sozlanmagan bo‘lsa strcmp() funksiyasi bilan bir xilda bo‘ladi. Taqqoslash registrni hisobga olgan holda bajariladi. Funksiyaning prototipi:
#include
int strcoll(const char *Str1, const char *Str2);
Misol ko‘raylik.
setlocale(LC_COLLATE, , "Russian_Russia.1251");
char str1[] = "e", str2[] = "ё";
int x = strcoll(str1, str2);
cout << x << endl;
// 1 (lokalni sozlamasdan: e (kodi 229) > ё (kodi 184))
// -1 (lokal sozlangandan keyin: е < ё)
strxfrm() funksiyasi Src С-satrini maxsus formatdagi satrga almashtiradi va uni Dst ga yozadi. Oxiriga nol-belgi qo‘yiladi MaxCount dan ortmagan berlgi yozilsdi. Kerakli belgilarni olish (nol belgisiz) uchun MaxCount parametrida 0 soni ko‘rsatiladi, Dst parametrida nol belgi beriladi. Satrlarni taqqoslash ko‘p marotaba amalga oshirilayotgan bo‘lsa, strxfrm() funksiyasidan foydalanish tavsiya qilinadi. Funksiyaning prototipi:
#include
size_t strxfrm(char *Dst, const char *Src, size_t MaxCount);
Misol:
setlocale(LC_ALL, "Russian_Russia.1251") ;
int x = 0;
char str1[] = "e", str2[] = "ё";
char buf1[10] = {0}, buf2[10] = {0};
x = strxfrm(0, str1, 0);
cout << x << endl; // 6 (bufer: 6+1)
strxfrm(buf1, str1, 10);
strxfrm(buf2 , str2, 10);
x = strcmp(str1, str2);
cout << x << endl; // 1 (e > ё)
x = strcmp(buf1, buf2);
cout << x << endl; // -1 (e < ё)
_stricmp() funksiyasi С-satrlarni registrni hisobga olmagan holda taqqoslaydi. Rus harflari uchun lokalni sozlash zarur bo‘ladi. Bu funksiya faqat VC++ da mavjud va standartga kirmaydi. Funksiyaning prototipi:
#include ing>
int stricmp(const char *Str1, const char *Str2);
Misol:
setlocale(LC_CTYPE, "Russian_Russia.12 51");
char s1[] = "абв", s2[] = "АББ";
cout << _stricmp(s1, s2) << endl; // 0
Satrlarni taqqoslash uchun memcmp() funksiyasidan ham foydalanish mumkin. memcmp() funksiyasi Mas1 va Mas2 massivlarning birinchi Size baytlarini taqqoslaydi. Qiymat sifatida quyidagilardan birini qaytaradi:

  • manfiy son – agar Mas1 < Mas2;

  • 0agar Mas1 = Mas2;

  • musbat son – agar Mas > Mas2.

Funksiyaning prototipi:
#include
int memcmp(const void *Bufl, const void *Buf2, size_t Size);
Misol:
char str1[] = "abc", str2[] = "abc"; int x = 0;
x = memcmp(str1, str2, sizeof str2);
cout << x << endl; // 0
str1[2] = 'b';
х = memcmp(str1, str2, sizeof str2);
cout << x << endl;
str1[2] = 'd';
x = memcmp(str1, str2, sizeof str2);
cout << x << endl;
memcmp() funksiyasi belgilarning registrni hisobga olgan holda taqqoslashni amalga oshiradi. Belgilar registrni hisobga olgmagan holda taqqoslash zarur bo‘lsa, _memicmp() funksiyasidan foydalanish mumkin. Funksiyaning prototipi:
#nclude
int _memicmp(const void *Bufl, const void *Buf2, size_t Size);
Funksiyadan foydalanishga misol:
std::setlocale(LC_ALL, "Russian_Russia.1251");
char str1[] = "абв", str2[] = "АБВ"; int x = 0;
x = memicmp(str1, str2, sizeof str2);
cout << x << endl; // 0
x = memcmp(str1, str2, sizeof str2);
cout << x << endl; // 1
Registrni e’tiborga olmagan holda belgilarni taqqoslash uchun _stricmp() va _memicmp() funksiyalaridan foydalanish mumkin. Bu funksiyalar standartga kirmaganligi sababli, boshqa kompilyatorlarda bajarilmasligi mumkin. Shu sababli, registrni e’tiborga olmagan holda belgilarni taqqoslash uchun, o‘z funksiyamizni (casecmp()) yozamiz.
#include
#include
#include
#include
int casecmp(const char *str1, const char *str2);
int main() {
char s1[] = "абв", s2[] = "АБВ";
cout << strcmp(s1, s2) << endl; // 1
cout << casecmp(s1, s2) << endl; // 0
cout << casecmp("аб", "аб") << endl; // 0
cout << casecmp(s1, "АБ") << endl; // 226
cout << casecmp("аба", s2) << endl; // -2
cin.get();
return 0;
}
int casecmp(const char *str1, const char *str2) {
setlocale(LC_CTYPE, "Russian_Russia.1251");
int ch1 = 0, ch2 = 0, result = 0;
while(1) {
ch1 = tolower((unsigned char)*str1);
ch2 = tolower((unsigned char)*str2);
result = ch1 ch2;
// Agar qiymatlar teng bo‘lmasa, natijani qaytaramiz
if(result) return result;
// Satr oxiriga borsa, u holda satrlar teng
if(!ch1 && !ch2) return 0;
++str1; // Ko’rsatkichlarni ko‘chiramiz
++str2;
}
return 0;
}

casecmp() funksiyasi parametrlar sifatida ikkita satrning (str1 va str2) manzilini oladi va satrlar teng bo‘lsa, '0' qiymat qaytaradi. Agar str1 < str2 bo‘lsa manfiy va str1 > str2 bo‘lsa musbat son qaytaradi. Parametr sifatida satrli o‘zgarmasni uzatish mumkin bo‘lishi uchun parametrlardan oldin const (masalan, const char *str1) kalit so‘zi ko‘rsatiladi. Sikl ichida tolower() funksiyasi yordamida ikkala belgi bir registrga keltiriladi, so‘ngra ikkinchi satr belgisidan birinchi satr belgisi ayiriladi. Ayirish natijasi nolga teng bo‘lmasa, bu qiymat funksiyaga qaytariladi. Nolga teng bo‘lsa, ikkita satr oxiriga borganligi tekshiriladi. Bunda satrlar teng bo‘lsa 0 qiymatni qaytarish mumkin. Satr oxiriga borilmagan bo‘lsa, ko‘rsatkich navbatdagi belgiga ko‘chiriladi va taqqoslash amalga oshiriladi.

Download 244.41 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling