O'zgaruvchilar va ma'lumot turlari
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
unsignedishlatiladi? Manfiy bo'lmaydigan narsalar uchun — fayl o'lchami, piksel soni, yosh.unsignedda 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 —floatyetarli.
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—sizeofnatijasi 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
0xbilan 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) uchunsizeofchiqaring. Jami necha bayt ekanligini hisoblang va yozing.
✏️ Vazifa 3 — ASCII o'yini
char harf = 'A'e'lon qiling.harf + 0danharf + 25gacha loop ishlatmay har birini alohidaprintfbilan chiqaring. Natija: A B C ... Z
✏️ Vazifa 4 — Manzillarni tekshiring
int,float,char,doubleturlarida bittadan o'zgaruvchi yarating. Har birining qiymati va xotira manzilini%pbilan chiqaring. Manzillar orasidagi farqni hisoblang — mos keladimi?
✏️ Vazifa 5 — Float aniqlik muammosi
Quyidagi hisoblash natijasini
%.20fbilan chiqaring:float a = 0.1f + 0.2f; double b = 0.1 + 0.2;
floatvadoublenatijasini solishtiring. Qaysi biri0.3ga yaqinroq?
✏️ Vazifa 6 — Overflow (toshib ketish)
int max = 2147483647ga1qo'shing va natijani chiqaring. Nima bo'ldi? Nima uchun? (unsigned intbilan 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.6fbilan boshlang. Natijani%.1fbilan chiqaring.
✏️ Vazifa 9 — Doira hisobi
double radius = 7.5berilgan. Doiraning yuzasi (pi * r * r) va uzunligini (2 * pi * r) hisoblang.double pi = 3.14159265358979ishlating. Natijani%.4fbilan 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 = 1bo'lsa ekrandaHachiqsin.
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