előadás 07

Mert void funkciók return főleg elemként program irányítását. Például a következő kimeneti funkciók eredményezheti számát növeljük pozitív egész erő. Ha a kitevő negatív, bevallásának ad utasítást kilép a funkciót, mielőtt megpróbálja kiszámítani ilyen kifejezés. Ebben az esetben a visszatérési utasítás működik, mint egy kontroll elem megakadályozza a nem kívánt egyedi feladat ellátására részben.

void teljesítmény (int bázis, int exp)

if (exp<0) return; /* Чтобы не допустить возведения числа в отрицательную степень, здесь выполняется возврат в вызывающую функцию и игнорируется остальная часть функции. */

a (; exp; exp--) i = bázis * i;

cout <<"Результат равен: " <

A funkció tartalmazhat több visszatérő. A funkció hajtható végre, ha legalább az egyiket. Például, a következő kódot teljesen jogos.

Ugyanakkor nem szabad elfelejteni, hogy túl sok a return utasítást rontja a világosság az algoritmus, és félrevezetik azokat, akik ott lesznek, hogy megértsék. Számos visszatérő kell használni, csak abban az esetben hozzájárulnak a célszerűség.

Minden funkció, kivéve a típusa void. vissza semmilyen értéket. Ez az érték kifejezetten beállítva a bevallását. Más szóval, minden nem üres-funkció csak akkor használható, mint egy változó a kifejezést. Következésképpen, minden egyes, a következő kifejezések megengedett C ++.

ha (max (x, y))> 100) cout <<"больше";

Annak ellenére, hogy az összes nem-üres-függvény visszatérési értéke, akkor nem feltétlenül kell használni a programot. A leggyakoribb kérdés a visszaadott értékek a függvény a következő: „Mivel a függvény egy értéket, akkor talán nem kellene (kell), hogy hozzárendeli a bizonyos változó?”. Válasz: Nem, ez nem szükséges. Ha a visszatérési érték nem vesz részt a feladat, akkor egyszerűen dobni (elveszett).

Tekintsük a következő programot, amely egy standard könyvtár abs () függvény.

using namespace std;

i = abs (-10); // 1-es vonal

cout <

abs () függvény abszolút értéke annak egész érv. Ez használ a fejléc . Az 1. sor, a visszaadott érték a függvény abs (). adott változó i. A 2. sor, a visszaadott érték a függvény abs (). semmi van rendelve, de az utasítás használják cout. Végül a 3. sorban az értéket a függvény visszatérési abs (). Ez elveszett, nem tulajdonítható a többi változó, és nem használják részeként egy kifejezést.

Ha a függvény egy eltérő típusú típusától semmis. végződik, mint a kimutatás eredményét a záró zárójel, az értéket, hogy visszatér nem határozza meg (azaz ismert). Természete miatt a hivatalos C ++ szintaxis nem üres, a funkció nem köteles végrehajtani az utasítást vissza. Ez akkor történhet meg, ha a funkció elérte vége előtt a visszatérési utasítás észlel. De, mivel a funkció bejelentett értéket visszaadni, az érték még mindig vissza, akkor is, ha ez csak „szemetet”. Általában bármely űrt akkor nem egy függvény vissza kell adniuk egy értéket kifejezetten végrehajt egy visszatérési utasítás.

Már említettük, hogy a void függvény lehet több vissza. Ugyanez vonatkozik a visszatérő függvények értékeit. Például az alábbiakban bemutatott programban find_substr () függvény két visszatérő utasításokat. hogy egyszerűsítse az algoritmus munkája. Ez a funkció megkeresi a megadott substring egy adott karakterlánc. Visszaküldi az index az első előfordulása a detektált előre meghatározott substring vagy -1. ha a megadott karaktersorozat nem található. Például, ha a vonal „Szeretem a C ++” kell találni azt a rész „szeretet”. A funkció find_substr () visszatér a 2-es szám (amely a „L” szimbólum index a „Szeretem C ++”).

using namespace std

int find_substr (char * sub, char * str);

index = find_substr ( "három", "one-kettő-három-négy");

cout <<"Индекс равен " <

// A függvény visszaküldi az index a szükséges substring, vagy -1, ha nem volt megtalálható.

int find_substr (char * sub, char * str)

p = Str [t]; // állítsa mutató

while (* p2 * P2 == * p)

/ * Ha elérjük a végét P2 húrok (azaz töredékszó), akkor azt a rész találtak. * /

if (* p2!) visszatérő t; // Vissza az index a részkarakterláncként.

vissza -1; // töredékszó nem található.

Az eredményeket a program a következők.

Mivel a kívánt substring létezik egy adott sorban, az első utasítás végrehajtásra kerül vissza. Mint egy gyakorlat, módosítja a programot úgy, hogy végzett részkarakterláncként kereső, ami nem része a megadott karakterláncot. Ebben az esetben a find_substr () függvény kell vissza értéke -1 (mivel a második kézi visszatérő).

Funkciók, hogy nem térnek vissza értéket (void-funkció)

using namespace std;

void print_vertical (char * str);

int main (int argc, char * argv [])

void print_vertical (char * str)

cout <<*str++ <<'\n';

Mivel print_vertical () nyilvánították érvénytelennek funkciót, akkor nem lehet használni a kifejezést. Például a következő állítás nem helytálló, és ezért nem fordul.

x = print_vertical ( "Hello!"); // hiba

Fontos! Az első változatban a C nyelv típusa void nem bocsátották. Így a régi függvényt C programok amelyek nem adnak vissza értéket kell int típusú alapértelmezés szerint. Ha találkozni ilyen funkciók a fordítás a régi C programok „sínen” C ++, csak nyilvánítja azokat a kulcsszó érvénytelen, így érvénytelen-funkciókat.

Függvény, amely visszaadja a mutatót

Funkciók visszatérhet mutatók. Pointerek nem ugyanaz, mint bármely más típusú adatokat, és anélkül, hogy bármilyen probléma. De mivel a mutató az egyik legnehezebb (vagy nem biztonságos): a C ++ nyelvet, akkor van értelme, hogy külön részt szentelünk.

Vissza a pointer funkció nyilatkozniuk kell a típus, mint egy visszatérő típus. Így például nyilvánították visszatérési típusa az f () függvény. hogy vissza kell adnia egy mutatót egy egész szám.

Ha a függvény egy mutatót, az értéke használják a bevallását. Azt is meg kell egy mutatót. (Mint minden funkció visszatérési értéke van összeegyeztethetőnek kell lennie a visszatérési típus.)

A következő program használatát mutatja be a mutatót a visszatérési típus. Ez - az új verzió find_substr () függvény szerint. Csak most nem tér vissza részkarakterláncként indexe, és a mutatót is. Ha a megadott karakterlánc nem található, visszatér a null pointer.

// Az új verzió find_substr () függvényt.

// ami visszaad egy pointert a húr.

using namespace std;

char * find_substr (char * sub, char * str);

substr = find_substr ( "három", "one-kettő-három-négy");

cout <<"Найденная подстрока: " <

a (t = 1; t<=n; t++) answer = answer* (t);

Nem rekurzív változata a funkció tény () igen egyszerű, és nem igényel hosszabb magyarázatot. Ez használ egy ciklus, amelyben a szervezett szorzás egymás kezdődő számok 1 és befejezve a megadott számot, mint a paraméter: mindegyik ismétlésnél az aktuális érték a manipulált változó ciklus szorozva az aktuális érték az előállított termék eredményeként az előző iterációs ciklus.

Rekurzív függvény factr () valamivel bonyolultabb. Ha ez az úgynevezett egy argumentuma 1, majd azonnal visszatér a értéke 1. Különben visszaküldi a terméket factr (n-1) * n. Ahhoz, hogy értékelje ezt expressziós okozott factr () módszer egy érv n-1. Ez a folyamat ismétlődik, amíg az az érv egyenlő 1, akkor okozta a korábbi módszerek vissza értéket. Például, ha kiszámítjuk a faktoriális 2 az első hívást a módszer factr () vezet a második kezelés a fenti eljárással, de egy argumentuma 1 második hívás factr () módszer értékét adja vissza 1, amely meg kell szorozni 2 (a kezdeti értéke az n paraméter ). Lehet, hogy érdekes, hogy helyezze factr function () cout nyilatkozatot. megmutatni a szint minden hívás, és a közbenső eredményeket.

Ha egy függvény önmagát hívja meg, a rendszer verem memóriát új lokális változók és paraméterek a funkció kód az elejétől ezekkel az új változókat. Rekurzív hívás létrehoz egy új példányt a funkciót. Új az egyetlen érv. Visszatérve minden rekurzív hívás vissza a veremből régi lokális változók és paraméterek függvényében folytatódik a „belső” hivatása pontot. Rekurzív függvények lehet mondani, hogy azok „jelölt” és a „visszahúzódik”.

Túl sok rekurzív hívások okozhat verem túlcsordulás. Mivel a helyi változók és paraméterek tárolja a rendszer verem és az új pályázati létrehoz egy új példányt az említett változók, eljöhet az idő, amikor a verem memória kimerült. Ebben az esetben a másik ( „nem ártatlan”) adatai is meg kell semmisíteni. De ha a rekurzió épül rendesen, ez aligha érdemes aggódni.

A fő előnye, rekurzió, hogy bizonyos típusú algoritmusok hajtják végre rekurzív könnyebb, mint az iteratív egyenértékű. Például Quicksort rendezési algoritmus meglehetősen nehéz végrehajtani iteratív módon. Ezen kívül bizonyos feladatokat (különösen azokat, amelyek a mesterséges intelligencia) egyszerűen létre rekurzív megoldásokat. Végül néhány programozó gondolt folyamat megszervezni, hogy ez könnyebb azt gondolni, rekurzív mint iteratív.

Írásakor egy rekurzív függvényt, akkor tartalmaznia kell a feltételeket a vizsgálati utasítások (pl ha-utasítás), amely megteremtené a kiutat a funkciókat anélkül, hogy a rekurzív hívást. Ha nem, akkor hívlak ez a funkció egyszerre, mert lehetetlen lesz visszamenni. Amikor dolgozik rekurzió a leggyakoribb hiba típusát. Ezért, amikor programok kidolgozása a rekurzív függvények nem szükséges fukarkodik a cout nyilatkozatot. tudatában lenni, hogy mi történik egy adott funkció, és hogy képes megszakítani munkáját a hiba esetén.

Vegyünk egy másik példa a rekurzív függvény. fordított () függvény rekurzív megjelenítéséhez string argumentum fordított sorrendben.

// megjeleníti a húr fordított sorrendben segítségével rekurzió.

using namespace std;

void fordított (char * s);

char str [] = "Ez egy teszt";

Kapcsolódó cikkek