3. Control Flow
Control flow - dastur kodining qaysi yo‘nalishda bajarilishini boshqarish. Ya’ni Java kodni tepadan pastga qarab bajaradi, lekin if, switch, for, while, break, continue, return orqali biz bu oqimni boshqaramiz.
Roadmapdagi Beginner bo‘limida bu qism quyidagilarni o‘z ichiga oladi: if / else / else if, switch, for, while, do-while, break, continue, return, enhanced for-each loop.
3.1. Control flow nima uchun kerak?
Oddiy kod shunday ishlaydi:
System.out.println("1");
System.out.println("2");
System.out.println("3");
Natija:
1
2
3
Java kodni yuqoridan pastga bajaradi.
Lekin real dasturda har doim ham hamma kod bajarilmaydi. Masalan:
Agar foydalanuvchi 18 yoshdan katta bo‘lsa → ruxsat ber
Aks holda → ruxsat bermagin
Buni Java’da if bilan qilamiz.
3.2. if
if - shart true bo‘lsa, ichidagi kod bajariladi.
int age = 20;
if (age >= 18) {
System.out.println("Kirish mumkin");
}
Bu yerda:
age >= 18
shart hisoblanadi.
Agar shart true bo‘lsa:
Kirish mumkin
chiqadi.
Agar age = 15 bo‘lsa, hech narsa chiqmaydi.
3.3. if / else
else - agar if sharti bajarilmasa, boshqa kodni bajaradi.
int age = 15;
if (age >= 18) {
System.out.println("Kirish mumkin");
} else {
System.out.println("Kirish mumkin emas");
}Natija:
Kirish mumkin emasMantiq:
Agar age >= 18 bo‘lsa → Kirish mumkin
Aks holda → Kirish mumkin emas3.4. else if
Agar bir nechta shart tekshirilsa, else if ishlatiladi.
int score = 85;
if (score >= 90) {
System.out.println("A");
} else if (score >= 80) {
System.out.println("B");
} else if (score >= 70) {
System.out.println("C");
} else {
System.out.println("Failed");
}Natija:
BBu yerda Java shartlarni yuqoridan pastga tekshiradi:
score >= 90 → false
score >= 80 → trueShu joyda kod bajariladi va qolgan else iflar tekshirilmaydi.
3.5. if tartibi muhim
Mana bu kod noto‘g‘ri mantiqqa ega:
int score = 95;
if (score >= 70) {
System.out.println("C");
} else if (score >= 80) {
System.out.println("B");
} else if (score >= 90) {
System.out.println("A");
}Natija:
CNega?
Chunki score >= 70 birinchi true bo‘ldi. Java keyingi shartlarga o‘tmaydi.
To‘g‘ri tartib:
int score = 95;
if (score >= 90) {
System.out.println("A");
} else if (score >= 80) {
System.out.println("B");
} else if (score >= 70) {
System.out.println("C");
}
Natija:
A3.6. Nested if
if ichida yana if yozish mumkin.
int age = 20;
boolean hasTicket = true;
if (age >= 18) {
if (hasTicket) {
System.out.println("Kirish mumkin");
} else {
System.out.println("Chipta yo‘q");
}
} else {
System.out.println("Yosh yetmaydi");
}
Lekin nested if ko‘payib ketsa, kod o‘qilishi qiyinlashadi.
Ko‘pincha buni && bilan soddalashtirish mumkin:
int age = 20;
boolean hasTicket = true;
if (age >= 18 && hasTicket) {
System.out.println("Kirish mumkin");
} else {
System.out.println("Kirish mumkin emas");
}
3.7. switch
switch bir qiymatni ko‘p variant bilan solishtirish uchun ishlatiladi.
Masalan, hafta kunlari:
int day = 3;
switch (day) {
case 1:
System.out.println("Dushanba");
break;
case 2:
System.out.println("Seshanba");
break;
case 3:
System.out.println("Chorshanba");
break;
default:
System.out.println("Noma’lum kun");
}Natija:
Chorshanba
3.8. break nima qiladi?
break - switch yoki loop’dan chiqib ketadi.
Agar switch ichida break yozilmasa, keyingi caselar ham bajarilib ketishi mumkin.
int day = 2;
switch (day) {
case 1:
System.out.println("Dushanba");
case 2:
System.out.println("Seshanba");
case 3:
System.out.println("Chorshanba");
default:
System.out.println("Noma’lum");
}
Natija:
Seshanba
Chorshanba
Noma’lum
Bu holat fall-through deyiladi.
To‘g‘ri variant:
int day = 2;
switch (day) {
case 1:
System.out.println("Dushanba");
break;
case 2:
System.out.println("Seshanba");
break;
case 3:
System.out.println("Chorshanba");
break;
default:
System.out.println("Noma’lum");
}Natija:
Seshanba3.9. Modern switch
Yangi Java versiyalarida switchni ixchamroq yozish mumkin.
int day = 3;
switch (day) {
case 1 -> System.out.println("Dushanba");
case 2 -> System.out.println("Seshanba");
case 3 -> System.out.println("Chorshanba");
default -> System.out.println("Noma’lum kun");
}Bu usulda odatda break kerak emas.
Yana qiymat qaytaradigan variant:
int day = 3;
String dayName = switch (day) {
case 1 -> "Dushanba";
case 2 -> "Seshanba";
case 3 -> "Chorshanba";
default -> "Noma’lum kun";
};
System.out.println(dayName);Natija:
Chorshanba3.10. for loop
for - kodni bir necha marta qayta bajarish uchun ishlatiladi.
for (int i = 1; i <= 5; i++) {
System.out.println(i);
}Natija:
1
2
3
4
5for uch qismdan iborat:
for (initialization; condition; update) {
// code
}Misolda:
for (int i = 1; i <= 5; i++)
Tushuntirish:
int i = 1 → boshlang‘ich qiymat
i <= 5 → shart
i++ → har aylanishdan keyin 1 taga oshadi3.11. for qanday ishlaydi?
Kod:
for (int i = 1; i <= 3; i++) {
System.out.println("i = " + i);
}Bajarilish tartibi:
1. i = 1
2. i <= 3 tekshiriladi → true
3. print
4. i++ → i = 2
5. i <= 3 tekshiriladi → true
6. print
7. i++ → i = 3
8. i <= 3 tekshiriladi → true
9. print
10. i++ → i = 4
11. i <= 3 tekshiriladi → false
12. loop tugaydiNatija:
i = 1
i = 2
i = 33.12. while
while - shart true bo‘lib turgan paytda kodni qayta-qayta bajaradi.
int i = 1;
while (i <= 5) {
System.out.println(i);
i++;
}Natija:
1
2
3
4
5for va while farqi:
for → necha marta aylanish taxminan ma’lum bo‘lsa
while → shart qachon false bo‘lishi oldindan aniq bo‘lmasaMasalan, user to‘g‘ri parol kiritmaguncha davom etish - whilega mos.
3.13. Infinite loop
Agar shart doim true bo‘lsa, loop hech qachon tugamaydi.
int i = 1;
while (i <= 5) {
System.out.println(i);
}Bu kodda i++ yo‘q. Shuning uchun i doim 1 bo‘lib qoladi.
Natija:
1
1
1
1
...Bu infinite loop deyiladi.
To‘g‘ri variant:
int i = 1;
while (i <= 5) {
System.out.println(i);
i++;
}3.14. do-while
do-while kamida bir marta bajariladi. Chunki shart oxirida tekshiriladi.
int i = 1;
do {
System.out.println(i);
i++;
} while (i <= 5);Natija:
1
2
3
4
5Farqni ko‘ramiz:
int i = 10;
while (i <= 5) {
System.out.println("while ishladi");
}Bu umuman ishlamaydi.
Lekin:
int i = 10;
do {
System.out.println("do-while ishladi");
} while (i <= 5);Natija:
do-while ishladiChunki do bloki avval bajariladi, keyin shart tekshiriladi.
3.15. break
break loop’ni to‘xtatadi.
for (int i = 1; i <= 10; i++) {
if (i == 5) {
break;
}
System.out.println(i);
}Natija:
1
2
3
4i == 5 bo‘lganda loop tugaydi.
3.16. continue
continue - hozirgi aylanishni tashlab, keyingi aylanishga o‘tadi.
for (int i = 1; i <= 5; i++) {
if (i == 3) {
continue;
}
System.out.println(i);
}Natija:
1
2
4
5i == 3 bo‘lganda System.out.println(i) bajarilmadi. Lekin loop davom etdi.
Farq:
break → loopni butunlay to‘xtatadi
continue → faqat bitta aylanishni tashlab ketadi3.17. return
return - metoddan chiqib ketadi.
public static void checkAge(int age) {
if (age < 18) {
System.out.println("Yosh yetmaydi");
return;
}
System.out.println("Kirish mumkin");
}Agar age < 18 bo‘lsa:
Yosh yetmaydichiqadi va metod tugaydi. Pastdagi kod bajarilmaydi.
return ko‘pincha kodni soddalashtirish uchun ishlatiladi.
Yomonroq o‘qiladigan variant:
public static void checkAge(int age) {
if (age >= 18) {
System.out.println("Kirish mumkin");
} else {
System.out.println("Yosh yetmaydi");
}
}Yaxshiroq variant:
public static void checkAge(int age) {
if (age < 18) {
System.out.println("Yosh yetmaydi");
return;
}
System.out.println("Kirish mumkin");
}Bu usul early return deyiladi.
3.18. Enhanced for-each loop
Array yoki collection ichidagi elementlarni aylanib chiqish uchun ishlatiladi.
Oddiy for:
String[] names = {"Ali", "Vali", "Sami"};
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
}for-each:
String[] names = {"Ali", "Vali", "Sami"};
for (String name : names) {
System.out.println(name);
}Natija:
Ali
Vali
SamiBu ancha o‘qilishi oson.
3.19. for va for-each farqi
Holat | Qaysi biri yaxshi |
|---|---|
Index kerak bo‘lsa |
|
Faqat elementlarni o‘qish kerak bo‘lsa |
|
Elementni index orqali o‘zgartirish kerak bo‘lsa |
|
Collection bo‘ylab oddiy yurish kerak bo‘lsa |
|
Misol: index kerak bo‘lsa:
String[] names = {"Ali", "Vali", "Sami"};
for (int i = 0; i < names.length; i++) {
System.out.println(i + ": " + names[i]);
}
Natija:
0: Ali
1: Vali
2: Sami3.20. Amaliy misol: baho chiqarish
public class Main {
public static void main(String[] args) {
int score = 76;
if (score >= 90) {
System.out.println("A");
} else if (score >= 80) {
System.out.println("B");
} else if (score >= 70) {
System.out.println("C");
} else if (score >= 60) {
System.out.println("D");
} else {
System.out.println("Failed");
}
}
}Natija:
C3.21. Amaliy misol: juft sonlarni chiqarish
public class Main {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
if (i % 2 != 0) {
continue;
}
System.out.println(i);
}
}
}Natija:
2
4
6
8
10Bu yerda:
i % 2 != 0son toq ekanini bildiradi. Agar son toq bo‘lsa, continue ishlaydi va print qilinmaydi.
3.22. Amaliy misol: kerakli userni topish
public class Main {
public static void main(String[] args) {
String[] users = {"Ali", "Vali", "Sami", "Hasan"};
String target = "Sami";
for (String user : users) {
if (user.equals(target)) {
System.out.println("User topildi: " + user);
break;
}
}
}
}Natija:
User topildi: SamiBu yerda break kerak. Chunki user topilgandan keyin loopni davom ettirish shart emas.
3.23. String solishtirishda muhim qoida
Java’da Stringni == bilan solishtirish odatda noto‘g‘ri.
Noto‘g‘ri:
String name = "Ali";
if (name == "Ali") {
System.out.println("Topildi");
}Ba’zan ishlagandek ko‘rinadi, lekin bu ishonchli usul emas.
To‘g‘ri:
String name = "Ali";
if (name.equals("Ali")) {
System.out.println("Topildi");
}Yana xavfsizroq variant:
String name = "Ali";
if ("Ali".equals(name)) {
System.out.println("Topildi");
}Nega bu xavfsizroq?
Agar name null bo‘lsa, mana bu kod xato beradi:
name.equals("Ali")Lekin bu xato bermaydi:
"Ali".equals(name)3.24. Beginner xatolar
Xato 1: else if tartibini noto‘g‘ri yozish
Noto‘g‘ri:
if (score >= 60) {
System.out.println("D");
} else if (score >= 90) {
System.out.println("A");
}To‘g‘ri:
if (score >= 90) {
System.out.println("A");
} else if (score >= 60) {
System.out.println("D");
}Xato 2: switchda break unutish
Noto‘g‘ri:
switch (status) {
case "NEW":
System.out.println("Yangi");
case "DONE":
System.out.println("Tugagan");
}To‘g‘ri:
switch (status) {
case "NEW":
System.out.println("Yangi");
break;
case "DONE":
System.out.println("Tugagan");
break;
}Yoki modern usul:
switch (status) {
case "NEW" -> System.out.println("Yangi");
case "DONE" -> System.out.println("Tugagan");
}Xato 3: Infinite loop
Noto‘g‘ri:
int i = 1;
while (i <= 10) {
System.out.println(i);
}To‘g‘ri:
int i = 1;
while (i <= 10) {
System.out.println(i);
i++;
}Xato 4: break va continueni adashtirish
break → loop tugaydi
continue → keyingi aylanishga o‘tadiMisol:
for (int i = 1; i <= 5; i++) {
if (i == 3) {
break;
}
System.out.println(i);
}Natija:
1
2for (int i = 1; i <= 5; i++) {
if (i == 3) {
continue;
}
System.out.println(i);
}Natija:
1
2
4
53.25. Kichik real misol: login tekshirish
public class Main {
public static void main(String[] args) {
String username = "admin";
String password = "12345";
boolean isBlocked = false;
if (isBlocked) {
System.out.println("Account bloklangan");
return;
}
if ("admin".equals(username) && "12345".equals(password)) {
System.out.println("Login muvaffaqiyatli");
} else {
System.out.println("Login yoki parol noto‘g‘ri");
}
}
}
Natija:
Login muvaffaqiyatliBu yerda ishlatilgan narsalar:
if
return
String equals
logical &&
boolean3.26. Qisqa xulosa
Control flow Java’da kod oqimini boshqaradi:
if / else → shart bo‘yicha qaror qilish
else if → bir nechta shartni tekshirish
switch → bitta qiymatni ko‘p variant bilan solishtirish
for → aniq miqdorda aylanish
while → shart true bo‘lsa aylanish
do-while → kamida bir marta bajariladigan loop
break → loop yoki switch’dan chiqish
continue → bitta aylanishni tashlab ketish
return → metoddan chiqish
for-each → array/collection elementlari bo‘ylab yurishEng muhim fikr:
Control flow - dasturga "qachon nima qilish kerak?" degan mantiqni beradi.