Arifmetik va mantiqiy operatorlar

~15 daq · C tili · Asoslar

Operator nima?

Operator — ikki yoki undan ortiq qiymat ustida amal bajaruvchi belgi. Siz maktabda +, -, ×, ÷ ko'rgansiz. C da bular kengroq va qiziqroq.

C dagi operatorlar 4 ta guruhga bo'linadi:

1. Arifmetik    →  +  -  *  /  %
2. Solishtirish →  ==  !=  >  <  >=  <=
3. Mantiqiy     →  &&  ||  !
4. Tayinlash    →  =  +=  -=  *=  /=  %=

Birma-bir tushunamiz.


1. Arifmetik operatorlar

Asosiy 5 ta

Operator Nomi Misol Natija
+ Qo'shish 10 + 3 13
- Ayirish 10 - 3 7
* Ko'paytirish 10 * 3 30
/ Bo'lish 10 / 3 3
% Qoldiq (modulo) 10 % 3 1

/ — Bo'lish operatori (ehtiyot bo'ling!)

Bu operator ikki xil ishlaydi:

#include <stdio.h>

int main() {
    // Ikki int bo'linsa — natija ham int (kasr tushib qoladi!)
    int a = 10, b = 3;
    printf("int / int = %d\n", a / b);       // 3  (3.33 emas!)

    // Kamida biri float bo'lsa — natija float
    float c = 10.0f, d = 3.0f;
    printf("float / float = %.4f\n", c / d); // 3.3333

    // Yoki casting bilan
    printf("cast = %.4f\n", (float)a / b);   // 3.3333

    return 0;
}

Natija:

int / int = 3
float / float = 3.3333
cast = 3.3333

⚠️ Eng ko'p uchraydigan xato: 7 / 2 = 3 deb kutasiz 3.5 ni. Ikkalasi int bo'lsa — kasr tushadi. Bu integer division deyiladi.

% — Modulo (qoldiq) operatori

Bu operator ko'pchilikka yangi. Lekin dasturlashda eng ko'p ishlatiladigan operatorlardan biri.

10 % 3 = 1    (10 = 3×3 + 1,  qoldiq 1)
15 % 5 = 0    (15 = 5×3 + 0,  qoldiq 0)
 7 % 2 = 1    ( 7 = 2×3 + 1,  qoldiq 1)
 8 % 2 = 0    ( 8 = 2×4 + 0,  qoldiq 0)
#include <stdio.h>

int main() {
    printf("10 %% 3 = %d\n", 10 % 3);   // 1
    printf("15 %% 4 = %d\n", 15 % 4);   // 3
    printf("20 %% 5 = %d\n", 20 % 5);   // 0
    printf(" 7 %% 2 = %d\n",  7 % 2);   // 1

    // Juft/toq aniqlash
    int son = 17;
    printf("%d — %s\n", son, son % 2 == 0 ? "juft" : "toq");

    return 0;
}

Natija:

10 % 3 = 1
15 % 4 = 3
20 % 5 = 0
 7 % 2 = 1
17 — toq

💡 Modulo qayerda ishlatiladi?

  • Juft/toq aniqlash: n % 2 == 0
  • Oxirgi raqam: n % 10
  • Soatni hisoblash: 25 % 24 = 1 (25-soat = 1)
  • Doiraviy massiv: i % size
  • Raqamlar yig'indisi: har xonani ajratish

Arifmetik operatorlar — katta misol

#include <stdio.h>

int main() {
    int   a = 17, b = 5;
    float x = 17.0f, y = 5.0f;

    printf("=== Butun sonlar (%d va %d) ===\n", a, b);
    printf("Qo'shish:     %d + %d = %d\n",  a, b, a + b);
    printf("Ayirish:      %d - %d = %d\n",  a, b, a - b);
    printf("Ko'paytirish: %d * %d = %d\n",  a, b, a * b);
    printf("Bo'lish:      %d / %d = %d\n",  a, b, a / b);
    printf("Qoldiq:       %d %% %d = %d\n", a, b, a % b);

    printf("\n=== Kasr sonlar (%.1f va %.1f) ===\n", x, y);
    printf("Bo'lish: %.1f / %.1f = %.4f\n", x, y, x / y);

    return 0;
}

Natija:

=== Butun sonlar (17 va 5) ===
Qo'shish:     17 + 5 = 22
Ayirish:      17 - 5 = 12
Ko'paytirish: 17 * 5 = 85
Bo'lish:      17 / 5 = 3
Qoldiq:       17 % 5 = 2

=== Kasr sonlar (17.0 va 5.0) ===
Bo'lish: 17.0 / 5.0 = 3.4000

2. Inkrement va Dekrement

Birga oshirish va birga kamaytirish — dasturlashda shunchalik ko'p uchraydiki, maxsus operator bor.

i++   // i ni 1 ga oshir (postfix)
++i   // i ni 1 ga oshir (prefix)
i--   // i ni 1 ga kamait (postfix)
--i   // i ni 1 ga kamait (prefix)

Prefix va Postfix farqi

#include <stdio.h>

int main() {
    int a = 5, b = 5;
    int x, y;

    x = a++;   // avval x = a (5), keyin a oshadi (6)
    y = ++b;   // avval b oshadi (6), keyin y = b (6)

    printf("a = %d, x = %d\n", a, x);   // a=6, x=5
    printf("b = %d, y = %d\n", b, y);   // b=6, y=6

    return 0;
}

Natija:

a = 6, x = 5
b = 6, y = 6

Vizual tushuntirish

Postfix (a++):
  x = a++
  ┌─────────────────────────────┐
  │  1. x ga a ning qiymati    │  x = 5
  │  2. a ni 1 ga oshir        │  a = 6
  └─────────────────────────────┘

Prefix (++b):
  y = ++b
  ┌─────────────────────────────┐
  │  1. b ni 1 ga oshir        │  b = 6
  │  2. y ga b ning qiymati    │  y = 6
  └─────────────────────────────┘

💡 Qoida: Agar faqat oshirish/kamaytirish kerak bo'lsa (natijani ishlatmasangiz) — ikkalasi ham bir xil. i++ va ++i — loopda farqi yo'q.


3. Tayinlash operatorlari

int x = 10;

x += 5;    // x = x + 5  →  x = 15
x -= 3;    // x = x - 3  →  x = 12
x *= 2;    // x = x * 2  →  x = 24
x /= 4;    // x = x / 4  →  x = 6
x %= 4;    // x = x % 4  →  x = 2
#include <stdio.h>

int main() {
    int ball = 0;

    ball += 10;    printf("Qo'shildi +10:  %d\n", ball);
    ball += 25;    printf("Qo'shildi +25:  %d\n", ball);
    ball -= 5;     printf("Ayirildi  -5:   %d\n", ball);
    ball *= 2;     printf("Ko'paydi  ×2:   %d\n", ball);
    ball /= 3;     printf("Bo'lindi  ÷3:   %d\n", ball);
    ball %= 7;     printf("Qoldig'i  %%7:  %d\n", ball);

    return 0;
}

Natija:

Qo'shildi +10:  10
Qo'shildi +25:  35
Ayirildi  -5:   30
Ko'paydi  ×2:   60
Bo'lindi  ÷3:   20
Qoldig'i  %7:   6

4. Solishtirish operatorlari

Ikki qiymatni solishtiradi. Natija: 1 (to'g'ri) yoki 0 (noto'g'ri).

Operator Nomi Misol Natija
== Teng 5 == 5 1
!= Teng emas 5 != 3 1
> Katta 5 > 3 1
< Kichik 5 < 3 0
>= Katta yoki teng 5 >= 5 1
<= Kichik yoki teng 5 <= 3 0
#include <stdio.h>

int main() {
    int a = 10, b = 20;

    printf("a = %d, b = %d\n\n", a, b);

    printf("a == b : %d\n", a == b);   // 0
    printf("a != b : %d\n", a != b);   // 1
    printf("a >  b : %d\n", a >  b);   // 0
    printf("a <  b : %d\n", a <  b);   // 1
    printf("a >= b : %d\n", a >= b);   // 0
    printf("a <= b : %d\n", a <= b);   // 1

    return 0;
}

Natija:

a = 10, b = 20

a == b : 0
a != b : 1
a >  b : 0
a <  b : 1
a >= b : 0
a <= b : 1

⚠️ Eng katta xato: = va == ni aralashtirish!

if (x = 5)   // ❌ tayinlash — x ga 5 yozadi, doim true
if (x == 5)  // ✅ solishtirish — x 5 ga tengmi?

Bu xatoni kompilator ham ko'rsatmasligi mumkin — lekin dastur noto'g'ri ishlaydi.


5. Mantiqiy operatorlar

Bir nechta shartni birlashtirib tekshirish uchun.

Operator Nomi Ma'nosi
&& VA (AND) Ikkalasi ham to'g'ri bo'lsa
|| YOKI (OR) Kamida biri to'g'ri bo'lsa
! EMAS (NOT) Teskarisini qaytaradi

Haqiqat jadvali (Truth Table)

AND (&&):                    OR (||):
┌───┬───┬────────┐          ┌───┬───┬────────┐
│ A │ B │ A && B │          │ A │ B │ A || B │
├───┼───┼────────┤          ├───┼───┼────────┤
│ 0 │ 0 │   0   │          │ 0 │ 0 │   0   │
│ 0 │ 1 │   0   │          │ 0 │ 1 │   1   │
│ 1 │ 0 │   0   │          │ 1 │ 0 │   1   │
│ 1 │ 1 │   1   │          │ 1 │ 1 │   1   │
└───┴───┴────────┘          └───┴───┴────────┘

NOT (!):
┌───┬─────┐
│ A │ ! A │
├───┼─────┤
│ 0 │  1  │
│ 1 │  0  │
└───┴─────┘

Hayot misollari

#include <stdio.h>

int main() {
    int yosh        = 20;
    int pul         = 50000;
    int haydovchi   = 1;    // guvohnoma bor
    int kasalmi     = 0;    // kasal emas

    // AND — ikkalasi to'g'ri bo'lishi kerak
    printf("Avtomobil olish mumkinmi? %d\n",
        yosh >= 18 && pul >= 30000);   // 1 (ha)

    // OR — kamida biri to'g'ri bo'lsa yetarli
    printf("Yo'lga chiqish mumkinmi? %d\n",
        haydovchi || yosh >= 18);       // 1 (ha)

    // NOT — teskarisi
    printf("Sog'mi? %d\n", !kasalmi);  // 1 (ha, sog')

    // Kombinatsiya
    printf("Mashinani haydash mumkinmi? %d\n",
        haydovchi && !kasalmi && yosh >= 16);  // 1

    return 0;
}

Natija:

Avtomobil olish mumkinmi? 1
Yo'lga chiqish mumkinmi? 1
Sog'mi? 1
Mashinani haydash mumkinmi? 1

6. Operatorlar ustunligi (Precedence)

Matematik kabi — ba'zi operatorlar boshqalardan oldin bajariladi.

Yuqori (birinchi bajariladi)
   ↑    ()              ← qavslar
   │    ++ --           ← inkrement
   │    ! (unary -)     ← mantiqiy NOT, manfiy
   │    * / %           ← ko'paytirish, bo'lish
   │    + -             ← qo'shish, ayirish
   │    < > <= >=       ← solishtirish
   │    == !=           ← tenglik
   │    &&              ← mantiqiy AND
   │    ||              ← mantiqiy OR
   ↓    = += -= ...     ← tayinlash
Quyi (oxirida bajariladi)

Misol

#include <stdio.h>

int main() {
    int natija;

    natija = 2 + 3 * 4;
    printf("2 + 3 * 4 = %d\n", natija);      // 14, (3*4=12, 12+2=14)

    natija = (2 + 3) * 4;
    printf("(2 + 3) * 4 = %d\n", natija);    // 20

    natija = 10 > 5 && 3 < 8;
    printf("10>5 && 3<8 = %d\n", natija);    // 1

    natija = 2 + 3 == 5;
    printf("2 + 3 == 5 = %d\n", natija);     // 1 (+ oldin, keyin ==)

    natija = !0 + 1;
    printf("!0 + 1 = %d\n", natija);         // 2 (! oldin: !0=1, 1+1=2)

    return 0;
}

Natija:

2 + 3 * 4 = 14
(2 + 3) * 4 = 20
10>5 && 3<8 = 1
2 + 3 == 5 = 1
!0 + 1 = 2

💡 Maslahat: Ustunlikni yodlab olmang — qavslar ishlating. Kod o'qilishi osonlashadi, xato kamayadi.


7. Ternary operator ? :

Kichik if-else o'rnida ishlatiladi.

shart ? to'g'ri_qiymat : noto'g'ri_qiymat
#include <stdio.h>

int main() {
    int a = 15, b = 22;

    // Kattasini topish
    int katta = (a > b) ? a : b;
    printf("Kattasi: %d\n", katta);           // 22

    // Juft yoki toq
    printf("%d — %s\n", a, a % 2 == 0 ? "juft" : "toq");  // toq

    // Musbat, manfiy yoki nol
    int son = -7;
    printf("%d: %s\n", son,
        son > 0 ? "musbat" :
        son < 0 ? "manfiy" : "nol");           // manfiy

    return 0;
}

Natija:

Kattasi: 22
15 — toq
-7: manfiy

8. Type casting — Tur o'zgartirish

Ba'zan bir turni boshqasiga aylantirishga to'g'ri keladi.

#include <stdio.h>

int main() {
    int   a = 7, b = 2;
    float natija;

    // Xato — integer division
    natija = a / b;
    printf("7 / 2 = %.2f\n", natija);         // 3.00 (xato!)

    // To'g'ri — casting bilan
    natija = (float)a / b;
    printf("(float)7 / 2 = %.2f\n", natija);  // 3.50

    // char → int
    char harf = 'Z';
    printf("'Z' = %d\n", (int)harf);          // 90

    // int → char
    int kod = 65;
    printf("65 = '%c'\n", (char)kod);          // 'A'

    // double → int (kasr tushadi)
    double pi = 3.99;
    printf("(int)3.99 = %d\n", (int)pi);      // 3 (yumaloqlamaydi!)

    return 0;
}

Natija:

7 / 2 = 3.00
(float)7 / 2 = 3.50
'Z' = 90
65 = 'A'
(int)3.99 = 3

⚠️ Diqqat: (int)3.99 = 3 — yumaloqlamaydi, faqat kasrni kesib tashlaydi.


Amaliy dastur — Raqam tahlilchisi

#include <stdio.h>

int main() {
    int son;

    printf("Son kiriting: ");
    scanf("%d", &son);

    printf("\n=== %d ning tahlili ===\n", son);

    // Musbat/manfiy/nol
    printf("Turi:         %s\n",
        son > 0 ? "musbat" : son < 0 ? "manfiy" : "nol");

    // Juft/toq (nol uchun alohida)
    if (son != 0)
        printf("Juft/toq:     %s\n", son % 2 == 0 ? "juft" : "toq");

    // Oxirgi raqam
    printf("Oxirgi raqam: %d\n", son % 10 < 0 ? -(son % 10) : son % 10);

    // 3 ga bo'linishi
    printf("3 ga bo'linadi: %s\n", son % 3 == 0 ? "ha" : "yo'q");

    // 5 ga bo'linishi
    printf("5 ga bo'linadi: %s\n", son % 5 == 0 ? "ha" : "yo'q");

    // 15 ga bo'linishi (FizzBuzz)
    printf("15 ga bo'linadi: %s\n", son % 15 == 0 ? "ha" : "yo'q");

    // Absolut qiymat
    printf("Absolut qiymat: %d\n", son < 0 ? -son : son);

    return 0;
}

Ishlash (son = -18):

=== -18 ning tahlili ===
Turi:          manfiy
Juft/toq:      juft
Oxirgi raqam:  8
3 ga bo'linadi: ha
5 ga bo'linadi: yo'q
15 ga bo'linadi: yo'q
Absolut qiymat: 18

Vazifalar

✏️ Vazifa 1 — Oxirgi raqam

Foydalanuvchidan 4 xonali son oling (masalan: 2748). Faqat % va / operatorlari bilan:

  • Birlar xonasini chiqaring → 8
  • O'nlar xonasini chiqaring → 4
  • Yuzlar xonasini chiqaring → 7
  • Minglar xonasini chiqaring → 2
  • Raqamlar yig'indisini chiqaring → 21

✏️ Vazifa 2 — Soat, daqiqa, soniya

Foydalanuvchidan faqat soniyalar sonini oling. Faqat / va % bilan soat, daqiqa, soniyaga aylantiring:

Kiriting: 7384
7384 soniya = 2 soat, 3 daqiqa, 4 soniya

✏️ Vazifa 3 — Teng bo'luvchilar

Foydalanuvchidan son oling. Quyidagilarni tekshiring va ekranga chiqaring (1 yoki 0 emas — ha/yo'q):

  • 2 ga bo'linadimi?
  • 3 ga bo'linadimi?
  • 5 ga bo'linadimi?
  • 7 ga bo'linadimi?
  • Ham 3 ga ham 5 ga bo'linadimi?

✏️ Vazifa 4 — Kvadrat va kub

Foydalanuvchidan butun son oling. Faqat * operatori bilan (kutubxona ishlatmang):

  • Kvadratini hisoblang
  • Kubini hisoblang
  • To'rtinchi darajasini hisoblang

Natijani chiroyli formatda chiqaring.


✏️ Vazifa 5 — Tenglamalar

Foydalanuvchidan a, b, c katsayilarini oling. Chiziqli tenglama ax + b = c dan x ni toping:

x = (c - b) / a

a = 0 bo'lsa: "Tenglama hal bo'lmaydi" chiqaring. double ishlating.


✏️ Vazifa 6 — Harfmi yoki raqammi?

Foydalanuvchidan bitta belgi (char) oling. ASCII qiymati asosida aniqlang (faqat &&, ||, >=, <= ishlating — tayyor funksiya yo'q):

  • Katta harf (A-Z): 65-90
  • Kichik harf (a-z): 97-122
  • Raqam (0-9): 48-57
  • Boshqasi

Belgi ASCII kodini ham chiqaring.


✏️ Vazifa 7 — Kasr va butun qism

Foydalanuvchidan double son oling. Casting yordamida:

  • Butun qismini chiqaring
  • Kasr qismini chiqaring (.4f bilan)
  • Yaxlitlangan qiymatini chiqaring ((int)(son + 0.5) formulasi bilan)
Kiriting: 7.83
Butun qism:     7
Kasr qism:      0.8300
Yaxlitlangan:   8

✏️ Vazifa 8 — Ikki son almashtirish

Foydalanuvchidan a va b sonlarini oling. Uchinchi o'zgaruvchi ishlatmay ularni almashtiring:

a = a + b;
b = a - b;
a = a - b;

Almashtirish oldidan va keyin chiqaring. Mantiqini tushuning va izohlang.


✏️ Vazifa 9 — Yil hisobi

Foydalanuvchidan tug'ilgan yilini oling. Quyidagilarni hisoblang (joriy yil = 2025):

  • Hozirgi yoshi
  • 100 yoshga necha yil qolgan
  • 2050 yilgacha necha yil qolgan
  • Yoshi juft yoki toqmi?

Hammasi int va % operatorlari bilan.


✏️ Vazifa 10 — Minimal kod

Quyidagi ifodalarni qog'ozda hisoblab yozing (kodga terib tekshiring):

a = 5, b = 3, c = 2

1.  a + b * c           = ?
2.  (a + b) * c         = ?
3.  a % b + c           = ?
4.  a > b && b > c      = ?
5.  a == 5 || b == 5    = ?
6.  !(a > b)            = ?
7.  a != b && c != b    = ?
8.  a / b * b + a % b   = ?  (nima sezasiz?)
9.  (float)a / b        = ?
10. a++ + ++b           = ?  (a va b keyin?)

✏️ Vazifa 11 — To'g'ri to'rtburchak

Foydalanuvchidan eni va bo'yini oling (float).

  • Yuzasi
  • Perimetri
  • Diagonal uzunligi (d = √(a² + b²))

Diagonalni math.h dan sqrt() bilan hisoblang. Kompilyatsiyada: gcc vazifa.c -o vazifa -lm


✏️ Vazifa 12 — Chegirma hisobi

Foydalanuvchidan mahsulot narxini va chegirma foizini oling (double).

  • Chegirma miqdori
  • Chegirmadan keyin narx
  • Chegirma 50% dan ortiq bo'lsa: "Juda katta chegirma!" chiqaring (&&, || ishlating)

✏️ Vazifa 13 — Sana hisobi

Foydalanuvchidan kun sonini oling (1 yildan boshlab). Faqat / va % bilan:

  • Necha oyda ekanligini toping (1 oy = 30 kun)
  • Necha haftada ekanligini toping (1 hafta = 7 kun)
  • Oy ichidagi kuni
  • Hafta ichidagi kuni
Kiriting: 75
2-oy, 15-kun
10-hafta, 5-kun

✏️ Vazifa 14 — Ikki nuqta orasidagi masofa

Foydalanuvchidan ikki nuqta koordinatlarini oling: x1, y1, x2, y2 (double). Evklid masofasini hisoblang:

d = √((x2-x1)² + (y2-y1)²)

math.h dan sqrt() ishlating.


✏️ Vazifa 15 — Raqamlarni almashtirish (bitwise)

Foydalanuvchidan ikkita int son oling. Ularni XOR bilan almashtiring:

a = a ^ b;
b = a ^ b;
a = a ^ b;

Vazifa 8 dagi usul bilan solishtiring. Qaysi biri ishonchliroq va nima uchun?


✏️ Vazifa 16 — Ball tizimi

Foydalanuvchidan test balli (0-100) oling. Faqat mantiqiy operatorlar bilan baho aniqlang:

90-100 → A (Mukammal)
75-89  → B (Yaxshi)
60-74  → C (Qoniqarli)
45-59  → D (Qoniqarsiz)
0-44   → F (Yiqildi)

else if ishlatmang — faqat &&, ||, ternary.


✏️ Vazifa 17 — Elektr hisobi

Foydalanuvchidan oylik elektr sarfi (kVt·soat) va o'tgan oyga nisbatan farqni oling (double).

  • Jami narx hisoblang (1 kVt = 900 so'm)
  • Oldingi oyga nisbatan ko'paydi yoki kamaydi?
  • Farq foizda necha %?
Farq foizi = (farq / o'tgan_oy) × 100

✏️ Vazifa 18 — Sonni aylantirish

Foydalanuvchidan 3 xonali son oling (masalan: 473). Faqat / va % bilan:

  • Teskari tartibda chiqaring: 374
  • Raqamlar yig'indisi: 14
  • Ko'paytmasi: 84
  • Eng katta raqami: 7
  • Eng kichik raqami: 3

✏️ Vazifa 19 — Mantiqiy zanjir

Uchta son a, b, c ni oling. Faqat &&, ||, !, solishtirish operatorlari bilan:

  • Uchtalasi ham teng?
  • Kamida ikkitasi teng?
  • Uchtalasi ham turli?
  • Eng kattasi bmi?
  • Kamida biri manfiy?
  • Hammasi musbat?

Har biriga ha yoki yo'q chiqaring.


✏️ Vazifa 20 — Mini kassa

Foydalanuvchidan mahsulot narxi va berilgan pulni oling (int).

  • Qaytim pulni hisoblang
  • Qaytimni eng yirik kupyuralar bilan bering:
    100000, 50000, 10000, 5000, 1000, 500, 100
    
    (faqat / va % bilan — loop ishlatmang)
  • Pul yetarli bo'lmasa: "Pul yetarli emas" chiqaring

Xulosa

Guruh Operatorlar Natija
Arifmetik + - * / % Son
Inkrement ++ -- Son
Tayinlash = += -= *= /= %= —
Solishtirish == != > < >= <= 0 yoki 1
Mantiqiy && || ! 0 yoki 1
Ternary ? : Istalgan

Keyingi dars

Operatorlarni bildik. Endi ular bilan qarorlar qabul qilishni o'rganamiz.

7-dars: Shartli operatorlar — if / else / else if