Statická proměnná java. Statické metody v Javě, přetěžování metod, rekurze. Co je statické

Komplextabulky Tabulkatyp
« objektů - několik objektů» ( OSN)

Typ tabulky " objekty-objekty-více

Celkový pohled na tabulky typu OSN:

V této tabulce hlava ( horní nadpis) má třívrstvou strukturu.

Příklad 5

Tabulka 2.9

Známky z informatiky a studenti matematiky 7. třída


V tomto příkladu jsou dvojice vytvořeny z objektů patřících do tříd „student“ a „předmět“. Vlastnosti zde představují známky, které studenti obdrželi za různá období studia.

Zkusme tytéž informace podat jinak. Tvoříme dvojice objektů patřících do tříd „student“ a „období studia“. Známky získané studenty v předmětech budeme považovat za vlastnosti.

Tabulka 2.10

Známky z informatiky a studenti matematiky 7. třída


Z tohoto příkladu je zřejmé, že objekty a vlastnosti mohou měnit role: co bylo objektem, stává se vlastností a naopak. Jedna nebo druhá možnost by měla být zvolena v závislosti na účelu sestavení tabulky. Například pro sledování pokroku studenta v různých časových obdobích ve stejném předmětu je vhodnější použít tabulku 2.9. A celkový obraz akademického výkonu za celou dobu studia je snáze pochopitelný pomocí tabulky 2.10. Tabulka 2.11 ukazuje výňatek ze zprávy o pokroku studenta, která se nachází na konci zápisu třídy.

Tabulka 2.11

Známky z informatiky a studenti matematiky 7. třída

Tabulka typu „objekty - vlastnosti - objekty“ (OSO)

Příklad 6

V tabulce 2.12 Prezentována jsou antropometrická data žáků 7. ročníku. Tato tabulka je typu OOS.

Tabulka 2.12AntropometrickéÚdaje o žákovi 7. třídy

Výsledky dětí ve školní sportovní soutěži jsou uvedeny v tabulce 2.13. Tato tabulka je typu UN.

Tabulka 2.13 Sportovní výsledky školy

Spojme informace obsažené v tabulce 2.12 a tabulce 2.13. K tomu „zvýšíme“ stranu tabulky 2.12 tím, že za ni vložíme potřebné sloupce z tabulky 2.13. Dostáváme:

Tabulka 2.14

Antropometrické data a sport výsledky studentů 7. třída


V této tabulce nejsou vlastnosti „výška“ a „váha“ spárovány, vztahují se pouze k objektům třídy „student“. Vlastnosti „výsledek“ a „skóre“ charakterizují dvojice objektů tříd „student“ a „cvičení“.

Na rozdíl od tabulek jiných typů nelze tabulky typu OCO „otočit na stranu“, protože jednotlivé vlastnosti objektů musí být nutně na straně.

Otázky A úkoly

1.Jaké výhody poskytují tabulkové informační modely oproti slovním popisům? Uveďte příklad.

2. Lze jakýkoli slovní popis nahradit tabulkovým? informační model? Uveďte příklad.

3.Uveďte příklady tabulkových informačních modelů, se kterými jste se setkali ve škole.

4.Uveďte příklady tabulkových informačních modelů, se kterými jste se setkali v každodenním životě.

5.Jaká pravidla je třeba dodržovat při sestavování tabulek?

PROTI. Jaké typy informací jsou umístěny ve sloupcích tabulky? Je možné tam umístit grafické obrázky? Uveďte příklad.

Krátký Ó hlavní věc

K popisu řady objektů, které mají stejné sady vlastností, se nejčastěji používají tabulky sestávající ze sloupců a řádků. Informace uvedené v tabulce jsou jasné, kompaktní a snadno viditelné.

Tabulka vlastností objektů je tabulka obsahující informace o vlastnostech jednotlivých objektů patřících do stejné třídy.

Typ tabulky " objekty-objekty-jeden" je tabulka obsahující informace o nějaké jediné vlastnosti dvojic objektů, které nejčastěji patří různé třídy.

Typ tabulky " objekty-objekty-více" je tabulka obsahující informace o několika vlastnostech dvojic objektů patřících do různých tříd.

Tabulka typu „objects-properties-objects“ je tabulka obsahující informace o vlastnostech dvojic objektů patřících do různých tříd a o jednotlivých vlastnostech objektů jedné z tříd.

Tabulka vlastností objektů je tabulka obsahující informace o vlastnostech jednotlivých objektů patřících do stejné třídy.

Celkový pohled na tabulky typů OS:

Počet řádků v tabulce závisí na počtu přítomných objektů a počet sloupců závisí na počtu uvažovaných vlastností.

Příklad 1

Tato tabulka poskytuje informace o některých starověkých ruských městech, která uchovávají jedinečné památky naší kultury a historie a tvoří světoznámý Zlatý prsten Ruska. Tato informace se odráží v záhlaví tabulky.

Tabulka zobrazuje objekty „Vladimir“, „Kostroma“, „Pereslavl-Zalessky“ a „Gus-Khrustalny“, které patří do třídy „město“. U každého objektu jsou uvedeny hodnoty vlastností „rok založení“, „zakladatel“ a „orientační bod“, vyjádřené čísly a slovy.

V malých tabulkách (3-4 řádky) mohou být objekty uvedeny v libovolném pořadí. Pokud je v tabulce hodně objektů, pak je třeba je seřadit v nějakém smysluplném pořadí, podle nějakého pravidla. Například ve výše uvedené tabulce mohou být města uvedena v abecední pořadí, vzestupně nebo sestupně podle roku jejich založení.

Pokud je v tabulce typu OS více vlastností než objektů, lze ji „otočit na bok“ - řádky lze změnit na grafy a grafy na řádky.

Například:

Co přesně by mělo být umístěno v hlavě a co by mělo být umístěno na straně - předměty nebo vlastnosti - závisí na konkrétním stole. Tabulka s mnoha řádky a několika sloupci je zpravidla výhodnější než tabulka s několika řádky, ale mnoha sloupci.

Typ tabulky Objects-Objects-One (OOO).
Tabulka objekty-objekty-jeden je tabulka obsahující informace o nějaké jediné vlastnosti dvojic objektů, nejčastěji patřících do různých tříd.

Celkový pohled na tabulky typu LLC:

V této tabulce má hlava (horní nadpis) složitou (dvouvrstvou) strukturu.

Příklad 2

Tabulku typu LLC lze „otočit na bok“ řádky a sloupce na řádky.

Například:

Tabulka typu OOO zaznamenává jednu vlastnost dvojice objektů, takže její buňky vždy obsahují hodnoty stejného typu: buď čísla, nebo slova, nebo grafické obrázky.

Příklad 3
Tabulka „Vzdálenosti mezi městy“ uvádí vzdálenosti mezi dvojicemi objektů patřících do stejné třídy „město“, proto jsou objekty této třídy uvedeny jak v záhlaví, tak na straně tabulky. Výsledkem je, že hlava stolu „ztratí“ jednu úroveň a samotný stůl vypadá jednodušeji. Tato tabulka platí také pro typ LLC.

Podobné tabulky jsou v atlasech dálnice. Pravda, tam jsou formátovány takto:

Příklad 4

Pomocí této tabulky si můžete udělat představu o tom, co žáky 7. ročníku zajímá, jaké kroužky a oddíly navštěvují. Pokud má žák zájem o tanec, sport popř počítačová grafika(navštíví odpovídající kruh nebo sekci), pak se do požadované buňky umístí 1, a pokud ne, 0.

Buňky této tabulky obsahují čísla, ale pouze 0 a 1. Takové tabulky se nazývají binární tabulky.

Důležitým rysem této tabulky je, že nezaznamenává kvantitativní (kolik?), ale kvalitativní vlastnosti(přítomnost/nepřítomnost spojení mezi
předměty).

Krátce o tom hlavním:

  • Tabulka vlastností objektů je tabulka obsahující informace o vlastnostech jednotlivých objektů patřících do stejné třídy.
  • Tabulka objekty-objekty-jeden je tabulka obsahující informace o nějaké jediné vlastnosti dvojic objektů, nejčastěji patřících do různých tříd.

Otázky a úkoly:

Poslední aktualizace: 19.04.2018

Kromě konvenční metody a pole, třída může mít statická pole, metody, konstanty a inicializátory. Například hlavní třída programu má metodu main, která je statická:

Veřejná statická void main(string args) ( )

Chcete-li deklarovat statické proměnné, konstanty, metody a inicializátory, uveďte před jejich deklarací klíčové slovo statický.

Statická pole

Když jsou vytvořeny objekty třídy, každý objekt má svou vlastní kopii nestatických pravidelných polí. A statická pole jsou společná pro celou třídu. Proto je lze použít bez vytváření objektů třídy.

Vytvořme například statickou proměnnou:

Public class Program( public static void main(String args) ( Person tom = new Person(); Person bob = new Person(); tom.displayId(); // Id = 1 bob.displayId(); // Id = 2 System.out.println(Person.counter) // 3 // změna Person.counter Person.counter = 8 Person sam = new Person( // Id = 8 ) class Person ( private int id; static int counter=1 Person())( id = counter++; ) public void displayId())( System.out.printf("Id: %d \n", id); ) )

Třída Person obsahuje počítadlo statické proměnné, která je inkrementována v konstruktoru a její hodnota je přiřazena proměnné id. To znamená, že při vytváření každého nového objektu Osoba se tato proměnná zvýší, takže každý nový objekt Osoba bude mít hodnotu pole id, která je o 1 větší než předchozí.

Protože je proměnná čítače statická, můžeme na ni v programu odkazovat jejím názvem třídy:

System.out.println(Person.counter); // získáme hodnotu Person.counter = 8; // změnit hodnotu

Konzolový výstup programu:

Id = 1 Id = 2 3 Id = 8

Statické konstanty

Statické jsou také konstanty, které jsou společné pro celou třídu.

Public class Program( public static void main(String args) ( dvojitý poloměr = 60; System.out.printf("Radisu: %f \n", poloměr); // 60 System.out.printf("Oblast: %f \n", Math.PI * poloměr); // 188,4 ) ) class Math( public statické finále dvojité PI = 3,14; )

Stojí za zmínku, že ve všech předchozích tématech již byly statické konstanty aktivně používány. Zejména ve výrazu:

System.out.println("ahoj");

out pouze představuje statickou konstantu třídy System. Proto je přístupný bez vytvoření objektu třídy System.

Statické inicializátory

Statické inicializátory jsou navrženy k inicializaci statických proměnných nebo k provádění akcí, které se provádějí při vytvoření úplně prvního objektu. Definujme například statický inicializátor:

Public class Program( public static void main(String args) ( Person tom = new Person(); Person bob = new Person(); tom.displayId(); // Id = 105 bob.displayId(); // Id = 106 ) ) class Osoba( private int id; static int counter; static( counter = 105; System.out.println("Statický inicializátor"); ) Osoba())( id=counter++; System.out.println("Konstruktor" " ); ) public void displayId())( System.out.printf("Id: %d \n", id); ) )

Statický inicializátor je definován jako běžný inicializátor, pouze mu předchází klíčové slovo static . V v tomto případě ve statickém inicializátoru nastavíme počáteční hodnotu čítače statického pole a vytiskneme zprávu do konzole.

V samotném programu jsou vytvořeny dva objekty třídy Osoba. Proto bude výstup konzole vypadat takto:

Statický inicializátor ID konstruktoru konstruktoru: 105 ID: 106

Stojí za zvážení, že statický inicializátor je volán pouze před vytvořením objektu první třídy.

Statické metody

Statické metody platí také pro celou třídu jako celek. Například ve výše uvedeném příkladu byl čítač statických proměnných externě přístupný a jeho hodnotu jsme mohli změnit mimo třídu Person. Udělejme to nepřístupné pro změnu zvenčí, ale přístupné pro čtení. K tomu používáme statickou metodu:

Public class Program( public static void main(String args) ( Person.displayCounter(); // Counter: 1 Person tom = new Person(); Person bob = new Person(); Person.displayCounter(); // Counter: 3 ) ) class Osoba( private int id; private static int counter = 1; Person())( id = counter++; ) // statická metoda public static void displayCounter())( System.out.printf("Počítadlo: %d \n ", counter); ) public void displayId())( System.out.printf("Id: %d \n", id); ) )

Nyní statická proměnná není přístupná zvenčí, je soukromá. A jeho hodnota se zobrazí pomocí statické metody displayCounter. Chcete-li volat statickou metodu, použijte název třídy: Person.displayCounter() .

Při použití statických metod musíme počítat s omezeními: ve statických metodách můžeme volat pouze jiné statické metody a používat pouze statické proměnné.

Obecně jsou metody definovány jako statické, když metody neovlivní stav objektu, tedy jeho nestatická pole a konstanty, a nemá smysl vytvářet instanci třídy pro volání metody. Například:

Public class Program( public static void main(String args) ( System.out.println(Operation.sum(45, 23)); // 68 System.out.println(Operation.subtract(45, 23)); // 22 System.out.println(Operation.multiply(4, 23) // 92 ) class Operation( static int sum(int x, int y)( return x + y; ) static int subtract(int x, int y); )( return x - y; ) static int multiply(int x, int y)( return x * y; ) )

V tomto případě pro metody součet, odečítání, násobení nezáleží na tom, která instance třídy Operation je použita. Tyto metody pracují pouze s parametry, aniž by ovlivnily stav třídy. Proto je lze definovat jako statické.

Statická metoda je fragment programu, kterému jsou nějaké přiřazeny jedinečné jméno, a které lze pod tímto jménem volat z jiných částí programu. V okamžiku, kdy dojde k volání, jsou provedeny akce uvedené uvnitř metody (v jejím popisu nebo těle).
V objektově orientovaném programování je hlavním úkolem metod změnit aktuální stav objektu, ale pokud ještě nejsou objekty v programu používány, lze metody již zavádět. Metoda, která je popsána uvnitř třídy, ale je volána bez aplikace konkrétní objekt tato třída se nazývá statická.

Kromě výše uvedeného názvu a popisu má metoda řadu dalších charakteristik:

  1. Sada modifikátorů.
  2. Typ návratové hodnoty.
  3. Sada argumentů (parametrů).

Modifikátory metod

Chcete-li vytvořit statickou metodu, musíte ji zadat před její název modifikátor statický. Pokud se tak nestane, lze metodu volat pouze v aplikaci na konkrétní objekt této třídy (bude nestatický).

Veřejný modifikátor je zodpovědný za úroveň přístupu k popsané metodě. Úrovně lze zadat místo veřejných soukromý přístup nebo chránit, nebo nelze nic specifikovat, pak se použije výchozí úroveň přístupu.

S úrovněmi přístupu se podrobněji seznámíme, až si vytvoříme vlastní třídy, ale prozatím podotýkáme, že výchozí přístup umožňuje přistupovat k metodě z libovolné části balíčku, ve kterém je metoda popsána. A veřejná úroveň umožňuje přístup k metodě odkudkoli. Včetně z jiných balíčků a programů.

Hlavní metoda musí mít úroveň veřejného přístupu právě proto, že k ní přistupuje virtuální java stroj, není součástí žádného balení.

Kromě toho existují další modifikátory, které například umožňují regulovat činnost metod při paralelních (vícevláknových) výpočtech.

Návratový typ

Metody v Javě lze rozdělit do dvou skupin: funkce a procedury. Do první skupiny patří metody, které jsou velmi podobné funkcím v matematickém smyslu. Takové metody v důsledku své práce vracejí nějaký konkrétní výsledek na místo v programu, ze kterého byly volány. stávající typ, to znamená, že to může být celé číslo nebo skutečné číslo nebo logická hodnota (int, double, boolean), pole (odkaz na něj), objekt (odkaz na něj). Návratová hodnota musí být přiřazena proměnné vhodný typ nebo předán nějaké jiné metodě jako argument.

Na rozdíl od funkcí, metody procedurálního typu produkují nějaký druh užitečné akce, ale neposkytují úplný výsledek, který by mohl být vyjádřen v jedné konkrétní hodnotě nebo objektu.

Dvojité r = Math.random(); /* náhodné odkazuje na funkce */ System.out.println(r); /* println odkazuje na procedury */

Pokud bychom vytvořili metodu, která by stejně jako println vytiskla text na obrazovku, ale zároveň spočítala počet mezer v textu a vrátila tento výsledek, dostali bychom funkci. V tomto případě by funkce pokračovala v provádění užitečných akcí charakteristické pro proceduru println. Funkce je tedy univerzálnější než procedura, ale není vždy nezbytná.

Při vytváření metody je prvním krokem určení, zda se bude jednat o funkci nebo proceduru. Pro mezivýpočty se obvykle používají funkce. Procedury mohou být také vhodné pro zkrácení podobných fragmentů kódu.

Za modifikátory, ale také vlevo od názvu metody, je uveden typ hodnoty, kterou vrací (pokud je metoda funkcí, například: int nebo double) nebo slovo void (pokud je metoda procedura) .

Pokud je metoda funkcí, pak musí obsahovat návratový příkaz za nímž je, oddělený mezerou, uveden výraz, jehož hodnota by měla být vrácena jako výsledek metody.

Všechny příkazy uvedené v popisu metody po returnu již nebudou provedeny return bez argumentu lze použít uvnitř procedur. Jednoduše ukončí proceduru před plánem (obdoba přerušení pro smyčku).

Argumenty (parametry)

Při volání metody jí lze z hlavního programu předat sadu určitých hodnot. Aby bylo možné metodu naučit je přijímat (a zpracovávat je uvnitř metody), musí být dvojice formuláře uvedeny v závorkách za názvem metody: typ_argumentu název_argumentu oddělené čárkami.

Poté při volání metody bude možné zadat sadu hodnot odpovídajících typům popsaným v argumentech.

Hodnoty, které jsou předány metodě v době volání, se nazývají skutečné parametry a názvy argumentů, které se objevují v popisu metody, se nazývají formální parametry.

Každý formální parametr je lokální proměnná uvnitř metody, to znamená, že není dostupný mimo metodu (mimo její popisný blok). Při volání metody se skutečná hodnota zkopíruje do formálního parametru.

Zejména to znamená, že předáním libovolné proměnné základní typ jako parametr k metodě, když je volána, nebudeme moci změnit hodnotu této proměnné v hlavním programu. Pokud je nějaký objekt nebo pole předán metodě prostřednictvím argumentu, pak se do metody zkopíruje pouze odkaz na objekt nebo pole (tj. jejich adresa v paměti). Akce, které provádíme s polem nebo objektem uvnitř metody, ovlivní stav tohoto pole nebo objektu v hlavním programu i poté, co metoda dokončí svou práci. Uvnitř metody jsme přistupovali na stejnou adresu a pracovali se stejnými daty v paměti, která byla k dispozici v hlavním programu.

Pokud je název skutečného parametru stejný jako formální parametr, pak to nezpůsobuje žádný problém: uvnitř metody je lokální proměnná, do které se při volání zkopíruje hodnota stejnojmenné globální proměnné. Přístupem k tomuto názvu uvnitř metody skončíme s lokální proměnnou a nebudeme se moci dostat do globální.

Popis metody

Metoda musí být popsána uvnitř třídy, ale jedna metoda není popsána uvnitř druhé, to znamená, že metoda musí být vnořena přímo do bloku třídy.

Obecné schéma pro popis metody:

Modifikátory return_value_type název_metody (formální argumenty) ( // akce prováděné metodou // možná, return )

Tradičně musí název metody začínat malým písmenem. Pokud se skládá z několika slov, každé následující slovo začíná na velké písmeno. Název pro metodu je zvolen tak, aby bylo jasné, co dělá.

Podívejme se na několik příkladů:

Public static double kvadk (double) ( double t; t = Math.pow(a, 0,5); return t; )

Nyní uvnitř hlavní metody můžeme použít naši metodu. Například takto:

Int a = 25; System.out.println(kvadk(a)); // 5.0 System.out.println(a) // 25

Při předávání skutečných parametrů metodě dochází k autocastingu. Pokud skutečný argument neodpovídá formálnímu typu, Java se pokusí přetypovat skutečný argument na více univerzální typ(v tomto případě bylo int převedeno na double).

Přetížení metody

Signatura metody je kombinací jejího názvu a sady formálních parametrů.
Java umožňuje vytvářet více metod se stejnými názvy, ale různými podpisy. Vytvoření metody se stejným názvem, ale s jinou sadou parametrů se nazývá přetěžování. Java na základě skutečných parametrů určuje, která přetížená metoda se má při volání provést.

Void pr(double a) ( System.out.println(a); ) void pr (String a) ( System.out.println(a); ) void pr(int a) ( for (int i=0; i

Příklad použití metody.

Int a = 5; int m = (1, 2, 8, 3) Řetězec s = "Svět"; pr (a) //původní metoda funguje pr (a+s); // Svět 5, první přetížení běží pr (m); // 1 2 8 3 pr (m+a); // chyba

Proměnná a není typu double, ale je zpracována původní metodou, protože je možné automatické přetypování z int na double. Opačným směrem to nejde. Pokud by metoda měla argument typu int, pak by nemohla vypisovat reálná čísla.

Přetěžování metod implementuje tak důležitou vlastnost v programování, jako je polymorfismus. Polymorfní je softwarový kód, který je spojen s jedním společným názvem, ale má různé implementace. Která implementace bude fungovat se vybírá na základě kontextu, ve kterém bylo jméno zmíněno. Konkrétně u metod jsou jejich přetížení polymorfní a výběr spustitelného přetížení probíhá podle parametrů.

Polymorfismus: jedno jméno, mnoho podob.

Příklady použití metod

Následující program vyhledá a zobrazí všechny prvočíselné netriviální dělitele čísla zadaného uživatelem z klávesnice, počínaje největším dělitelem, nebo hlásí, že zadané číslo je prvočíslo.

Importovat java.util.Scanner; public class Main ( public static boolean isPrime(int n) ( for(int i = 2; i<= Math.sqrt(n) ; i++) { if(n%i == 0) { return false; } } return true; } public static void main(String args) { Scanner sc = new Scanner(System.in); System.out.print("Введите натуральное число: "); if(sc.hasNextInt()) { int u = sc.nextInt(); if(u >0) ( if(isPrime(u)) ( System.out.println("Zadali jste prvočíslo"); ) else ( System.out.print("Prvočinitele čísla: "); for(int i = (int) Math.sqrt(u i >= 2 --) ( if(u%i == 0 && isPrime(i)) ( System.out.print(i+" "); ) ) System; .out.println ( ) ) else ( System.out.println("Nezadali jste kladné číslo"); ) ) else ( System.out.println("Nezadali jste celé číslo"); ) ) )

V následujícím příkladu bude z důvodu přetížení vytvořeno několik metod stejného názvu.

První verze metody jednoduše přeloží řetězec, tj. bude to ve skutečnosti kratší synonymum pro vestavěnou metodu System.out.println(). Tato možnost nebude mít žádné parametry.

Druhá varianta metody (její první přetížení) kontroluje, zda má numerický argument zlomková část, pokud tam není, pak se argument převede na celá čísla a zobrazí se na obrazovce bez nulové zlomkové části (3 místo 3.0). Tato metoda bude moci projít nejen typové proměnné double, ale také proměnné jakéhokoli jiného typu, u kterých je možný automatický převod na double (například libovolné celočíselné proměnné).

Třetí metoda s jedním parametrem jednoduše zavolá čtvrtou metodu a předá výsledné pole jako parametry a také mezeru jako druhý parametr. Upozorňujeme, že voláme metodu, která bude popsána dále v programu, což je zcela přijatelné.

Čtvrtá metoda vydává číselné pole, které již zpracovává každý prvek stávající metoda. Po každém zobrazeném prvku se přidá oddělovač předaný v parametru.

Public class Main ( public static void pr() ( System.out.println(); ) public static void pr(double d) ( if((int)d == d) ( System.out.print((int)d ) else ( System.out.print(d); ) ) public static void pr(double m) ( pr(m, " "); ) public static void pr(double m, String s) ( for(int i) = 0;< m.length; i++) { pr(m[i]); System.out.print(s); } } public static void main(String args) { double arrn = {1, 2.71, 3.14, 15, -5, 92, 0.5}; double p = 3.0; int k = 13; pr(p); // вывод числа, без дробной части при возможности pr(); // переводит строку pr(arrn); // вывод číselné pole na řádek pr(); // přeloží řetězec pr(arrn,", "); // výstup číselného pole na řádek oddělený čárkami pr(); // přeloží řetězec pr(k); // výstup celého čísla přes autocast ) )

V důsledku běhu programu se na obrazovce zobrazí následující:

3 1 2.71 3.14 15 -5 92 0.5 1, 2.71, 3.14, 15, -5, 92, 0.5, 1

Úkoly

  1. Vytvořte statickou metodu, která bude mít dva celočíselné parametry aab, a vrátí náhodné celé číslo ze segmentu jako jeho hodnotu. S pomocí tato metoda vyplňte pole 20 celých čísel a zobrazte je na obrazovce.
  2. Vytvořte metodu, která zobrazí zadané pole na obrazovce jako řetězec. Pomocí vytvořené metody a metody z předchozí úlohy vyplňte 5 polí po 10 prvcích náhodná čísla a zobrazit všech 5 polí na obrazovce, každé na samostatném řádku.
  3. Vytvořte metodu, která seřadí zadané pole ve vzestupném pořadí jakýmkoli způsobem, který znáte.
  4. Pole ukládá 7 explicitně specifikovaných textové řetězce. Napište program, který bude řadit a zobrazovat řetězce v abecedním pořadí. Pokud byly například uvedeny následující řádky:
Puškin Lermontov Nekrasov Tolstoj L. N. Tolstoj A. N. Yesenin Paustovsky

Program by měl zobrazovat:

Yesenin Lermontov Nekrasov Paustovsky Puškin Tolstoj A. N. Tolstoj L. N.

Tip: Nejprve musíte vytvořit metodu, která nastaví vztah řazení pro dva řetězce předané metodě jako argumenty.

Rekurze

Rekurze je metoda (funkce), která sama sebe volá ve svém těle.

Vezměme si příklad - výpočet faktoriálu. K výpočtu n! stačí znát a vynásobit (n-1)! a n.

Vytvořme metodu, která implementuje popsanou metodu.

Statický int fakt (int n) ( if (n==1) ( return 1; ) else if (n==2) ( return 2; ) else ( return fact(n-1) * n; ) )

Zadaná metoda vypočítá faktoriál přirozeného čísla.

Uvažujme příklad, který vypočítá n-té Fibonacciho číslo pomocí rekurze.

Připomeňme si, jak vypadají první prvky této série: 1 1 2 3 5 8 13 ...

Statické int fib (int n) ( if (n==1 || n == 2) ( návrat 1; ) návrat fib (n-2) + fib (n-1); )

Všimněte si, že v této metodě není druhý návrat umístěn do bloku else pro první podmíněný operátor. To je přípustné, protože pokud je podmínka splněna a je spuštěn první návrat, pak provádění programu dosáhne druhého návratu, pokud podmínka splněna není;

Rekurzivní výpočty často vedou k nutnosti opakovat stejné akce, což výrazně zpomaluje program.

Úkoly

  1. Experimentálně zjistěte, od kterého prvku Fibonacciho posloupnosti se výpočet pomocí rekurze stává nepřijatelným (trvá déle než minutu).
  2. Vytvořte hybridní metodu, která pro malé n vypočítá n-té Fibonacciho číslo pomocí rekurze a pro hodnoty vyšší než prahová hodnota n, kterou jste našli v předchozím problému, vypočítá n-té Fibonacciho číslo pomocí iteračního algoritmu (smyčka, ve které hodnoty dvou předchozích prvků sekvence).
  3. Spočítejte, kolikrát by bylo nutné přepočítat čtvrtý prvek Fibonacciho posloupnosti, abyste vypočítali patnáctý prvek.

Zásobník hovorů

V obecný případ PROTI aktuální okamžik v jeden okamžik lze provést pouze jeden jedinou metodou z celého programu. To znamená, že pokud metoda A je navržena tak, že ve svém těle volá metodu b a on sám A zavolal hlavní, poté při spuštění programu bude řízení nejprve přeneseno na metodu hlavní, pak metoda A, pak metoda b. Metoda b vrátí výsledek a kontrolu A, A vrátí výsledek kontroly do hlavní a teprve potom budou popraveni základní příkazy specifikované v metodě hlavní na zbývajících linkách po hovoru A.

Celá hierarchie (kdo komu volal) je uložena ve speciální paměťové oblasti zvané zásobník hovorů. Prvky se do tohoto paměťového fragmentu přidávají podle následujícího principu: jako první musí být načten naposledy přidaný prvek. Kdy metoda funguje? b, ukazuje se, že pod ním na zásobníku je metoda A a způsob hlavní.

Z tohoto důvodu existuje nebezpečí přetečení zásobníku volání během procesu rekurze.

Dochází k tzv. komplexní rekurzi, při které se metoda A volá metodu b, b příčiny S, A S příčiny A.

2010, Alexej Nikolajevič Kostin. Oddělení TIDM Matematická fakulta MPGU.




Nahoru