O’zbekiston respublikasi oliy va o’rta maxsus ta’lim vazirligi farg’ona davlat universiteti kurs ishi mavzu: C# dasturlash tilida dasturlashda lambda-ifodadan foydalanish bajardi


Lambda ifodasini vazifa sifatida ishlatish


Download 229.99 Kb.
bet4/4
Sana05.06.2020
Hajmi229.99 Kb.
#114689
1   2   3   4
Bog'liq
O

2.3 Lambda ifodasini vazifa sifatida ishlatish


Odatiy metodni vazifa sifatida ishlatishdan tashqari, yana bir oqilona yondashuv mavjud: lambda ifodasini alohida hal qilingan muammo sifatida belgilash!

Eslatib o'tamiz, lambda ifodalari anonim funksiyalarning maxsus shakli hisoblanadi. Shuning uchun ularni alohida vazifalar sifatida bajarish mumkin.

Lambda ifodalari, ayniqsa metodning yagona maqsadi bir martalik vazifani hal qilishda foydalidir. Lambda ifodalari alohida vazifa bo'lishi yoki boshqa metodlarga murojaat qilishi mumkin. Lambda ifodasini vazifa sifatida ishlatish chiroyli ko’rinish oladi.

Quyidagi dasturda lambda ifodasini vazifa sifatida ishlatilishini namoyish etadi.



using System;
using System.Threading;
using System.Threading.Tasks;

    class DemoLambdaTask


    {
        
static void Main() 
        {
                
Task tsk = Task.Factory.StartNew( () => {
                
Console.WriteLine("Vazifa boshlandi");
                
for (int count = 0; count < 10; count++)
                {
                    
Thread.Sleep(500);
                    
Console.WriteLine("Muammolar soni " + count );
                }
                
Console.WriteLine("Vazifa tugadi.");
            } );
            tsk.
Wait();
            tsk.
Dispose();
            
Console.WriteLine("Asosiy qism tugadi.");
            
Console.ReadKey();
        }
    }

Dastur natijasi quyidagicha:




    

Izoh: Vazifani tasvirlash uchun lambda ifodasini ishlatishdan tashqari, tsk.Dispose() metodiga tsk.Wait () metodi qaytmaguncha murojat qilinmasligiga e'tibor bering. Dispose() metodi faqat vazifaning oxirida chaqirilishi mumkin, buni tekshirish uchun tsk.Wait() metodini chaqirishdan oldin bu yerda tasvirlangan dasturda tsk. Dispose() metodini chaqirib ko'ring. Bu favqulodda vaziyatga olib kelishini darhol sezasiz.

III-BOB. LAMBDA-IFODALAR VA MAHALLIY FUNKSIYALAR

3.1 Lambda ifodalari va mahalliy funksiyalarni taqqoslash


Bir qarashda mahalliy funksiyalar va lambda ifodalari juda o'xshash. Ko'pgina hollarda lambda ifodalari va mahalliy funksiyalarni  tanlash uslubi va shaxsiy xohishga bog'liq bo’ladi. Biroq, siz bilishingiz kerak bo'lgan birini yoki boshqasini ishlatishingiz mumkin bo'lgan haqiqiy farqlar mavjud.

Mahalliy funksiyalar nomlarga egaLambda iboralari anonim usul bo'lib, ular Func yoki Action turlarga bo'linadi. 



Mahalliy funksiyani e'lon qilganingizda, argument turlari va qaytish turi funksiya deklaratsiyasining bir qismidir. Lambda ifodasi tanasining bir qismi bo'lish o'rniga, argument turlari va qaytish turi lambda ifodasining o'zgaruvchan turi deklaratsiyasining bir qismidir. 

Mahalliy funksiyalar lambda iboralariga qaraganda aniq tayinlash uchun turli xil qoidalarga ega. Mahalliy funksiya deklaratsiyasiga har qanday kod joylashgan joyda murojaat qilish mumkin. Lambda ifodasi o'zgaruvchiga kirishdan oldin unga tayinlanishi kerak (yoki lambda ifodasiga murojaat qiladigan vakil orqali chaqiriladi.) Ushbu farqlar shuni anglatadiki, rekursiv algoritmlarni mahalliy funksiyalar yordamida yaratish osonroq. O'zini chaqiradigan mahalliy funksiyani e'lon qilishingiz va belgilashingiz mumkin. Lambda ifodalari e'lon qilinishi kerak va bir xil lambda ifodasiga murojaat qiladigan tanaga qayta tayinlanishidan oldin standart qiymat belgilanishi kerak.

Belgilangan tayinlash qoidalari, shuningdek, mahalliy funksiya yoki lambda ifodasi bilan olingan har qanday o'zgaruvchiga ta'sir qiladi. Ikkala mahalliy funksiyalar va lambda ifoda qoidalari har qanday qo'lga kiritilgan o'zgaruvchilar mahalliy funksiya yoki lambda ifodasi delegatga aylantirilganda aniq belgilanishini talab qiladi. Farqi shundaki, lambda ifodalari ular e'lon qilinganida delegatlarga aylantiriladi. Mahalliy funksiyalar faqat vakil sifatida ishlatilganda va delegatlarga aylantiriladi. Agar siz mahalliy funksiyani e'lon qilsangiz va uni faqat metod kabi chaqirib murojaat qilsangiz, u vakilga aylantirilmaydi. Ushbu qoida mahalliy funksiyani o'z ichiga qamrab oladigan har qanday qulay joyda e'lon qilish imkoniyatini beradi. Qayta tiklash bayonotlaridan so'ng mahalliy funktsiyalarni asosiy usul oxirida e'lon qilish odatiy holdir.

Uchinchidan, kompilyator mahalliy funksiyalarni o'rab turgan doirada aniqlangan parametrlarni aniq belgilashga imkon beradigan statik tahlilni amalga oshirishi mumkin. Ushbu misolni ko'rib chiqing:



int M()

{

int y;

LocalFunction();

return y;
void LocalFunction() => y = 0;

}

Mahalliy funksiyalar lambda ifodalariga nisbatan ortiqcha tuyulishi mumkin bo'lsa-da, aslida turli xil maqsadlarda qo'llaniladi. Mahalliy funksiyalar faqat boshqa metodning kontekstidan chaqiriladigan funksiyani yozishni istagan holatlar uchun samaraliroq bo'ladi.


3.2 Lambda-ifodalari orqali dasturlar tuzish


Lambda-ifodalaridan foydalanishda kirish parametrlari turlari aniq yoki barchasi aniq bo'lishi kerak, aks holda CS0748 kompilyator xatosi yuz beradi.

  1. using System;
    namespace Lambda_1
    {
        
    class Program
        {
            
    delegate int Operation(int x, int y);
            
    static void Main(string[] args)
            {
                Operation operation = (x, y) => x + y;
                
    Console.WriteLine(operation(10, 20));
                
    Console.WriteLine(operation(40, 20));
                
    Console.ReadKey();
            }
        }
    }


    Dastur natijasi:





  1. using System;
    namespace Lambda_2
    {
        
    class Program
        {
            
    delegate int kvadrat(int x);
            
    static void Main(string[] args)
            {
                kvadrat k = i => i * i;
                
    Console.Write("Sonni kiriting: ");
                
    int a=int.Parse(Console.ReadLine());
                
    Console.WriteLine("Uning kvadrati: "+k(a));
                
    Console.ReadKey();
            }
        }
    }



Dastur natijasi:


using
System;
namespace Funk_2
{
    
class Program
    {
        
public static int r (int x)
        {
            
int y=x*x; return y;
        }
        
static void Main(string[] args)
        {
            
Console.Write("Sonni kiriting: ");
            
int a=int.Parse(Console.ReadLine());
            
Console.WriteLine("Uning kvadrati: "+r(a));
            
Console.ReadKey();
        }
    }
}



using System;
namespace Lambda_3
{
    class Program
    {
        delegate void Salom();
        static void Main(string[] args)
        {
            Salom s1 = () => Console.WriteLine("Salom!");
            Salom s2 = () => Console.WriteLine("Xush kelibsiz.");
            s1(); s2();
            Console.ReadKey();
        }
    }
}

Dastur natijasi:


using System;

namespace Lambda_3
{
    class Program
    {
        public static void Salom()
        {
            Console.WriteLine("Salom!");
            Console.WriteLine("Xush kelibsiz.");
        }
        static void Main(string[] args)
        {
            Salom();
            Console.ReadKey();
        }
    }
}



  1. using System;

    namespace Lambda_4
    {
        
    class Program
        {
            
    delegate void ChangeHandler(ref int x);
            
    static void Main(string[] args)
            {
                
    Console.Write("Sonni kiriting: ");
                
    int x = int.Parse(Console.ReadLine());
                ChangeHandler ch = (
    ref int n) => n = n * 2;
                ch(
    ref x);
                
    Console.WriteLine(x);
                
    Console.ReadKey();
            }
        }
    }

    Dastur natijasi:





  1. using System;

    namespace Lambda_5
    {
        
    class Program
        {
            
    delegate void Hello();
            
    static void Main(string[] args)
            {
                Hello message = () =>
    Show_Message();
                message();
                
    Console.ReadKey();
            }
            
    private static void Show_Message()
            {
                
    Console.WriteLine("Assalomu alaykum!");
            }
        }
    }


Dastur natijasi:




  1. using System;

    namespace Lambda_6
    {
        
    class Program  
        {
            
    delegate bool IsEqual(int x);
             
            
    static void Main(string[] args)
            {
                
    int[] integers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
                
    int result1 = Sum(integers, x => x > 5);
                
    Console.WriteLine(result1);
                
    int result2 = Sum(integers, x => x % 2 == 0);
                
    Console.WriteLine(result2);
                
    Console.ReadKey();
            }
         
            
    private static int Sum (int[] numbers, IsEqual func)
            {
                
    int result = 0;
                
    foreach(int i in numbers)
                {
                    
    if (func(i))
                        result += i;
                }
                
    return result;
            }
        }
    }




Dastur natijasi:


MAVZUGA OID TESTLAR

Standart testlar


№1 Fan bobi - ; Fan bo’limi- ; Qiyinlik darajasi-.

Lambda ifodasi tuzilishiga ko’ra necha turga bo’linadi?

2

4

3

6

№2 Fan bobi -; Fan bo’limi-; Qiyinlik darajasi-.



Blokli lambda ifodasini yaratishda uning tanasi qanday qavsga o’raladi?

Katta qavs

O’rta qavs

Kichik qavs

Qavsga o’ralmaydi

№3 Fan bobi -; Fan bo’limi - ; Qiyinlik darajasi-



Lambda operatori qaysi javobda to’g’ri ko’rsatilgan?

=>

=

<>

<=>

№4 Fan bobi -; Fan bo’limi-; Qiyinlik darajasi-.



Nima noma'lum usullarning kengaytmasi bo'lib, ular aniq kiritilmagan parametrlar va qiymatlarni qaytarishga imkon beradi.

Lambda ifodalar

Delegatlar

Anonim usullar

Mahalliy funksiyalar

№5 Fan bobi -; Fan bo’limi-; Qiyinlik darajasi-.



Lambda operatori qaysi operator bilan bir xil ustuvorlikka ega hisoblanadi?

Tayinlash

Tanlash

Shart

Taqqoslash

№6 Fan bobi -; Fan bo’limi-; Qiyinlik darajasi-.



Qiymat qaytarmaydigan lambda-ifodalarini qanday delegat turlariga o’tkazish mumkin

ActionDelegat

Bunday lambda-ifodalar mavjud emas

Lambda-ifodalarini delegat turlariga o’tkazib bo’lmaydi.

FuncDelegat

№7 Fan bobi -; Fan bo’limi-; Qiyinlik darajasi-.



Rekusiv algoritmlarni quyidagilarda qaysi biri yordamida yaratish osonroq?

Mahalliy funsiyalar

Lambda ifodalar

Anonim usullar

Ifoda daraxti

№8 Fan bobi -; Fan bo’limi-; Qiyinlik darajasi-.



Blokli lambda ifodalari tanasi eng ko’pi bilan nechta ifodadan iborat bo’lishi mumkin?

Cheklanmagan

2

3

5

№9 Fan bobi -; Fan bo’limi-; Qiyinlik darajasi-.



Lambda-ifodasi birinchi bor C# ning qaysi versiyasida qo’llanilgan?

3.0

3.5

2.0

5.1


Nosdantart testlar


  1. Lambda ifodasining berilishini to’g’ri ketma-ketlikda belgilang.

A

Lambda-ifodasi tanasi

B

Kirish parametri

C

Lambda operatori

Javob:

1-

2-

3­-

Javobi:

Javob:

1-B

2-C

3­-A



  1. Quyida noto’g’ri berilgan mulohazani aniqlang.

1

Lambda ifodalari daraxt-ifodalar qurilishida keng qo'llaniladi.

2

Lambda ifodalari alohida vazifa bo'lishi mumkin.

3

Lambda ifodalari boshqa usullarga murojaat qilishi mumkin.

4

tashqi o'zgaruvchilar lambda ifodalarida anonim usullarda bo'lgani kabi ishlatilishi va olinishi mumkin emas.

Javob:




Javobi:

Javob:

4



  1. a) mahalliy funksiyalar b) lambda ifodalar
    Mulohazani yuqoridagi so’zlardan mosini qo’yib to’ldiring:

(1) ­­­­­­­­_________________ nomlarga ega. (2)_________________ anonim usul bo'lib, ular Func yoki Action turlarga bo'linadi. (3)_________________ deklaratsiyasiga har qanday kod joylashgan joyda murojaat qilish mumkin. (4)_______________ o'zgaruvchiga kirishdan oldin unga tayinlanishi kerak. (5)_______________ ular e'lon qilinganida delegatlarga aylantiriladi. (6)___________________ faqat vakolat sifatida ishlatilganda vakolatxonalarga aylantiriladi.

Javob:

1-

2-

3-

4-

5-

6-

Javobi:

Javob:

1-a

2-b

3-a

4-b

5-b

6-a



  1. Quyidagilarni mosini belgilang.


  1. kkita parametrga ega va hech qanday qiymatga ega bo'lmagan lambda ifodasi … vakiliga aylantirilishi mumkin. 

    1. Func

  1. Bitta parametrga ega va qiymatni qaytaradigan lambda ifodasi … vakiliga aylantirilishi mumkin.

    1. Action

Javob:

1-

2-

Javobi:

Javob:

1-b

2-a

  1. To’g’ri fikrlarni aniqlang. Javoblar jadvaliga “ha” yoki “yo’q” so’zlarini yozing.
    1) Har qanday lambda ifodasi delegat turiga aylantirilishi mumkin.
    2) Blokli lambda-ifodalarining mazmuni har qanday sonli ifodalardan
    3) Agar lambda ifodasida bir nechta parametr ishlatilsa, ular qavs ichiga o'ralgan bo'lishi kerak.
    4) Lambda ifodalari anonim funksiyalarning maxsus shakli hisoblanganligi uchun ularni alohida vazifalar sifatida bajarish mumkin.
    5) Lambda ifodalari faqat LINQ bilan ishlashda ishlatiladi.

Javob:





3)

4)

5)

Javobi:

Javob:

  1. ha

  1. yo’q

3) ha

4) ha

5) yo’q

  1. Quyidagi C# ga doir atamalar va ularning xususiyatlarini juftlang.

  1. Lambda operatori

  1. …ning tanasida bir nechta operatorlarni ko'rsatishga ruxsat beriladi.

  1. Blokli lambda-ifodasi

  1. … bu o'rnatilgan so'rovlar tili

  1. LINQ

  1. … lambda ifodalarini e'lon qilish uchun ishlatiladi.

  1. anonim usul

  1. Lambda ifodasi … ni ifodalashning qisqa usulidir.

Javob:

1-

2-

3-

4-

Javobi:

Javob:

1-c

2-a

3-b

4-d


XULOSA


Bu kurs ishida turli dasturlar tuzishda lambda-ifodalaridan foydalanish metodikasi ko’rib chiqildi. Lambda-ifodalari – anonim funktsiyalar singari ishlatiladi , farqi shuki, Lambda ifodalarida siz kiritgan qiymat turini ko'rsatishingiz shart emas, shuning uchun uni ishlatish uchun yanada moslashuvchan qiladi. Lambda ifodasi anonim funksiya bo'lib, asosan LINQda delegatlar yaratish uchun ishlatiladi. Oddiy qilib aytganda, bu deklaratsiyasiz usul, ya'ni kirish modifikatori, qaytish qiymati deklaratsiyasi va nomi.

Lambda ifodasi anonim usulni ifodalashning qisqa usulidir. Anonim usullar ham, Lambda ifodalari ham usulning bajarilishini ichki qismni aniqlashga imkon beradi, ammo anonim usul aniq usuldan parametr turlarini va qaytish turini aniqlashni talab qiladi. Lambda ifodasi C # 3.0 tipidagi infer xususiyatidan foydalanadi, bu esa kompilyatorga kontekst asosida o'zgaruvchining turini aniqlashga imkon beradi. Bu juda qulay, chunki bu biz yozishda juda ko'p narsalarni ya’ni olgan sinfga alohida usulni e'lon qilish va yozish harakatini tejaydi. Usul faqat bir marta ishlatiladigan va usulning ta'rifi qisqa bo'lgan joylarda ayniqsa foydali!

FOYDALANILGAN ADABIYOTLAR


  1. O’zbekiston Respublikasi “Kadrlar tayyorlash m illiy dasturi “to’g’risidagi qonuni, “ Xalq ta’limi jurnali“, 1998 yil, 2- soni.

  2. I.A.Karimov “Barkamol avlod - O’zbekiston taraq qiyotining poydevori” Toshkent, Sharq nashriyoti , 1999 yil.

  3. Paul Short “Lambdas in C#” 2013 year.

  4. Герберд Шилдт “C# 4.0: полное руководствo” 2011 г.

  5. GoalKicker.com “C# Notes for Professionals”.

  6. https://www.geeksforgeeks.org/lambda-expressions-in-c-sharp/.

  7. https://www.codingame.com/playgrounds/213/using-c-linq---a-practical-overview/lambda-expressions


Download 229.99 Kb.

Do'stlaringiz bilan baham:
1   2   3   4




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling