Информатика


Download 7.16 Mb.
Pdf ko'rish
bet154/300
Sana25.08.2023
Hajmi7.16 Mb.
#1670002
1   ...   150   151   152   153   154   155   156   157   ...   300
Bog'liq
informatika Mominov

Leksik analiz. Kiritilgan ifoda haqiqiy sonligini tekshiruvchi dastur: 
33-listing. Output: 
#include  
void Main() 
{ int k=1; m=0; char c; 
while (c!=`\n`) { 
if ((c=`.`) && (m=0)) {m=1; continue }; 
if ((c<`0`) || (c>`9`)) {k=0; break}; } 
if (k) cout<<“\n Haqiqiy son”; else cout<<“\n Haqiqiy son emas”;} 
Keyingi dasturimizda kiritilayotgan ifoda identifikator yoki yo`qligi tekshiriladi: 
34-listing. Output: 
#include  
void Main() 
{ int k=0; char c; 
while (c!=`\n`) 
{if (k==-1) break; 
m=2; 
if ((c>=`0`) && (c<=`9`)) m=0; 


259 
if ((c>=`a`) && (c<=`Z`)) m=1; 
if (c==`_`) m=1; } 
switch(m) 
{ case 0: if (k==0) k=-1;break; 
case 1: k=1;beak; 
default: k=-1;break; } } 
if (k=-1) cout<<(“\n Identifikator emas”); else cout<<(“\n Identifikator”); }
Rekursiv funksiyalar. Rekursiv funksiya deb, o`ziga o`zi murojaat qiluvchi 
funksiyaga aytiladi. Masalan, faktorialni hisoblash funksiyasini keltiramiz: 
39-listing.
Output: 
Long fact(int k) 
{if (k<0) return 0; 
if (k==0) return 1; 
return k*fact(k-1); } 
Manfiy argument uchun funksiya 0 qiymat qaytaradi. Parametr 0 ga teng 
bo`lsa funksiya 1 qiymat qaytaradi. Aks holda, parametr qiymat birga 
kamaytirilgan holda funksiyaning o`zi chaqiriladi va uzatilgan parametrga 
ko`paytiriladi. Funksiyaning o`z - o`zini chaqirish formal parametr qiymati 0 ga 
teng bo`lganda to`xtatiladi. Keyingi misolimizda ixtiyoriy haqiqiy sonning butun 
darajasini hisoblash rekursiv funksiyasini keltiramiz. 
40-listing.
Output: 
Double expo(double a, int n) 
{ if (n==0) return 1; 
if (a==0.0) return 0; 
if (n>0) return a*expo(a,n-1); 
if(n<0) return expo(a,n+1)/a; } 
Funksiyaga expo(2.0,3) shaklda murojaat qilinganda rekursiv ravishda 
funksiyaning ikkinchi parametri kamaygan holda murojaatlar hosil bo`ladi: 


260 
Expo(2.0,3), expo(2.0,2), expo(2.0,1), expo(2.0,0). Bu murojaatlarda quyidagi 
ko`paytma hisoblanadi: 2.0*2.0*2.0*1 va kerakli natija hosil qilinadi. Shuni 
ko`rsatib o`tish kerakki, bu funksiyamizda noaniqlik mavjuddir ya`ni 0.0 ga teng 
sonning 0 chi darajasi 0 ga teng bo`ladi. Matematik nuqtai nazardan bo`lsa, bu 
holda noaniqlik kelib chiqadi. Yuqoridagi sodda misollarda rekursiyasiz iterativ 
funksiyalardan foydalanish maqsadga muvofiqdir. Masalan, darajani hisoblash 
funksiyani quyidagicha tuzish mumkin: 
41-listing.
Output: 
Double expo(double a, int n) 
{ if (n==0) return 1; 
if (a==0.0) return 0; 
int k=(n>0)?n:-n; 
for(double s=1.0, int i=0; iif (n>0) return s else return 1/s; } 
Rekursiyaga misol sifatida sonni satr shaklida chiqarish masalasini ko`rib 
chiqamiz. Son raqamlari teskari tartibda hosil bo`ladi. Birinchi usulda raqamlarni 
massivda saqlab so`ngra teskari tartibda chiqarishdir. 
Rekursiv usulda funksiya har bir chaqiriqda bosh raqamlardan nusxa olish 
uchun o`z - o`ziga murojaat qiladi, so`ngra oxirgi raqamni bosib chiqaradi. 
42-listing. print n in decimal (recursive)
Output: 
printd(n)
int n; 
( int i;
if (n < 0)
putchar(`-`); 
n = -n; 
if ((i = n/10) != 0) 


261 
printd(i); 
putchar(n % 10 + `0`); ) 
PRINTD(123) chaqiriqda birinchi funksiya PRINTD N = 123 qiymatga ega. 
U 12 qiymatni ikkinchi PRINTD ga uzatadi, boshqarish o`ziga qaytganda 3 ni 
chiqaradi. 


Download 7.16 Mb.

Do'stlaringiz bilan baham:
1   ...   150   151   152   153   154   155   156   157   ...   300




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