void hello world(void)
{
printf("Hello w o r l d ! !!\n");
}
W m B
; ; ; ;
Көбінесе функциялар профаммага өз есептеулерінің нәтижесін қайтарады.
Егер функция ешкандай да мән кайтармайтын болса, онда ол функция атынын
алдында v o i d түйінді сөзі көрсетілуі қажет. Функция атынан кейін жақша ішінде
оның параметрлері көрсетіледі.
Параметр
—
бұл функцияга өцдеу үіиін берілетін
мәлімет.
Егер функцияның параметрлері болмаса, онда дөнгелек жақшалар ішіне
v o i d түйінді сөзі жазылады немесе ештеңе көрсетілмейді. Функцияны
пайдалануды функцияны шақыру деп атайды. Келесі профаммада h e llo _ _ w o rld
функциясы пайдаланылады.
#include
void hello_world()
{
printf ("Hello__world () ! ! !\n”) ;
)
void m a i n ()
{
h e l l o _ w o r l d ();
^
)
Профамманы орындау нәтижесі:
Hello w o r l d ! !!
Сонымен, программаны іске косқан кезде бірінші болып m a in функциясы
орындалады. Жогарыдагы профаммада h e llo _ _ w o r ld функциясын шакыру
m a in функциясында аткарылады. Егер профамманы орындау кезінде функцияны
шакыру әрекеті кезіксе, онда басқару бірден функцияга беріледі де, онын
96
операторлары ең алғашқы жолдан бастап орындала бастайды. Функцияның ең
сонғы операторы орындалып болған соң, басқару негізгі программадағы
функцилны шақыру жолынан кейін тұрған операторға беріледі.
Функдияларды пайдалану программалаушыларға модульдік программалауды
пайдалану мүмкіндігін береді, яғни программаны модульдерден кздрастыруға
болады. Әрбір функция белгілі бір тапсырманы (есепті) орындауы тиіс жэне
функция аты сол тапсырманың мазмұнына сәйкес келуі керек. Сонда ғана бұл
функция ны басқа программаларды жазу кезінде де қолдануға болады.
4.1 Функцияларда айнымалыларды пайдалану
Программапаушы өз функцияларын жазганда, онда айнымалыларды пайдалану
кажетгілігі туындайды. Айнымалылар m a in функциясындағы тәрізді функцияда
жариялануы, ягни апдын ала сипатгапуы қажет.
Келесі программада функция параметрлерін қолдану мысалы қарастырылады.
#include
void hello_world()
{
cout « "Hello world!!!" « "\n";
i
void hello__number (int nh)
{
int counter;
for (counter = 1 ; counter <= nh; counter++)
hello_world() ;
)
void m a i n ()
{
int kol;
cout « "How much time?" « "\n";
cin » k o l ;
hello_number(kol);
cout « "How much time?" « "\n";
cin » k o l ;
hello__number (kol) ;
I
I ,
Ц щ
: • -
Программаны орындау нәтижесі төменде көрсетілген.
How much time*
>
2
Hello world!!!
Hello world!!!
How much time?
5
Hello world!!
Hello world!!
Hello world!!
Hello world!!
Hello world!!
97
Үнемі функция нақты бір жүмысты атқаруды (мысалга, кандай да бір
хабарламаға қорытынды), және де шақыру функциясының есептеу нәтижесін
қайтаруды талал етеді. Шақыру кодының нәтижесін қайтаруды қамтамасыз ету
үшін функцияда r e t u r n операторын пайдалану керек.
Фунқцияның типі оның ( i n t ,
f l o a t ,
c h a r , т.б.) магынасының
қайтарылу типімен анықталады. Мысапы, егер функция i n t типін қайтаратын
болса, онда сол т и г т функция идентификаторы алдында корсету кажет:
i n t some f u n c t i o n ( i n t v a l u e )
4.2 Функцияның мэн кайтаруы
Келесі i c u b e функциясы параметр ретінде берілген саннын кубын кайтарады.
Мысалы, функция га 5 саны берілсе, онда i c u b e функциясы 5 *5 *5 мәнін, ягни 125
мәнін кайтарады:
i n t i c u b e ( i n t v a l u e )
<
-Щ
r e t u r n ( v a l u e * v a l u e * v a l u e ) ;
Сонымен, функция шакырылган соң, оның жұмыс нәтижесін кайтару үшін
r e t u r n
операторы
колданылады
(төмендегіні
қараңыз).
Программада
функцияның қайтарган мәні айнымалыга меншіктеледі немесе баска бір
функциянын параметрі ретінде ( p r i n t f немесе c o u t )
келесідей түрде
көрсетілуі мүмкін:
r e s u l t = i c u b e ( 5 ) ;
немесе
p r i n t f ("5 c u b e d i s % d \n ", i c u b e ( 5 ) ) ;
Енді толык программа карастырайык.
# i n c l u d e < i o s t r e a m .h >
i n t i c u b e ( i n t v a lu e )
{
// функция операторлары
)
)
{
r e t u r n ( v a l u e * v a l u e * v a l u e ) ;
)
v o i d m ain ()
{
c o u t « "3 c u b e d i s
V
I « i c u b e (3) « "X n";
« i c u b e ( 5 ) « "Xn” ;
« i c u b e (7) « " \ n " ;
c o u t « ” 5 c u b e d i s
I
I
c o u t « "7 c u b e d i s
II
Программаны орындау нәтижелері:
3 c u b e d i s 27
5 c u b e d i s 125
7 c u b e d i s 343
98
Функцияға берілетін мән оның параметрі типіне сэйкес болу керек. Егер,
мысалы, нақты (жылжымалы нүктелі сан) санның үшінші дәрежесін есептеу керек
болса, онда типі басқа f c u b e функциясын құру керек:
f l o a t f c u b e ( f l o a t v a lu e )
{
return(value * value * value);
}
C/C++ тіддері r e t u r n сөзі кездескенде, бірден функция жұмысын аяқтап,
нәтижесін негізгі
гтрофаммаға (оны шақырушы функцияға) қайтарады.
Функцияны орындау кезінде r e t u r n операторынан кейін түрган кез келген
операторлар еленбей қалады. Программа өз жұмысын функцияны шақырған
жолдан ары қарай жалгастыра береді.
Кей жагдайда функция тұлгасы (операторлары) ішінде бірнеше r e t u r n
операторлары болуы мүмкін, мұндайда функция программага өзіндегі әрбір шарт
үшін жеке есептелген мәндерді кайтарады.
Мүмкіндігіне карай функцияда тек қана бір r e t u r n операторьгн қолдану
ұсынылады. Функцияның көлемді жэне күрделі болып, онда бірнеше r e t u r n
операторларының тұруы оның жұмысын түсінуді қиындатады. Көбінесе,
функцияны онда тек бір r e t u r n операторы қолданылатындай етіп түрлендіріп
жазуға болады, мысалы, екі мәнді салыстыратын бір функция жазайық:
int compare__values (int first, int second)
{
int result;
if (first = second)
result = 0 ;
else if (first > second)
result = 1 ;
else if (first < second)
result = 2;
return (result);
)
Бұл профамма тым қарапайым болгандыктан, бір r e t u r n операторын
колдану артықшылыгын түсіну киындау шыгар.
Бірақта кейбір жагдайларда кодтың көрнекілігін арттыру үшін бірнеше
r e t u r n операторын пайдалану да дүрыс болып саналады.
C/C++ компиляторлары функцияның қайтарылатын мэнінің типі мен оның
параметрлері типі жайлы мәліметтің профаммада функцияны шақыруга дейін
тұруын талап етеді. Компилятордын функцияны анықтауды оны бірінші пайда-
ланудан бұрын қоюды талап етуі компьютер жадында профамма мәліметтерін
дұрыс орналастыруды камтамасыз етеді. Бірақ профамманың күрделілігінің
артуы нәтижесінде бұл талап орындалмай қалуы мүмкін. Сондыкган мұндай
жагдайда функция параметрлері мен қайтарылатын мэн типтерін алдын ала
қыскаша сипаттап кететін функция прототипін қолдану қарастырылган.
Мысалы, і c u b e жэне f c u b e функцияларын қолданатын профамманы
прототиптерді көрсетіп қайта қарастырайық:
99
^ in c lu d e < s t d i o .h >
i n t i__cub© ( i n t ) ;
/ / i__cube функциясының прототип!
f l o a t f__cube ( f l o a t ) ; / / f__cube функциясыкың п рото ти п і
v o id m ain ()
{
^
!
p r i n t f ("3 cu b ed i s %d\n" , i__cube (3) ) ; //i_ _ c u b e функциясын шақыру
p r i n t f ( " 3 .7 cu b ed i s %f \n " , f__cube ( 3 .7 ) ) ; / / f__cube функциясын
/ / шақыру
>
;
v
;
1
^
i n t i___cube ( i n t v a lu e ) / / ic u b e Функциясын си п аттау
{
~
W m Z
T
T^ : v
r e t u r n ( v a lu e * v a lu e * v a l u e ) ;
}
f l o a t f__cube ( f l o a t v a lu e ) / / f__cube Функциясын си п аттау
{
- - ■
ү
4
r e t u r n ( v a lu e * v a lu e * v a l u e ) ;
>
Программаны орындау нәтижелері:
3 c u b e d i s 27
3 . 7 c u b e d i s 5 0 .6 5 3 0 0 2
Функция прототипі нүктелі үпрмен аякталады, ал функцияны сипаттау
кезінде такырып жолынан сон функция операторлары жазылып, тек солардан
кейін гана нүктелі үтір орналасады.
Өз (тұтынушы) функцияларыңызды кұрганнан сон, бір программа үшін
жазылган функцияны басқа бір программада да колдануга болады. Бір рет
жазылган функцияны бірнеше программаларда пайдалану мүмкіндігі програм
малау және оны түзету кезеңдерін қысқартуга мүмкіндік береді.
4.3 Н акты және формальды (керсетпелі) параметрлер
Формальды параметрлер деп функция аныкталуында көрсетілетін параметрлер
атауларын айтамыз. Мысалы, мынадай функцияда:
v o i d jo b _ _ in fo rm a tio n ( i n t a g e , f l o a t s a l a r y , i n t number__job)
{
// функциялар операторлары
}
a g e ,
s a l a r y , n u m b e r^ jo b атаулары берілген функция үшін формальды
немесе көрсетпелі параметрлер болып саналады.
Функцияны профаммадан немесе баска бір функциядан шакырган кезде,
функцияга берілетін мэндер накты немесе койылмалы параметрлер болып
табы лады.
Төмендегі
мысалда
берілген
30,
42000.00
жэне
321
мәндері
j o b _ i n f o r m a t i o n функциясын шақыру кезіндегі көрсетпелі параметрлерді
апмастырып солардың орнына койылатын накты параметрлер болып табылады:
jo b _ _ in fo rm a tio n ( 3 0 ,4 2 0 0 0 .0 0 ,3 2 1 ) ;
100
Функцияга тасымалданып қойылатын параметрлер сандық мэн немесе аины-
малы түрінде болуы мүмкін. Оларға қойылатын жалғыз талап — қойылмалы накты
парамстрдің (немесе айнымалының) типі көрсетпелі параметр типімен бірдей
болуы тиіс. Келесі код фрагменті қойылмапы параметр орнына айнымалыны
пайдалану тэсілін көрсетеді:
i n t w o rk e r s__age = 3 0 ;
f l o a t w o r k e r s _ js a la r y = 4 2 0 0 0 .0 0 ;
i n t jo b _ n u m b er = 3 2 1 ;
,
j o b _ i n f o r m a t i o n { w o r k e r s _ a g e , w o rk e rs _ _ s a la ry , j ob_num ber) ;
4.4 Функциялар мен айнымалылар атауларының әрекет ету аймағы
Программадағы функциялар мен айнымалылар атауларының өз әрекет ету
(немесе көріну) аймағы, яғни оларды пайдалануға болатын, мәндері белгілі болып
келетін профамманың жұмыс аймағы болады.
Келесі программаны қарастырайық.
# i n c l u d e < s t d i o . h >
v o i d p r ( i n t pr__count)
{
i n t c o u n t ;
f o r ( c o u n t =
1
; c o u n t< = p r _ c o u n t; co u n t+ + )
p u t c h a r (1
A * );
v o i d m ain (v o id )
{
1 1
§
;
Щ
- ; Щ
i n t c o u n t ;
f o r ( c o u n t = 1 ; c o u n t <= 3 ; co u n t+ + )
printf("\n Your computer should print %d time(s)\n” ,
c o u n t ) ;
p r ( c o u n t ) ;
)
p r i n t f ( " \ n " ) ;
I
* - и И і ;;
^
Программанын орындалу нэтижелері:
Y our с о т р и t e r s h o u l d p r i n t 1 t i m e ( s )
A
Y our c o m p u te r s h o u ld p r i n t 2 t i m e ( s )
A A
Y our c o m p u te r s h o u ld p r i n t 3 t i m e ( s )
A A A
Мұңда p r жэне m ain функцияларының эрқайсысында c o u n t аинымалысы
пайдаланылады, бірак бұл айнымалылардын екеуі екі түрлі болып табылады,
өйткені олардын эркайсысының өз жұмыс аймағы бар. Рг функциясындагы
101
c o u n t айнымалысы тек функцияның орындалуы кезінде гана белгілі (көріну
аймағы функция ішінде ғана) болып саналады. Сол сияқты екінші c o u n t
айнымалысы тек m ain функциясының орындалуы кезінде гана жұмыс істей
алады. Сондықтан f o r цнкліндегі c o u n t айнымалысының өзгеру нәтижесі m ain
функциясындағы c o u n t айнымалысына ешқандай әсерін тигізбейді.
Айнымалының жұмыс істеу аймагын қарастыру кезінде локальдық жэне гло-
бальдық айнымалылар түсінігі жиі пандаланылады.
Локальдық (жергілікті) айиымалы
— бұл белгілі бір функцияның ішкі
операторларында ғана белгілі болып табылатын, әрекет ету аймағы шектеулі
айнымалы.
Глобальды (ауқымды) айнымалы
— бұл программаның барлық аймақтарында
толық белгілі болып саналатын айнымалы.
Жоғарыла мысалда көрсетілген c o u n t айнымалысы тек қарастырылган
функция ішінде ғана аныкталған локальдық айнымалы болатын.
4.5 Функция прототиптері
Функция прототипі компиляторға функция қайтаратын мәлімет типін,
функцияда қолданылатын параметрлер санын, параметрлер типтерін және
олардың орналасу реттілігін (мысалдағы екінші параметр v o id , ягни ештеңе жоқ)
көрсетеді. Компилятор негізгі программадан (одан кейін жазылған) функцияны
шақырудың дұрыстыгын тексеру үшін функция прототипін қолданады. Прототип
жазылған кезде функцияның сипатталуы негізгі программадан соң орнасады.
Прототиптің жазылу түрі:
v o i d row (v o id ) ;
Бірінші v o i d компиляторга функция қайтаратын мәннік типін (мұнда
«ештеңе» қайтарылмайды) көрсетеді. Екінші v o id параметрлердің саны мен
типін және солардың реттілігін көрсетуі (мұнда да «ештене») тиіс.
Компилятор функция прототипінде көрсетілген айнымалы атауларын елемейді.
Мысалы, берілген үш бүтін санның максималды мәнін табу функциясынын
прототипі мынадай
i n t maximum ( i n t a , f l o a t b , i n t c) ;
немесе
i n t maximum ( i n t , f l o a t , i n t ) ;
болуы да мүмкін.
Қысқаша жазу түрін пайдаланган дұрысырақ болып саналады.
4.6 Рекурсивті функциялар
Келесі функция void типіндегі мән қайтарады, ягни жұмыс аткарады, бірак
ешкандай мән бермейді:
v o i d p r i n t ( i n t g g , i n t mm, i n t d d )
{ p r i n t f ( H\ n жыл: %d” , g g ) ;
p r i n t f ( " \ t а й : %d” ,mm) ;
p r i n t f (" \ t к ү н : % d", g g ) ;
}
102
Енді программада осы функцияны төмендегідей түрде шақырсақ,
p r i n t f ( 2 0 1 2 , 1 0 , 1 5 ) ;
Оның нәтижесі:
түрінде болады.
Рекурсивті функциялар. C/C++ тіліңде функция өзін өзі шақырып та пайда-
лана алады, мұндай функция
рекурсивті
деп аталады.
Берілген п бүтін санының факториалын есептейтін ( п ! =1-2-3-...*п)
рекурсивті функция мысалы:
f a k t ( i n t n )
i n t b ;
(n
b =
0
) r e t u r n
1
;
f a k t ( n -
1
) * n ;
r e t u r n n ;
)
Осы функцияны енгізілген n мәні үшін кез келген бүтін санный факториалын
есептеуде колданудың толык профаммасы төмендегі 4.1 мысалда келтірілген.
Функцияларды па йд ал а ну есептері
(тесттен
шыгу кажет.
#include
#include
void main (
)
{
int n=-4;
float power(float, int), x=2.0;
() ;
p r i n t f ("-З-тің 3 дәрежесі =%f\n", power(-3.0, 3));
printf ("%4 .
2f-Hii* %3d fl0peKeci=%6.2f\n"/x,n,power (x,n)) ;
p r i n t f ("0-ді -2 дәрежесіне шыгару: % 6 .2f\n” ,p o w e r (0.0, -2));
getch () ;
}
float power (float x, int n)
I
*
-1
float step;
if(n>0)
{
for(step=l.0; n>0; n— ) step*=x;
return step;
>
else if(x!=0)
I
for ( step=1.0; n<0; пч-+) step/=x;
103
r e t u r n s t e p ;
>
{
p r i n t f ("Қате!!! H) ;
p r i n t f ( "%d-Ti 0 дәреж еге
шыгаруга 6олмаиды!\п",п)
;
r e t u r n О;
)
>
Программа нәтижесі:
-3-тің 3 дэрежесі =-27.000000
2.00-нің -4 дэрежесі= 0.06
Қ а т е !! ! -2
-ні 0 дәрежеге шыгаруіга
ш
0-ді -2 дэрежесіне шығару: 0.00
pow er () функциясы оны шақырган функцияга бір гана мән беруі керек. Бұл
үшін r e t u r n операторын колдану ыңгайлы. Осындай тәсілмен қайтарылган мэн
функция жұмысының нәтижесі болып табылады жэне оны өрнектерде қолдануга
болады.
Функция аргументтері оның жұмысынан кейін өзгермеуі керек, сондықтан
ол функцияга
мэні арқылы
беріледі.
Жазылган функцияның жұмысынын дұрыстыгын тексеру үшін оны бірнеше
берілген мэндер арқылы тесттен өткізу керек. Тест ретінде алынатын мәнді
құрылған алгоритмнің барлық тармактарын қадагалап шыгатындай етіп тандап
алу кажет. Біздін мысалымызда дәрежені есептеу m ain () функциясында үш түрлі
типтегі мәліметтер арқылы тексеріліп шықты, осылай тексеру жеткілікті болып
саналады.
4.1
есеп. Бүтін сандардын факториалын аныісгау профаммасы.
# in c lu d e < с о п іо .һ >
#include
#include
float long fakt(int m)
{
0
)
r e t u r n
1
;
e l s e
return ( (float)
m * fa k t (m-
1
) ) ;
)
tain ()
{
float p;
int n;
104
printf("Бүтін саи енгізіңіз n : ");
scanf (n%dvv, 6n) ;
for (int k*0; k<»n; k++)
( pefakt (k) ;
printf(" %i!» %-15.0f\n",k,p);
| й !
1
р >
Г
'
■
.■ -
/ ; . ' ^
p u t s ("Аяқтау үшін Enter\n");
getch () ;
i
s
- ШШШШ
Келесі функция да ешқандай мән қайтармайды және оның ешқандай
параметрлері де жок.
4.2 есеп. Ағымдағы уақытты бейнелеу.
#include
void real-time (void)
p r i n t f (”\пҚаэіргі уақьгг :
%s",TIME и (саг:мин:сек.)”);
}
".
1
Ш
.
1
•’
Щ
ISSISH I
main ()
{ real-time () ; )
Профамма нәтижесі:
Қазіргі уақыт: 14:16:25 (с а г :мин:сек.)
I
Прототипті көрсетуді осы мысал аркылы былай корсетуге болады:
#include
void real-time (void) ;
m a i n ()
{ real-time () ; }
void real_time(void)
printf ("\n Қазіргі уақыт: %s,f,TIME и (саг: мин: сек.)”)
)
4.3 есеп. Берілген екі бүтін саннын кішісін аныктайтын функцияның ішкі мәтіні
мынадай болуы мүмкін:
int mini (int х, int у)
{ int t;
if (x
else t=y;
return t ;
Шм>
1
М Ш ш Ш Ш І Ш Ш
■
Ш
S
\
Ш .
: j j .
Щ /
- ■
Бүл функцияны төмендегідей түрде басқаша да жазуға болады
mini(int х, int у)
{ return (x
105
Қяйтарылатын нәтиже типі корсстілмесе, ол келісім бойьінша бұтін сан
( i n t
типі болып
саналады.
'Щ
4.4 сссп. Бсрілген он бүтіи санмың факториапын аныктау функциясын жаіу:
#i n c l u d e < о о п іо .һ >
• i n c l u d e < e t d i o . h >
Щ
lo n g f a k t ( i n t k)
..щ
( i f (k < 0) r e t u r n 0 ;
i f (k “ *0) r e t u r n 1 ;
. ц ?|й
lo n g p - 1 ;
f o r ( i n t j « l ; j < « k ; j + + )
P*“ J ;
I
^Щт
r e t u r n (p ) ;
>
Щ
n e i n ()
: Щ И
( i n t n; f l o a t о ;
*
p r i n t f ("n ■ n) ;
'Щ
a c a n f (" %d" , fin) ;
^ І И
“ f a k t (n) ;
p r i n t f ( »% d f « % l f \ n " , n , O ) ;
0 « to h () ;
:Щ
)
Щ
Tcpic сандардыц факториалы болмайлы, муішайла функция 0
мәнін береді,
ал
0
!-І, калган жагдайларла бұл функция цикл ішінде факториалды есептейді.
4.5
сссп, Берілген
m, п
бүтін саидары үшін мынадай врнекті есептеу
ксрек:
ШЙН
( т + я)!
/ / О" ( ® ? *n !) / (mfn) f e c iiiT ty
linoludt
#include
"
long fakt (int k)
( if (k<0) return 0;
if
'
r8 S ^ H
long р м і ;
for (int j«l; j<*k; j++)
.|||
ш Я М
p#* J /
Щ
return (p) ;
main О
(int m,n; float o;
| г
Щ
| '
Достарыңызбен бөлісу: |