logo

Manni lotindan krilga o’tkazib beruvchi dasturni ishlab chiqish

Yuklangan vaqt:

16.11.2024

Ko'chirishlar soni:

0

Hajmi:

764.7919921875 KB
O‘ZBEKISTON RESBUPLIKASI
OLIY TA'LIM FAN VA INNOVATSIYALAR VAZIRLIGI
SHAROF RASHIDOV NOMIDAGI SAMARQAND DAVLAT
UNIVERSITETI INTELLEKTUAL TIZIMLAR VA
KOMPYUTER TEXNOLOGIYALARI
FAKULTETI
Dasturiy Injiniring yo‘nalishi
______________________ fanidan
KURS ISHI
MAVZU:  Manni lotindan krilga o’tkazib beruvchi dasturni
ishlab chiqish .
Bajardi: ___ -bosqich “_______________” guruhi talabasi
Rahbar:                           _______________________________    
                                                                  (F. I. O.)
Reja: I. Kirish
II. Asosiy qism
          2.1 C++ tilida dasturni tuzish va uning bosqichlari
          2.2 Dasturni ishlatib ko’rish va xatolar ustida ishlash
          2.3 Dasturni takomillashtirish,  qo’shimcha imkoniyatlar qo’shish
          2.4 Mavjud saytlar haqida ma’lumot
III. Xulosa
IV. Foydalanilgan adabiyotlar
Kirish
1 Lotin yozuvidan kirill yozuviga o‘tkazish dasturi turli sabablarga ko‘ra zarur 
bo‘lishi mumkin. Bu dastur ayniqsa lingvistik va madaniy manbalarni saqlash, 
o‘qitish, tadqiqot va hujjatlashtirish kabi sohalarda juda muhimdir.  Quyida bu 
dasturning foydalanish sohalari va afzalliklari haqida batafsil ma’lumot beraman.
                               
Texnologik Integratsiya
Zamonaviy texnologiyalar, masalan, veb-saytlar, mobil ilovalar va kompyuter 
dasturlari, ko‘p hollarda lotin yozuvidan foydalanadi. Lotin yozuvidan kirill 
yozuviga o‘tkazish dasturi orqali, bu texnologiyalarni kirill yozuviga moslashtirish 
mumkin. Bu, o‘z navbatida, internetdagi kontentni kirill yozuvidagi 
foydalanuvchilar uchun ham oson va tushunarli qiladi. 
 Axborot Texnologiyalari va Media
Axborot texnologiyalari va media sohasida, kontentni turli yozuv tizimlarida 
taqdim qilish zarur bo‘lishi mumkin. Lotin yozuvidan kirill yozuviga o‘tkazish 
dasturi orqali, turli tillardagi veb-saytlar, bloglar, ijtimoiy tarmoqlar va axborot 
resurslari uchun kontent yaratish va taqdim etish mumkin. Bu esa, o‘z navbatida, 
auditoriyaning kengayishiga va ma’lumotlarning keng tarqalishiga yordam beradi.
2 C++ tilida ham lotin yozuvini kirill yozuviga o‘giruvchi dasturni yaratish
mumkin. Quyidagi bosqichlar bo‘yicha dasturni yaratishni ko‘rib chiqamiz.
 Dasturni yaratish uchun kerakli vositalar
1. Kompilyator:  C++ kodni kompilyatsiya qilish uchun kompilyator (GCC, Clang,
Visual Studio) kerak bo‘ladi.
2. Tekst muharriri:  Kod yozish uchun tekst muharriri (Visual Studio Code, 
CLion, Notepad++).
                                      
Dasturni yaratish bosqichlari
1. Boshlash:
    - Yangi papka yaratib, unga dastur faylini saqlang. Masalan, converter.cpp.
2. Latindan Kirillga o‘girish qoidalarini tayyorlash:
    - Har bir harf va harf birikmalarining o‘girish qoidalarini sozlash.
    - Masalan,  а  -> a,  б  -> b,  ш  -> sh va h.k.
3. Kod yozish:
#include <iostream>
#include <unordered_map>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
3 unordered_map<string, string> rules = {
    {"a", " а "}, {"b", " б "}, {"v", " в "}, {"g", " г "}, {"d", " д "},
    {"e", " е "}, {"yo", " ё "}, {"j", " ж "}, {"z", " з "}, {"i", " и "},
    {"y", " й "}, {"k", " к "}, {"l", " л "}, {"m", " м "}, {"n", " н "},
    {"o", " о "}, {"p", " п "}, {"r", " р "}, {"s", " с "}, {"t", " т "},
    {"u", " у "}, {"f", " ф "}, {"x", " х "}, {"ch", " ч "}, {"sh", " ш "},
    {"ya", " я "}, {"yu", " ю "}, {"q", " қ "}, {"h", " ҳ "}, {"ng", " нг "},
    {"g'", " ғ "}, {"o'", " ў "}, // Corrected to use single quotes
};
string latin_to_cyrillic(const string& text) {
    string result;
    size_t i = 0;
    vector<pair<string, string>> sorted_rules(rules.begin(), rules.end());
    sort(sorted_rules.begin(), sorted_rules.end(),
         [](const pair<string, string>& a, const pair<string, string>& b) {
             return a.first.size() > b.first.size();
         });
    while (i < text.size()) {
        bool matched = false;
        for (const auto& rule : sorted_rules) {
            if (text.substr(i, rule.first.size()) == rule.first) {
                result += rule.second;
                i += rule.first.size();
                matched = true;
                break;
            }
        }
        if (!matched) {
4             result += text[i];
            ++i;
        }
    }
    return result;
}
int main() {
    string input_text;
     cout << "Латин ёзувидаги матнни киритинг: ";
     getline(cin, input_text);
    string output_text = latin_to_cyrillic(input_text);
    cout << " Кирилл   ёзувидаги   матн : " << output_text << endl;
    
    return 0;
}
Dasturni sinab ko’rish
1. Kodni kompilyatsiya qilish:
5     - Terminal yoki komandalar satrini oching.
    - cd buyrug‘i yordamida dastur joylashgan papkaga kiring.
    - g++ converter.cpp -o converter buyrug‘ini ishlatib dasturni kompilyatsiya 
qiling.
2. Dasturni ishga tushirish:
     - ./converter buyrug‘ini ishlatib dasturni ishga tushiring.
    - Latin yozuvidagi matnni kiriting. Dastur kiritilgan matnni kirill yozuviga 
o‘girib chiqaradi.
Dasturni takomillashtirish
1. Xatolarni tekshirish va to‘g‘irlash:
    - Testlarni o‘tkazing va barcha qoidalar to‘g‘ri ishlayotganini tekshiring.
    - Xatolarni aniqlab, to‘g‘irlang.
2. Qo‘shimcha imkoniyatlar qo‘shish:
    - Yanada qulay foydalanuvchi interfeysini yaratish.
    - Veb-ilova yoki mobil ilovalar uchun API yaratish.
6 unordered_map - bu kalit qiymat va xaritalangan qiymat birakmasin hosil bo'lgan 
elementlarni saqlaydigan bog'langan konteyner. Kalit qiymati elementni yagona 
aniqlash uchun ishlatiladi va xaritalangan qiymat kalit bilan bog'langan tarkibdir. 
Kalit ham, qiymat ham oldindan belgilangan yoki foydalanuvchi tomonidan 
belgilangan har qanday turdagi bo'lishi mumkin. Oddiy qilib aytganda, 
unordered_map elementlarni o'zida saqlaydigan lug'at turidagi ma'lumotlar 
strukturasiga o'xshaydi. U ketma-ket juftlarni (kalit, qiymat) o'z ichiga oladi, bu 
uning noyob kaliti asosida alohida elementni tezda olish imkonini beradi. Ichki 
unordered_map Xash Table yordamida amalga oshiriladi, xaritaga taqdim etilgan 
kalit xesh-jadval indekslariga xeshlanadi, shuning uchun ma'lumotlar 
strukturasining ishlashi ko'p jihatdan xesh funktsiyasiga bog'liq, ammo o'rtacha 
hisobda qidirish, qo'shish va o'chirish narxiga bog'liq. xesh jadvali O(1).
Izoh: Ushbu chiqishning o'ziga xos tomoni shundaki, unordered_map natijasining 
qiymati tasodifiy kalitdan qiymatga ishlab chiqariladi, xarita esa qiymat va kalitni 
tartiblangan tarzda ko'rsatadi.
7 unordered_map bo'yicha usullar unordered_map-da ishlaydigan ko'plab 
funktsiyalar mavjud.  Ulardan eng foydalilari:
● operator =
● operator []
● empty
● size for capacity
● begin and end for the iterator.
● find and count for lookup.
● insert and erase for modification.
 Quyidagi jadval unordered_map usullarining to'liq ro'yxatini ko'rsatadi:
Usullar/funksiyalar Tavsif
at()
Bu C++ unordered_map funksiyasi element k kaliti
bilan qiymatga havolani qaytaradi
begin()
unordered_map konteyneridagi konteynerdagi
birinchi elementga ishora qiluvchi iteratorni
qaytaradi
end()
unordered_map konteyneridagi konteynerdagi
oxirgi elementdan keyingi holatga ishora qiluvchi
iteratorni qaytaradi
count()
Berilgan kalit yordamida unordered_mapdagi
elementlar sonini hisoblang
find()
Iteratorni elementga qaytaradi
empty()
Unordered_map konteynerida konteyner bo'sh yoki
yo'qligini tekshiradi
erase()
unordered_map konteyneridagi konteynerdagi
elementlarni o chirib tashlangʻ
8     C++ 11 kutubxonasi, shuningdek, ichki ishlatiladigan chelaklar sonini, chelak 
hajmini, shuningdek, ishlatilgan xesh funksiyasini va turli xesh siyosatlarini ko'rish
uchun funktsiyalarni taqdim etadi, ammo ular real ilovalarda unchalik foydali 
emas.  Iterator yordamida unordered_map ning barcha elementlarini takrorlashimiz 
mumkin.                                                                                                          
Eslatmalar C++ standart kutubxonasi algoritmlari turli xil ma'lumotlar 
tuzilmalarida ishlashi mumkin. Ular ishlashi mumkin bo'lgan ma'lumotlar 
tuzilmalari faqat vektor va kabi C++ Standart kutubxonasi konteyner sinflarini 
emas, balki ro'yxat, maxsus ma'lumotlar tuzilmalari va agar ular ma'lum bir 
algoritm talablariga javob bersa, elementlar massivlarini ham o'z ichiga oladi. C++ 
standart kutubxonasi algoritmlari iteratorlar orqali bilvosita konteyner 
elementlariga kirish va o‘tish orqali ushbu ko‘p qirrali darajaga erishadi.                 
C++ standart kutubxonasi algoritmlari iterator diapazonlarini qayta ishlaydi, ular 
odatda boshlang'ich yoki yakuniy pozitsiyalari bilan belgilanadi. Quyida keltirilgan
diapazonlar diapazondagi barcha iteratorlar o zgarmas bo lishi va har bir ʻ ʻ
diapazonning ketma-ketligi ichida iteratorni qo shish orqali oxirgi pozitsiyaga 	
ʻ
birinchidan etib borishi kerakligi ma nosida haqiqiy bo lishi kerak.                          	
ʼ ʻ
C++ 20 dan beri <algoritm> da aniqlangan ko'pchilik algoritmlar diapazonni 
oladigan shaklda ham mavjud. Masalan, sort(v1.begin(), v1.end(), greater<int>()) 
ni chaqirish o'rniga diapazonlarni chaqirishingiz mumkin::sort(v1, greater<int>()); 
C++ standart kutubxonasi algoritmlari bir vaqtning o'zida har xil turdagi konteyner
obyektlarida ishlashi mumkin. Algoritmlarning maqsadi haqida ma'lumot berish 
uchun ikkita qo'shimcha ishlatilgan:
● _if qo'shimchasi algoritm elementlarning o'zida emas, balki elementlarning 
qiymatlarida ishlaydigan funksiya ob'ektlari bilan ishlatilishini bildiradi. 
Masalan, find_if algoritmi qiymatlari funksiya ob'ekti tomonidan 
belgilangan mezonga javob beradigan elementlarni qidiradi va find algoritmi
ma'lum bir qiymatni qidiradi.
9 ● _copy qo'shimchasi algoritm odatda o'zgartirilgan qiymatlarni nusxalash 
o'rniga nusxalangan qiymatlarni o'zgartirishini bildiradi. Boshqacha qilib 
aytganda, ular manba diapazonining elementlarini o'zgartirmaydi, balki 
natijalarni chiqish diapazoniga yoki iteratorga qo'yadi. Misol uchun, teskari 
algoritm diapazondagi elementlarning tartibini o'zgartiradi va 
teskari_ko'chirish algoritmi teskari natijani belgilangan diapazonga 
ko'chiradi.
C++ standart kutubxonasi algoritmlari ko'pincha ularning maqsadi yoki talablarini 
ko'rsatish uchun guruhlarga bo'linadi. Bularga o zgarmas algoritmlarga nisbatan ʻ
elementlarning ma nosini o zgartiruvchi algoritm o zgarishlari kiradi. O'zgartirish 	
ʼ ʻ ʻ
algoritmlari elementlarning tartibini o'zgartiradi, lekin elementlarning qiymatlarini 
emas. Yo'q qilish algoritmlari diapazondagi elementlarni yoki diapazonning 
nusxasini yo'q qilishi mumkin. Saralash algoritmlari diapazondagi elementlarni 
turli yo‘llar bilan qayta tartiblaydi va tartiblangan diapazon algoritmlari faqat 
elementlari ma’lum bir tarzda tartiblangan diapazonlar uchun ishlaydi.                    
Raqamli ishlov berish uchun taqdim etilgan C++ Standard Library raqamli 
algoritmlari o'zlarining <raqamli> sarlavha fayliga ega va funksiya ob'ektlari va 
adapterlari <funksional> sarlavhasida aniqlanadi. Boolean qiymatlarni 
qaytaradigan funksiya ob'ektlari predikatlar deb ataladi. Odatiy ikkilik predikat 
operator< hisoblanadi. Umumiy qoidaga ko'ra, tartiblangan elementlar 
taqqoslanadigan elementlardan kichikroq bo'lishi kerak, shuning uchun ikkita 
elementni hisobga olgan holda, ularning ekvivalentligini (ikkinchisidan kichik 
bo'lmasligi ma'nosida) yoki biri ikkinchisidan kichikligini aniqlash mumkin. Bu 
teng bo'lmagan elementlarning tartibiga olib keladi.
Algoritmlar
● adjacent_find  - Teng yoki belgilangan shartni qondiradigan ikkita qo'shni 
elementni topadi.
● all_of  - Agar shart belgilangan diapazondagi har bir element tomonidan 
qondirilsa, rost qaytaradi.
● any_of  - Belgilangan elementlar oralig'ida shart kamida bir marta to'g'ri 
bo'lsa, true qiymatini qaytaradi
● binary_search  - Saralangan diapazonda ikkilik predikat tomonidan 
belgilangan ma'noda ko'rsatilgan qiymatga teng yoki ekvivalent element 
mavjudligini tekshiradi
10 ● copy  -  Elementlarning qiymatlarini manba diapazonidan maqsad 
diapazonga belgilaydi, elementlarning manba ketma-ketligi bo'yicha 
takrorlanadi va ularga oldinga yo'nalishda yangi pozitsiyalarni tayinlaydi
● copy_backward -   Elementlarning qiymatlarini manba diapazonidan 
maqsad diapazonga belgilaydi, elementlarning asl ketma-ketligini 
takrorlaydi va ularga teskari yo'nalishda yangi pozitsiyalarni belgilaydi
● equal  - Ikki diapazonni element jihatidan yoki ikkilik predikat tomonidan 
belgilangan ma'noda tenglik yoki ekvivalentlik uchun solishtiradi
● equal_range -   tartiblangan diapazondagi juft pozitsiyalarni topadi; ularning
birinchisi ko'rsatilgan elementning pozitsiyasidan kichik yoki unga teng, 
ikkinchisi esa elementning pozitsiyasidan kattaroqdir, bunda ketma-
ketlikdagi pozitsiyalarni o'rnatish uchun ishlatiladigan ekvivalentlik yoki 
tartibning mohiyati ikkilik predikat bilan belgilanishi mumkin.
● find_first_of -  Belgilangan diapazondagi bir nechta qiymatlardan har 
qandayining birinchi paydo bo'lishini yoki belgilangan elementlar to'plamida
ikkilik predikat tomonidan ko'rsatilgan ma'noda ekvivalent bo'lgan bir 
nechta elementlarning birinchi paydo bo'lishini topadi.
● search  -  qidiruv Elementlari belgilangan elementlar ketma-ketligida 
ko rsatilganlarga teng yoki ikkilik predikat tomonidan belgilangan ma noda ʻ ʼ
ko rsatilgan ketma-ketlikdagi elementlarga ekvivalent bo lgan ketma-
ʻ ʻ
ketlikni maqsadli diapazonda birinchi marta izlaydi.
● transform -  Berilgan funktsiya ob'ektini manba diapazonidagi har bir 
elementga yoki ikkita manba diapazonidagi bir juft elementlarga qo'llaydi va
funktsiya ob'ektining qaytish qiymatlarini maqsad diapazoniga ko'chiradi.
● swap  -   Elementlarning qiymatlarini ikki turdagi ob'ektlar o'rtasida 
almashtirib, birinchi ob'ektning mazmunini ikkinchi obyektga va 
ikkinchisining mazmunini birinchisiga tayinlaydi
● stable_partition  - Diapazon elementlarini ikkita ajratilgan to‘plamga 
ajratadi, teng elementlarning nisbiy tartibini saqlab, unar predikatni 
qanoatlantirmaydigan elementlardan oldin qo‘yadi.
● stable_sort  - Belgilangan diapazondagi elementlarni kamayib ketmaydigan 
tartibda yoki ikkilik predikat tomonidan belgilangan tartib mezoniga ko'ra 
tartiblaydi va teng elementlarning nisbiy tartibini saqlaydi.
● upper_bound  Belgilangan qiymatdan kattaroq qiymatga ega bo'lgan 
tartiblangan diapazondagi birinchi elementning o'rnini topadi, bunda 
tartiblash mezoni ikkilik predikat bilan belgilanishi mumkin
11 Vektor (std::vector) va string (std::string) C++ standart kutubxonasining muhim 
asosiy konteynerlari hisoblanadi. Ular o'z elementlarini qo'shni xotira bo'lagida 
saqlaydilar. Ushbu konteynerlarning ikkalasi ham elementlarga indeks bo'yicha 
kirishni ta'minlaydi va yangi elementlarni oxiriga samarali qo'shish imkonini 
beradi.                                                                                                             
Konteyner std::vector                                                                                            C+
+ standart kutubxonasida vektor (std::vector) dinamik massiv bo'lib, yangi 
elementlarni tezda oxiriga qo'shish imkonini beradi va kerak bo'lganda uning 
hajmini o'zgartiradi. Vektor xotira oqishining yo'qligini kafolatlaydi (biz bu haqda 
boshqa paragraflarda gaplashamiz, hozircha buni yaxshi narsa deb hisoblang). 
Vektor bilan ishlash uchun sarlavha fayl vektorini kiritish kerak. Vektorning 
elementlari bir xil turdagi bo'lishi kerak va bu tip dastur tuzilganda ma'lum bo'lishi 
kerak. U burchakli qavs ichida std::vector: dan keyin ko'rsatiladi, masalan, 
std::vector<int> ints vektori, std::vector<std::string> esa satrlar vektori.         
Keling, vektorni elementlar bilan to'ldiradigan va ularni bo'sh joy bilan ajratadigan 
dastur misolini ko'rib chiqamiz:
# include   <iostream>
# include   <vector>
int   main () {
   std::vector< int > data = { 1 ,  2 ,  3 ,  4 ,  5 };
    for  ( int  elem : data) {
       std::cout << elem <<  " " ;
   }
   std::cout <<  "\n" ;
}
12 Bu erda biz vektorni initsializatsiya ro'yxati orqali ishga tushiramiz, unda 
elementlar vergul bilan ajratilgan. Vektorni ishga tushirishning yana bir usuli - 
elementlar sonini va (agar kerak bo'lsa) element naqshini ko'rsatish:
# include   <string>
# include   <vector>
int   main () {
   std::vector<std::string> v1;   // пустой вектор строк
   std::vector<std::string>  v2 ( 5 );   // вектор из пяти пустых строк
   std::vector<std::string>  v3 ( 5 ,  "hello" );   // вектор из пяти строк 
"hello"
}
Elementlarga kirish                                                                                           
Yuqorida vektor elementlarini chop etish uchun range-for siklidan foydalandik. 
Ammo ba'zida indekslar bilan ishlash qulayroqdir. Vektor elementlarni xotirada 
ketma-ket saqlaydi, shuning uchun element indeksidan foydalanib, uning 
xotiradagi o'rnini tezda topishingiz mumkin. Indekslash noldan boshlanadi:
std::vector<int> data = {1, 2, 3, 4, 5};
int  a = data[ 0 ];   // начальный элемент вектора
int  b = data[ 4 ];   // последний элемент вектора (в нём пять элементов)
data[ 2 ] =  -3 ;   // меняем элемент 3 на -3
Vektordagi elementlarning umumiy sonini bilish uchun siz size funktsiyasidan 
foydalanishingiz mumkin:
std::cout << data. size () <<  "\n" ;
13 Ba'zi boshqa dasturlash tillarida bo'lgani kabi salbiy indekslarga ham ruxsat 
berilmaydi.
 E'tibor bering: kvadrat qavslar orqali indeksga kirsak, uning to'g'riligini tekshirib 
bo'lmaydi. Bu "biz foydalanmayotgan narsamiz uchun pul to'lamasligimiz kerak" 
tamoyilining yana bir ko'rinishi.
 O'rnatilgan validatorlar dasturni sekinlashtiradi: dasturchi to'g'ri kod yozadi va 
ma'lumotlar[i] ifodasidagi i indeksi manfiy emasligiga ishonch hosil qiladi va i 
<data.size() shartini qondiradi deb taxmin qilinadi. Bunday holda, u ularga kerak 
emas. 
Agar siz hali ham noto'g'ri indeks yordamida vektorga kirsangiz, dastur ish vaqtida
aniqlanmagan xatti-harakatlarga tushib qoladi: aslida u vektorga tegishli bo'lmagan
xotirani o'qishga harakat qiladi.
Agar siz ko'p keraksiz tekshiruvlar qilishni xohlamasangiz va indeksning 
to'g'riligiga ishonchingiz komil bo'lmasa, at funktsiyasidan foydalanishingiz 
mumkin:
std::vector< int > data = { 1 ,  2 ,  3 ,  4 ,  5 };
std::cout << data[ 42 ] <<  "\n" ;   // неопределённое поведение: может 
произойти всё что угодно
std::cout << data. at ( 0 ) <<  "\n" ;   // напечатается 1
std::cout << data. at ( 42 ) <<  "\n" ;   // произойдёт исключение std::out_of_range 
— его можно будет перехватить и обработать
14 Indekslardan foydalanmasdan uning  front  va  back  elementini qaytaradigan 
vektorning old va orqa funktsiyalarini ko'rib chiqing:
std::vector< int > data = { 1 ,  2 ,  3 ,  4 ,  5 };
std::cout << data. front () <<  "\n" ;   // то же, что data[0]
std::cout << data. back () <<  "\n" ;   // то же, что data[data.size() - 1]
Shuni ta'kidlash kerakki, bu funktsiyalarni bo'sh vektorda chaqirish aniqlanmagan 
xatti-harakatlarga olib keladi. Vektor bo'sh yoki yo'qligini tekshirish uchun 
data.size() == 0 ni solishtirish o'rniga mantiqiy qiymatni qaytaruvchi bo'sh 
funksiyadan foydalanish odatiy holdir:
if  (!data.empty()) {
  // вектор не пуст, с ним можно работать
}
Indekslar orqali takrorlang                                                                              
Shunday bo'ladiki, standart kutubxonada indekslar va konteyner o'lchamlari 
imzosiz turdagi bo'ladi. Unsigned int yoki unsigned long int o'rniga an'anaviy 
size_t taxallus (aniqrog'i, std::vector<T>::size_type) ishlatiladi. Size_t turi aslida 
platforma bit chuqurligiga qarab uint32_t yoki uint64_t bilan bir xil. Uning 
dasturda qo'llanilishi biz indekslar yoki o'lchamlar bilan shug'ullanayotganimizni 
yanada ta'kidlaydi.                                                                                            
Indekslar yordamida ma'lumotlar elementlarini takrorlash quyidagicha yozilishi 
mumkin:
for  ( size_t  i =  0 ; i != data. size (); ++i) {
   std::cout << data[i] <<  " " ;
}
15 Elementlarni qo'shish va olib tashlash                                                              
Vektorda siz elementlarni oxiriga samarali qo'shishingiz va ularni oxiridan olib 
tashlashingiz mumkin. Buning uchun  push_back  va  pop_back  funksiyalari 
mavjud. Klaviaturadan raqamlarni vektorga o'qiydigan va oxirida barcha nollarni 
olib tashlaydigan dasturni ko'rib chiqing:                                                    
Vektorning boshqa qismlariga elementlarni qo'shish yoki olib tashlash samarasiz, 
chunki u qo'shni elementlarni almashtirishni talab qiladi. Shuning uchun vektor 
alohida funktsiyalarga ega emas, masalan, elementlarni boshidan qo'shish yoki olib
tashlash. 
# include   <iostream>
# include   <vector>
int   main () {
    int  x;
   std::vector< int > data;
    while  (std::cin >> x) {   // читаем числа, пока не закончится ввод
       data. push_back (x);   // добавляем очередное число в вектор
   }
    while  (!data. empty () && data. back () ==  0 ) {
        // Пока вектор не пуст и последний элемент равен нулю
       data. pop_back ();   // удаляем этот нулевой элемент
   }
}
16 Buni umumiy  insert / erase  funksiyalari va iteratorlar yordamida amalga oshirish 
mumkin. Bunday misollarni keyinroq ko'rib chiqamiz.  Clear  funksiyasidan 
foydalanib vektordan barcha elementlarni olib tashlashingiz mumkin.
Xotira zaxirasi                                                                                                      
Vektor elementlarni doimiy ketma-ketlikda, birin-ketin xotirada saqlaydi. Bu yangi
elementlarni tezda qo'shish uchun ketma-ketlikning oxirida qo'shimcha joyni 
saqlab qoladi. Ushbu zaxira tugagach, keyingi element kiritilganda, qayta 
taqsimlash sodir bo'ladi: vektor elementlari yangi, kengroq xotira blokiga 
ko'chiriladi.                                                                                                             
Qayta taqsimlash juda qimmat protsedura, ammo agar u kamdan-kam hollarda 
sodir bo'lsa, uning ta'siri ahamiyatsiz. Agar yangi blokning o'lchami oldingi 
o'lchamdan ikki baravar ko'p tanlansa, elementni qo'shishning amortizatsiya 
murakkabligi doimiy bo'lishini isbotlash mumkin.
Elementlar vektorga ketma-ket qo'shiladigan va har bir qadamdan keyin o'lcham va
zaxira chop etiladigan dasturni ko'rib chiqing:
# include   <iostream>
# include   <vector>
int   main () {
   std::vector< int > data = { 1 ,  2 };
   std::cout << data. size () <<  "\t"  << data. capacity () <<  "\n" ;
   data. push_back ( 3 );
   std::cout << data. size () <<  "\t"  << data. capacity () <<  "\n" ;
17    data. push_back ( 4 );
   std::cout << data. size () <<  "\t"  << data. capacity () <<  "\n" ;
   data. push_back ( 5 );
   std::cout << data. size () <<  "\t"  << data. capacity () <<  "\n" ;
}
Mana ushbu dasturning chiqishi:
2       2                                                                                                                         
3       4                                                                                                                          
4       4                                                                                                                          
5       8 
Ko'rinib turibdiki, vektor o'lchami bir marta, zahira esa charchagandan keyin ikki 
barobar ortadi. Shunday qilib, to'rtlikni qo'shganda, zaxiradagi mavjud xotiradan 
foydalaniladi va uch va beshni qo'shganda, qayta taqsimlash sodir bo'ladi.
18 Ba'zan siz vektorni elementlar bilan to'ldirishingiz kerak va elementlarning soni 
oldindan ma'lum. Bunday holda, zaxira funksiyasidan foydalanib, kerakli xotira 
hajmini darhol zahiraga olishingiz mumkin, shunda elementlarni qo'shganda, qayta
taqsimlash sodir bo'lmaydi. 
Internet saytlari lotin yozuvini kirill yozuviga o‘tkazishda juda foydali vosita 
hisoblanadi. Bu saytlar tez va oson tarzda matnni bir yozuvdan llllikkinchisiga 
o‘girish imkonini beradi. Quyida shu kabi xizmatlarni taqdim etadigan mashhur 
internet saytlar va ularning qanday ishlashi haqida ma’lumot berib o‘taman.
 1. Translit.cc
Translit.cc  sayti lotin va kirill yozuvlari o‘rtasida matnni o‘girish uchun keng 
foydalaniladigan xizmatlardan biridir. Bu saytdan foydalanish juda oson va qulay. 
Quyida uning qanday ishlashini ko‘rib chiqamiz
:
19 Ishlash tartibi:
1. Matnni kiritish:  Foydalanuvchi saytga kirib, o‘girmoqchi bo‘lgan matnni 
maxsus maydonga kiritadi.
2. Tilni tanlash:  Tillar va yozuv tizimlari o‘rtasidagi o‘girishni tanlash imkoniyati 
mavjud. Lotindan kirillga va kirildan lotinga o‘girish mumkin.
3. O‘girish:  "Конвертировать" tugmasini bosish orqali matn lotin yozuvidan kirill
yozuviga o‘tkaziladi.
4. Natijani ko‘rish:  O‘girilgan matn ekranda namoyon bo‘ladi va uni ko‘chirib 
olish mumkin.
 2. LingvoSoft Online Translator
LingvoSoft  sayti ham turli tillardagi yozuvlarni o‘girish uchun qulay vositadir. Bu 
sayt o‘zining yuqori aniqlikdagi tarjimalari bilan mashhur.
Ishlash tartibi:
1. Matnni kiritish:  Foydalanuvchi matnni saytdagi maxsus maydonga kiritadi.
2. O‘girish tugmasini bosish:  Kiritilgan matnni o‘girish uchun "Tarjima qilish" 
tugmasini bosish kifoya.
3. Natijani ko‘rish:  O‘girilgan matn ekranda namoyon bo‘ladi va uni ko‘chirib 
olish yoki sahifaga o‘tkazish mumkin.
 3. Google Translate
Google Translate  ham lotin va kirill yozuvlari o‘rtasidagi o‘girishda foydali 
vositadir. Bu sayt keng imkoniyatlarga ega va turli tillarni ham qo‘llab-
quvvatlaydi.
20 Ishlash tartibi:
1. Matnni kiritish:  Foydalanuvchi saytdagi matn maydoniga o‘girmoqchi bo‘lgan 
matnni kiritadi.
2. Tillarni tanlash:  Til va yozuv tizimlarini tanlash imkoniyati mavjud. Masalan, 
o‘zbek tili uchun lotin va kirill yozuvlari o‘rtasida o‘girish mumkin.
3. Tarjima qilish:  "Tarjima qilish" tugmasini bosish orqali matn o‘giriladi.
4. Natijani ko‘rish:  O‘girilgan matn ekranda namoyon bo‘ladi va uni ko‘chirib 
olish mumkin.
 4. Uzbek Cyrillic to Latin Converter
Uzbek Cyrillic to Latin Converter  sayti maxsus o‘zbek tili uchun yaratilgan 
bo‘lib, kirill yozuvini lotin yozuviga o‘tkazishda foydali vositadir.
21 Ishlash tartibi:
1. Matnni kiritish:  Foydalanuvchi kirill yozuvidagi matnni saytdagi matn 
maydoniga kiritadi.
2. O‘girish:  "Конвертировать" tugmasini bosish orqali matn lotin yozuviga 
o‘tkaziladi.
3. Natijani ko‘rish:  O‘girilgan matn ekranda namoyon bo‘ladi va uni ko‘chirib 
olish mumkin.
Qanday ishlaydi?
Bu saytlar, odatda, kiritilgan matnni maxsus algoritmlar orqali o‘girishni amalga 
oshiradi. Algoritmlar matnni belgilarga bo‘lib chiqadi va har bir belgini yoki 
belgilar guruhini mos keladigan lotin yozuviga o‘tkazadi. Ushbu jarayonda har bir 
xarf yoki xarflar ketma-ketligi uchun maxsus qoidalar va o‘girish jadvallari 
qo‘llaniladi.
Lotin yozuvidan kirill yozuviga o‘tkazish yoki aksincha kirill yozuvidan lotin 
yozuviga o‘tkazish uchun turli internet saytlari mavjud. Ushbu saytlar 
foydalanuvchilarga tez va oson tarzda matnlarni o‘girish imkonini beradi, 
shuningdek, ular ta’lim, texnologiyalar, xalqaro hamkorlik va madaniy merosni 
saqlash kabi sohalarda katta ahamiyatga ega
22 Lotin yozuvi haqida qiziqarli faktlar
1. Alifbo:  Lotin - Rim yozuvida ishlatiladigan alifbo. U 23 ta harfdan iborat. J, U 
va W harflari lotinda topilmaydi. 
2. Kelib chiqishi:  Lotin alifbosi etrusk alifbosidan miloddan avvalgi 600-
yillargacha ishlab chiqilgan. Ko pgina Yevropa tillari uchun standart alifboga ʻ
aylanishdan oldin u etrusk, yunon va finikiya alifbolaridan o tgan. 	
ʻ
3. Zamonaviy o zgarishlar:	
ʻ  Bugungi kunda ko plab tillar lotin alifbosidan 	ʻ
foydalanadi. Masalan, ingliz alifbosi 26 ta, fin alifbosi esa 21 ta harfdan iborat. 
Biroq, u qadimgi Rimda ishlatilgan 23 ta harfga asoslangan.
23 4.. Ilmiy sohalarda qo‘llanilishi:
Lotin alifbosi ko‘pincha ilmiy atama va nomlarda qo‘llaniladi. Masalan, tibbiyot, 
biologiya va astronomiya fanlarida ko‘plab atama va nomlar lotin tilida yozilgan.
5. O’lik til:  Bugungi kunda lotin tili “o‘lik til” hisoblanadi, ya’ni u kundalik 
hayotda foydalanilmaydi.
Kirill yozuvi haqida faktlar
1. Tarixi:  Kirill alifbosi 9-asrda Sloveniya va Makedoniya hududlarida yashagan 
Kirill va Mefodiy tomonidan yaratilgan. Ular islomdan oldingi slavyan qavmlari 
uchun yozuv tizimini ishlab chiqqan.
2. Glagolitsa:  Kirill va Mefodiy tomonidan yaratilgan dastlabki yozuv tizimi 
"glagolitsa" deb atalgan. Bu yozuv tizimi keyinchalik kirill alifbosining asosi 
bo‘lgan.
3. Rus tili:  Kirill alifbosi ko‘p yillar davomida rus tilining asosiy yozuv tizimi 
bo‘lib kelgan. U 1918 yilda amalga oshirilgan islohotlardan so‘ng o‘zgarishga 
uchragan.
4. O‘zbek tilida qo‘llanilishi:  Kirill alifbosi O‘zbekistonda 1940 yildan 1993 
yilgacha asosiy yozuv tizimi sifatida qo‘llangan. Keyinchalik lotin alifbosiga o‘tish
boshlangan.
5. O‘zgartirishlar:  Kirill alifbosida vaqt davomida turli o‘zgartirishlar qilingan. 
Masalan, o‘tgan asrlarda ayrim harflar qo‘shilgan yoki chiqarilgan.
6. Xalqaro qo‘llanilishi:  Kirill alifbosi ko‘plab mamlakatlarda qo‘llaniladi. 
Bugungi kunda Rossiya, Belarus, Qozog‘iston, Qirg‘iziston va boshqa bir qator 
davlatlarda rasmiy yozuv tizimi hisoblanadi.
24 7. Tarkibi:  Kirill alifbosida har xil tillarda harflar soni turlicha bo‘ladi. Masalan, 
rus tilida 33 ta harf bor.
8. Tartiblari:  Kirill alifbosida harflar tartibi va ularning yozilishi har xil tillarda 
turlicha bo‘lishi mumkin. Bu yozuv tizimining turli tillarga moslashuvchanligini 
ko‘rsatadi.
9. Yozuv turlari:  Kirill alifbosi bilan turli yozuv turlari mavjud. Masalan, ustav 
yozuvi, poluustav yozuvi va qo‘l yozuvi kabi turlari bor. Ustav yozuvi rasmiy 
hujjatlar uchun, qo‘l yozuvi esa kundalik yozish uchun qo‘llaniladi.
10. Kompyuterdagi qo‘llanilishi:  Kompyuter va mobil qurilmalarda kirill 
alifbosidan foydalanish uchun turli kodirovka tizimlari mavjud. Masalan, UTF-8 
va CP1251 kodirovka tizimlari kirill alifbosini qo‘llab-quvvatlaydi.
Xulosa
Lotin yozuvidan kirill yozuviga o‘tkazishning ahamiyati va zaruriyati, shuningdek,
bu jarayonni amalga oshirishda qo‘llaniladigan internet saytlar haqida to‘liq 
ma’lumot berildi. 
1. Ahamiyati:  Lotin va kirill yozuvlari o‘rtasidagi o‘girish ta’lim, texnologiya, 
xalqaro hamkorlik va madaniy merosni saqlash sohalarida muhimdir. Ushbu 
jarayon yordamida o‘quvchilarga yozuvni tushunish osonlashadi, internetdagi 
axborotlarni keng tarqatish mumkin bo‘ladi, xalqaro aloqalar soddalashadi va 
madaniy merosimiz zamonaviy yozuvda saqlanadi.
25 2. Internet saytlari: Translit.cc, LingvoSoft, Google Translate, Uzbek Cyrillic 
to Latin Converter  kabi internet saytlari lotin va kirill yozuvlari o‘rtasidagi 
o‘girish jarayonini amalga oshirishda keng foydalaniladi. Bu saytlar turli yozuv 
tizimlari o‘rtasida oson va tez o‘girish imkoniyatini beradi.
3. Algoritmlar:  Ushbu saytlar kiritilgan matnni maxsus algoritmlar orqali 
o‘girishni amalga oshiradi. Algoritmlar har bir belgini yoki belgilar guruhini mos 
keladigan yozuvga o‘tkazadi.
Lotin va kirill yozuvlari o‘rtasidagi o‘girish zamonaviy axborot texnologiyalari va 
ta’lim tizimida katta ahamiyatga ega. Bu jarayonni amalga oshirish uchun internet 
saytlarining qulay imkoniyatlari mavjud. Ushbu saytlar yordamida o‘quvchilar, 
tadqiqotchilar va oddiy foydalanuvchilar matnlarni tez va oson tarzda o‘girishlari 
mumkin. Bunda ular ta’lim jarayonini yaxshilash, axborotlarni tarqatish va 
madaniy merosni saqlashga hissa qo‘shadilar.
Foydalanilgan adabiyotlar
Elektron ta’lim resurslari
1. https://ru.m.wikipedi.org
2. https://lotin.uz
3. https://uzlatin.com
4. https://translit.cc   
5. https://facebook.com   
6. https://www.britannica.com/topic/Latin-language   
7. https://en.m.wikipedia.org/wiki/Latin   
26 8. https://www.polilingua.com/blog/post/history-of-latin-language-impact-on-   
modern-languages.htm
9. https://www.britannica.com/topic/Cyrillic-alphabet   
10. https://study.com/academy/lesson/cyrillic-alphabet-letters-languages-   
script.html
11. https://en.m.wikipedia.org/wiki/Cyrillic_alphabets#:~:text=The%20early   
%20Cyrillic%20alphabet%20was,Slavic%20languages%20influenced
%20by%20Russian
27

O‘ZBEKISTON RESBUPLIKASI OLIY TA'LIM FAN VA INNOVATSIYALAR VAZIRLIGI SHAROF RASHIDOV NOMIDAGI SAMARQAND DAVLAT UNIVERSITETI INTELLEKTUAL TIZIMLAR VA KOMPYUTER TEXNOLOGIYALARI FAKULTETI Dasturiy Injiniring yo‘nalishi ______________________ fanidan KURS ISHI MAVZU: Manni lotindan krilga o’tkazib beruvchi dasturni ishlab chiqish . Bajardi: ___ -bosqich “_______________” guruhi talabasi Rahbar: _______________________________ (F. I. O.) Reja:

I. Kirish II. Asosiy qism 2.1 C++ tilida dasturni tuzish va uning bosqichlari 2.2 Dasturni ishlatib ko’rish va xatolar ustida ishlash 2.3 Dasturni takomillashtirish, qo’shimcha imkoniyatlar qo’shish 2.4 Mavjud saytlar haqida ma’lumot III. Xulosa IV. Foydalanilgan adabiyotlar Kirish 1

Lotin yozuvidan kirill yozuviga o‘tkazish dasturi turli sabablarga ko‘ra zarur bo‘lishi mumkin. Bu dastur ayniqsa lingvistik va madaniy manbalarni saqlash, o‘qitish, tadqiqot va hujjatlashtirish kabi sohalarda juda muhimdir. Quyida bu dasturning foydalanish sohalari va afzalliklari haqida batafsil ma’lumot beraman. Texnologik Integratsiya Zamonaviy texnologiyalar, masalan, veb-saytlar, mobil ilovalar va kompyuter dasturlari, ko‘p hollarda lotin yozuvidan foydalanadi. Lotin yozuvidan kirill yozuviga o‘tkazish dasturi orqali, bu texnologiyalarni kirill yozuviga moslashtirish mumkin. Bu, o‘z navbatida, internetdagi kontentni kirill yozuvidagi foydalanuvchilar uchun ham oson va tushunarli qiladi. Axborot Texnologiyalari va Media Axborot texnologiyalari va media sohasida, kontentni turli yozuv tizimlarida taqdim qilish zarur bo‘lishi mumkin. Lotin yozuvidan kirill yozuviga o‘tkazish dasturi orqali, turli tillardagi veb-saytlar, bloglar, ijtimoiy tarmoqlar va axborot resurslari uchun kontent yaratish va taqdim etish mumkin. Bu esa, o‘z navbatida, auditoriyaning kengayishiga va ma’lumotlarning keng tarqalishiga yordam beradi. 2

C++ tilida ham lotin yozuvini kirill yozuviga o‘giruvchi dasturni yaratish mumkin. Quyidagi bosqichlar bo‘yicha dasturni yaratishni ko‘rib chiqamiz. Dasturni yaratish uchun kerakli vositalar 1. Kompilyator: C++ kodni kompilyatsiya qilish uchun kompilyator (GCC, Clang, Visual Studio) kerak bo‘ladi. 2. Tekst muharriri: Kod yozish uchun tekst muharriri (Visual Studio Code, CLion, Notepad++). Dasturni yaratish bosqichlari 1. Boshlash: - Yangi papka yaratib, unga dastur faylini saqlang. Masalan, converter.cpp. 2. Latindan Kirillga o‘girish qoidalarini tayyorlash: - Har bir harf va harf birikmalarining o‘girish qoidalarini sozlash. - Masalan, а -> a, б -> b, ш -> sh va h.k. 3. Kod yozish: #include <iostream> #include <unordered_map> #include <string> #include <vector> #include <algorithm> using namespace std; 3

unordered_map<string, string> rules = { {"a", " а "}, {"b", " б "}, {"v", " в "}, {"g", " г "}, {"d", " д "}, {"e", " е "}, {"yo", " ё "}, {"j", " ж "}, {"z", " з "}, {"i", " и "}, {"y", " й "}, {"k", " к "}, {"l", " л "}, {"m", " м "}, {"n", " н "}, {"o", " о "}, {"p", " п "}, {"r", " р "}, {"s", " с "}, {"t", " т "}, {"u", " у "}, {"f", " ф "}, {"x", " х "}, {"ch", " ч "}, {"sh", " ш "}, {"ya", " я "}, {"yu", " ю "}, {"q", " қ "}, {"h", " ҳ "}, {"ng", " нг "}, {"g'", " ғ "}, {"o'", " ў "}, // Corrected to use single quotes }; string latin_to_cyrillic(const string& text) { string result; size_t i = 0; vector<pair<string, string>> sorted_rules(rules.begin(), rules.end()); sort(sorted_rules.begin(), sorted_rules.end(), [](const pair<string, string>& a, const pair<string, string>& b) { return a.first.size() > b.first.size(); }); while (i < text.size()) { bool matched = false; for (const auto& rule : sorted_rules) { if (text.substr(i, rule.first.size()) == rule.first) { result += rule.second; i += rule.first.size(); matched = true; break; } } if (!matched) { 4