• MUSTAQIL ISHI
  • Iterator deb nomlangan
  • Mustaqil ishi tekshirdi: Jomurodov d jizzax 2022 Mavzu: Iteratorlar va funksional ob’ektlar Iterator, aslida, qiymatlar to'plamini takrorlash uchun "yield" operatoridan foydalanadigan kod blokidir




    Download 20.25 Kb.
    Sana03.11.2023
    Hajmi20.25 Kb.
    #93732
    Bog'liq
    Algoritm mustaqil ish 3


    Mirzo Ulug’bek nomidagi O’zbekiston
    Milliy universiteti Jizzax filialli
    Amaliy matematika fakulteti
    Axborot tizimlari va texnologiyalari
    21-21-guruh talabasi
    Bo’riboyev Diyorbekning
    “Algoritmik tillar va dasturlash” fanidan yozgan

    MUSTAQIL ISHI

    Tekshirdi: Jomurodov D


    Jizzax 2022

    Mavzu:  Iteratorlar va funksional ob’ektlar

    Iterator, aslida, qiymatlar to'plamini takrorlash uchun "yield" operatoridan foydalanadigan kod blokidir. Ushbu kod bloki xususiyatlarda usul, bayonot yoki "get" blokining tanasini ko'rsatishi mumkin.


    Iterator ikkita maxsus ko'rsatmalardan foydalanadi:
    yield return: qaytariladigan elementni belgilaydi
    yield break: ketma-ketlikda boshqa elementlar yo'qligini ko'rsatadi
    Kichik bir misolni ko'rib chiqing:
    Numbers numbers = new Numbers();
    foreach (int n in numbers)
    {
    Console.WriteLine(n);
    }
    class Numbers
    {
    public IEnumerator GetEnumerator()
    {
    for (int i = 0; i < 6; i++)
    {
    yield return i * i;
    }
    }
    }

    Numbers sinfida GetEnumerator() usuli aslida iteratorni ifodalaydi. Daromadni qaytarish bayonoti qandaydir qiymatni qaytaradi (bu holda raqamning kvadrati).


    Dasturda foreach tsikli yordamida biz oddiy to'plam kabi Numbers ob'ektini takrorlashimiz mumkin. Har bir element foreach siklida qabul qilinganda, rentabellikni qaytarish bayonoti ishga tushiriladi, bu bitta elementni qaytaradi va joriy pozitsiyani eslab qoladi.
    Iteratorlar tufayli biz foreach tsiklidagi raqamni osonlikcha takrorlashimiz mumkin:

    foreach(var n in 5) Console.WriteLine(n);


    foreach (var n in -5) Console.WriteLine(n);
    static class Int32Extension
    {
    public static IEnumerator GetEnumerator(this int number)
    {
    int k = (number > 0)? number: 0;
    for (int i = number - k; i <= k; i++) yield return i;
    }
    }
    Bunday holda, iterator int yoki System.Int32 turi uchun kengaytma usuli sifatida amalga oshiriladi. Iterator usulida biz aslida 0 dan joriy raqamgacha barcha butun qiymatlarni qaytaramiz. Konsol chiqishi:
    0
    1
    2
    3
    4
    5
    -5
    -4
    -3
    -2
    -1
    0

    Yana bir misol: deylik, bizda kompaniyani ifodalovchi va xodimlar qatorida Person obyektlari xodimlarini saqlaydigan Kompaniya kolleksiyasi bor. Ushbu to'plamni takrorlash uchun biz rentabellik bayonotidan foydalanamiz:


    class Person
    {
    public string Name { get; }
    public Person(string name) =>Name = name;
    }
    class Company
    {
    Person[] personnel;
    public Company(Person[] personnel) => this.personnel = personnel;
    public int Length => personnel.Length;
    public IEnumerator
    GetEnumerator()
    {
    for (int i = 0; i < personnel.Length; i++)
    {
    yield return personnel[i];
    }
    }
    }
    GetEnumerator() usuli iteratorni ifodalaydi. Va biz foreach siklida Kompaniya ob'ektini takrorlaganimizda, u yield return personalni[i]; deb chaqiradi. Daromadni qaytarish bayonoti chaqirilganda, joriy joylashuv saqlanadi. Va foreach usuli yangi ob'ektni olish uchun keyingi iteratsiyaga o'tganda, iterator o'sha joydan ishlashni boshlaydi.
    Xo'sh, foreach tsiklidagi asosiy dasturda iteratorning amalga oshirilishi tufayli haqiqiy sanab o'tiladi:
    var people = new Person[]
    {
    new Person("Tom"),
    new Person("Bob"),
    new Person("Sam")
    };
    var microsoft = new Company(people);
    foreach(Person employee in microsoft)
    {
    Console.WriteLine(employee.Name);
    }
    GetEnumerator() usulida iteratorni amalga oshirishda for tsiklida massiv iteratsiyasi ishlatilgan bo'lsa-da, bu talab qilinmaydi. Biz daromadni qaytarish bayonotiga bir nechta qo'ng'iroqlarni aniqlashimiz mumkin:
    public IEnumerator
    GetEnumerator()
    {
    yield return personnel[0];
    yield return personnel[1];
    yield return personnel[2];
    }
    Bunday holda, har safar daromadni qaytarish bayonoti chaqirilganda, iterator joriy joyni ham eslab qoladi va keyingi qo'ng'iroqlarda u erdan boshlanadi.
    Iterator deb nomlangan
    Yuqorida iterator yaratish uchun GetEnumerator usulidan foydalandik. Ammo rentabellik bayonoti har qanday usul ichida ishlatilishi mumkin, faqat shunday usul IEnumerable interfeys ob'ektini qaytarishi kerak. Bunday usullarni iteratorlar deb ham atashadi.
    Kompaniya sinfida shunday nomlangan iterator yaratamiz va undan foydalanamiz:
    class Person
    {
    public string Name { get; }
    public Person(string name) =>Name = name;
    }
    class Company
    {
    Person[] personnel;
    public Company(Person[] personnel) => this.personnel = personnel;
    public int Length => personnel.Length;
    public IEnumerable
    GetPersonnel(int max)
    {
    for (int i = 0; i < max; i++)
    {
    if (i == personnel.Length)
    {
    yield break;
    }
    else
    {
    yield return personnel[i];
    }
    }
    }
    }
    Bu yerda aniqlangan iterator IEnumerable GetPersonnel(int max) usuli bo'lib, u chiqish uchun ob'ektlar sonini parametr sifatida oladi. Dasturni amalga oshirish jarayonida uning qiymati xodimlar qatorining uzunligidan kattaroq bo'lishi mumkin. Va xatolikka yo'l qo'ymaslik uchun yield break bayonoti ishlatiladi. Ushbu bayonot iteratorning bajarilishini to'xtatadi.
    Iteratordan foydalanish:
    var people = new Person[]
    {
    new Person("Tom"),
    new Person("Bob"),
    new Person("Sam")
    };
    var microsoft = new Company(people);
    foreach(Person employee in microsoft.GetPersonnel(5))
    {
    Console.WriteLine(employee.Name);
    }

    Download 20.25 Kb.




    Download 20.25 Kb.

    Bosh sahifa
    Aloqalar

        Bosh sahifa



    Mustaqil ishi tekshirdi: Jomurodov d jizzax 2022 Mavzu: Iteratorlar va funksional ob’ektlar Iterator, aslida, qiymatlar to'plamini takrorlash uchun "yield" operatoridan foydalanadigan kod blokidir

    Download 20.25 Kb.