Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
Metody (funkce, procedury)
A0B36PRI - PROGRAMOVÁNÍ Metody (funkce, procedury) Jazyk JAVA České vysoké učení technické Fakulta elektrotechnická V 2.01
2
Nezajímá nás jak to počítá
Metoda Černá (programová) skřínka pro určitý výpočetní úkon Známe - co počítá Nezajímá nás – jak to počítá Má určené místo pro vstup informace se kterou metoda počítá – vstup dat Má určené místo pro výstup zpracované informace – výstup dat Princip umožňuje řešit složité úkoly rozkladem na jednodušši navzájem spolupracující části (metody) Vstup dat Metoda má jméno Metoda Nezajímá nás jak to počítá Známe co metoda počítá Výstup dat A0B36PRI „PROGRAMOVÁNÍ“ 04
3
Čtení hodnoty z klávesnice
Metoda bez vstupů Metoda nemusí mít vstup dat Má pouze výstup dat Např: Čtení hodnoty z klávesnice Výstupem metody – přečtená hodnota Čtení hodnoty z klávesnice Metoda Výstup dat = přečtená hodnota A0B36PRI „PROGRAMOVÁNÍ“ 04
4
Metoda bez výstupů Metoda nemusí mít výstup dat, pouze vykoná nějakou činnost Má pouze vstup dat Např: zobrazení hodnoty na obrazovce Vstupem metody – jméno a hodnota zobrazovaných dat Vstup dat = Jméno a hodnota toho co se má zobrazit Metoda Zobrazení jména a hodnoty dat na obrazovce A0B36PRI „PROGRAMOVÁNÍ“ 04
5
Metoda - vstupní a výstupní data
Metoda může mít více vstupních dat Metoda může mít i více výstupních dat Funkce – je metoda, která má pouze jednu hodnotu – „výstupní“ Procedura – je metoda, která má definovány vstupní hodnoty a svou činnost nemívá žádná výstupní data Funkce vždy pouze jednu výstupní hodnotu Procedura – „něco“ vykoná Funkce Funkce Procedura Procedura A0B36PRI „PROGRAMOVÁNÍ“ 04
6
Funkce Funkce – je metoda, která má pouze jednu hodnotu – hodnotu funkce Funkci lze použít ve výrazu Např: y = 2*x + sin(x), y = 2*x + Math.sin(x); sin(x) je funkce Funkce vždy pouze jednu „výstupní“ hodnotu Funkce Funkce Sin(x) A0B36PRI „PROGRAMOVÁNÍ“ 04
7
Procedura Procedura – je metoda, která má definovány vstupní hodnoty a svou činnost - nemívá žádná výstupní data Procedura ale může změnit Hodnotu nelokální proměnné – nedoporučeno – proč? Hodnoty prvků polí či hodnoty atributů objektů, je-li vstupní hodnotou reference na pole či objekt – viz později!!! Proceduru – nelze použít ve výrazu Procedura – „něco“ vykoná Procedura Procedura A0B36PRI „PROGRAMOVÁNÍ“ 04
8
Funkce a procedura – vstupní data
Pravidla pro zápis vstupních dat jsou pro funkci i pro proceduru stejná Pravidla pro zápis vstupních dat pro funkci i proceduru stejná Funkce Funkce Procedura Procedura A0B36PRI „PROGRAMOVÁNÍ“ 04
9
Funkce, rozklad na dílčí problémy
Připomeňme si program pro výpočet faktoriálu: public class Faktorial { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("zadejte přirozené číslo"); int n = sc.nextInt(); if (n < 1) { System.out.println(n + " není přirozené číslo"); System.exit(0); } int i = 1; int f = 1; while (i < n) { i = i + 1; f = f * i; } System.out.println (n + "! = " + f); }// main() END }// class Faktorial END Čtení přirozeného čísla Algoritmus výpočtu faktoriálu Tisk výsledku Čtení přirozeného čísla, výpočet faktoriálu a tisk výsledku jsou tři dílčí podproblémy, jejichž řešení popíšeme samostatnými metodami` A0B36PRI „PROGRAMOVÁNÍ“ 04
10
Řešení problému rozkladem na dílčí problémy
ctiPrirozene Funkce Čtení přirozeného čísla Předává se přečtené n Funkce faktorial Algoritmus výpočtu faktoriálu Předává se vypočtený faktoriál Procedura tiskVysledku Tisk výsledku A0B36PRI „PROGRAMOVÁNÍ“ 04
11
Faktoriál pomocí funkcí
Funkce pro čtení přirozeného čísla static int ctiPrirozene() { Scanner sc = new Scanner(System.in); System.out.println ("Zadejte přirozené číslo"); int n = sc.nextInt(); if ( n < 1) { System.out.println (n + " není přirozené číslo"); System.exit(0); } return n; } Hlavička funkce static int ctiPrirozene() vyjadřuje, že funkce nemá parametry (prázdná závorka) a že výsledkem volání funkce je hodnota typu int Příkaz předepisuje návrat z funkce, výsledkem volání je hodnota n Příklad volání funkce: int nn = ctiPrirozene(); A0B36PRI „PROGRAMOVÁNÍ“ 04
12
Faktoriál pomocí funkcí
Funkce pro výpočet faktoriálu static int faktorial(int n) { int i = 1; int f = 1; while (i < n) { i = i + 1; f = f * i; } return f; Hlavička funkce vyjadřuje, že funkce má jeden vstupní parametr typu int a že výsledkem je hodnota typu int Příklad volání funkce int ff = faktorial(4); A0B36PRI „PROGRAMOVÁNÍ“ 04
13
Faktoriál pomocí funkcí
Procedura pro tisk výsledku výpočtu static void tiskVysledku(int n, String napis, int x) { Systém.out.println(n + napis + s); } Hlavička vyjadřuje, že procedura má tři vstupní parametry (int, String, int). Procedura nevrací žádnou hodnotu (void). Příklad volání procedury tiskVysledku(n, "! = ",f); A0B36PRI „PROGRAMOVÁNÍ“ 04
14
Faktoriál pomocí funkcí
Výsledné řešení: package pri04; import java.util.*; public class Faktorial { public static void main(String[] args) { int n = ctiPrirozene(); int f = faktorial(n); tiskVysledku(n,"! = ",f); } static int ctiPrirozene() { … } static int faktorial(int n) { … } static void tiskVysledku(int n, String napis,int x){ … } A0B36PRI „PROGRAMOVÁNÍ“ 04
15
Deklarace funkce Deklaraci funkce tvoří hlavička funkce tělo funkce
Hlavička funkce v jazyku Java má tvar static typ jméno(specifikace parametrů) kde typ je typ výsledku funkce (funkční hodnoty) jméno je identifikátor funkce specifikací parametrů se deklarují parametry funkce, každá deklarace má tvar typ_parametru jméno_parametru (a oddělují se čárkou) specifikace parametrů je prázdná, jde-li o funkci bez parametrů Tělo funkce je složený příkaz nebo blok, který se provede při volání funkce Tělo funkce musí končit příkazem return x; kde x je výraz, jehož hodnota je výsledkem volání funkce A0B36PRI „PROGRAMOVÁNÍ“ 04
16
Bloková struktura programu
package d6alg; public class TridaA { package d36alg; public class TridaB { Začátek programu static int x1, x2=0, y=54; static char funkceB ( void ) { double d; d = TridaC.funkceD ( ); ……… } public static void main (String[] args) { int x = funkceA ( 35 ); TridaB.funkceC ( x, c1 ); } // main() END Fce v jiném modulu static void funkceC (int r1, char c) { System.out.printf (……..); } static int funkceA (int x) { char s; s = TridaB.funkceB ( ); } } // class END } // class END Konec programu A0B36PRI „PROGRAMOVÁNÍ“ 04
17
Struktura metody (funkce, procedury)
Jméno funkce Typ návratové hodnoty Formální parametr(y) funkce Hlavička funkce static double funkceA ( int x ) { } Začátek funkce final double MIN = ; double v=1.0; int n; Lokální konstanty Lokální proměnné for( n=0; n<10; n++) { v = v * ; } if( v > MIN ) v = v ; return v ; Kód funkce Návratová hodnota Zdrojový modul (soubor) Konec funkce A0B36PRI „PROGRAMOVÁNÍ“ 04
18
Vstupní parametry funkce
Parametry funkce jsou lokální proměnné funkce, kterým se při volání funkce přiřadí hodnoty skutečných parametrů Jestliže parametr funkce je typu T, pak přípustným skutečným parametrem je výraz, jehož hodnotu lze přiřadit proměnné typu T (stejná podmínka, jako u přiřazení) Příklad: public class Max1 { static int max(int x, int y) { if (x>y) return x; else return y; } public static void main(String[] args) { int a = 10, b = 20; System.out.println(max(a+20, b));// O.K. System.out.println(max(1.1, b)); // Chyba při překladu } A0B36PRI „PROGRAMOVÁNÍ“ 04
19
Vstupní parametry funkce
Vstupní parametry funkce slouží pro předání vstupních dat algoritmu, který je funkcí realizován Častá chyba začátečníka: funkce, která čte hodnoty parametrů pomocí operace vstupu dat (např. čtení klávesnice) static int max(int x, int y) { x = sc.nextInt(); // nesmyslný příkaz y = sc.nextInt(); // nesmyslný příkaz if (x>y) return x; else return y; } int z= max(7,99); Nesmysl Proč? A0B36PRI „PROGRAMOVÁNÍ“ 04
20
Hodnota funkce Typ návratové hodnoty se uvádí před názvem funkce
Návratová hodnota (proměnná, výraz) se uvádí za příkazem return Funkce může vracet pouze jednu návratovou hodnotu Návratovou hodnotou může být i referenční proměnná (viz „pole“) static int max(int x, int y) { int maxHodnota = y; if (x>y) maxHodnota = x; return x; } Funkce max Návratová hodnota A0B36PRI „PROGRAMOVÁNÍ“ 04
21
Formální a skutečné parametry funkce
public static void main(String[] args){ int a = 4; int b = 2; int m = max(a,b); System.out.println("max="+m); m = max(b,6); } static int max(int x, int y) { int maxHodnota = y; if (x > y) maxHodnota = x; return x; Skutečné parametry Skutečné parametry obsahují aktuální předávaná data do metody Formální parametry Formální parametry umožní v těle metody popsat, jak má algoritmus zpracovat vstupní data /** * x y */ Formální parametry jsou lokální proměnné A0B36PRI „PROGRAMOVÁNÍ“ 04
22
Příklad – Výplata hotovosti
Výplata hotovosti (výčetka platidel) se odevzdává bance, uvádí vždy hodnotu bankovky a počet bankovek My budeme hledat takovou výčetku, která pro danou částku obsahuje celkově nejmenší počet bankovek Příklad: (pro jednoduchost uvažujme pouze bankovky 5000, 1000, 500 a 100 Kč) Částka = bankovka (Kč) počet (ks) 5000 7 1000 3 500 1 100 4 A0B36PRI „PROGRAMOVÁNÍ“ 04
23
Příklad - Výplata hotovosti
public class Vycetka { public static void main(String[] args) { int plat, platX; int p5000,p1000,p500,p100; platX=sc.nextInt(); plat=platX; p5000=plat/5000; plat=plat%5000; p1000=plat/1000; plat=plat%1000; p500=plat/500; plat=plat%500; p100=plat/100; plat=plat%100; System.out.println("Vyplata castky " + platX + " je:\n" + p ",\n" + p ",\n„ + p ",\n" + p ", \na zbytek " + plat); }} pocet = plat/hodnBankovky; plat = plat%hodnBankovky; A0B36PRI „PROGRAMOVÁNÍ“ 04
24
Výplata hotovosti s funkcí
public class VycetkaFunkce { static int plat; static int pocetBankovek(int hodnotaBankovky){ int pocet; pocet = plat/hodnotaBankovky; plat = plat%hodnotaBankovky; return pocet; }; public static void main(String[] args) { int p5000,p1000,p500,p100, platX; plat=sc.nextInt(); platX=plat; p5000=pocetBankovek(5000); p1000=pocetBankovek(1000); p500=pocetBankovek(500); p100=pocetBankovek(100); System.out.println ("Vyplata castky " + platX + " je:\n" + p ",\n" + p ",\n„ + p ",\n" + p ", \na zbytek " + plat); }} A0B36PRI „PROGRAMOVÁNÍ“ 04
25
Přetěžování jmen funkcí
Funkce lišící se v počtu nebo typu parametrů se mohou jmenovat stejně (přetěžování jmen, Name Overloading) Příklad: public class Max2 { static int max(int x, int y) { if (x>y) return x; else return y; } static int max(int x, int y, int z) { return max(x, max(y, z)); static double max(double x, double y) { public static void main(String[] args) { System.out.println (max(3,4)); System.out.println (max(1,2,3)); System.out.println (max(1.0,2.4)); Přetížené jméno max A0B36PRI „PROGRAMOVÁNÍ“ 04
26
ukončit na více místech
Příklady funkcí Funkce pro zjištění, zda daný rok je přestupný public class Rok { static boolean prestupny(int rok) { if (rok%4 == 0 && (rok%100!=0 || rok%1000 == 0)) return true; else return false; } public static void main(String[] args) { int rok; System.out.println ("zadejte rok"); rok = sc.nextInt(); System.out.print("rok "+rok); if (prestupny(rok)) System.out.println (" je přestupný"); System.out.println (" není přestupný"); return může metodu ukončit na více místech A0B36PRI „PROGRAMOVÁNÍ“ 04
27
Funkce pro výpočet NSD 1 Efektivní algoritmus lze sestavit na základě těchto vztahů: je-li x = y, pak nsd(x,y) = x je-li x > y, pak nsd(x,y) = nsd(x-y,y) je-li x < y, pak nsd(x,y) = nsd(x,y-x) Řešení 1: static int nsd(int x, int y) { while (x != y) if (x > y) x = x-y; else y = y-x; return x; } public static void main(String[] args) { int a=sc.nextInt();int b=sc.nextInt(); System.out.println(“Nejvetsi spolecny delitel” + a + ”, “ + b + “je “ + nsd(a,b)); int nsd(int x, int y) { int d; if (x<y) d=x; else d=y; while (x%d!=0 | y%d!=0) d--; return d; } A0B36PRI „PROGRAMOVÁNÍ“ 04
28
Funkce pro výpočet NSD 2 Do těla cyklu vnoříme místo podmíněného příkazu pro jediné zmenšení hodnoty x nebo y dva cykly pro opakované zmenšení hodnot x a y Řešení 2: static int nsd(int x, int y) { while (x!=y) { while (x>y) x = x-y; while (y>x) y = y-x; } return x; public static void main(String[] args) { int a = sc.nextInt();int b = sc.nextInt(); System.out.println(“Nejvetsi spolecny delitel” + a + ”, “ + b “je “ + nsd(a,b)); A0B36PRI „PROGRAMOVÁNÍ“ 04
29
Euklidův algoritmus pro výpočet NSD 3
Vnitřní cykly řešení 2 počítají nenulový zbytek po dělení většího čísla menším Pro výpočet zbytku po dělení máme operaci % Jejím využitím dostaneme Euklidův algoritmus, který lze slovně formulovat takto: určíme zbytek po dělení daných čísel, zbytkem dělíme dělitele a určíme nový zbytek, až dosáhneme nulového zbytku; poslední nenulový zbytek je nsd Řešení 3: static int nsd(int x, int y) { int zbytek = x%y; while (zbytek != 0) { x = y; y = zbytek; zbytek = x%y; } return y; public static void main(String[] args) { int a=sc.nextInt();int b=sc.nextInt(); System.out.println(“Nejvetsi spolecny delitel” + a + ”, “ + b “je “ + nsd(a,b)); A0B36PRI „PROGRAMOVÁNÍ“ 04
30
Procedury Metoda, jejíž typ výsledku je void, nevrací žádnou hodnotu
Metoda, která nevrací žádnou hodnotu, se nazývá procedura Předávání vstupních dat do procedury se řídí stejnými pravidly jako u funkce Procedura může vracet vypočítané hodnoty (!)- způsob bude probrán v dalších lekcích. Příklady procedury: Hlavní funkce main Tisk na obrazovku print( ) nebo println( ) Příklad uživatelské procedury: Výpis znaku zn doplněného zleva mezerami na celkový počet n znaků static void vypisZnak(char zn, int n) { for (int i=1; i<n; i++) System.out.print(' '); System.out.print(z); } A0B36PRI „PROGRAMOVÁNÍ“ 04
31
Statické proměnné Třída může obsahovat deklarace statických proměnných
Statické proměnné třídy jsou použitelné ve všech funkcích dané třídy – jsou to pro ně nelokální proměnné Příklad: public class StatickePromenne { static int x, y; // statické proměnné třídy public static void main(String[] args) { System.out.println("zadejte dvě celá čísla"); x = sc.nextInt(); y = sc.nextInt(); // System.out.println(i); // Nelze, i zde neznama vypisSoucet(); } static void vypisSoucet() { int i=6; System.out.println("součet čísel je "+(x+y+i)); Poznámka: statické proměnné jsou inicializovány hodnotou nula A0B36PRI „PROGRAMOVÁNÍ“ 04
32
Hvězdičky - procedury static void hvezdickyln(int pocet){
for (int i=1; i<=pocet; i++) System.out.print('*'); System.out.println(""); } static void hvezdicky(int pocet) { static void mezeryln(int pocet) { for (int i=1; i<=pocet; i++) System.out.print(' '); static void mezery(int pocet) { A0B36PRI „PROGRAMOVÁNÍ“ 04 A0B36PR1 - 05 32
33
Hvězdičky - procedury ***** ********** public class Hvezdicky {
public static void main(String[] args ) { hvezdickyln(5); mezery(4); hvezdicky(10); mezeryln(0); } ***** ********** A0B36PRI „PROGRAMOVÁNÍ“ 04 A0B36PR1 - 05 33
34
Zastínění nelokální proměnné
Deklarace lokální proměnné x zastíní deklaraci nelokální proměnné x Příklad: public class Zastineni { static int a = 10; public static void main(String[] args) { f(); System.out.println(a); } static void f() { int a = 20; Program vypíše 20 10 Statická, nelokální (globální ve své třídě) Lokální proměnná, zastíní nelokální proměnnou stejného jména public class Lokalita A0B36PRI „PROGRAMOVÁNÍ“ 04
35
Přidělování paměti proměnným
Poznali jsme doposud dva druhy proměnných: statické proměnné třídy lokální proměnné metod Přidělením paměti proměnné rozumíme určení adresy umístění proměnné v paměti počítače Statickým proměnným třídy se přidělí paměť v okamžiku, kdy se do paměti zavádí kód funkcí třídy, a zůstane jim přidělena až do ukončení běhu programu, prostor haldy (heap) Lokálním proměnným a parametrům funkce se paměť přidělí při každém volání funkce a zůstane jim přidělena jen do návratu z funkce ( při návratu z funkce se přidělené adresy uvolní pro další použití) Úseky paměti přidělované lokálním proměnným a parametrům tvoří tzv. zásobník (stack, LIFO): úseky se přidávají a odebírají, přičemž se vždy odebere naposledy přidaný úsek zásobník A0B36PRI „PROGRAMOVÁNÍ“ 04
36
Přidělování paměti proměnným
Příklad public static void main(String[] args) { int a; // 1 f(); // 5 } static void f() { int b; ... // 2 g(10); // 4 static void g(int x) { int c; // } c x b b b Proměnné v paměti a a a a a args args args args args 1 2 3 4 5 krok A0B36PRI „PROGRAMOVÁNÍ“ 04
37
Další informace k této přednášce hledejte např. v:
Herout, P.: Učebnice jazyka Java, Kopp, Č.Budějovice, 2010, str A0B36PRI „PROGRAMOVÁNÍ“ 04
38
Metody (funkce, procedury)
A0B36PRI - PROGRAMOVÁNÍ Metody (funkce, procedury) Jazyk JAVA Konec České vysoké učení technické Fakulta elektrotechnická
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.