Funksiyalar va sonli massivlar.
Funksiyalarda bir o’lchovli sonli massivlar argument sifatida ishlatilganda ularning chegarasini ko’rsatish shart emas. Misol tariqasida n o’lchovli vektorlar bilan bog’lik funksiyalarni ta'riflashni ko’rib chiqamiz.
Vektorning uzunligini aniqlash funksiyasi:
float mod_vec(int n,float x[])
{ float a=0;
for (int I=0;Ireturn sqrt(double(a));
}
Ikki vektorning skalyar ko`paytmasi funksiyasi:
float scalar(int n,float x[],float y[])
{ float a=0;
for (int I=0;Ireturn a;
}
Quyidagi dasturda ikki vektor orasidagi burchak kosinusini hisoblash funksiyasi kiritiladi va bu funksiya yordamida berilgan vektorlar orasidagi burchak kosinusi hisoblanadi:
#include #include float cosinus(int n,float x[],float y[])
{ float a=0,b=0,c=0;
for (int I=0;I{ a+=x[I]*y[I];
b+=x[I]*x[I];
c+=y[I]*y[I];
}
return a/sqrt(double(b*c));
}
void main()
{ float e[]={1,2,3};
float g[]={-1,7,4};
Cout<<(“\n%I”,cosinus(3,e,g));
}
Funksiyalarda bir o’lchovli massivlar qaytariluvchi qiymatlar sifatida ham kelishi mumkin. Misol uchun ikki vektor summasini hisoblovchi funksiya protsedurani ko’ramiz:
Void sum_vec(int n, float a,float b, float c)
{
for(int i=0;i}
Bu funksiyaga quyidagicha murojaat qilish mumkin:
Float a[]={1,-1.5,-2}, b[]={-5.2,1.3,-4}, c[3];
sum_vec(3,a,b,c);
Massiv qiymat qaytaruvchi funksiya ta'rifini:
Float *sum_vec(int n,float a,float b)
{ float d[n];
for(int i=0;i}
Bu funksiyaga qo’yidagicha murojaat qilish mumkin:
Float a[]={1,-1.5,-2},b[]={-5.2,1.3,-4};
float c[]=sum_vec(3,a,b);
Massivlarni tartiblash.
Keyingi misolimizda massivlarni qiymatlari o’sish tartibida joylashtirish funksiyasi berilgan:
Void function sort(int n, double a[])
{ int i,j; double c; for(i=0;iif (a[i]>a[j]) {c=a[i];a[i]=a[j];a[j]=c;}
Bu usulda har bir element a[0] dan boshlab, keyingi hamma elementlar bilan solishtiriladi. Biror element ko’rilayotgan a[i] dan kichik bo’lsa, bu elementlar o’rin almashtiriladi. Natijada a[i] o`rniga i dan n gacha elementlar ichida eng kichigi qo’yiladi.
Qo’yidagi funksiya butun sonlar massivini Shell usuli asosida tartiblaydi. Bu usulda oldin bir biridan uzoqda joylashgan elementlar solishtiriladi. Elementlar orasidagi interval birgacha kamayib boradi.
shell(v, n) /* sort v[0]...v[n-1] into increasing order */
int v[], n;
int gap, i, j, temp;
for (gap = n/2; gap > 0; gap /= 2) for (i = gap; i < n; i++)
for (j=i-gap; j>=0 && v[j]>v[j+gap]; j-=gap) temp = v[j];
v[j] = v[j+gap]; v[j+gap] = temp;
Bu dasturda uchta tsikl ishlatilgan. Eng tashqi tsikl elementlar orasidagi intervalni N/2 dan nol'gacha ikki martadan kamaytirib boradi. O’rta tsikl interval bilan ajratilgan elementlarni solishtiradi; eng ichki tsikl tartiblanmagan elementlar o’rnini almashtiradi. Interval oxiri birga teng bo’lgani uchun hamma elementlar to`g`ri tartiblanadi.
Keyingi misolda berilgan x qiymat tartiblangan massivda mavjudmi yoki yo`qligini aniqlovchi funksiyani ko’rib chiqamiz. Bu funksiya ikkiga bo’lish usulidan foydalanadi. Massiv elementlari o’sish tartibida joylashgan bo’lishi kerak.
binary(x, v, n) /* find x in v[0]...v[n-1] */ int x, v[], n;
int low, high, mid; low = 0;
high = n - 1; while (low <= high)
mid = (low + high) / 2; if (x < v[mid])
high = mid - 1;
else if (x > v[mid]) low = mid + 1;
else /* found match */ return(mid); return(-1);