Bajardi: Abdurasulov F
Download 19.97 Kb.
|
Abdurasulov F (6)
- Bu sahifa navigatsiya:
- Kirish……………………………………………………………. Nazariy qism……………………………………………………. Amaliy qism…………………………………………………….. Xulosa……………………………………………………………
- Adabiyotlar…………………………………………………….. Kirish
- Nazariy qism
Toshkent Amaliy Fanlar Universiteti 3-Fakultet Axborot xavfsizligi yo’nalishi KURS ISHI Bajardi:Abdurasulov F.
TOSHKENT-2023 Topshiriq Variant35 1. Rekursiv jarayonlarni tashkil etish. 2. a soni berilgan. 0 dan a gacha bo'lgan juft sonlar soni toping va konsolga chiqaring. a sonini inobatga olmaymiz Mundarija: Kirish……………………………………………………………. Nazariy qism……………………………………………………. Amaliy qism…………………………………………………….. Xulosa…………………………………………………………… Adabiyotlar…………………………………………………….. Kirish C++ da dasturlashning asosiy bloklaridan biri funksiyalardir. Funksiyalar dasturchi ishini juda yengillashtiradi. Funksiyalar yordamida programma modullashadi, qismlarga bo'linadi. Bu esa keyinchalik dasturni rivojlantirishni osonlashtiradi. Bunda dasturchi yozgan funksiyalar C++ ning standart kutubhonasi va boshqa kutubhonalar ichidagi funksiyalar bilan birlashtiriladi. Bu esa ishni osonlashtiradi. Ko'p holda dasturda takroran bajariladigan amalni funksiya sifatida yozish va kerakli joyda ushbu funksiyani chaqirish mumkin. Nazariy qism Funksiya e’lonlarda kirish parametrlarining faqat tipi yozish kifoya, huddi square() funksiyasidek. Yoki kiruvchi parametrlarning nomi ham berilishi mumkin, bu nomlar kompilyator tarafidan etiborga olinmaydi, biroq dasturning o'qilishini ancha osonlashtiradi. Bulardan tashqari C++ da funksiya imzosi (function signature) tushunchasi bor. Funksiya imzosiga funksiya nomi, kiruvchi parametrlar tipi, soni, ketma-ketligi kiradi. Funksiyadan qaytuvchi qiymat tipi imzoga kirmaydi. int foo(); //No1 int foo(char, int); //No2 double foo(); //No3 – No 1 funksiya bilan imzolari ayni. void foo(int, char); //No4 - No2 bilan imzolari farqli. char foo(char, int); //No5 - No2 bilan imzolari ayni. int foo(void); //No6 - No1 va No3 bilan imzolari ayni, Yuqoridagi misolda kirish parametrlari bo'lmasa biz () qavsning ichiga void deb yozishimiz mumkin (No6 ga qarang). Yoki () qavslarning quruq o’zini yozaversak ham bo’ladi (No1 ga qarang). 64 Yana bir tushuncha - funksiya chaqirig'idir. Dasturda funksiyani chaqirib, qo'llashimiz uchun uning chaqiriq ko'rinishini ishlatamiz. () qavslari funksiya chaqirig'ida qo'llaniladi. Agar funksiyaning kirish argumentlari bo’lmasa, () qavslar bo’sh holda qo’llaniladi. Ma’lumki, funksiyalarni aniqlashda ulaming qaytarishi lozim bo‘lgan qiymatlar tipi va funksiya uchun zarur bo‘lgan parametrlar tipini ko'rsatish lozim edi. Faraz qilaylik, ikkita butun sonni qo‘shish uchun funksiya qurilgan bo‘lsin. Agar uchta butun sonni qo‘shish talab qilingan bo‘lsa, ular uchun boshqa nomdagi funksiyani qurish talab qilinadi. Ikkita haqiqiy sonni qo‘shish uchun esa boshqa funksiya qurish lozim bo'ladi. Bunday hollarda bir xil funksiyani takror va takror yozishning o'miga, C++ tili bir xil nomdagi funksiyalarni qurish imkonini beradi. Dastumi kompilatsiya qilish jarayonida C++ funksiyalaming har biridagi argumentlar miqdori e’tiborga olinadi va aynan kerak bo'lgan funksiyani chaqiradi. Kompilyatorga bir nechta funksiyalar orasidan kcragini tanlash imkoniyati funksiyalarni qayta yuklash deb ataladi. Funksiyalami qayta yuklash amali bir xil nomdagi parametrlami har xil tipga mansub bo‘lgan turli funksiyalar uchun qo‘llashga ruxsat beradi. Masalan, quyidagi dastur add_values nomli ikkita funksiyani qayta yuklash uchun xizmat qiladi: #include using namespace std; int add_values (int a, int b) {
}
{
return(a + b + c); }
int main() { cout « “200 + 801 = “ « add_values(200, 801) « endl; cout « “100 + 201 + 700 = “ « add_values(100, 201, 700) « endl;} Ko‘rinib turibdiki, dasturda ikkita bir xil nomdagi, ammo parametrlari soni har xil bo‘lgan add_values funksiyasi aniqlangan. Bu holda kompilyator parametrlar soniga ko‘ra qaysi funksiyani qo‘llash haqida mustaqil ravishda xulosa qiladi. Agar funksiya o‘zidan yordamchi funksiya sifatida foydalanadigan bo‘lsa, bunday funksiyalar rekursiv deyiladi. Rekursiv funksiyalar ikki turga bo‘linadi: a) to‘g‘ri rekursiya. Bunda dastur o‘ziga-o‘zi murojaat qiladi. b) yondosh rekursiya. Bunda A funksiya B ga, B funksiya A ga murojaat qiladi. Rekursiv funksiya yozish uchun avvalo : 1) rekkurent munosabat; 2) shu munosabat uchun boshlang‘ich holatlar aniqlangan bo‘lishi shart. Rekkurent munosabat deganda qaralayotgan jarayonga doir muayyan bosqichlami avvalgi bosqichlar bilan bog‘lovchi munosabatlar tushuniladi. Masalan, N! =N*(N—1) formulani N! uchun rekurent munosabat deb qarash mumkin. Boshlang‘ich holat sifatida esa 1!=1 olinadi. Keltirilgan ma’lumotlami hisobga olsak, faktorialni hisoblash masalasi uchun rekkurent va boshlang‘ich munosabatlar quyidagicha bo'ladi: 𝑁! = { 𝑁 ∗ (𝑁 − 1)! 𝑎𝑔𝑎𝑟 𝑁 > 1 1, 𝑎𝑔𝑎𝑟 𝑁 = 1 Ko‘rinib turibdiki, N! ni hisoblash uchun (N-1)! ma’lum bo‘lishi kerak. Lekin, (N-1)!=(N-1)*(N-2)! bo‘lgani uchun o‘z navbatida (N-2)! ni inpish talab qilinadi. (N-2)! esa (N-3)!*(N-2) ga teng va hokazo. Bu yerda N! ni hisoblash algoritmi o ‘zining ichiga o ‘zi “cho‘kib” borishi hodisasi ro‘y bermoqda. Cho‘kish jarayoni boshlang‘ich holat sodir bo‘lgunga qadar, ya’ni 1! gacha davom etadi. Shundan keyin, “cho‘- kish” jarayoni to‘xtaydi, 1!=1 ekanligi haqida ko‘rsatma olgan kompyuter yuqoriga qarab “suzib” chiqish bosqichini boshlaydi. Ya’ni, 2!=1, 2!=l-2=2, 3 !=2!-3=6 va hokazo. Bu holat to N! hisoblanmaguncha davom etaveradi. Yuqorida keltirilgan masala dasturi quyidagicha bo’ladi : #include using namespace std; long fak(int m) { long f; if (m==1) f=1; else f=fak(m-1)*m; return f; } int main() { int n;
cout<<"Butun sonni kiriting: ";
cin>>n;
cout< using namespace std;
int fun(int m) { int f; if (m==0) f=1; else { int h=m/2; if (m % 2==0) f=fun(h); else f=fun(h)+1 ; } return f; } int main() { int n; cout<<"Butun sonni kiriting: "; cin>>n; Download 19.97 Kb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling