7. Funksiyalar
Oʻzgaruvchan sondagi parametrlar
Download 98.33 Kb.
|
07.Funksiyalar
- Bu sahifa navigatsiya:
- 7.5. Massivlarni funksiyaga uzatish
Oʻzgaruvchan sondagi parametrlar. Funksiyada parametrlar soni, bitta majburiy parametr mavjudlik shartida, ihtiyoriy sonda bo‘lishi mumkin. Funksiyaning e’loni va aniqlanishida o‘zgaruvchan sondagi parametrlar uchta nuqta orqali belgilanadi. Funksiya ichida bu parametrlarga kirish uchun bir necha usulidan foydalanish mumkin.
Birinchi usul parametrlar sonini majburiy parametrda uzatish. Bunda oxirgi majburiy parametr manzili ko‘rsatkichda saqlanadi. Ko‘rsatkich yordamida keyingi parametrga o‘tish bajariladi. Misol tariqasida ihtiyoriy sondagi butun sonlar yig‘indisini topish dasturini yozamiz. #include int sum(int x, ...); int main() { cout << sum(2, 20, 30) << endl; // 50 cout << sum[3, 1, 2, 3) << endl; // 6 cout << sum(4, 1, 2, 3, 4) << endl; // 10 cin.get(); return 0; } int sum(int х, ...) { int result = 0; int *p = &x; // Oxirgi parametr manzilini olamiz for(int i = 0; 1 < х; i++) { ++p; // Ko‘rsatkichni navbatdagi parametrga ko‘chiramiz result += *р; // Navbatdagi sonni qo‘shamizs } return result; } Bu misolda majburiy parametr tipi boshqa parametrlar tipi bilan mos keladi. Ihtiyoriy sondagi haqiqiy sonlar yig‘indisini topish talab qilinsa, uning yordamida parametrlar soni uzatilayotgan majburiy parametr tipini o‘zgartirish yoki ko‘rsatkichning ko‘chishida tiplarni keltirishni bajarish mumkin. Ihtiyoriy sondagi haqiqiy sonlarni qo‘shish. #include double sum(int x, ...); int main() { cout << sum(2, 20.2, 3.6) << endl; // 23.8 cout << sum(3, 1., 2.8, 3.4) << endl; // 7.2 cin.get(); return 0; } double sum(int x, ...) { double result = 0.0, *pd = 0; int *pi = &x; // Oxirgi parametr manzilini olamiz ++pi; // Ko‘rsatkichni tiplarni keltirishdan avval ko‘chiramiz !!! pd = reinterpret_cast for(int i = 0; i < x; i++) { result += *pd; // Navbatdagi sonni qo‘shamiz ++pd; // Ko‘rsatkichni navbatdagi parametrga ko‘chiramiz } return result; } Funksiyaga ihtiyoriy sondagi satrni uzatishda oxirgi parametrda nol ko‘rsatkichni berish mumkin. Bunday holda paraametrlar sonini oshkor berish shart emas. Misol tariqasida funksiyaga bir necha satr uzatamiz. Konsol oynasida satrlar mazmunini funksiya ichida chiqaramiz. #include void func(char *s, ...); int main() { char str1[] = "string1", str2[] = "string2"; func(str1, str2, 0); // Oxirgi parametrda nol ko‘rsatkich func(str1, str2, str1, 0); // Oxirgi parametrda nol ko‘rsatkich cin.get(); return 0; } void func(char *s, ...) { char **p = &s; while (*p) { cout << *p << endl; ++p; } } 7.5. Massivlarni funksiyaga uzatishBir o‘lchovli massivlar va C-satrlarni funksiyaga uzatish ko‘rsatkichlar yordamida malga oshiriladi. Funksiyani chqairishda o‘zgaruvchi nomidan oldin '&' operatori qo‘yilmaydi, chunki o‘zgaruvchining nomi massiv birinchi elementining manzilini oladi. Quyidagi dastur kodida С-satrni funksiyaga uzatishga keltirilgan. #include void func1(char *s); void func2(char s[]); int main() { char str[] = "String"; cout << sizeof(str) << endl; // 7 func1(str); // str dan oldin & operatori ko‘rsatilmaydi func2(str); cout << str << endl; // string cin.get(); return 0; } void func1(char *s) { s[0] = 's'; // str massiv elementi qiymati o‘zgaradi cout << sizeof(s) << endl; // 4, 7 emas! } void func2(char s[]) { s[5] = 'G'; // str massiv elementining qiymati o'zgaradi } char *s e’loni char s[] e’loniga ekvivalent. Har ikki holatda ham char tipidagi ko‘rsatkich e’lon qilinadi. sizeof operatori funksiyadan tashqarida belgili massivning butun o‘lchamini, funksiya ichida faqat ko‘rsatkichning o‘lchamini qaytaradi. Chunki funksiya ichida s o‘zgaruvchi massiv emas, ko‘rsatkich hisoblanadi. Ko‘p o‘lchovli massivni uzatishda barcha o‘lchamlari aniq ko‘rsatilishi lozim (masalan, int а[4][4][4]). Birinchi o‘lchamni ko‘rsatmaslik mumkin (masalan, int а[][4][4]). Ikki o‘lchovli massivni funksiyaga uzatishga misol: #include void func(int a[][4]); int main() { const short ROWS = 2, COLS = 4; int i, j; int mas[ROWS][COLS] = {{1, 2, 3, 4}, {5, 6, 7, 8}}; func(mas); // Qiymatlarni chiqaramiz for(i = 0; i < ROWS; i++) { for(j = 0; j < COLS; j++) { cout.width(4); // Maydonning kengligi cout << mas[i][j]; } cout << endl; } cin.get(); return 0; } void func(int a[][4]) { // yoki void func(int a[2][4]) a[0][0] = 80; } Ko‘p o‘lchovli massivni bunday uzarishni universal deb bo‘lmaydi, chunki qat’iy bog‘lanish mavjud. Buni hal qilishning yechlaridan biri qo‘shimcha ko‘rsatkichlar massivini yaratish hisoblanadi. Bunday hola funksiyaga ko‘rsatkichlar massivining birinchi elementi manzili beriladi, funksiyada parametrni e’lon qilish quyidagicha ko‘rinishda bo‘ladi: int *а[] yoki int **а Ko‘rsatkichlar massivini funksiyaga uzatishga doir misol: #include void func(int *a[], short rows, short cols); int main() { const short ROWS=2, COLS=4; int mas[ROWS][COLS] = {{1, 2, 3, 4}, {5, 6, 7, 8}}; // Ko'rsatkichlar massivini yaratish int *pmas[] = {mas[0], mas[1]}; // Ko'rsatkichlar massivi manzilini uzatish func(par R, ROWS, COLS); cin.get(); return 0; } void func(int *a[], short rows, short cols) { // void func(int **a, short rows, short cols) int i,j; for(i = 0; i < rows; i++) { for(j = 0; j < cols; j++) { cout.width(4); cout << a[i][j]; } cout << endl; } } Bu usul ham kamchilikga ega, chunki qo‘shimch ko‘rsatkichlar massivini yaratish zarur. Eng yaxshi usul ko‘p o‘lchovli massivni bir o‘lchovli kabi uzatish hisoblanadi. Bu holda funksiyaga massiv birinchi elementining manzili uzatiladi, parametrida ko‘rsatkich e’lon qilinadi. Ko‘p o‘lchovli massivning barcha elementlari xotirada ketma-ket joylashganligi sababli, elementlar soni yoki o‘lchamlarini bilgan holda joriy elementning joylashuvini manzilli arifmetikadan foydalanib hisoblash mumkin. Ikki o‘lchovli massivni bir o‘lchovli sifatida uzatishga misol. // Ikki o‘lchovli massivni bir o‘lchovli sifatida uzatish #include void func(int *a, short rows, short cols); int main() { const short ROWS = 2, COLS = 4; int mas[ROWS][COLS] = {{1 ,2, 3, 4}, {5, 6, 7, 8}}; // Funksiyaga massiv birinchi elementining manzilini uzatamiz func(mas[0], ROWS, COLS); cin.get(); return 0; } void func(int *a, short rows, short cols) { int i, j; for(i = 0; i < rows; i++) { for(j = 0; j < cols; j++) { cout.width(4); cout << a[i * cols + j]; // element o‘rnini hisoblash } cout << endl; } } С-satrlar massivini funksiyaga uzatish ko‘rsatkichlar massivini uzatish kabi amalga oshiriladi. Funksiyaga elementlar sonini uzatmaslik uchun C-satrlar massivini nomlashda oxirgi elementiga nol ko‘rsatkich berish mumkin. Bu element massiv oxirini ko‘rsatuvchi belgi bo‘lib xizmat qiladi. Misol tariqasida barcha satrlarni funksiya ichida chiqaramiz. #include void func(char *s[]); int main() { char *str[]={"String1", "String2", "String3", 0}; // Nolinchi ko'rsatkich qo'yamiz – oriyentir (oxirini ko‘rsatish) uchun func(str); cin.get(); return 0; } void func(char *s[]) { // yoki void func(char **s) while(*s) { // Barcha satrlarni chiqarish cout << *s << endl; ++s; } } Download 98.33 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling