O'zgaruvchilar va ma'lumot turlari

~20 daq · C tili · Asoslar

O'zgaruvchi nima?

Dastur ishlayotganda ma'lumotlar bilan ishlaydi. Bu ma'lumotlar xotirada (RAM) saqlanadi.

O'zgaruvchi — xotiradagi quti. Har bir qutining:

  • nomi bor — siz unga murojaat qilasiz
  • turi bor — ichiga qanday narsa sig'ishi
  • qiymati bor — hozir ichida nima bor
  • manzili bor — xotirada qayerda turadi

Oddiy hayot misoli

Tasavvur qiling: omborxona. Har bir javon — o'zgaruvchi. Javonning:

  • Nomi: "yosh_javoni", "narx_javoni"
  • O'lchami: kichik javon, katta javon (tur)
  • Ichidagi narsa: 25, 15000.50 (qiymat)
RAM (xotira):
+------------------------------------------+
|  ...                                     |
|  +----------+  +----------+              |
|  |    25    |  |  15000.5 |              |
|  +----------+  +----------+              |
|    "yosh"        "narx"                  |
|  manzil:104    manzil:108                |
|  ...                                     |
+------------------------------------------+

O'zgaruvchi e'lon qilish

C da o'zgaruvchi ishlatishdan oldin e'lon qilish shart. Python da bunday emas — u o'zi tushunadi. C da esa siz aniq aytishingiz kerak: "menga bu turdagi joy ber".

Sintaksis

tur   nom;
tur   nom = qiymat;

Misol

int   yosh;            // faqat e'lon — ichida "axlat" qiymat
int   yosh = 25;       // e'lon + qiymat berish (initialization)

⚠️ Muhim: E'lon qilingan lekin qiymat berilmagan o'zgaruvchi ichida noaniq qiymat bo'ladi — xotirada oldin qolgan "axlat". Doim qiymat bering!


C dagi asosiy turlar

Tur O'lcham Qiymat oralig'i Ishlatilishi
char 1 bayt -128 ... 127 Bitta belgi, kichik son
int 4 bayt -2,147,483,648 ... 2,147,483,647 Butun sonlar
float 4 bayt ±3.4 × 10³⁸ Kasr sonlar (oddiy)
double 8 bayt ±1.7 × 10³⁰⁸ Kasr sonlar (aniq)
_Bool 1 bayt 0 yoki 1 Mantiqiy qiymat

1. int — Butun sonlar

Nima uchun ishlatiladi?

Yosh, sana, hisob, sanash — butun sonlar uchun.

Xotirada qanday saqlanadi?

int — 4 bayt = 32 bit. Har bir bit 0 yoki 1.

25 soni xotirada (32 bit):
00000000 00000000 00000000 00011001
                                 = 25 (o'nlik)

Kod

#include <stdio.h>

int main() {
    int yosh = 25;
    int temperatura = -10;    // manfiy ham bo'ladi
    int aholi = 36000000;     // 36 million

    printf("Yosh: %d\n", yosh);
    printf("Temperatura: %d\n", temperatura);
    printf("Aholi: %d\n", aholi);

    return 0;
}

Natija:

Yosh: 25
Temperatura: -10
Aholi: 36000000

%d nima?

printf da %d — "bu yerga int qiymatini qo'y" degani. d — decimal (o'nlik) dan keladi.

int ning kengaytirilgan turlari

short int  kichik = 100;           // 2 bayt: -32768 ... 32767
long  int  katta  = 1000000L;      // 8 bayt: juda katta sonlar
unsigned int musbat = 4000000000U; // faqat musbat: 0...4,294,967,295

💡 Qachon unsigned ishlatiladi? Manfiy bo'lmaydigan narsalar uchun — fayl o'lchami, piksel soni, yosh. unsigned da musbat oraliq ikki marta kengayadi.


2. float va double — Kasr sonlar

Farqi nima?

float  → 4 bayt → 6-7  ta aniq raqam
double → 8 bayt → 15-16 ta aniq raqam

Kod

#include <stdio.h>

int main() {
    float  narx   = 15000.50f;       // f harfi — float ekanligi
    double pi     = 3.14159265358979;
    double massa  = -0.000045;

    printf("Narx:  %.2f\n", narx);   // 2 ta kasr raqam
    printf("Pi:    %.10f\n", pi);    // 10 ta kasr raqam
    printf("Massa: %f\n", massa);

    return 0;
}

Natija:

Narx:  15000.50
Pi:    3.1415926536
Massa: -0.000045

Float ning xavfli tomoni

#include <stdio.h>

int main() {
    float a = 0.1f;
    float b = 0.2f;
    float c = a + b;

    printf("%.20f\n", c);   // 20 ta kasr raqam ko'rsatamiz
    return 0;
}

Natija:

0.30000001192092895508

0.1 + 0.2 = 0.3 emas! Bu float ning cheklovi. Pul hisoblashda double yoki alohida kutubxona ishlating.

⚠️ Qoida: Pul, bank, ilmiy hisob — double. Oddiy hisob, o'yin grafika — float yetarli.


3. char — Belgilar

Nima uchun ishlatiladi?

Bitta harf, raqam belgisi, maxsus belgi saqlash uchun.

Xotirada qanday saqlanadi?

char — 1 bayt = 8 bit. Ichida ASCII kodi saqlanadi.

Belgi ASCII kodi
'A' 65
'B' 66
'a' 97
'0' 48
' ' 32

Kod

#include <stdio.h>

int main() {
    char harf  = 'A';
    char belgi = '!';
    char raqam = '7';    // bu int 7 emas — '7' belgisi

    printf("Harf:  %c\n", harf);
    printf("Belgi: %c\n", belgi);
    printf("Raqam: %c\n", raqam);

    // char aslida son — shunday ham chiqarish mumkin:
    printf("'A' ning ASCII kodi: %d\n", harf);

    return 0;
}

Natija:

Harf:  A
Belgi: !
Raqam: 7
'A' ning ASCII kodi: 65

Qiziqarli — char bilan arifmetika

#include <stdio.h>

int main() {
    char harf = 'A';

    printf("%c\n", harf);       // A
    printf("%c\n", harf + 1);   // B
    printf("%c\n", harf + 2);   // C
    printf("%c\n", harf + 25);  // Z

    return 0;
}

Natija:

A
B
C
Z

'A' = 65, 65 + 1 = 66 = 'B'. ASCII jadval ketma-ket!

💡 Qoida: char — bitta belgi uchun ' ' (bitta qo'shtirnoq). Satr uchun " " (ikki qo'shtirnoq). Bularni aralashtirmang!


4. _Bool — Mantiqiy qiymat

Faqat ikki holat: ha/yo'q, to'g'ri/noto'g'ri, yoqilgan/o'chirilgan.

#include <stdio.h>
#include <stdbool.h>    // bool, true, false uchun

int main() {
    _Bool tugma = 0;         // o'chirilgan
    bool  ishlayapti = true; // stdbool.h dan

    printf("Tugma: %d\n", tugma);
    printf("Ishlayapti: %d\n", ishlayapti);

    // Har qanday nolmas son — true
    _Bool natija = 42;
    printf("42 → bool: %d\n", natija);   // 1 chiqadi

    return 0;
}

Natija:

Tugma: 0
Ishlayapti: 1
42 → bool: 1

O'zgarmas qiymatlar — const va #define

Ba'zi qiymatlar dastur davomida o'zgarmasligi kerak — masalan, PI soni, soliq foizi, maksimal hajm. C da buning ikki yo'li bor.

const — o'zgarmas o'zgaruvchi

const double PI    = 3.14159265358979;
const int    HAFTA = 7;
const float  SOLIQ = 0.12f;

const bilan e'lon qilingan o'zgaruvchiga keyinchalik qiymat berishga urinsa — kompilyator xato beradi:

const int MAX = 100;
MAX = 200;    // xato: assignment of read-only variable

#define — preprocessor konstantasi

#define PI    3.14159265358979
#define HAFTA 7
#define MAX   100

#define — kompilyatsiyadan oldin ishlaydi. Kodda PI yozilgan har bir joy 3.14159265358979 bilan almashtiriladi. Tur yo'q, xotira ajratilmaydi.

Farqi qanday?

const #define
Tur tekshiruvi Ha Yo'q
Xotira Ajratiladi Ajratilmaydi
Debug da ko'rinadi Ha Yo'q
Tavsiya Zamonaviy C Eski uslub

Misol

#include <stdio.h>

#define OYLAR 12

int main() {
    const double PI      = 3.14159265358979;
    const int    KUNLAR  = 365;

    double radius = 5.0;
    double yuza   = PI * radius * radius;

    printf("PI:     %.5f\n", PI);
    printf("Yuza:   %.2f\n", yuza);
    printf("Oylar:  %d\n",   OYLAR);
    printf("Kunlar: %d\n",   KUNLAR);

    return 0;
}

Natija:

PI:     3.14159
Yuza:   78.54
Oylar:  12
Kunlar: 365

💡 Qoida: Konstantalar nomini KATTA HARF bilan yozish — dasturlashda keng tarqalgan uslub. PI, MAX_SIZE, SOLIQ_FOIZI — bir qarashda o'zgarmas ekanligini bilasiz.


sizeof — O'lchamni bilish

#include <stdio.h>

int main() {
    printf("char:   %zu bayt\n", sizeof(char));
    printf("int:    %zu bayt\n", sizeof(int));
    printf("float:  %zu bayt\n", sizeof(float));
    printf("double: %zu bayt\n", sizeof(double));

    int yosh = 25;
    printf("yosh o'zgaruvchisi: %zu bayt\n", sizeof(yosh));

    return 0;
}

Natija (64-bit tizimda):

char:   1 bayt
int:    4 bayt
float:  4 bayt
double: 8 bayt
yosh o'zgaruvchisi: 4 bayt

💡 %zu — sizeof natijasi uchun format specifier. (z — size_t turi, u — unsigned)


O'zgaruvchi manzili — & operatori

Har bir o'zgaruvchining xotirada manzili bor. & operatori o'sha manzilni ko'rsatadi.

#include <stdio.h>

int main() {
    int   yosh  = 25;
    float narx  = 15000.5f;
    char  harf  = 'A';

    printf("yosh  qiymati:  %d\n",   yosh);
    printf("yosh  manzili:  %p\n",   (void*)&yosh);

    printf("narx  qiymati:  %.1f\n", narx);
    printf("narx  manzili:  %p\n",   (void*)&narx);

    printf("harf  qiymati:  %c\n",   harf);
    printf("harf  manzili:  %p\n",   (void*)&harf);

    return 0;
}

Natija (har safar boshqacha bo'ladi):

yosh  qiymati:  25
yosh  manzili:  0x7ffd5a3b1234
narx  qiymati:  15000.5
narx  manzili:  0x7ffd5a3b1230
harf  qiymati:  A
harf  manzili:  0x7ffd5a3b122f

💡 Manzillar 0x bilan boshlanadi — bu o'n oltilik (hexadecimal) son. Pointer darsida batafsil o'rganamiz.


O'zgaruvchi nomlash qoidalari

Ruxsat etilgan

int yosh = 25;          // kichik harf
int YOSH = 25;          // katta harf
int yosh25 = 25;        // harf + raqam
int _yosh = 25;         // pastki chiziq bilan boshlash
int talaba_yoshi = 25;  // snake_case (tavsiya)

Ruxsat etilmagan

int 25yosh = 25;        // raqam bilan boshlanmaydi
int yosh-narx = 25;     // minus belgisi bo'lmaydi
int int = 25;           // kalit so'z ishlatilmaydi
int yosh narx = 25;     // bo'sh joy bo'lmaydi

Yaxshi nom yozish

// Yomon — nima ekanligini bilmaysiz
int a = 25;
float b = 15000.5f;

// Yaxshi — o'qiladi, tushuniladi
int talaba_yoshi = 25;
float mahsulot_narxi = 15000.5f;

Hammasi birgalikda

#include <stdio.h>

int main() {
    char   baho        = 'A';
    int    yosh        = 19;
    float  gpa         = 3.75f;
    double stipendiya  = 1250000.50;
    _Bool  faol        = 1;

    printf("===== Talaba Ma'lumotlari =====\n");
    printf("Baho:        %c\n",   baho);
    printf("Yosh:        %d\n",   yosh);
    printf("GPA:         %.2f\n", gpa);
    printf("Stipendiya:  %.2f\n", stipendiya);
    printf("Faol:        %d\n",   faol);
    printf("================================\n");

    printf("\nXotira o'lchamlari:\n");
    printf("char:   %zu bayt\n", sizeof(baho));
    printf("int:    %zu bayt\n", sizeof(yosh));
    printf("float:  %zu bayt\n", sizeof(gpa));
    printf("double: %zu bayt\n", sizeof(stipendiya));

    return 0;
}

Natija:

===== Talaba Ma'lumotlari =====
Baho:        A
Yosh:        19
GPA:         3.75
Stipendiya:  1250000.50
Faol:        1
================================

Xotira o'lchamlari:
char:   1 bayt
int:    4 bayt
float:  4 bayt
double: 8 bayt

Vazifalar

✏️ Vazifa 1 — O'zingiz haqingizda

Quyidagi ma'lumotlaringizni o'zgaruvchilarga joylab ekranga chiqaring:

  • Ismingizning birinchi harfi (char)
  • Yoshingiz (int)
  • Bo'yingiz sm da (float)
  • Oylik xarajatingiz (double)

✏️ Vazifa 2 — sizeof tekshiruvi

Barcha asosiy turlar (char, short, int, long, float, double) uchun sizeof chiqaring. Jami necha bayt ekanligini hisoblang va yozing.

✏️ Vazifa 3 — ASCII o'yini

char harf = 'A' e'lon qiling. harf + 0 dan harf + 25 gacha loop ishlatmay har birini alohida printf bilan chiqaring. Natija: A B C ... Z

✏️ Vazifa 4 — Manzillarni tekshiring

int, float, char, double turlarida bittadan o'zgaruvchi yarating. Har birining qiymati va xotira manzilini %p bilan chiqaring. Manzillar orasidagi farqni hisoblang — mos keladimi?

✏️ Vazifa 5 — Float aniqlik muammosi

Quyidagi hisoblash natijasini %.20f bilan chiqaring:

float a = 0.1f + 0.2f;
double b = 0.1 + 0.2;

float va double natijasini solishtiring. Qaysi biri 0.3 ga yaqinroq?

✏️ Vazifa 6 — Overflow (toshib ketish)

int max = 2147483647 ga 1 qo'shing va natijani chiqaring. Nima bo'ldi? Nima uchun? (unsigned int bilan ham sinab ko'ring)

✏️ Vazifa 7 — Noto'g'ri turni aniqlang

Quyidagi kodda xato bormi? Borsa — nima xato? Fikrinsizni yozing (ishga tushirmasdan):

int   narx    = 15000.99;
float yosh    = 25;
char  son     = 300;
int   nomi    = 'A';

✏️ Vazifa 8 — Harorat konvertori

Celsius haroratni Fahrenheit ga aylantiring:

F = (C x 9/5) + 32

float celsius = 36.6f bilan boshlang. Natijani %.1f bilan chiqaring.

✏️ Vazifa 9 — Doira hisobi

double radius = 7.5 berilgan. Doiraning yuzasi (pi * r * r) va uzunligini (2 * pi * r) hisoblang. double pi = 3.14159265358979 ishlating. Natijani %.4f bilan chiqaring.

✏️ Vazifa 10 — Talaba kartochkasi

Quyidagi formatda chiqadigan dastur yozing:

==============================
     FOUNDATION UNIVERSITY
==============================
  Ism:      A
  ID:       2024001
  Kurs:     1
  GPA:      3.95
  Faol:     Ha
==============================

Har bir qiymat — alohida o'zgaruvchi. _Bool faol = 1 bo'lsa ekranda Ha chiqsin.


Xulosa

Tur Bayt Ishlatilishi Format
char 1 Bitta belgi, kichik son %c yoki %d
int 4 Butun sonlar %d
float 4 Kasr son (oddiy) %f
double 8 Kasr son (aniq) %f yoki %lf
_Bool 1 true / false %d

Keyingi dars

O'zgaruvchiga qiymat berdik. Endi foydalanuvchidan kiritish olishni o'rganamiz.

5-dars: Kirish / chiqish — scanf va printf