6-bo‘lim
Sikllar
for, while, do-while va foreach sikllari, break va continue, ichma-ich sikllar, indeks va diapazon amallari hamda cheksiz sikl tuzoqlari.
Ushbu bo‘lim mundarijasi
Sikl - bir amalni ko'p marta takrorlash vositasi. C# da to'rt xil sikl bor va har birining o'z o'rni bor.
foreach - eng ko'p ishlatiladigani #
To'plamdagi har bir element bo'ylab yuradi:
string[] shaharlar = ["Namangan", "Andijon", "Samarqand"];
foreach (string shahar in shaharlar)
{
Console.WriteLine($" {shahar} - {shahar.Length} harf");
}
Namangan - 8 harf
Andijon - 7 harf
Samarqand - 9 harf
Indeks bilan ovora bo'lish shart emas, chegaradan chiqib ketish
mumkin emas. Ro'yxat bo'ylab yurish kerak bo'lsa - foreach.
List<int> sonlar = [1, 2, 3, 4];
try
{
foreach (int son in sonlar)
{
if (son == 2)
{
sonlar.Remove(son);
}
}
}
catch (InvalidOperationException x)
{
Console.WriteLine($"Istisno: {x.Message}");
}
Istisno: Collection was modified; enumeration operation may not execute.
Sikl davomida element qo'shish yoki o'chirish istisnoga olib keladi.
Yechim: for sikli bilan teskari yo'nalishda yuring yoki
RemoveAll ishlating:
List<int> sonlar = [1, 2, 3, 4];
sonlar.RemoveAll(s => s == 2);
Console.WriteLine(string.Join(", ", sonlar));
1, 3, 4
for - indeks kerak bo'lganda #
for (int i = 1; i <= 5; i++)
{
Console.WriteLine($"{i} ning kvadrati = {i * i}");
}
1 ning kvadrati = 1
2 ning kvadrati = 4
3 ning kvadrati = 9
4 ning kvadrati = 16
5 ning kvadrati = 25
for uch qismdan iborat:
| Qism | Misol | Qachon bajariladi |
|---|---|---|
| Boshlanish | int i = 1 | Bir marta, boshida |
| Shart | i <= 5 | Har takrordan oldin |
| Qadam | i++ | Har takrordan keyin |
Teskari yurish ham oson:
string[] shaharlar = ["Namangan", "Andijon", "Samarqand"];
for (int i = shaharlar.Length - 1; i >= 0; i--)
{
Console.WriteLine($"{i}: {shaharlar[i]}");
}
2: Samarqand
1: Andijon
0: Namangan
shaharlar[0] - birinchi element, shaharlar[2] - uchinchi va
oxirgisi.
Shuning uchun oxirgi indeks har doim Length - 1. Eng ko'p
uchraydigan xato - i <= Length yozib qo'yish; u
IndexOutOfRangeException beradi.
while - takror soni oldindan noma'lum bo'lganda #
int son = 1000;
int qadam = 0;
while (son > 1)
{
son /= 2;
qadam++;
}
Console.WriteLine($"1000 ni {qadam} marta ikkiga bo'lsak, 1 ga yetadi");
1000 ni 9 marta ikkiga bo'lsak, 1 ga yetadi
do-while - kamida bir marta bajariladi #
int[] kiritilgan = [0, 0, 7];
int indeks = 0;
int qiymat;
do
{
qiymat = kiritilgan[indeks];
Console.WriteLine($"Tekshirilmoqda: {qiymat}");
indeks++;
}
while (qiymat == 0 && indeks < kiritilgan.Length);
Console.WriteLine($"Nolga teng bo'lmagan qiymat: {qiymat}");
Tekshirilmoqda: 0
Tekshirilmoqda: 0
Tekshirilmoqda: 7
Nolga teng bo'lmagan qiymat: 7
Shart oxirida tekshirilgani uchun tana kamida bir marta ishlaydi. Bu foydalanuvchidan to'g'ri ma'lumot so'raganda qulay.
break va continue #
int[] sonlar = [3, 8, 15, 4, 22, 7];
Console.WriteLine("Juft sonlar:");
foreach (int son in sonlar)
{
if (son % 2 != 0)
{
continue; // toqni o'tkazib yuboradi
}
Console.WriteLine($" {son}");
}
Console.WriteLine("10 dan katta birinchi son:");
foreach (int son in sonlar)
{
if (son > 10)
{
Console.WriteLine($" {son}");
break; // siklni butunlay to'xtatadi
}
}
Juft sonlar:
8
4
22
10 dan katta birinchi son:
15
| Kalit so'z | Nima qiladi |
|---|---|
continue | Joriy takrorni tugatib, keyingisiga o'tadi |
break | Siklni butunlay to'xtatadi |
Ichma-ich sikllar #
for (int i = 1; i <= 3; i++)
{
for (int j = 1; j <= 3; j++)
{
Console.Write($"{i * j,4}");
}
Console.WriteLine();
}
1 2 3
2 4 6
3 6 9
Tashqi sikl n marta, ichkisi m marta aylansa, tana n * m marta
bajariladi.
Uchga uch - to'qqiz marta, muammo yo'q. Lekin ikkalasi ham 10 000 marta aylansa, bu 100 million amal degani va dastur sezilarli sekinlashadi.
Ichma-ich sikl yozayotganingizda har doim "eng katta holatda necha marta aylanadi?" deb o'zingizdan so'rang.
Indeks va diapazon #
C# 8 dan boshlab massivning bir qismini ajratib olish juda qulay:
int[] sonlar = [10, 20, 30, 40, 50, 60];
Console.WriteLine($"Oxirgi element: {sonlar[^1]}");
Console.WriteLine($"Oxiridan ikkinchi: {sonlar[^2]}");
Console.WriteLine($"Birinchi uchtasi: {string.Join(", ", sonlar[..3])}");
Console.WriteLine($"Uchinchidan keyin: {string.Join(", ", sonlar[3..])}");
Console.WriteLine($"O'rtadagilar: {string.Join(", ", sonlar[1..^1])}");
Oxirgi element: 60
Oxiridan ikkinchi: 50
Birinchi uchtasi: 10, 20, 30
Uchinchidan keyin: 40, 50, 60
O'rtadagilar: 20, 30, 40, 50
| Yozuv | Ma'nosi |
|---|---|
^1 | Oxiridan birinchi (oxirgi element) |
..3 | Boshidan 3-indeksgacha (3 kirmaydi) |
3.. | 3-indeksdan oxirigacha |
1..^1 | Birinchi va oxirgisidan tashqari hammasi |
sonlar[..3] uchta element beradi: 0, 1 va 2-indekslar. 3-indeks
kirmaydi.
Buni shunday eslash oson: [boshlanish..tugash] da tugash nuqtasi
"shu yergacha, o'zi kirmaydi" degani. Xuddi for (i = 0; i < 3; i++)
kabi.
foreach va indeks birga #
Ba'zan ham element, ham uning tartib raqami kerak bo'ladi:
string[] shaharlar = ["Namangan", "Andijon", "Samarqand"];
foreach ((string shahar, int indeks) in shaharlar.Select((s, i) => (s, i)))
{
Console.WriteLine($"{indeks + 1}. {shahar}");
}
1. Namangan
2. Andijon
3. Samarqand
Select - LINQ metodi, u haqda 15-bo'limda gaplashamiz. Oddiyroq
yechim - shunchaki for ishlatish.
Cheksiz sikl #
int son = 0;
while (true)
{
son++;
if (son >= 3)
{
break;
}
}
Console.WriteLine($"Sikl {son} da to'xtadi");
Sikl 3 da to'xtadi
while (true) ataylab cheksiz sikl yaratadi va undan break bilan
chiqiladi. Bu to'g'ri usul - masalan menyu ko'rsatadigan dasturda.
Eng ko'p uchraydigan sabab - hisoblagichni oshirishni unutish:
int i = 0;
while (i < 10)
{
Console.WriteLine(i);
// i++ unutilgan - sikl hech qachon tugamaydi
}
Dastur qotib qoladi va uni Ctrl + C bilan to'xtatish kerak
bo'ladi.
Ikkinchi sabab - shartni noto'g'ri yozish: while (i > 0) deb, i ni
esa oshirib borish.
Sikl yozgach, o'zingizdan so'rang: "shart qachon false bo'ladi?"
Javob topolmasangiz, sikl cheksiz.
Qaysi siklni tanlash #
| Vaziyat | Sikl |
|---|---|
| To'plamdagi har bir element | foreach |
| Indeks kerak yoki qadam 1 emas | for |
| Teskari yurish yoki element o'chirish | for |
| Takror soni oldindan noma'lum | while |
| Kamida bir marta bajarilishi shart | do-while |
foreachbilan shaharlar ro'yxatini chiqaring.forbilan 1 dan 10 gacha sonlarning kvadratini chiqaring.- Massivni teskari tartibda chiqaring.
whilebilan sonni necha marta 2 ga bo'lish mumkinligini hisoblang.continueyordamida faqat toq sonlarni chiqaring.breakbilan 100 dan katta birinchi sonni toping.- Ichma-ich sikl bilan 5x5 ko'paytirish jadvalini chizing.
^1,..3va1..^1diapazonlarini o'z massivingizda sinang.foreachichida ro'yxatdan element o'chirib, istisnoni ko'ring.- Ataylab cheksiz sikl yozib,
Ctrl + Cbilan to'xtating.
Xulosa #
foreach- to'plam bo'ylab yurishning eng xavfsiz usuli.foreachichida to'plamni o'zgartirib bo'lmaydi -RemoveAllyoki teskariforishlating.forindeks kerak bo'lganda; oxirgi indeks har doimLength - 1.whiletakror soni noma'lum bo'lganda,do-whilekamida bir marta bajarilishi shart bo'lganda.continuejoriy takrorni o'tkazadi,breaksiklni to'xtatadi.- Ichma-ich sikl narxi ko'paytiriladi -
n * m. ^1oxirgi element,a..bdiapazon; tugash chegarasi qo'shilmaydi.- Sikl yozgach so'rang: "shart qachon
falsebo'ladi?"
Keyingi bo'limda massivlar va to'plamlarni o'rganamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.