Ôóínöèè èñïîëüçóþòñя äëя íaâåäåíèя ïîðяäna â õaîñå aëãîðèòìîâ.
Á. Còðaóñòðóï
Объявление и определение функций
Ôóíêöèя — ýòî èìåíîâaííaя ïîñëåäîâaòåëüíîñòü îïèñaíèé è îïåðaòîðîâ, âû- ïîëíяþùaя êaêîå-ëèáî çaêîí÷åííîå äåéñòâèå. Ôóíêöèя ìîæåò ïðèíèìaòü ïaða- ìåòðû è âîçâðaùaòü çía÷åíèå.
Ëþáaя ïðîãðaììa ía C++ ñîñòîèò èç ôóíêöèé, îäía èç êîòîðûõ äîëæía èìåòü èìя main (ñ íåå ía÷èíaåòñя âûïîëíåíèå ïðîãðaììû). Ôóíêöèя ía÷èíaåò âûïîë- íяòüñя â ìîìåíò âûçîâa. Ëþáaя ôóíêöèя äîëæía áûòü îáúяâëåía è îïðåäåëåía. Êaê è äëя äðóãèõ âåëè÷èí, îáúяâëåíèé ìîæåò áûòü íåñêîëüêî, a îïðåäåëåíèå òîëüêî îäíî. Îáúяâëåíèå ôóíêöèè äîëæíî íaõîäèòüñя â òåêñòå ðaíüøå åå âûçîâa äëя òîãî, ÷òîáû êîìïèëяòîð ìîã îñóùåñòâèòü ïðîâåðêó ïðaâèëüíîñòè âûçîâa.
Îáúяâëåíèå ôóínöèè (ïðîòîòèï, çaãîëîâîn, ñèãíaòóða) çaäaåò åå èìя, òèï âîçâða- ùaåìîãî çía÷åíèя è ñïèñîê ïåðåäaâaåìûõ ïaðaìåòðîâ. Îïðåäåëåíèå ôóínöèè ñî- äåðæèò, êðîìå îáúяâëåíèя, òåëî ôóíêöèè, ïðåäñòaâëяþùåå ñîáîé ïîñëåäîâa- òåëüíîñòü îïåðaòîðîâ è îïèñaíèé â ôèãóðíûõ ñêîáêaõ:
[ êëaññ ] òèï èìя ([ ñïèñîê_ïaðaìåòðîâ ])[throw ( èñêëþ÷åíèя )]
{ òåëî ôóíêöèè }
Ðaññìîòðèì ñîñòaâíûå ÷añòè îïðåäåëåíèя.
C ïîìîùüþ íåîáяçaòåëüíîãî ìîäèôèêaòîða êëaññ ìîæíî яâíî çaäaòü îáëañòü âèäèìîñòè ôóíêöèè, èñïîëüçóя êëþ÷åâûå ñëîâa extern è statiC:
extern — ãëîáaëüíaя âèäèìîñòü âî âñåõ ìîäóëяõ ïðîãðaììû (ïî óìîë÷a- íèþ);
statiC — âèäèìîñòü òîëüêî â ïðåäåëaõ ìîäóëя, â êîòîðîì îïðåäåëåía ôóíêöèя.
Òèï âîçâðaùaåìîãî ôóíêöèåé çía÷åíèя ìîæåò áûòü ëþáûì, êðîìå ìaññèâa è ôóíêöèè (íî ìîæåò áûòü óêaçaòåëåì ía ìaññèâ èëè ôóíêöèþ). Åñëè ôóíêöèя íå äîëæía âîçâðaùaòü çía÷åíèå, óêaçûâaåòñя òèï vOid.
Cïèñîê ïaðaìåòðîâ îïðåäåëяåò âåëè÷èíû, êîòîðûå òðåáóåòñя ïåðåäaòü â ôóíê- öèþ ïðè åå âûçîâå. Ýëåìåíòû ñïèñêa ïaðaìåòðîâ ðaçäåëяþòñя çaïяòûìè. Äëя êaæäîãî ïaðaìåòða, ïåðåäaâaåìîãî â ôóíêöèþ, óêaçûâaåòñя åãî òèï è èìя (â îáúяâëåíèè èìåía ìîæíî îïóñêaòü).
Îá èñêëþ÷åíèяõ, îáðaáaòûâaåìûõ ôóíêöèåé, ðaññêaçûâaåòñя â ðaçäåëå «Cïè- ñîê èñêëþ÷åíèé ôóíêöèè», ñ. 227.
 îïðåäåëåíèè, â îáúяâëåíèè è ïðè âûçîâå îäíîñ è òîñ æå ôóínöèè òèïû è ïîðяäîn ñëåäîâaíèя ïaðaìåòðîâ äîëæíû ñîâïaäaòü. Ía èìåía ïaðaìåòðîâ îãðaíè÷åíèé ïî ñîîòâåòñòâèþ íå íaêëaäûâaåòñя, ïîñêîëüêó ôóíêöèþ ìîæíî âûçûâaòü ñ ðaçëè÷- íûìè aðãóìåíòaìè, a â ïðîòîòèïaõ èìåía êîìïèëяòîðîì èãíîðèðóþòñя (îíè ñëó- æaò òîëüêî äëя óëó÷øåíèя ÷èòaåìîñòè ïðîãðaììû).
Ôóíêöèþ ìîæíî îïðåäåëèòü êaê âñòðîåííóþ ñ ïîìîùüþ ìîäèôèêaòîða inline, êîòîðûé ðåêîìåíäóåò êîìïèëяòîðó âìåñòî îáðaùåíèя ê ôóíêöèè ïîìåùaòü åå êîä íåïîñðåäñòâåííî â êaæäóþ òî÷êó âûçîâa. Ìîäèôèêaòîð inline ñòaâèòñя ïå- ðåä òèïîì ôóíêöèè. Îí ïðèìåíяåòñя äëя êîðîòêèõ ôóíêöèé, ÷òîáû ñíèçèòü ía- êëaäíûå ðañõîäû ía âûçîâ (ñîõðaíåíèå è âîññòaíîâëåíèå ðåãèñòðîâ, ïåðåäa÷a óïðaâëåíèя). Äèðåêòèâa inline íîñèò ðåêîìåíäaòåëüíûé õaðaêòåð è âûïîëíяåòñя êîìïèëяòîðîì ïî ìåðå âîçìîæíîñòè. Èñïîëüçîâaíèå inline-ôóíêöèé ìîæåò óâå- ëè÷èòü îáúåì èñïîëíяåìîé ïðîãðaììû. Îïðåäåëåíèå ôóíêöèè äîëæíî ïðåäøå- ñòâîâaòü åå âûçîâaì, èía÷å âìåñòî inline-ðañøèðåíèя êîìïèëяòîð ñãåíåðèðóåò îáû÷íûé âûçîâ.
Òèï âîçâðaùaåìîãî çía÷åíèя è òèïû ïaðaìåòðîâ ñîâìåñòíî îïðåäåëяþò òèï ôóínöèè.
Äëя âûçîâa ôóíêöèè â ïðîñòåéøåì ñëó÷aå íóæíî óêaçaòü åå èìя, ça êîòîðûì â êðóãëûõ ñêîáêaõ ÷åðåç çaïяòóþ ïåðå÷èñëяþòñя èìåía ïåðåäaâaåìûõ aðãóìåíòîâ. Âûçîâ ôóíêöèè ìîæåò íaõîäèòüñя â ëþáîì ìåñòå ïðîãðaììû, ãäå ïî ñèíòaêñèñó äîïóñòèìî âûðaæåíèå òîãî òèïa, êîòîðûé ôîðìèðóåò ôóíêöèя. Åñëè òèï âîçâða- ùaåìîãî ôóíêöèåé çía÷åíèя íå vOid, îía ìîæåò âõîäèòü â ñîñòaâ âûðaæåíèé èëè, â ÷añòíîì ñëó÷aå, ðañïîëaãaòüñя â ïðaâîé ÷añòè îïåðaòîða ïðèñâaèâaíèя.
Ïðèìåð ôóíêöèè, âîçâðaùaþùåé ñóììó äâóõ öåëûõ âåëè÷èí:
inClude
int sum(int a, int b); // îáúяâëåíèå ôóíêöèè int main(){
inta= 2,b= 3, C, d;
C = sum(a, b); // âûçîâ ôóíêöèè Cin >> d;
COut << sum(C, d); // âûçîâ ôóíêöèè
return 0;
}
int sum(int a, int b){ // îïðåäåëåíèå ôóíêöèè return (a + b);
}
Ïðèìåð ôóíêöèè, âûâîäяùåé ía ýêðaí ïîëя ïåðåäaííîé åé ñòðóêòóðû:
inClude struCt WOrker{
Char fiO[30]; int date, COde; dOuble salary;
};
vOid print_wOrker(WOrker); //îáúяâëåíèå ôóíêöèè int main(){
WOrker stuff[100];
… /* ôîðìèðîâaíèå ìaññèâa stuff */
fOr (inti= 0; i<100; i++)print_wOrker(stuff[i]); // âûçîâ ôóíêöèè return 0;
}
vOid print_wOrker(WOrker w){ //îïðåäåëåíèå ôóíêöèè
COut << w.fiO << ' ' << w.date << ' ' << w.COde << ' ' << w.salary << endl;
}
Âñå âåëè÷èíû, îïèñaííûå âíóòðè ôóíêöèè, a òaêæå åå ïaðaìåòðû, яâëяþòñя ëî- êaëüíûìè. Îáëañòüþ èõ äåéñòâèя яâëяåòñя ôóíêöèя. Ïðè âûçîâå ôóíêöèè, êaê è ïðè âõîäå â ëþáîé áëîê, â ñòåêå âûäåëяåòñя ïaìяòü ïîä ëîêaëüíûå aâòîìaòè÷å- ñêèå ïåðåìåííûå. Êðîìå òîãî, â ñòåêå ñîõðaíяåòñя ñîäåðæèìîå ðåãèñòðîâ ïðîöåñ- ñîða ía ìîìåíò, ïðåäøåñòâóþùèé âûçîâó ôóíêöèè, è aäðåñ âîçâðaòa èç ôóíêöèè äëя òîãî, ÷òîáû ïðè âûõîäå èç íåå ìîæíî áûëî ïðîäîëæèòü âûïîëíåíèå âûçû- âaþùåé ôóíêöèè.
Ïðè âûõîäå èç ôóíêöèè ñîîòâåòñòâóþùèé ó÷añòîê ñòåêa îñâîáîæäaåòñя, ïîýòîìó çía÷åíèя ëîêaëüíûõ ïåðåìåííûõ ìåæäó âûçîâaìè îäíîé è òîé æå ôóíêöèè íå ñîõðaíяþòñя. Åñëè ýòîãî òðåáóåòñя èçáåæaòü, ïðè îáúяâëåíèè ëîêaëüíûõ ïåðå- ìåííûõ èñïîëüçóåòñя ìîäèôèêaòîð statiC:
inClude vOid f(int a){
intm= 0;
COut << "n m p\n"; while (a--){
statiC intn= 0; intp= 0;
COut << n++ << ' ' << m++ << ' ' << p++ << '\n';
}
}
int main(){ f(3); f(2); return 0;}
Còaòè÷åñêaя ïåðåìåííaя n ðaçìåùaåòñя â ñåãìåíòå äaííûõ è èíèöèaëèçèðóåòñя îäèí ðaç ïðè ïåðâîì âûïîëíåíèè îïåðaòîða, ñîäåðæaùåãî åå îïðåäåëåíèå. Àâòî- ìaòè÷åñêaя ïåðåìåííaя m èíèöèaëèçèðóåòñя ïðè êaæäîì âõîäå â ôóíêöèþ. Àâòî- ìaòè÷åñêaя ïåðåìåííaя p èíèöèaëèçèðóåòñя ïðè êaæäîì âõîäå â áëîê öèêëa. Ïðîãðaììa âûâåäåò ía ýêðaí:
nmp 000
110
220
nmp 300
410
Ïðè ñîâìåñòíîñ ðaáîòå ôóínöèè äîëæíû îáìåíèâaòüñя èíôîðìaöèåñ. Ýòî ìîæ- íî îñóùåñòâèòü ñ ïîìîùüþ ãëîáaëüíûõ ïåðåìåííûõ, ÷åðåç ïaðaìåòðû è ÷åðåç âîç- âðaùaåìîå ôóínöèåñ çía÷åíèå.
Do'stlaringiz bilan baham: |