Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

České vysoké učení technické Fakulta elektrotechnická Strukturované datové typy Pole Jazyk JAVA A0B36PRI - PROGRAMOVÁNÍ V 2.01.

Podobné prezentace


Prezentace na téma: "České vysoké učení technické Fakulta elektrotechnická Strukturované datové typy Pole Jazyk JAVA A0B36PRI - PROGRAMOVÁNÍ V 2.01."— Transkript prezentace:

1 České vysoké učení technické Fakulta elektrotechnická Strukturované datové typy Pole Jazyk JAVA A0B36PRI - PROGRAMOVÁNÍ V 2.01

2 A0B36PRI „PROGRAMOVÁNÍ“ 072 Pole – použití [x,y,z] y z x [a,b,c] Ryba Žába Tchoř Muflon Veverka Husa Vektory Databáze Kompl. č. Matice Zpracování řetězců znaků Třídění Řazení

3 A0B36PRI „PROGRAMOVÁNÍ“ 073 Pole – použití Abstrakce paměti počítače 04A5 F34B 8852 paměťová místa adresa 1235 adresa 1236 adresa 1237 Obsah paměťového místa

4 A0B36PRI „PROGRAMOVÁNÍ“ 074 Pole Strukturovaný typ skupina uspořádaných proměnných stejného typu (prvky pole) přístup k jednotlivým proměnným pomocí indexu (celé číslo, od 0) práce s polem buď s celkem nebo s jednotlivými prvky pole (pomocí indexu) Příklady: souřadnice bodu, komplexní číslo n-rozměrný vektor matice – pole polí řetězec znaků Na pole odkazuje referenční typ proměnné (druhým referenčním typem je objekt), vlastní pole prvků jméno nemá. Pole je přístupné pomocí reference resp. referenční proměnné odkaz-na-pole … Indexy prvků Prvek pole Jméno odkazu

5 A0B36PRI „PROGRAMOVÁNÍ“ 075 Pole - struktura Zde jednorozměrné pole Prvky pole adresovány nepřímou adresou Na pole ukazuje proměnná, která obsahuje adresu vlastních prvků pole Taková proměnná se v Javě nazývá referenční, je to adresa, odkaz na vlastní prvky pole (v jazyce „C“ se takové proměnná nazýva „ukazatel“) K prvkům pole se přistupuje pomocí jména referenční proměnné, hranatých závorek a indexu: a[ 2 ] je třetí prvek pole a. Indexy pole (číslování prvků) v Java vždy začíná nulou, tedy první prvek pole a je a[ 0 ]. a … Indexy prvků Prvek pole Jméno odkazu Adresa prvků a[ 2 ]

6 A0B36PRI „PROGRAMOVÁNÍ“ 076 Příklad 1 – Teploty v týdnu Zadání: přečíst teploty naměřené v jednotlivých dnech týdnu, vypočítat průměrnou teplotu a pro každý den vypsat odchylku od průměrné teploty Řešení (zatím bez pole): s proměnnými typu int: int t1, t2, t3, t4, t5, t6, t7, prumer; t1=sc.nextInt();... t7=sc.nextInt(); prumer = (t1+t2+t3+t4+t5+t6+t7)/7; System.out.println(t1-prumer);... System.out.println(t7-prumer); Řešení je těžkopádné a bylo by ještě horší, kdyby vstupními daty byly teploty za měsíc nebo za celý rok

7 A0B36PRI „PROGRAMOVÁNÍ“ 077 Příklad 1 – Teploty v týdnu Příklad vyřešíme pomocí pole Pole je strukturovaný datový typ skládající se z pevného počtu složek (prvků) stejného typu, které se vzájemně rozlišují pomocí indexu V jazyku Java se pole indexuje čísly 0, 1,... počet prvků – 1, kde počet prvků je dán při vytvoření pole pro uložení teplot vytvoříme pole obsahující 7 prvků typu int int[] teploty = new int[7]; první prvek pole má označení teploty[0], druhý teploty[1] atd. ekvivalentní zápis (závorky u jména pole): int teploty[] = new int[7]; teploty …

8 A0B36PRI „PROGRAMOVÁNÍ“ 078 Příklad 1 – Teploty v týdnu Řešení pomocí pole vstupní data přečteme a do prvků pole uložíme cyklem for (int i = 0; i < 7; i++) teploty[i] = sc.nextInt(); průměrnou teplota: součet prvků pole dělený 7 int prumer = 0; for (int i = 0; i < 7; i++) prumer = prumer + teploty[i]; prumer = prumer / 7; na závěr pomocí cyklu vypíšeme odchylky od průměru for (int i = 0; i < 7; i++) System.out.println (teploty[i]-prumer);

9 A0B36PRI „PROGRAMOVÁNÍ“ 079 Pole v jazyku Java 1.Pole p obsahující n prvků typu T vytvoříme deklarací T p[] = new T[n];// 1.moznost, zavorka za p T[] p = new T[n];// 2.moznost, zavorka za typem kde T může být libovolný typ a n musí být celočíselný výraz s nezápornou hodnotou; prvky takto zavedeného pole jsou inicializované, tj. mají známé počáteční hodnoty (číselné typy = 0, boolean = false, …) 2. Inicializované pole pole lze zavést definicí hodnot prvků pole int p[] = {133,2,3,445,53,6};

10 A0B36PRI „PROGRAMOVÁNÍ“ 0710 Pole v jazyku Java Zápis p[i] i je celočíselný výraz hodnota je nezáporná menší než počet prvků, označuje prvek pole p s indexem i má vlastnosti proměnné typu T; Pozn.: nedovolená hodnota indexu způsobí chybu při výpočtu java.lang.ArrayIndexOutOfBoundsException: 7 Počet prvků pole p lze zjistit pomocí zápisu p.length Příklad použití: for (int i = 0; i < p.length; i++) System.out.print(p[i]);

11 A0B36PRI „PROGRAMOVÁNÍ“ 0711 Příklad 2 – Výpis pole v opačném pořadí Vstup: n a 1 a 2...,a n, kde a i jsou celá čísla Výstup: čísla a i v opačném pořadí Řešení: import java.util.*; // Scanner je v knihovně java.util public class ObratPole { public static void main (String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Zadejte pocet cisel"); int[] pole = new int[sc.nextInt()]; System.out.println(„Zadejte "+pole.length+" čísel"); for (int i = 0; i < pole.length; i++) pole[i] = sc.nextInt(); System.out.println("Vypis cisel v obracenem poradi"); for (int i = pole.length-1; i >= 0; i--) System.out.println(pole[i]); }

12 A0B36PRI „PROGRAMOVÁNÍ“ 0712 Pole – přidělení paměti Všimněme si podrobněji mechanismu vytváření a přístupu k polím v jazyku Java Uvažujme např. lokální deklaraci, která vytvoří pole 3 prvků typu int int[] a = new int [3]; Deklarace má tento efekt: lokální proměnné a se přidělí paměťové místo na zásobníku, které však neobsahuje prvky pole, ale je dimensováno na uložení reference na pole (čísla reprezentujícího adresu jiného paměťového místa) operátorem new se v jiné paměťové oblasti (heap) rezervuje (alokuje) úsek potřebný pro pole 3 prvků typu int adresa tohoto úseku se uloží do a Při grafickém znázornění reprezentace v paměti místo adres kreslíme šipky deklarovaná proměnná pole vytvořené operátorem new a a[0] a[1] a[2] Poznámka: reprezentace pole je zjednodušená, obsahuje ještě počet prvků

13 A0B36PRI „PROGRAMOVÁNÍ“ 0713 Referenční proměnná Shrnutí: pole n prvků typu T lze v jazyku Java vytvořit pouze dynamicky pomocí operace new T [ n ] adresu dynamicky vytvořeného pole prvků typu T lze uložit do proměnné typu T [ ]; takovou proměnnou nazýváme referenční proměnnou pole prvků typu T Referenční proměnnou pole lze deklarovat bez vytvoření pole; deklarací int[] a; se zavede referenční proměnná, která má nedefinovanou hodnotu, jde-li o lokální proměnnou, nebo speciální hodnotu null, která neodkazuje (nereferencuje) na žádné pole, jde-li o statickou proměnnou třídy V obou předchozích případech je třeba, před dalším použitím referenční proměnné a, jí přiřadit adresu (referenci) na vytvořené pole, např. příkazem a = new int [10];

14 A0B36PRI „PROGRAMOVÁNÍ“ 0714 Přiřazení mezi referenčními proměnnými pole Mezi referenčními proměnnými (odkazy) je povolené přiřazení Po přiřazení pak obě proměnné odkazují (referencují) totéž pole! Příklad: int[] a = new int[3]; int[] b = a; b[1] = 10; System.out.println(a[1]); // vypíše se 10 Přiřazení hodnot mezi dvěma poli není v jazyku Java definováno: b=new int[a.length]; for (int i=0; i

15 A0B36PRI „PROGRAMOVÁNÍ“ 0715 V olání hodnotou - "Call by Value“ – připomenutí public static void main(String[]args){ int a = 4,b; b = max(a,6); …//dalsi prikazy } static int max(int x,int y) { int m = y; if (x > y) m = x; return m; } Při „volání hodnotou“ se do formálního parametru předává KOPIE skutečného parametru. Změna formálního parametru uvniř metody nemůže ovlivnit hodnotu skutečného parametru. 4 a 0 b 6 Paměť dat 6 b y m x 4 x 6 y 6 m !

16 A0B36PRI „PROGRAMOVÁNÍ“ r q p Předávání reference na pole – „volání odkazem“ public static void main (String[]args){ int[] p = new int[3]; p[1] = 5; test(p); … // dalsi prikazy } static void test (int[] q){ int[] r; q[1] = 33; r = q; r[0] = 77; return } Referenční proměnná se předává „HODNOTOU“, vlastní pole „ODKAZEM“ Zde: p, q, r – lokální proměnné, vlastní pole není lokální. Pole nemá jméno ! !

17 A0B36PRI „PROGRAMOVÁNÍ“ q p Referenční proměnná jako návratová hodnota funkce public static void main (String[]args){ int[] p; p = testA(); p[1] = 5; … // dalsi prikazy } static int[] testA (){ int[] q = new int[3]; q[1] = 33; return(q); } Referenční proměnná může být návratovou hodnotou funkce Zde: p, q – lokální proměnné, vlastní pole není lokální Zde pole vzniklo v metodě testA() a jeho adresa se předala do main(). 33 ! ! 5

18 A0B36PRI „PROGRAMOVÁNÍ“ 0718 Příklad 3 - Pole – vstupní a návratová hodnota funkce Reference pole může být parametrem funkce i jejím výsledkem Použití metod uvedených na předchozích snímcích: public class ObratPole { public static void main(String[] args) { int[] vstupniPole = ctiPole(); int[] vystupniPole = obratPole(vstupniPole); vypisPole(vystupniPole); } static int[] ctiPole() {... } static int[] obratPole(int[] pole) {... } static void vypisPole(int[] pole) {... } }

19 A0B36PRI „PROGRAMOVÁNÍ“ 0719 Příklad 3 - Pole – vstupní a návratová hodnota funkce static int[] ctiPole() { Scanner sc = new Scanner(System.in); System.out.println("zadejte počet čísel"); // Zalozeni pole int[] pole = new int [sc.nextInt()]; // Naplneni prvku pole System.out.println("zadejte "+pole.length+" čísel"); for (int i=0; i

20 A0B36PRI „PROGRAMOVÁNÍ“ 0720 Příklad 3 - Pole – vstupní a návratová hodnota funkce static int[] obratPole (int[] poleIn) { // Do metody predan odkaz na pole vznikle mimo metodu // V metode zalozeno dalsi pole shodne delky int[] novePole = new int[poleIn.length]; // Do noveho pole se prekopiruji prvky v opacnem poradi for (int i = 0; i < poleIn.length; i++) novePole[i] = poleIn[poleIn.length-1-i]; return novePole; } static void vypisPole (int[] poleIn) { for (int i = 0; i < poleIn.length; i++) System.out.println(poleIn[i]); } Pole není lokální proměnná. Lokální proměnnou může být odkaz na pole. Pole s sebou nese informaci o své délce (proměnná length) Pomocí pole je možné z metody předávát více výstupních dat (na rozdíl od předávání jedné hodnoty pomocí návrhatové hodnoty funkce

21 A0B36PRI „PROGRAMOVÁNÍ“ 0721 Příklad 4 - Změna pole daného parametrem Metoda nevytváří nové pole, ale obrátí pole odazované formálním parametrem Pole je zde volané odkazem a je zároveň vstupním i výstupním parametrem static void obratPole(int[] pole) { int pom; for (int i=0; i

22 A0B36PRI „PROGRAMOVÁNÍ“ 0722 Příklad 5 - Pole jako tabulka četnosti čísel Předchozí příklady ilustrovaly použití pole pro uložení posloupnosti Pole lze použít též pro realizaci tabulky (zobrazení), která hodnotám typu indexu (v jazyku Java to je pouze interval celých čísel počínaje nulou) přiřazuje hodnoty nějakého typu Příklad: přečíst řadu čísel zakončených nulou a vypsat tabulku četnosti čísel od 1do 100 (ostatní čísla ignorovat) Tabulka četnosti bude pole 100 prvků typu int, počet výskytů čísla x, kde 1  x  100, bude hodnotou prvku s indexem x-1 Aby program byl snadno modifikovatelný pro jiný interval čísel, zavedeme dvě konstanty: final static int MIN = 1; final static int MAX = 100; a pole vytvoříme s počtem prvků Max-Min+1 int[] tab = new int[MAX-MIN+1];

23 A0B36PRI „PROGRAMOVÁNÍ“ 0723 Příklad 5 - Pole jako tabulka četnosti čísel Funkce, která přečte čísla a vytvoří tabulku četnosti: static int[] tabulka() { Scanner sc = new Scanner(System.in); int[] tab = new int[MAX-MIN+1]; System.out.println ("zadejte řadu celých čísel zakončenou nulou"); int cislo = sc.nextInt(); while (cislo!=0) { if (cislo>=MIN && cislo<=MAX) tab[cislo-MIN]++; cislo = sc.nextInt(); } return tab; } Funkce, tabulku četnosti vypíše: static void vypis(int[] tab) { for (int i=0; i

24 A0B36PRI „PROGRAMOVÁNÍ“ 0724 Příklad 5 - Pole jako tabulka četnosti čísel Celkové řešení: public class CetnostCisel { final static int MIN = 1; final static int MAX = 100; public static void main(String[] args) { vypis(tabulka()); } static int[] tabulka() {... } static void vypis(int[] tab) {... }

25 A0B36PRI „PROGRAMOVÁNÍ“ 0725 Příklad 5 - Pole reprezentující množinu Zadání: Vypsat všechna prvočísla menší nebo rovna zadanému max Algoritmus: 1. Vytvoříme množinu obsahující všechna přirozená čísla od 2 do max. 2. Z množiny vypustíme všechny násobky čísla Najdeme nejbližší číslo k tomu, jehož násobky jsme v předchozím kroku vypustili, a vypustíme všechny násobky tohoto čísla. 4. Opakujeme krok 3, dokud číslo, jehož násobky jsme vypustili, není větší než odmocnina z max. 5. Čísla, která v množině zůstanou, jsou hledaná prvočísla. Pro reprezentaci množiny čísel použijeme pole prvků typu boolean prvek mnozina[ x ] bude udávat, zda číslo x v množině je ( true ) nebo není ( false )

26 A0B36PRI „PROGRAMOVÁNÍ“ 0726 Příklad 5 -Eratosthenovo síto Funkce pro vytvoření množiny prvočísel do max static boolean[] sito(int max) { boolean[] mnozina = new boolean[max+1]; for (int i=2; i<=max; i++) mnozina[i] = true; int p = 2; int pmax = (int)Math.sqrt(max); do { // vypuštění všech násobků čísla p for (int i=p+p; i<=max; i+=p) mnozina[i] = false; // hledání nejbližšího čísla k p do { p++; } while (!mnozina[p]); } while (p<=pmax); return mnozina; }

27 A0B36PRI „PROGRAMOVÁNÍ“ 0727 Příklad 5 -Eratosthenovo síto Funkce pro výpis množiny static void vypis(boolean[] mnozina) { for (int i=2; i

28 A0B36PRI „PROGRAMOVÁNÍ“ 0728 Příklad 6 – Kořeny kvadratické rovnice Zadání: Zapište metody pro řešení kvadratické rovnice a.x 2 +b.x+c = 0, pro a ≠ 0. Řešení: Navrhneme metody pro: Čtení koeficientů a,b,c z klávesnice. Nazveme ctiKoefKvadrRovnice Výpočet kořenů kvadratické rovnice. Nazveme korenyKvadrRovnice Tisk výsledku na obrazovku. Nazveme:tiskKorenuKvadrRovnice Předávání parametrů: Koeficienty a,b,c se budou předávat v poli. V první prvku (index 0) je informace, zda zadání platí (tj. a ≠ 0), v dalších prvcích jsou a,b,c. Výpočetní metoda korenyKvadrRovnice vypočítá kořeny do pole (bude výstupním parametrem), kde v prvním prvku (index 0) bude informace zda jsou kořeny reálné nebo komplexní (tj. komplexně sdružené). V dalších prvcích pole budou vypočíatné kořeny v pořadí ReX 1,ImX 1,ReX 2,ImX 2. Budou-li kořeny reálné bude v ImX 1, ImX 2 hodnota nulová.

29 A0B36PRI „PROGRAMOVÁNÍ“ 0729 Příklad 6 – Kořeny kvadratické rovnice static double[ ] korenyKvadrRovnice (double[ ] koef_abc) { // Input: koef_abc[1]=a,..[2]=b,..[3]=c; a!=0 // Output:koreny[0] != 0 =>real roots,==0 =>komplex roots // koreny[1]=ReX1,..[2]=ImX1 // koreny[3]=ReX2,..[4]=ImX2; // // Symbolicke oznaceni indexu vstupniho pole final int Ka=1,Kb=2,Kc=3; double diskriminant; double sqrDiskriminant; double[] koreny = new double[5]; // Symbolicke oznaceni indexu vystupniko pole final int ReKompl=0, ReX1=1, ImX1=2, ReX2=3, ImX2=4; Pokračovaní metody na dalším snímku

30 A0B36PRI „PROGRAMOVÁNÍ“ 0730 Příklad 6 – Kořeny kvadratické rovnice diskriminant = koef_abc[Kb]*koef_abc[Kb]-4*koef_abc[Ka]*koef_abc[Kc]; if(diskriminant >= 0.){ sqrDiskriminant = Math.sqrt(diskriminant); koreny[ReX1] = (-koef_abc[Kb]+sqrDiskriminant)/(2*koef_abc[Ka]); koreny[ImX1] = 0.; koreny[ReX2] = (-koef_abc[Kb]-sqrDiskriminant)/(2*koef_abc[Ka]); koreny[ImX2] = 0.; koreny[ReKompl] = 1.; // != 0. => Priznak realnych korenu } Pokračovaní metody na dalším snímku

31 A0B36PRI „PROGRAMOVÁNÍ“ 0731 Příklad 6 – Kořeny kvadratické rovnice else{ // D < 0. sqrDiskriminant = Math.sqrt(-diskriminant); koreny[ReX1] = -koef_abc[Kb]/(2*koef_abc[Ka]); koreny[ImX1] = sqrDiskriminant/(2*koef_abc[Ka]); koreny[ReX2] = -koef_abc[Kb]/(2*koef_abc[Ka]); koreny[ImX2] = -sqrDiskriminant/(2*koef_abc[Ka]);; koreny[ReKompl] = 0.;// == 0. =>Priznak komplex.korenu }// if()else END return(koreny); }// korenyKvadrRovnice() END

32 A0B36PRI „PROGRAMOVÁNÍ“ 0732 Příklad 6 – Kořeny kvadratické rovnice static double[] ctiKoefKvadrRovnice (){ //Output:koefAbc[0]=-1 => Error(a==0),koefAbc[1]=a, [2]=b, [3]=c Scanner read = new Scanner (System.in); double[] koefAbc = new double [4]; koefAbc[0]= 1.; // Hodnoty a,b,c OK (predbezne nastaveni) System.out.println("Zadej koeficient a = "); koefAbc[1] = read.nextDouble(); if(koefAbc[1] == 0.){ koefAbc[0]= -1; // Chyba koeficient a == 0 return (koefAbc); // Chybovy vystup metody } System.out.println("Zadej koeficient b = "); koefAbc[2] = read.nextDouble(); System.out.println("Zadej koeficient c = "); koefAbc[3] = read.nextDouble(); return (koefAbc); }

33 A0B36PRI „PROGRAMOVÁNÍ“ 0733 Příklad 6 – Kořeny kvadratické rovnice static void tiskKorenuKvadrRovnice (double[] koreny){ final int ReKompl=0, ReX1=1, ImX1=2, ReX2=3, ImX2=4; if(koreny[ReKompl] != 0){ // Realne koreny System.out.println("x1="+koreny[ReX1]+"+"+koreny[ImX1]); System.out.println("x2="+koreny[ReX2]+"+"+koreny[ImX2]); return; } // Komplexne sdruzene koreny if(koreny[ImX1] >= 0){ System.out.println("x1="+koreny[ReX1]+"+j"+koreny[ImX1]); System.out.println("x2="+koreny[ReX1]+"-j"+koreny[ImX1]); return; } System.out.println("x1="+koreny[ReX1]+"-j"+(-koreny[ImX1])); System.out.println("x2="+koreny[ReX1]+"+j"+(-koreny[ImX1])); }

34 A0B36PRI „PROGRAMOVÁNÍ“ 0734 Příklad 6 – Kořeny kvadratické rovnice public class KorKvadrRov{ static {Locale.setDefault(Locale.US);} public static void main (String[] args){ double[] koef; double[] koren; while(true){ System.out.println (“Vypocet korenu kvadraticke rovnice"); koef = ctiKoefKvadrRovnice(); if(koef[0] Chyba-END koren = korenyKvadrRovnice(koef); tiskKorenuKvadrRovnice(koren); }

35 A0B36PRI „PROGRAMOVÁNÍ“ 0735 Další informace k této přednášce hledejte např. v: Herout, P.: Učebnice jazyka Java, Kopp, Č.Budějovice, 2010, str.129 – 138.

36 České vysoké učení technické Fakulta elektrotechnická Strukturované datové typy Pole Jazyk JAVA Konec A0B36PRI - PROGRAMOVÁNÍ


Stáhnout ppt "České vysoké učení technické Fakulta elektrotechnická Strukturované datové typy Pole Jazyk JAVA A0B36PRI - PROGRAMOVÁNÍ V 2.01."

Podobné prezentace


Reklamy Google