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


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

MUNDARIJA


KIRISH 3

I-BOB. LAMBDA-IFODALARI VA ULARDAN FOYDALANISH USULLARI 5

1.1 Lambda-ifodasining kelib chiqishi 5

1.2 Lambda-ifodalaridan foydalanish metodlari 6

II-BOB. LAMBDA-IFODALARINING BERILISH USULLARI 11

2.1 Yagona lambda-ifodalari 11

2.2 Blokli lambda-ifodalar 15

2.3 Lambda ifodasini vazifa sifatida ishlatish 19

III-BOB. LAMBDA-IFODALAR VA MAHALLIY FUNKSIYALAR 22

3.1 Lambda ifodalari va mahalliy funksiyalarni taqqoslash 22

3.2 Lambda-ifodalari orqali dasturlar tuzish 24

MAVZUGA OID TESTLAR 31

Standart testlar 31

Nosdantart testlar 33

XULOSA 36

FOYDALANILGAN ADABIYOTLAR 37




KIRISH


O’zbеkistоn mustаqil dаvlаt bo’lgаndаn bеri biz yoshlаrni yangichа hаyotgа yеtаklаdi. Mustаqillik yangichа yashаshni tаlаb qildi, yangichа fikrlаmаsdаn, аniqrоg’i dunyoqаrаshni o’zgаrtirmаsdаn yangichа yashаsh mumkin emаsligi yaqqоl аyon bo’ldi. Mustаqillikni аsrаb аvаylаydigan, o’z yurtigа sаdоqаtli, mа`nаn yuksаk, buyuk аjdоdlаr аn`аnаsini munоsib dаvоm ettirа оlаdigаn, bаrkаmоl аvlоdni tаrbiyalаb vоyagа еtkаzishni mаqsаd qilgаn mukаmmаl tizim zаrur edi.

Аnа shu mаqsаdni аmаlgа оshirish uchun O’zbеkistоn Prеzidеnti I.Kаrimоv tаshаbbusi vа bеvоsitа rаhbаrligidа kаdrlаr tаyyorlаsh milliy mоdеli yarаtildi.

“Jahon sivilizatsiyasiga dahldor bo‘lgan eng zamonaviy ilmlarni egallamay turib, mamlakat taraqqiyotini ta’minlash qiyin”, - degan edilar I.Karimov.

Ushbu kurs ishi aynan shu maqsadda yozilgan bo‘lib, u fanni o‘qitishda Respublikamizda to‘plangan ko‘p yillik pedagogik tajribalarni ilmiy tahlildan o‘tkazish natijasida hosil bo‘lgan xulosalarga hamda Davlat ta’lim standartlariga mos na’munaviy dastur va unga mos ishchi dasturlarga asoslangandir.

C # ning 3.0 versiyasida uning mohiyatini aniqlaydigan va dasturlash tillarini rivojlanishini yangi bosqichga olib chiqadigan xususiyatlar kiritildi deyish mubolag'a bo'lmaydi. Ko'plab yangi xususiyatlar orasida quyidagi ikkita xususiyat diqqatga sazovordir: LINQ va lambda iboralari. LINQ qisqartmasi Birlashgan So'rovlar Tilini anglatadi. Ushbu til vositasi C # elementlari yordamida ma'lumotlar bazasida so'rovlarni yaratishga imkon beradi va lambda iboralari lambda operatoridan foydalanadigan funktsiyalarning sintaksisidir => va lambda ifodalari ko'pincha LINQ ifodalarida qo'llaniladi.

Bu kurs ishida C# daturlash tilida Lambda-ifodalardan foydalanish metodikasi ko’rib chiqildi.

Kurs ishi kirish, 3 bob, mavzuga oid testlar, xulosa va adabiyotlar ro’yxatidan iborat.

Birinchi bobda lambda-ifodalar va uning imkoniyatlari haqida batafsil ma’lumot beriladi.

U ikki paragrafdan iborat bo’lib, birinchi paragrafda lambda-ifodalarining kelib chiqishi haqida umumiy ma’lumotlar beriladi.

Ikkinchi paragrafda lambda-ifodalaridan foydalanish metodikasi yoritiladi.

Ikkinchi bobda lambda-ifodalarining berilishi turlari yoritilib, u ikki paragrafdan iborat.

Uchinchi bob lambda-ifodalari va mahalliy funksiyalar haqida bo’lib u ikki paragrafdan iborat.

Birinchi paragrafida lambda-ifodalari va mahalliy funksiyalar o’rtasidagi farqlar keltirib o’tilgan. Ikkinchi paragrafda tajriba natijalarini tahlil qilishga doir dasturlar keltiriladi.

Xulosada olingan natijalar haqida so’z yuritiladi.

Ish foydalanilgan adabiyotlar ro’yxati bilan yakunlanadi.


I-BOB. LAMBDA-IFODALARI VA ULARDAN FOYDALANISH USULLARI

1.1 Lambda-ifodasining kelib chiqishi


C# tarixidagi navbatdagi muhim voqea 3.0 versiyasining chiqarilishi edi. C# 2.0 da ko'plab yangi funktsiyalarning paydo bo'lishi munosabati bilan, C# rivojlanishining sekinlashishini kutish mumkin edi, chunki dasturchilar ularni o'rganish uchun vaqt kerak edi, ammo bu sodir bo'lmadi. 3.0 versiyasi kelishi bilan Microsoft dasturlashning umumiy g'oyasini butunlay o'zgartirgan bir qator yangiliklarni kiritdi. Ushbu yangiliklarga lambda ifodalari, o'rnatilgan so'rovlar tili (LINQ), kengaytma usullari va aniq kiritilmagan parametrlar kiradi. Albatta, ushbu yangi xususiyatlarning barchasi juda muhimdir, chunki ular ushbu tilning rivojlanishiga sezilarli ta'sir ko'rsatdi, ammo ulardan ikkitasi alohida ajralib turadi: o'rnatilgan so'rovlar tili (LINQ) va lambda ifodalari. LINQ va lambda ifodalari C# dasturlash uchun mutlaqo yangi ahamiyat kasb etadi va uning dasturlash tillarining davomiy rivojlanishidagi etakchi rolini ta'kidlaydi.

Anonim usullarning ahamiyatiga qaramay, ularni yanada zamonaviy yondashuv bilan ya’ni lambda ifodasi bilan almashtirishdi. Ushbu dasturlash tilining asl versiyasi 1.0 chiqarilganidan beri lambda ifodasi C# ning eng muhim yangiliklaridan biri deb aytish mubolag'a emas. Lambda ifodasi mutlaqo yangi sintaksis elementiga asoslangan va anonim usulga yanada samarali alternativa bo'lib xizmat qiladi.

Lambda-ifodasi - bu sodda, ammo ayni paytda bajariladigan kod birligi nima ekanligini aniqlashning samarali usulini ta'minlaydigan yangi sintaktik vositadir. Lambda-ifodalari odatda delegatlar va voqealar bilan ishlash uchun ishlatiladi, chunki delegat lambda-ifodasini nazarda tutishi mumkin.

Lambda ifodalari asosan LINQ bilan ishlashda ishlatiladi, ular ko'pincha delegatlar va voqealar bilan birgalikda ishlatiladi.

Lambda-ifodasi - bu anonim funksiyani yaratishning yana bir usuli. Shuning uchun lambda-ifodasi delegatga berilishi mumkin. Lambda ifodasi uning ekvivalenti bo’lgan anonim usulga qaraganda samaraliroq deb hisoblanganligi sababli, aksariyat hollarda undan foydalanish tavsiya etiladi.

1.2 Lambda-ifodalaridan foydalanish metodlari


Barcha lambda ifodalari uni ikki qismga ajratadigan lambda operatori (ya’ni “ => ”) dan foydalanadi. Lambda operatori (ya’ni =>) tayinlash operatori bilan bir xil ustuvorlikka ega va = ga to'g'ri assotsiativdir. Lambda operatori lambda ifodalarini e'lon qilish uchun ishlatiladi va LINQ so'rovlarida keng qo'llaniladi. Kirish parametri (yoki bir nechta parametrlar) chap tomonda, lambda ifodasi tanasi esa o'ng tomonda ko'rsatilgan bo’ladi.

string[] words = { "cherry", "apple", "blueberry" };
int shortestWordLength = words.Min((string w) =>w.Length); //5


LINQ kengaytmalarida yoki so'rovlarda foydalanilganda ob'ektlarning turini odatda kompilyator tomonidan taxmin qilinganidek o'tkazib yuborish mumkin:

int shortestWordLength = words.Min(w =>w.Length);
//xuddi shu natija bilan kompilyatsiya qiladi

Lambda operatorining umumiy shakli quyidagicha.

(kiritish parametrlari) => ifoda

Lambda ifoda parametrlari => operatoridan oldin ko'rsatilgan va amaldagi ifoda / bayonot / blok operatorning o'ng tomonida joylashgan bo’ladi:



// ifoda
(int x, string s) =>s.Length >x

// ifoda
(int x, int y) =>x + y

// bayonot

(string x) =>Console.WriteLine(x)

// blok

(string x) =>
{


x += " Salom!";

Console.WriteLine(x);

}

Ushbu operator aniq metod yozmasdan, delegatlarni osongina aniqlash uchun ishlatilishi mumkin:



delegate void TestDelegate(string s);

TestDelegate myDelegate = s =>Console.WriteLine(s + "alaykum!");

myDelegate("Assalomu ");

o‘rniga


void MyMethod(string s)

{

Console.WriteLine(s + " alaykum!");

}

delegate void TestDelegate(string s);

TestDelegate myDelegate = MyMethod;

myDelegate("Assalomu ");

Lambda operatori ba'zan "o'tib ketadi" yoki "bo'ladi" kabi so'zlar bilan tavsiflanadi. C# dasturlash tili lambda ifodasining o'ziga qarab lambda ifodalarining ikkita turini qo'llab-quvvatlaydi.

Lambda ifodalari - bu noma'lum usullarning kengaytmasi bo'lib, ular aniq kiritilmagan parametrlar va qiymatlarni qaytarishga imkon beradi. Ularning sintaksisi anonim usullarga qaraganda kamroq verbal bo'lib, funktsional dasturlash uslubiga amal qiladi.

using System;
using System.Collections.Generic;
using System.Linq;
    
public class Program
    {
        
public static void Main()
        {
            var Sonlar =
new List<int> {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
            var kvsumma = Sonlar.
Select( son=>son * son )
            .
Aggregate( (int x, int y) => { return x + y; } );
            
Console.WriteLine( kvsumma);
            
Console.ReadKey();
        }
    }

Dastur natijasi:





Izoh: yuqoridagi kod 1 dan 10 gacha bo'lgan raqamlarning kvadratlari yig'indisini chiqaradi. Birinchi lambda ifodasi ro'yxatdagi raqamlarni kvadratga ajratadi.

Faqat bitta parametr mavjud bo'lgan qavs qoldirilishi mumkin. Agar xohlasangiz, siz qavs qo'shishingiz mumkin:

.Select( (number) => number * number);

yoki parametrni aniq yozing, ammo keyin qavs kerak bo'ladi:

.Select( (int number) => number * number);

Lambda tanasi ifodadir va yashirin qaytishga ega. Agar xohlasangiz, siz ham bayonot tanasini ishlatishingiz mumkin. Bu yanada murakkab lambdalar uchun foydalidir.

.Select( number => { return number * number; } );

Tanlash usuli hisoblangan qiymatlar bilan yangi IEnumerable qiymatini qaytaradi.

Ikkinchi lambda ifodasi tanlangan usuldan qaytarilgan ro'yxatdagi raqamlarni yig'adi. Qavslar talab qilinadi, chunki bir nechta parametrlar mavjud. Parametrlarning turlari aniq yozilgan, ammo bu kerak emas. Quyidagi usul tengdir.

.Aggregate( (first, second) => { return first + second; } );

Bu xuddi shunday:

.Aggregate( (int first, int second) => first + second );

Func<int, int> square = x => x * x;

Console.WriteLine(square(5));

// Output:

// 25
System.Linq.Expressions.Expressionint, int>> e = x => x * x;

Console.WriteLine(e);

// Output:

// x => (x * x)
Har qanday lambda ifodasi delegat turiga aylantirilishi mumkin. Lambda ifodasi  o'zgartirilishi mumkin bo'lgan delegat turi uning parametrlari va qaytish qiymati bilan belgilanadi. Agar lambda ifodasi  qiymatni qaytarmasa, uni ActionDelegat turlaridan biriga o'tkazish mumkin; aks holda, u FuncDelegatlarning turlaridan biriga aylantirilishi mumkin. Masalan, ikkita parametrga ega va hech qanday qiymatga ega bo'lmagan lambda ifodasi Action vakiliga aylantirilishi mumkin. Bitta parametrga ega va qiymatni qaytaradigan lambda ifodasi Func vakiliga aylantirilishi mumkin. Quyidagi misolda x=>x*x nomlangan x va qiymatini qaytaradigan parametrni belgilaydigan lambda ifodasi x kvadrat shaklida, delegat turidagi o'zgaruvchiga tayinlangan:

Func<int, int> square = x => x * x;

Console.WriteLine(square(5));

// Output:

// 25

Lambda-ifodalari, shuningdek , quyidagi misolda ko'rsatilganidek,  daraxt-ifodasi turlariga o'tkazilishi mumkin:



System.Linq.Expressions.Expressionint, int>> e = x => x * x;

Console.WriteLine(e);

// Output:

// x => (x * x)

Siz fonda bajarilishi kerak bo'lgan kodni o'tkazish uchun Task.Run(Action) usuliga argument sifatida delegat turlari yoki ifoda daraxtlari misollarini talab qiladigan har qanday kodda lambda ifodalarini ishlatishingiz mumkin. Quyidagi misolda ko'rsatilganidek , siz LINQni C# dasturlash tilida yozganda lambda ifodalarini ishlatishingiz mumkin :



int[] numbers = { 2, 3, 4, 5 };

var squaredNumbers = numbers.Select(x => x * x);

Console.WriteLine(string.Join(" ", squaredNumbers));

II-BOB. LAMBDA-IFODALARINING BERILISH USULLARI

2.1 Yagona lambda-ifodalari


Agar lambda ifodasi tanasi bitta ifodadan iborat bo'lsa, unda yagona lambda ifodasi hosil bo'ladi. Bunday holda, ifoda tanasi qavslarga o’ralmagan bo’ladi. Agar lambda ifodasining tanasi katta qavslarga o'ralgan operatorlar blokidan iborat bo'lsa, unda blokli lambda ifodasi hosil bo'ladi. Bundan tashqari, blokli lambda ifoda bir qator operatorlarni o'z ichiga olishi mumkin, Lambda iboralarining ikkala turi ham alohida muhokama qilinadi.

Yagona lambda ifodasida => operatorining chap tomonida parametr (yoki bir qator parametrlar) o'ng tomonida lambda ifoda tanasi ifodalanadi. Bunday ifodaning qaytish natijasi – lambda operatorini bajarish natijasidir.

Quyida bitta parametrni oladigan yagona lambda ifodasining umumiy shakli keltirilgan.



parametr => ifoda

Agar siz bir nechta parametrlarni ko'rsatishingiz kerak bo'lsa, unda quyidagi shakl ishlatiladi.



(parametrlar_listi) => ifoda

Shunday qilib, ikkita yoki undan ko'p parametrlarni ko'rsatish talab qilinganda, ular qavslarga o'ralgan bo'lishi kerak. Agar ifoda parametrlarni talab qilmasa, unda bo'sh qavslardan foydalanish kerak.

Quyida bitta lambda ifodasining oddiy namunasi keltirilgan.

x => x + 2

Ushbu ifodada, x + 2 – ni ishlatadigan parametrdir, natijada parametrlarni hisoblash qiymati 2 ga oshadi. Quyida yagona lambda ifodasining yana bir misoli keltirilgan.



n => n % 2 == 0

Lambda ifodasi ikki bosqichda qo'llaniladi. Birinchidan, lambda ifodasi bilan mos keladigan delegat turi e'lon qilinadi, so'ngra lambda ifodasi tayinlangan vakilning misoli keltiriladi. Bu dasturning qaytaruvchi qiymati hisoblanish natijasi hisoblanadi.

Quyidagi ikkita dastur yagona lambda iboralarini ishlatishni namoyish etadi. Birinchidan, ushbu dasturda ikki turdagi delegatlar e'lon qilinadi. Birinchisida, Incr, int turining argumentini oladi va bir xil turdagi natijani beradi. Ikkinchi vakil IsEven ham int turining argumentini qabul qiladi, lekin bool tipidagi natijani beradi. Keyin, ushbu vakillarning misollariga yagona lambda iboralari beriladi.



  1. using System;
    delegate int Incr(int v);
    namespace Lambda
    {
        
    delegate bool IsEven(int v);
        
    class SimpleLambdaDemo
        {
            
    static void Main()
            {
                Incr incr = count => count +
    2;
                
    Console.WriteLine("Lambda ifodasida incr dan foydalanish : ");
                
    int x = -10;
                
    while(x <= 0)
                {
                    
    Console.Write(x + " ");
                    x = incr(x);
                }
                
    Console.ReadKey();
            }
        }
    }

    Natija quyidagicha:


  2. using System;
    delegate int Incr(int v);
    namespace Lambda
    {
        
    delegate bool IsEven(int v);
        
    class SimpleLambdaDemo
        {
            
    static void Main()
            {
                IsEven isEven = n => n %
    2 == 0;
                
    Console.WriteLine("Lambda ifodasida IsEven dan foydalanish : ");
                
    for(int i=1; i <= 10; i++)
                
    if(isEven(i)) Console.Write(i + " ");
                
    Console.ReadKey();
            }
        }
    }


Yuqoridagi birinchi dasturda, incr delegatsiyasining namunasiga yagona lambda iborasi berilgan, bu hisoblash natijasi parametrning qiymatini 2 ga oshiradi. Ushbu ifoda Incr vakiliga tayinlanishi mumkin, chunki u ushbu vakilning deklaratsiyasiga mos keladi.

Ikkinchi dasturda isEven delegatsiyasiga (agar unga berilgan argument mos bo'lsa) mantiqiylikni qaytaradigan ifoda beriladi, aks holda mantiqiy ifoda yolg’on qiymat qabul qiladi. Shuning uchun, bu lambda ifodasi isEven deklaratsiyasiga mos keladi.

Yuqoridagilar bilan bog'liq holda, oqilona savol tug'iladi: kompilyator lambda ifodasida ishlatiladigan ma'lumot turini qanday biladi, masalan, vakilga berilgan lambda ifodasidagi hisoblash parametrining int turi haqida ma'lumotni qanday oladi?

Bu savolga javob quyidagicha: kompilyator parametr turi va ifoda vakili turiga qarab baho beradi va natijasining turi to'g'risida xulosa chiqaradi. Shuning uchun, lambda ifodasining parametrlari vakilning qaytish qiymatiga va qaytarilish qiymati parametrlarga mos kelishi kerak.

Demak, siz lambda ifoda parametr turini aniq ko'rsatishingiz kerak. Buning uchun ma'lumotlar turiga ma'lum bir nomni kiritish kifoya. Misol sifatida, quyida delegatni e'lon qilishning yana bir usuli mavjud:



Incr incr = (int x) => x + 2;

Ko'rib turganingizdek, o’zgaruvchi endi aniq parametr sifatida e'lon qilingan. Qavslar qo'llanilishiga e'tibor bering. Endi ular kerak! (Qavslar faqat bitta parametr ko'rsatilgan bo'lsa va uning turi aniq ko'rsatilmagan bo'lsa foydalanilmasligi mumkin.)

Yuqoridagi dasturlardagi ikkala lambda ifodalarida bitta parametr ishlatilgan, ammo umuman lambda ifodalari nolni o'z ichiga olgan har qanday parametrlarga ega bo'lishi mumkin. Agar lambda ifodasida bir nechta parametr ishlatilsa, ular qavs ichiga o'ralgan bo'lishi kerak. Quyida qiymat ma'lum bir oraliqda ekanligini aniqlash uchun lambda ifodasini ishlatishga misol keltirilgan.

(min, max, qiymat) =>qiymat >= min && qiymat <= max;

Va bu qanday qilib delegat turi ushbu lambda ifodasi bilan mos kelishi e'lon qilinadi.



delegate bool Oraliq(int min, int max, int qiymat);

Shuning uchun InRange delegatining namunasi quyidagicha yaratilishi mumkin.



Oraliq oraliq = (min, max, qiymat) => qiymat >= min && qiymat <= max;

Shundan so'ng, yagona lambda ifodasi quyida ko'rsatilgandek bajarilishi mumkin.



if(oraliq(1, 5, 3)) Console.WriteLine(
"3 soni 1 dan 5 gacha bo’lgan oraliqda.");


Bitta yakuniy eslatma: tashqi o'zgaruvchilar lambda ifodalarida anonim usullarda bo'lgani kabi ishlatilishi va olinishi mumkin.

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