Məlumatın funksiyaya göndərilməsi

Deyildiyi kimi, funksiyanın başlanğıcında onun adından sonra gələn mötərizədə onun parametrləri yazılır. Parametrlər – funk­siyaya onun qarşısında qoyulan məsələni yerinə yetirmək üçün verilən məlumatdır.

Parametrlərin ötürülməsinin iki üsuluna baxaq: qiymətə görə və müraciətə görə.

Aşağıdakı misalda çıxarılan məlumatın məzmunu printmessage funksiyası ilə parametr kimi ötürülür:

# include < …….>

# include <string>

using namespace std;

void printmessage (string);

int main()

{

string str;

cout << ”enter a string:”;

cin >> str;

printmessage(str);

return 0;

void printmessage(string s)

{

cout << ”you inputted” << s;

}

Qeyd edək ki, yuxarıdakı kodda həm prototipin, həm də funk­siyanın başlığının yalnız bir parametri – string parametri var. Lakin funksiyanın prototipinin parametrində yalnız verilən parametrin tipi (string) göstərildiyi halda, funksiyanın baş­lı­ğı­nın parametrində həm verilənlərin tipi, həm də parametrin adı (string s) göstərilmişdir.

Funksiyanın prototipində verilənlərin tipindən başqa (məc­bu­ri olan), parametrin adı da ola bilər:

void printmessage (string somearg);

Lakin bu parametr fiktiv parametr adlanır, cünki o heç bir məq­səd daşımır.

Aşağıdakı kodda printmessage funksiyası çağrılır:

printmessage(str);

str – sətir dəyişəni printmessage funksiyasının parametri ki­mi ötürülür. Sonra str qiyməti printmessage funksiyasının baş­lı­­ğında parametr adı olan s sətir dəyişəni ilə ötürülür:

void printmessage(stringe s);

Daha sonra s sətir dəyişəni printmessage funksiyasının göv­də­sində

cout << “you inputted”<< s;

məlumatının çıxraılması üçün istifadə olunur.

Funksiyanın başlığındakı parametrin adı funksiyanın parametrinə ötürülən dəyişənin adı ilə eyni ola bilər:

printmessage(str);

void printmessage(string str)

Hətta bu halda da main funksiyasındakı str dəyişəni printmessage funksiyasındakı dəyişəndən fərqlənir.

Yuxarıdkı misalda funksiyanın yalnız bir parametrinə baxılırdı. Lakin funksiya iki və ya daha çox parametrə də malik ola bilər.

Aşağıdakı proqramda printmessage funksiyasında iki parametr ( biri ad və digəri soyad üçün ) istifadə olunur:

#include <…. . . >

# include <string>

using namespace std;

void printmessage (string, string);

int main()

{

string name 1, name 2;

cout <<” adı daxil et:”;

cin >> name1;

cout << ”soyadı daxil et:”;

cin >> name2;

printmessage(name1, name2);

return 0;

}

void printmessage(string firstname, string lastname)

{

cout << “ Sizin adiniz-”<< firstname <<”soyadınız-”<<lastname<<end1;

}

Funksiyaların çağırılması zamanı parametrlər sırası baş­lıq­dakı parametrlər sırası ilə eyni olmalıdır.Yuxarıdakı misalda funk­siyanın çağırılması və onun başlığı aşağıdakı kimidir:

printmessage (name1, name2);

void printmessage(string firstname, string lastname)

Funksiya çağırıldıqda name1 qiyməti funksiyanın baş­lı­ğın­da­kı firstname, name2 qiyməti isə lastname dəyişəninə təqlid olu­nur.

İndi isə parametrlərin müraciətə əsasən ötürülməsinə baxaq.

Parametrlərin qiymətə görə ötürülməsi o vaxt əlveriş­li­dir ki, ça­ğırılan funksiyada onların yerini dəyişmək lazım gəl­mə­sin. printmessage funksiyası öz parametrlərinin qiymə­t­lə­rini də­yiş­dir­mir, sadəcə olaraq onları ekrana çıxarır.

Buna baxmayaraq bəzən funksiyaya onunla ötürülən pa­ra­met­rin qiymətini dəyişmək lazım gəlir.

Aşağıdakı misalda double funksiyası onun ötürdüyü qiy­mə­ti iki dəfə artırmalıdır:

# include <inter>

using namespace std;

void double (int);

int main ()

{

int num;

cout <<” enter number:”;

cin >>num;

double (num);

cout <<”the number doubled in main is”<<num<<endl;

return0;

}

void double (int x)

{

cout <<”the number to double is”<<x<<end1;

x*=2;

cout<< “the number doubled in double is”<<x<<end1;

}

Buradan görünür ki, double funksiyasında onun para­met­ri­ni iki dəfə artırdıqda num qiyməti dəyişmədi. main funk­si­ya­sın­da num qiyməti ona görə dəyişmədi ki, double funk­si­yasına onun surəti ötürülür. Çağırılan funksiyanın onun ötür­düyü də­­yişəni main funksiyasında dəyişməsi üçün həmin dəyişən müraciətə görə ötürülməlidir. Çağırılan funk­siyadakı dəyişən müraciət tipli dəyişən adlanır. Müraciət tipli dəyişən – də­yi­şə­nin main funksiyasındakı surəti deyil, təxəllüsüdür.

Aşağıdakı funksiyada dəyişənin müraciətə əsasən ikiqat artırılmaqla ötürülməsi göstərilir:

void double (int &x)

{ cout <<”the number double is”<<x<<end1;

x*=2;

cout<<the number;

Dəyişənin müraciətə əsasən ikiqat artırılmaqla ötürül­mə­si üçün əvvəlki proqramda double funksiyasının prototip və başlığı

void double(int);

void double(int x)

əvəzinə

void double(int &);

void double(int &x)

kimi yazılmalıdır.

Qeyd edək ki, müraciətə və ya qiymətə görə bir neçə qiy­məti də ötürmək olar. Hətta bir neçə qiyməti müraciətə , di­gər­lərini isə qiymətə görə ötürmək olar. Müraciətə görə o qiy­mətlər ötürülür ki, onları dəyişmək lazım gəlmir, qiymətə görə isə dəyişilməli olan qiymətlər ötürülür.

Aşağıdakı proqramda AddNumbers funksiyasının üç para­met­ri var: ilk iki parametr - cəmlənən ədədlərdir, onlar qiy­mətə gö­rə ötürülürlər, üçüncü parametr – iki ədədin cə­mi­dir, o, mü­raciətə görə ötürülür və onun qiyməti çagırılan funksiya ilə dəyişdirilir.

# include <inter>

using namespace std;

void AddNumbers (int, int ,int &);

int main()

{

int firstnum, secondnum, sum=0;

cout <<”Birinci ededi daxil et:”;

cin >>firstnum;

cout<<”Ikinci ededi daxil et:”;

cin>>secondnum;

AddNumbers(firstnum, secondnum, sum);

cout <<firstnum<<”+”<<secondnum<<”=”<<sum;

return 0;

}

void AddNumbers(int x,int y,int& z)

{

z=x+y;

}

6.9. Funksiyadan qiymətin qaytarılması

Parametrlər çağırılan funksiyanın qiymətlərinin ötürül­mə­si üçün istifadə olu­nur. Qaytarılan qiymət isə çagırılan funk­si­ya­dan qiy­mət­lə­ri onu çağıran funksiyaya ötürməyə xidmət edir.

Məsələn, əvvəlki proqramda AddNumbers funksiyası üç pa­ra­­metrə malik idi: ilk ikisi – toplanan ədədlər və üçüncüsü – onların cəmi.

Üçüncü parametri yox etməklə və onu funksiyanın qay­tar­dığı qiymətlə əvəz etməklə əvvəlki proqramı yax­şı­laş­dır­maq olar:

# include <inter>

using namespace std;

int AddNumbers (int, int);

int main()

{

int firstnum, secondnum, sum=0;

cout <<”Enter first number:”;

cin >>firstnum;

cout<<”Enter second number:”;

cin >>secondnum;

sum = AddNumbers(firstnum, secondnum);

cout <<firstnum<<”+”<<secondnum<<”=”<<sum;

return 0;

}

int AddNumbers(int x,int y)

{

return x+y;

}

Burada funksiyanın çağırılması mənimsətmə opera­to­run­dan sağda yerləşir. Mənimsətmə operatorunun solunda yer­lə­şən dəyişənin tipi funksiyanın qaytarılan tipi ilə eyni ol­ma­lıdır. Iş prinsipi ondan ibarətdir ki, funksiyanın çağı­rıl­ma­sından qaytarılan qiymət mənimsətmə operatorundan sol­da yerləşən sum dəyişəninə mənimsədilir:

sum = AddNumbers(firstnum, secondnum);

funksiyanın qaytarılan x+y qiyməti

return x+y;

operatorunun yerinə yetirilməsindən sonra main funksi­ya­sın­da­kı sum dəyişəninə mənimsədilir.

Qeyd edək ki, funksiyaya parametr olaraq bir neçə qiy­mət qaytarmaq olmaz. Bunu etmək üçün massivləri, struk­tur­ları və sinifləri bilmək lazımdır.

 

Misal.6.1.Altproqramlardan istifadə edilməkləonluq say siste­mində verilmiş 255 ədədinin digər say sistemlərində ya­zı­lışını təsvir edən proqram (Standart C – də).

# include <stdlib.h>

# include <stdio.h>

void itab(int n, char s[], int b);

void reverse(char s[]);

int main(void) {

char buffer[10];

int i;

for ( i = 2; i <= 20; ++i ) {

itab(255, buffer, i);

printf("onluq say siteminde 255 esasi %-2d -say sistemin­de­:­ %s­\n", i, buffer);

}system("PAUSE");

return 0; }

void itab(int n, char s[], int b) {

static char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

int i, sign;

if ( b < 2 || b > 36 ) {

fprintf(stderr, "EX3_5: Cannot support base %d\n", b);

exit(EXIT_FAILURE); }

if ((sign = n) < 0)

n = -n;

i = 0;

do {

s[i++] = digits[n % b];

} while ((n /= b) > 0);

if (sign < 0)

s[i++] = '-';

s[i] = '\0';

reverse(s); }

/* Reverses string s[] in place*/

void reverse(char s[]) {

int c, i, j;

for ( i = 0, j = strlen(s)-1; i < j; i++, j--) {

c = s[i];

s[i] = s[j];

s[j] = c;

}

}

Alınmış nəticə:

onluq say siteminde 255 esasi 2 -say sisteminde: 11111111

onluq say siteminde 255 esasi 3 -say sisteminde: 100110

onluq say siteminde 255 esasi 4 -say sisteminde: 3333

onluq say siteminde 255 esasi 5 -say sisteminde: 2010

onluq say siteminde 255 esasi 6 -say sisteminde: 1103

onluq say siteminde 255 esasi 7 -say sisteminde: 513

onluq say siteminde 255 esasi 8 -say sisteminde: 377

onluq say siteminde 255 esasi 9 -say sisteminde: 313

onluq say siteminde 255 esasi 10 -say sisteminde: 255

onluq say siteminde 255 esasi 11 -say sisteminde: 212

onluq say siteminde 255 esasi 12 -say sisteminde: 193

onluq say siteminde 255 esasi 13 -say sisteminde: 168

onluq say siteminde 255 esasi 14 -say sisteminde: 143

onluq say siteminde 255 esasi 15 -say sisteminde: 120

onluq say siteminde 255 esasi 16 -say sisteminde: FF

onluq say siteminde 255 esasi 17 -say sisteminde: F0

onluq say siteminde 255 esasi 18 -say sisteminde: E3

onluq say siteminde 255 esasi 19 -say sisteminde: D8

onluq say siteminde 255 esasi 20 -say sisteminde: CF

Misal 6.2. C(m,n) funksiyasını rekursiv üsulla hesablayan proq­­ram yazın. Binomial əmsalların rekursiv hesablanması üçün

düs­turundan istifadə edin.

 

#include <cstdlib>

#include <iostream>

using namespace std;

long C(long n,long k) {

if(k == 0 || n == k) return 1;

return C(n - 1, k - 1) + C(n - 1, k);

}

int main() {

long n, k;

scanf ("%ld%ld", &n, &k);

printf ("%ld\n ", C(n, k));

system("PAUSE");

return EXIT_SUCCESS;

}

Nəticə: