# 4.1. Belgilar (Chars)

Shu paytgacha biz ko'rib chiqqan asosiy ma'lumotlar turlari raqamlarni (butun sonlar va suzuvchi nuqta) yoki haqiqiy/noto'g'ri qiymatlarni (booleanlar) ushlab turish uchun ishlatilgan. Ammo, agar biz harflarni saqlamoqchi bo'lsak?

```cpp
#include <iostream>
 
int main()
{
    std::cout << "Til o'rganishni xohlaysizmi? (y/n)";
 
    // Biz foydalanuvchiga "y" yoki "n" belgilarini 
    // kiritishni xohlaymiz
    // Buni qanday qilamiz?
 
    return 0;
}
```

Char ma'lumotlarining turi belgini ushlab turish uchun mo'ljallangan. Belgilar bitta harf, raqam, belgi yoki bo'sh joy bo'lishi mumkin.

Char ma'lumotlarining turi ajralmas tipdir, ya'ni asosiy qiymat butun son sifatida saqlanadi. Mantiqiy 0 qiymati noto'g'ri va nol bo'lmagan haqiqiy deb talqin qilinganidek, char o'zgaruvchisi saqlagan butun son ASCII belgisi sifatida tushuniladi.

**ASCII** ma'lumot almashish uchun Amerika standart kodini anglatadi va u inglizcha belgilarni (bir nechta boshqa belgilarni) 0 dan 127 gacha bo'lgan raqamlar (ASCII kodi yoki kod nuqtasi deb ataladi) bilan ifodalashning o'ziga xos usulini belgilaydi. Masalan, ASCII kodi 97 "a" belgisi sifatida talqin qilinadi.

Belgilar har doim bitta tirnoq orasiga joylashtiriladi (masalan, 'g', '1', '').

## ASCII jadvali

| Code | Symbol                          | Code | Symbol  | Code | Symbol | Code | Symbol       |
| ---- | ------------------------------- | ---- | ------- | ---- | ------ | ---- | ------------ |
| 0    | NUL (null)                      | 32   | (space) | 64   | @      | 96   | \`           |
| 1    | SOH (start of header)           | 33   | !       | 65   | A      | 97   | a            |
| 2    | STX (start of text)             | 34   | ”       | 66   | B      | 98   | b            |
| 3    | ETX (end of text)               | 35   | #       | 67   | C      | 99   | c            |
| 4    | EOT (end of transmission)       | 36   | $       | 68   | D      | 100  | d            |
| 5    | ENQ (enquiry)                   | 37   | %       | 69   | E      | 101  | e            |
| 6    | ACK (acknowledge)               | 38   | &       | 70   | F      | 102  | f            |
| 7    | BEL (bell)                      | 39   | ’       | 71   | G      | 103  | g            |
| 8    | BS (backspace)                  | 40   | (       | 72   | H      | 104  | h            |
| 9    | HT (horizontal tab)             | 41   | )       | 73   | I      | 105  | i            |
| 10   | LF (line feed/new line)         | 42   | \*      | 74   | J      | 106  | j            |
| 11   | VT (vertical tab)               | 43   | +       | 75   | K      | 107  | k            |
| 12   | FF (form feed / new page)       | 44   | ,       | 76   | L      | 108  | l            |
| 13   | CR (carriage return)            | 45   | -       | 77   | M      | 109  | m            |
| 14   | SO (shift out)                  | 46   | .       | 78   | N      | 110  | n            |
| 15   | SI (shift in)                   | 47   | /       | 79   | O      | 111  | o            |
| 16   | DLE (data link escape)          | 48   | 0       | 80   | P      | 112  | p            |
| 17   | DC1 (data control 1)            | 49   | 1       | 81   | Q      | 113  | q            |
| 18   | DC2 (data control 2)            | 50   | 2       | 82   | R      | 114  | r            |
| 19   | DC3 (data control 3)            | 51   | 3       | 83   | S      | 115  | s            |
| 20   | DC4 (data control 4)            | 52   | 4       | 84   | T      | 116  | t            |
| 21   | NAK (negative acknowledge)      | 53   | 5       | 85   | U      | 117  | u            |
| 22   | SYN (synchronous idle)          | 54   | 6       | 86   | V      | 118  | v            |
| 23   | ETB (end of transmission block) | 55   | 7       | 87   | W      | 119  | w            |
| 24   | CAN (cancel)                    | 56   | 8       | 88   | X      | 120  | x            |
| 25   | EM (end of medium)              | 57   | 9       | 89   | Y      | 121  | y            |
| 26   | SUB (substitute)                | 58   | :       | 90   | Z      | 122  | z            |
| 27   | ESC (escape)                    | 59   | ;       | 91   | \[     | 123  | {            |
| 28   | FS (file separator)             | 60   | <       | 92   | \\     | 124  | \|           |
| 29   | GS (group separator)            | 61   | =       | 93   | ]      | 125  | }            |
| 30   | RS (record separator)           | 62   | >       | 94   | ^      | 126  | \~           |
| 31   | US (unit separator)             | 63   | ?       | 95   | \_     | 127  | DEL (delete) |

0-31 kodlari chop etilmaydigan belgilar deb ataladi va ular asosan printerlarni formatlash va boshqarish uchun ishlatiladi. Ularning aksariyati hozir eskirgan.

32-127 kodlari bosma belgilar deb ataladi va ular ko'pchilik kompyuterlar ingliz tilidagi asosiy matnni ko'rsatish uchun foydalanadigan harflar, raqamli belgilar va tinish belgilarini ifodalaydi.

### Belgilarni boshlang'ich qiymatini berish

Char o'zgaruvchilarini belgi harflari yordamida boshlashingiz mumkin:

```cpp
char ch2{ 'a' }; 
```

Siz belgilarni butun sonlar bilan boshlashingiz mumkin, lekin iloji bo'lsa, bunga yo'l qo'ymaslik kerak

```cpp
char ch1{ 97 }; 
```

{% hint style="danger" %}
Belgilar sonini butun sonlar bilan aralashtirib yubormaslik uchun ehtiyot bo'ling. Quyidagi ikkita boshlanish bir xil emas:

* **char ch {5};**     // tamsayı 5 bilan boshlang (butun son sifatida saqlanadi).
* **char ch {'5'};**    // "5" uchun kod nuqtasi bilan boshlang (butun son sifatida saqlanadi)

Belgilar raqamlari biz raqamlarni matematik operatsiyalarni qo'llash uchun emas, balki matn sifatida ko'rsatishni xohlaganimizda foydalanish uchun mo'ljallangan.
{% endhint %}

### Choralarni bosib chiqarish

Charni chop etish uchun std :: cout dan foydalanilganda, std :: cout char o'zgaruvchisini ASCII belgisi sifatida chiqaradi:

```cpp
#include <iostream>
 
int main()
{
    char ch1{ 'a' };   // (afzal qilingan)
    std::cout << ch1;  // cout belgini bosib chiqaradi
 
    char ch2{ 98 };   // "b" uchun kod nuqtasi (afzal emas)
    std::cout << ch2; // cout belgini bosib chiqaradi ('b')
 
 
    return 0;
}
```

**Natija**:

```cpp
ab
```

Shuningdek, biz char harflarini to'g'ridan - to'g'ri chiqarishimiz mumkin:

```cpp
cout << 'c';
```

Bu natijani beradi:

```cpp
c
```

{% hint style="warning" %}
Belgilangan kenglikdagi **int8\_t** odatda C ++ da imzolangan belgi bilan bir xil bo'ladi, shuning uchun u odatda tamsayı o'rniga char sifatida chop etiladi.
{% endhint %}

### Belgilarni sonlar sifatida chop etish

Agar biz belgini belgi o'rniga raqam sifatida chiqarishni istasak, std :: coutga charni butun son kabi chop etishini aytishimiz kerak. Buning bitta (yomon) usuli - charni butun songa belgilash va butun sonni chop etish:

```cpp
#include <iostream>
 
int main()
{
    char ch { 97 } ;
    int i { ch };           // ch qiymati bilan butun sonni boshlang
    std::cout << i << '\n'; // qiymatini chop eting
    return 0;
}
```

Eng yaxshi usul - bu *type cast*. Turi boshqa turdagi qiymatdan bitta turdagi qiymat hosil qiladi. Ma'lumotlarning asosiy turlarini (masalan, char dan int ga yoki aksincha) aylantirish uchun biz statik translyatsiya deb nomlangan turdan foydalanamiz.

{% hint style="info" %}
**Asosiy tushuncha**\
Qachonki siz burchakli qavslardan foydalanadigan C ++ sintaksisini (oldingi protsessordan tashqari) ko'rsangiz, burchakli qavslar orasidagi narsa katta ehtimol bilan turga aylanadi. Odatda C ++ parametrlanadigan turga muhtoj bo'lgan tushunchalar bilan shug'ullanadi.
{% endhint %}

Bu erda biz char qiymatidan butun sonni yaratish uchun **static\_cast** -dan foydalanaman:

```cpp
#include <iostream>
 
int main()
{
    char ch{ 'a' };
    std::cout << ch << '\n';
    std::cout << static_cast<int>(ch) << '\n';
    std::cout << ch << '\n';
    return 0;
}
```

**Natija**:

```cpp
a
97
a
```

### Belgilarni kiritish

Quyidagi dastur foydalanuvchidan belgini kiritishni so'raydi, keyin belgini ham, uning ASCII kodini ham chop etadi:

```cpp
#include <iostream>
 
int main()
{
    std::cout << "Klaviatura belgisini kiriting: ";
 
    char ch{};
    std::cin >> ch;
    std::cout << ch << " ASCII kodi: " << static_cast<int>(ch) << '\n';
 
    return 0;
}
```

**Natija**:

```cpp
Klaviatura belgisini kiriting: q
ASCII kodi: 113
```

E'tibor bering, **std :: cin** sizga bir nechta belgilar kiritishga imkon beradi. Biroq, ch o'zgaruvchisi faqat 1 belgidan iborat bo'lishi mumkin. Binobarin, ch o'zgaruvchiga faqat birinchi kirish belgisi chiqariladi. Qolgan foydalanuvchi kiritmalari **std :: cin** ishlatadigan kirish buferida qoladi va uni **std :: cin** ga keyingi qo'ng'iroqlar yordamida chiqarib olish mumkin.

```cpp
#include <iostream>
 
int main()
{
    std::cout << "Klaviatura belgisini kiriting: "; // foydalanuvchi "abcd" ga kirgan deb taxmin qiling (tirnoqsiz)
 
    char ch{};
    std::cin >> ch; // ch = 'a', "bcd" navbatda qoldirilgan.
    std::cout << ch << " ASCII kodi: " << static_cast<int>(ch) << '\n';
 
    // Eslatma: Quyidagi cin foydalanuvchidan kirishni so'ramaydi, u navbatdagi kirishni oladi!
    std::cin >> ch; // ch = 'b', "cd" navbatda qoldirilgan.
    std::cout << ch << " ASCII kodi: " << static_cast<int>(ch) << '\n';
    
    return 0;
}
```

**Natija**:

```cpp
Klaviatura belgisini kiriting: abcd
a ning ASCII kodi: 97
b ning ASCII kodi: 98
```
