Thursday, September 18, 2014

C++: Ֆունկցիա

Մաթեմատիկական մեկնաբանությամբ ֆունկցիան մի գործողություն է, որը մի բազմությունը՝ որոշման տիրույթը, արտապատկերում է մեկ այլ բազմության՝ արժեքների տիրույթին։ C++ լեզվում նույնպես այդպես է․ ֆունկցիան ստանում է արգումենտներ և վերադարձնում է արժեք։ Բայց նաև, ծրագրավորման գործի առանձնահատկություններից ելնելով, C++ լեզուն թույլատրում է սահմանել ֆունկցիաներ, որոնք արգումենտներ չեն ստանում կամ/և արժեքներ չեն վերադարձնում։

main ֆունկցիայի օրինակով արդեն տեսանք, որ C++ լեզվում ֆունկցիայի սահմանումն ունի չորս բաղադրիչ. i) վերադարձվող արժեքի տիպ, ii) անուն, iii) արգումենտների ցուցակ, iv) մարմին։ Օրինակ, եթե սահմանենք տրված շառավղով շրջանի մակերեսը հաշվող area ֆունկցիան, ապա այն կունենա այսպիսի տեսք.
double area( double radius )
{
  return radius * radius * 3.14159265358979323846;
}
Այս ֆունկցիայի վերադարձվող արժեքի տիպը double է, անունը area է, արգումենտների ցուցակում թվարկված է միակ radius արգումենտը՝ իր տիպի հետ, իսկ մարմինը բաղկացած է միակ return հրամանից, որի արգումենտում շրջանի մակերեսի հաշվման բանաձևն է։

Ֆունկցիայի տիպ է կոչվում վերադարձրած արժեքի տիպի ու արգուենտների տիպերի ցուցակի համադրությունը։

Եթե հարկավոր է սահմանել մի ֆունկցիա, որից արժեք չենք ակնկալում, ապա պետք է վրա վերադարձվող արժեքի տիպը նշել որպես void։ Այսպիսի ֆունկցիային երբեմն անվանում են նաև պրոցեդուրա։ Օրինակ, սահմանենք մի ֆունկցիա, որը ստանում է առանց նշանի ամբողջ թիվ (unsigned int) և արտածում է այդ թվի տասական, ութական ու տասնվեցական ներկայացումները։ Այդ ներկայացումները ստացվում են հոսքերի dec, oct և hex մանիպուլյատորների օգնությամբ, որոնք սահմանված են iostream ֆայլում։
void print_number( unsigned int num )
{
  std::cout << std::setw(8) << std::dec << num
            << std::setw(8) << std::oct << num
            << std::setw(8) << std::hex << num
            << std::endl;
}
Արտածման հոսքի setw պարամետրով մանիպուլյատորը, որ սահմանված է գրադարանի iomanip ֆայլում, հնարավորություն է տալիս սահմանել այն դիրքերի քանակը, որոնք պետք է օգտագործվեն արժեքի արտածման համար։

Եթե ֆունկցիան պետք է ստանա մի քանի արգումենտներ, ապա դրանք արգումենտների ցուցակում թվարկվում են իրարից ստորակետով անջատված։ Օրինակ, սահմանենք avg3 ֆունկցիան, որը արգումենտում ստանում է երեք իրական թիվ և վերադարձնում դրանց թվաբանական միջինը։
double avg3( double a, double b, double c )
{
  auto sum = a + b + c;
  return sum / 3;
}
Եթե մի որևէ f() ֆունկցիայում օգտագործվելու է մի այլ g() ֆունկցիա, ապա այն պետք է ավելի շուտ հայտարարված կամ սահմանված լինի։ Օրինակ, ծրագրում այդ երկու ֆունկցիաների փոխադարարձ դասավորությունը կարող է լինել այսպիսին.
int g( double a, char b )
{
    // ինչ-որ հրամաններ
    return 777;
}

void f( int x )
{
    // ինչ-որ հրամաններ
    auto v = g( 3.14, 'p' );
    // ինչ-որ հրամաններ
}
Կամ, f() ֆունկցիային կարող է նախորդել միայն g() ֆունկցիայի հայտարարությունը։ Ահա այսպես.
int g( double, char );

void f( int x )
{
    // ինչ-որ հրամաններ
    auto v = g( 3.14, 'p' );
    // ինչ-որ հրամաններ
}

int g( double a, char b )
{
    // ինչ-որ հրամաններ
    return 777;
}
Առաջին տողում գրված արտահայտությունը կոմպիլյատորին տեղեկացնում է, որ գոյություն ունի double և char տիպի արգումենտներ ստացող և int արժեք վերադարձնող g անունով ֆունկցիա, որի սահմանումը գալու է քիչ ավելի ուշ։

No comments:

Post a Comment