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.

🕑 15 daqiqa o‘qish 📄 724 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. foreach - eng ko'p ishlatiladigani
  2. for - indeks kerak bo'lganda
  3. while - takror soni oldindan noma'lum bo'lganda
  4. do-while - kamida bir marta bajariladi
  5. break va continue
  6. Ichma-ich sikllar
  7. Indeks va diapazon
  8. foreach va indeks birga
  9. Cheksiz sikl
  10. Qaysi siklni tanlash
  11. Xulosa

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:

CSHARP
string[] shaharlar = ["Namangan", "Andijon", "Samarqand"];

foreach (string shahar in shaharlar)
{
    Console.WriteLine($"  {shahar} - {shahar.Length} harf");
}
Natija
  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.

foreach ichida to'plamni o'zgartirib bo'lmaydi
CSHARP
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}");
}
Natija
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:

CSHARP
List<int> sonlar = [1, 2, 3, 4];
sonlar.RemoveAll(s => s == 2);
Console.WriteLine(string.Join(", ", sonlar));
Natija
1, 3, 4

for - indeks kerak bo'lganda #

CSHARP
for (int i = 1; i <= 5; i++)
{
    Console.WriteLine($"{i} ning kvadrati = {i * i}");
}
Natija
1 ning kvadrati = 1
2 ning kvadrati = 4
3 ning kvadrati = 9
4 ning kvadrati = 16
5 ning kvadrati = 25

for uch qismdan iborat:

QismMisolQachon bajariladi
Boshlanishint i = 1Bir marta, boshida
Sharti <= 5Har takrordan oldin
Qadami++Har takrordan keyin

Teskari yurish ham oson:

CSHARP
string[] shaharlar = ["Namangan", "Andijon", "Samarqand"];

for (int i = shaharlar.Length - 1; i >= 0; i--)
{
    Console.WriteLine($"{i}: {shaharlar[i]}");
}
Natija
2: Samarqand
1: Andijon
0: Namangan
Indeks noldan boshlanadi

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 #

CSHARP
int son = 1000;
int qadam = 0;

while (son > 1)
{
    son /= 2;
    qadam++;
}

Console.WriteLine($"1000 ni {qadam} marta ikkiga bo'lsak, 1 ga yetadi");
Natija
1000 ni 9 marta ikkiga bo'lsak, 1 ga yetadi

do-while - kamida bir marta bajariladi #

CSHARP
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}");
Natija
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 #

CSHARP
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
    }
}
Natija
Juft sonlar:
  8
  4
  22
10 dan katta birinchi son:
  15
Kalit so'zNima qiladi
continueJoriy takrorni tugatib, keyingisiga o'tadi
breakSiklni butunlay to'xtatadi

Ichma-ich sikllar #

CSHARP
for (int i = 1; i <= 3; i++)
{
    for (int j = 1; j <= 3; j++)
    {
        Console.Write($"{i * j,4}");
    }
    Console.WriteLine();
}
Natija
   1   2   3
   2   4   6
   3   6   9
Ichma-ich sikl narxi

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:

CSHARP
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])}");
Natija
Oxirgi element:     60
Oxiridan ikkinchi:  50
Birinchi uchtasi:   10, 20, 30
Uchinchidan keyin:  40, 50, 60
O'rtadagilar:       20, 30, 40, 50
YozuvMa'nosi
^1Oxiridan birinchi (oxirgi element)
..3Boshidan 3-indeksgacha (3 kirmaydi)
3..3-indeksdan oxirigacha
1..^1Birinchi va oxirgisidan tashqari hammasi
Diapazon chegarasi qo'shilmaydi

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:

CSHARP
string[] shaharlar = ["Namangan", "Andijon", "Samarqand"];

foreach ((string shahar, int indeks) in shaharlar.Select((s, i) => (s, i)))
{
    Console.WriteLine($"{indeks + 1}. {shahar}");
}
Natija
1. Namangan
2. Andijon
3. Samarqand

Select - LINQ metodi, u haqda 15-bo'limda gaplashamiz. Oddiyroq yechim - shunchaki for ishlatish.

Cheksiz sikl #

CSHARP
int son = 0;

while (true)
{
    son++;
    if (son >= 3)
    {
        break;
    }
}

Console.WriteLine($"Sikl {son} da to'xtadi");
Natija
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.

Tasodifiy cheksiz sikl

Eng ko'p uchraydigan sabab - hisoblagichni oshirishni unutish:

CSHARP
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 #

VaziyatSikl
To'plamdagi har bir elementforeach
Indeks kerak yoki qadam 1 emasfor
Teskari yurish yoki element o'chirishfor
Takror soni oldindan noma'lumwhile
Kamida bir marta bajarilishi shartdo-while
Amaliy topshiriq
  1. foreach bilan shaharlar ro'yxatini chiqaring.
  2. for bilan 1 dan 10 gacha sonlarning kvadratini chiqaring.
  3. Massivni teskari tartibda chiqaring.
  4. while bilan sonni necha marta 2 ga bo'lish mumkinligini hisoblang.
  5. continue yordamida faqat toq sonlarni chiqaring.
  6. break bilan 100 dan katta birinchi sonni toping.
  7. Ichma-ich sikl bilan 5x5 ko'paytirish jadvalini chizing.
  8. ^1, ..3 va 1..^1 diapazonlarini o'z massivingizda sinang.
  9. foreach ichida ro'yxatdan element o'chirib, istisnoni ko'ring.
  10. Ataylab cheksiz sikl yozib, Ctrl + C bilan to'xtating.

Xulosa #

  • foreach - to'plam bo'ylab yurishning eng xavfsiz usuli.
  • foreach ichida to'plamni o'zgartirib bo'lmaydi - RemoveAll yoki teskari for ishlating.
  • for indeks kerak bo'lganda; oxirgi indeks har doim Length - 1.
  • while takror soni noma'lum bo'lganda, do-while kamida bir marta bajarilishi shart bo'lganda.
  • continue joriy takrorni o'tkazadi, break siklni to'xtatadi.
  • Ichma-ich sikl narxi ko'paytiriladi - n * m.
  • ^1 oxirgi element, a..b diapazon; tugash chegarasi qo'shilmaydi.
  • Sikl yozgach so'rang: "shart qachon false bo'ladi?"

Keyingi bo'limda massivlar va to'plamlarni o'rganamiz.

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.