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 – funksiyaya 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ə funksiyanı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əcburi olan), parametrin adı da ola bilər:
void printmessage (string somearg);
Lakin bu parametr fiktiv parametr adlanır, cünki o heç bir məqsə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 kimi ö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övdə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ıqdakı parametrlər sırası ilə eyni olmalıdır.Yuxarıdakı misalda funksiyanı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ığındakı firstname, name2 qiyməti isə lastname dəyişəninə təqlid olunur.
İ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şlidir ki, çağırılan funksiyada onların yerini dəyişmək lazım gəlməsin. printmessage funksiyası öz parametrlərinin qiymətlərini dəyişdirmir, sadəcə olaraq onları ekrana çıxarır.
Buna baxmayaraq bəzən funksiyaya onunla ötürülən parametrin qiymətini dəyişmək lazım gəlir.
Aşağıdakı misalda double funksiyası onun ötürdüyü qiymə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 parametrini iki dəfə artırdıqda num qiyməti dəyişmədi. main funksiyasında num qiyməti ona görə dəyişmədi ki, double funksiyasına onun surəti ötürülür. Çağırılan funksiyanın onun ötürdü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 funksiyadakı 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ülmə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çə qiyməti də ötürmək olar. Hətta bir neçə qiyməti müraciətə , digərlərini isə qiymətə görə ötürmək olar. Müraciətə görə o qiymə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 üç parametri var: ilk iki parametr - cəmlənən ədədlərdir, onlar qiymətə görə ötürülürlər, üçüncü parametr – iki ədədin cəmidir, 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ülməsi üçün istifadə olunur. Qaytarılan qiymət isə çagırılan funksiyadan qiymətləri onu çağıran funksiyaya ötürməyə xidmət edir.
Məsələn, əvvəlki proqramda AddNumbers funksiyası üç parametrə malik idi: ilk ikisi – toplanan ədədlər və üçüncüsü – onların cəmi.
Üçüncü parametri yox etməklə və onu funksiyanın qaytardığı qiymətlə əvəz etməklə əvvəlki proqramı yaxşılaşdırmaq 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ə operatorundan sağda yerləşir. Mənimsətmə operatorunun solunda yerləşən dəyişənin tipi funksiyanın qaytarılan tipi ilə eyni olmalıdır. Iş prinsipi ondan ibarətdir ki, funksiyanın çağırılmasından qaytarılan qiymət mənimsətmə operatorundan solda 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 funksiyasındakı sum dəyişəninə mənimsədilir.
Qeyd edək ki, funksiyaya parametr olaraq bir neçə qiymət qaytarmaq olmaz. Bunu etmək üçün massivləri, strukturları və sinifləri bilmək lazımdır.
Misal.6.1.Altproqramlardan istifadə edilməkləonluq say sistemində verilmiş 255 ədədinin digər say sistemlərində yazı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 sisteminde: %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 proqram yazın. Binomial əmsalların rekursiv hesablanması üçün
düsturundan 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ə: