LYAMDA IFODALAR OID TOPSHIRIQ
1. Butun N soni berilgan:
a) Fibonachi sonlarining N-xadi topilsin.
b) N gacha bo’lgan tub sonlar aniqlansin.
c) N sonining raqamlari yig’indisi topilsin.
2. Butun N va M sonlari berilgan:
EKUB(N,M)-?
EKUK(N,M)-?.
3. S satr va butun k soni berilgan:
a) S satrda k soni bor yoki yo’qligini aniqlang;
b) S satrda k soni mavjud bo’lsa, shu son satrdan o’chirilsin.
Javoblar
1-usul
1.a) Fibonachi sonlarining N-xadi topilsin.
Nazariy qismi: Fibonachchi sonlari bu rekursiv formula orqali aniqlangan.Y’an ketma-ketlikning keying hadini bilish uchun avvalgi hadlarini bilish lozim(Aynan Fibonachchi seriyasining n- hadi n-1 va n-2 hadlarga bog’liq,aniqlroq aytsak ularning yig’indisi orqali aniqlangan).Shuni e’tiborga olsak uning dastlabki ikki hadi
Quyida dastur kodi keltirilgan:
using System;
namespace Lambda_ifodalar_1
{
public delegate int Fibonacci(int n);
class LyambdaApplication
{
static void Main(string[] args)
{
Console.Write("Enter to black screen calculated n-th Fibonacci number: ");
int n = int.Parse(Console.ReadLine());
Lyambda ex = new Lyambda();/*We create object class Lyambda,because we use by method Fibanachchi of this class. If Fibanachchi method is static field,that we don't need to create object.But it method isn't static declared */
Console.Write("Fibonacci series n-th numbers value is: ");
ex.Fibanachchi(n);
Console.Read();
}
}
class Lyambda
{
public void Fibanachchi(int t)
{
Fibonacci fibo = n =>
{
int n0 = 0, n1 = 1; int result = 0;
for (int i = 2; i <= n; i++)
{
result = n0 + n1;
n0 = n1;
n1 = result;
}
return result;
};
Console.WriteLine(fibo.Invoke(t));
}
}
}
Dastur natijasidan namuna:
Ya’ni 10-Fibonachchi soni 55 ga teng ekan
Izoh: Biz dastlab Fibonacci nomli delegate e’lon qilib olyapmiz(unga bitta int turidagi parametric bor metodniga yuklashimiz mumkin).Chunki delgatni e’lon qilganimizda uning parametrlar ro’yxatiga faqat bitta int turidagi ro’yxat kiritilgan.
Yana shuni ham e’tiborga olishimiz kerakki, bu delegatni private yoki protected modifikatorlari orqali e’lon qilsak kompilyator xatolik beradi.Chunki biz bu masalni ishlashda ikkita class(sinf)dan foydalanyapmiz.Lyambda classida delegatdan foydalanyapmiz.Lyambda Applicationda esa buning natijasini olyapmiz.Agar biz Lyambda va Lyambda Application ni o’zaro polimorfizm(vorislik) orqali bog’laganimizda u holda bu delegatni protected tarzida ham qo’llashimiz mumkin bo’lar edi.
Lyambda ifodadan foydalanib Lyambda classida kerakli natijani olyapmiz.Bu metod void deb e’lon qilingani uchun natijani shu yerning o’zida chop etilyapti.Main() metodi joylashgan classda esa shunchaki natijani ekranga chop etish uchun kod yozilyapti xolos.Buning uchun Lyambda classining obyektini yaratib olib undagi Fibanachchi() metodiga murojaat etilyapti.Darvoqe bunda delegatga murojaat etishda maxsus Invoke() metodidan ham foydalandik.Bu shunchaki dastur effektini oshirish uchun.Uni qo’llamasak ham bo’ladi(Biroq odatda professional dastruchilar orasida odatda undan foydalaniladi).
2-usul
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _2_usulda_Fibonacci
{
class Program
{
static void Main(string[] args)
{
Console.Write("n ni kiriting :");
int n = int.Parse(Console.ReadLine());
Func d = Fibonacci;
Console.WriteLine("Fibonachchi ketma-ketligining n- hadi: "+d(n));
Console.ReadKey();
}
static int Fibonacci(int n)
{
int result = 0;
int n0 = 0, n1 = 1;
for (int i = 2; i <=n; i++)
{
result = n0 + n1;
n0 = n1;
n1 = result;
}
if (n == 0) return 0;
if (n == 1) return 1;
else return result;
}
}
}
Bunda hech qanday delegatdan foydalanish shart emas.Bu yozishlarni qisqartirish uchun shunchaki Func ni to’g’ri qo’llay olsa bo’ldi.Uning ichiga odatda hech nima yozilmaydi.Odatd unga kiruvchi parametrlarni bitta o’zgaruvchiga yuklab unga bitta metodni yuklab qo’yiladi.Xuddi delegatlarga o’xshab(shuning uchun ham lambda ifoda delegatning qisqartirilgan shaklidir).
Dastur natijasidan namuna:
Ko’rinib turganidek natija bir xil.
b) N gacha bo’lgan tub sonlar aniqlansin.
Nazariy qismi: Tub son faqat o’ziga va birga bo’linadigan son ekanligini inobatga olamiz.Bunda sikldan foydalanamiz va delegate ni bool tipida e’lon qilamiz.Har bir sonni gacha bo’luvchisi borligini tekshiramiz va shu orqali tub yoki murakkab son ekanligini aniqlaymiz
Dastur kodi quyidagicha
using System;
namespace Tub_son_Lyambda_ifoda_bilan
{
public delegate bool isOdd(int v);
class Program
{
static void Main(string[] args)
{
Console.Write("Enter number n: ");
int n = int.Parse(Console.ReadLine());
isOdd isOdd=k=>
{
bool prime =true;
for (int i = 2; i <=Math.Sqrt(k); i++)
{
if (k % i == 0) { prime = false; break; }
}
return prime;
};
String list_OddNumbers_to_N = null;
for (int i = 2; i <=n; i++)
{
if (isOdd(i)) { list_OddNumbers_to_N += i + " "; }
}
Console.Write("There are odd numbers to n: " + list_OddNumbers_to_N);
Console.ReadKey();
}
}
}
Dastur natijasidan namuna:
Izoh:Yuqorida ta’kidalanganidek delegateni bool tipida e’lon qilib n gacha bo’lgan hamma sonlarni bu delegat orqali tublikka tekshirib chiqamiz.Va bitta sikl orqali hamma sonlarni tekshirish chog’ida bu natijani shakllantirib boramiz(String turidagi o’zgaruvchiga yuklab boramiz qiymatlarni.Aslida buni delgatni void tarzida e’lon qilib ham natijaga erishish mumkin bunda har bir sonni tekshiryotganda aga u tub bo’lsa natijani ekranga chop etaverardik.Biroq yuqoridagi kod har bir dasturchi uchun tushunarliroq bo’ladi effekt jihatidan ham soddaroq yozilganligi ham void tarzida e’lon qilgandan ko’ra yaxshiroq deb o’ylayman.Kodda qo’llanilgan lambda expressions(ifoda) esa quyidagicha:
isOdd isOdd=k=>
Uning quyi qismi esa lambda operatorga misol bo’la oladi.
2-usul
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication8
{
class Program
{
static void Main(string[] args)
{
Func> EnumerableRange = (startPoint, endPoint) =>
Enumerable.Range(Math.Min(startPoint, endPoint), Math.Abs(startPoint - endPoint) + 1);
Func isFullyDivided = (value, divisor) => (value % divisor).Equals(0);
Console.Write("N ni kiriting ");
int ep = int.Parse(Console.ReadLine());
var query = EnumerableRange(2, ep) .Where(value =>
EnumerableRange(2, (int)Math.Ceiling(Math.Sqrt(ep))) .Any(divisor => value != divisor && isFullyDivided(value, divisor)) );
var primeNumbers = EnumerableRange(2, ep) .Except(query);
Console.WriteLine("1 dan N gacha bo'lgan tub sonlar quyidagilar: ");
foreach (var item in primeNumbers) { Console .WriteLine(item); } Console .Read(); }
}
}
Bunda ataylab inglizcha yozmadim ustoz.IEnumerable bilan ishladim.
Func isFullyDivided = (value, divisor) => (value % divisor).Equals(0);
Yuqorida lambda ifoda va operator qo’llanilgan.Bunda maxsus tiplar bilan ishlovchi Func dan foydalandim.Lambda expressionsni qo’llashning yana bir ommaviy uslublaridan biri bunda lambda ifoda ta’rifiga binoan delegate kodining yozilishoi qosqa ko’rinishga keladi.
c) N sonining raqamlari yig’indisi topilsin.
Nazariy qism: Buni ham bitta sodda lambda ifoda va lambda operator orqali hal etamiz.Teskari tomondan qarab sonning birlar xonasidan boshlab 10 ga bo’lib qoldiq olamiz va sonni o’nga bo’lib avtomtik ravishda yig;indini hisoblab boramiz.
Dastur kodi quyidagicha:
using System;
namespace Sum_with_lambda
{
class Program
{
private delegate int SumNumbers(int n);
static void Main(string[] args)
{
Console.Write("Enter the number n: ");
int k = int.Parse(Console.ReadLine());
SumNumbers sum=n=>
{
int sumnums = 0;
while(n!=0)
{
int digit = n % 10;
n /= 10;
sumnums += digit;
}
return sumnums;
};
Console.Write("Sum of numbers' digits is equal to: " + sum(k));
Console.Read();
}
}
}
Dastur natijasidan namuna:
Izoh:Bu juda sodda algoritm bo’lin ko’rinib turibdiki, oxirgi birlar xonasidan boshlab raqamlarini ajratib olyapmiz(n%10 orqali) va sonni n/10 qilib nolgacha kamaytirib borib hamma raqamlari yig’indisini dinamik ravishda hisoblab borilyapti.Bunda bitta lambda ifoda va lambda opertaordan foydalandik.Bunda qo’llanilga lambda expressions esa:
SumNumbers sum=n=>
Va pastki qatordan {} ichida lambda operatorni qo’lladik(Yuqorida kodi bilan batafsil tanishib o’tishingiz mumkin
2-usul
Dastur kodi quyidagicha:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _2_usulda_SumsNumbers
{
class Program
{
static void Main(string[] args)
{
Console.Write("n sonini kiriting : ");
int n = int.Parse(Console.ReadLine());
Func sums = k => k.ToString().Sum(c => c - '0');
Console.WriteLine("Sum numbers digit is ="+sums(n));
Console.ReadKey();
}
}
}
Do'stlaringiz bilan baham: |