Strukturované datové typy

Slides:



Advertisements
Podobné prezentace
Standardní knihovní funkce pro práci s textovými řetězci
Advertisements

Pole Příklad: 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í.
Pro začátek něco lehčího
Orbis pictus 21. století Tato prezentace byla vytvořena v rámci projektu.
Počítače a programování 1 Přednáška 13 Jiří Šebesta.
Funkce Připomeňme si program pro výpočet faktoriálu:
Programování funkcí v Excelu (pole)
Pascal - příklady.
Programování 2 Cvičení 5.
Třída Array Je součásti balíčku java.util Účelem je usnadnit práci s poli Metody – nejpoužívanější equel(),fill(),sort() a binarySearch() equels() Slouží.
Pole, ukazatele a odkazy
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
Metody (funkce, procedury)
Algoritmy I. Cvičení č. 10.
Počítače a programování 1. Obsah přednášky Výjimky - základní typy výjimek Způsoby zpracování výjimek.
Principy překladačů Mezikód Jakub Yaghob.
Čtvrté cvičení Objektové programování Objektový model v Javě
Materiály k přednášce Úvod do programování Ondřej Čepek.
Větvení cykly J a v a Začínáme programovat Lucie Žoltá.
J a v a Začínáme programovat Lucie Žoltá pole řetězec debugr.
J a v a Začínáme programovat Lucie Žoltá metody, objekty, konstruktor.
J a v a Začínáme programovat Lucie Žoltá. Odkazy - oficiální stránky (překladače, help, metody, vývojové prostředí NetBeans,...)
C# - struktury, výčtové typy, pole
C# - datové typy Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí.
Vyučovací hodina 1 vyučovací hodina: Opakování z minulé hodiny 5 min Nová látka 20 min Procvičení nové látky 15 min Shrnutí 5 min 2 vyučovací hodiny: Opakování.
A1PRG - Programování – Seminář Ing. Michal Operátory (2. část) 4 Verze
Třída jako zdroj funkcionality
Objektové programování
A1PRG - Programování – Seminář Ing. Michal Ukazatele a pole 10 Verze
Počítače a programování 1
JavaScript Podmínky, cykly a pole.
OSNOVA: a)Programování se soubory b)Záloha databáze v souboru c) Příklady Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování.
KIV/PPA1 cvičení 8 Cvičící: Pavel Bžoch. Osnova cvičení Objekty v Javě Třída Konstruktor Metody Metody a proměnné třídy x instance Program sestávající.
A1PRG - Programování – Seminář Ing. Michal Standardní knihovní funkce pro vstup a výstup 12 Verze
C# - předávání parametrů Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí.
Dědičnost - inheritance dědičnost je jednou z forem znovupoužitelnosti dědičnost je jednou z forem znovupoužitelnosti B A Třída A je předkem třídy B Třída.
Gymnázium prof. Jana Patočky Jindřišská Praha 1 „Praha & EU: Investujeme do vaší.
10. Dynamické proměnné Dynamická proměnná se nezavádí deklarací proměnných, ale vzniká za běhu programu provedením speciálního příkazu. Nemá přidělen žádný.
7. Typ soubor Souborem dat běžně rozumíme uspořádanou množinu dat, uloženou mimo operační paměť počítače (na disku). Pascalský soubor je abstrakcí skutečného.
Algoritmizace a programování Textové soubory - 13 Mgr. Josef Nožička IKT Algoritmizace a programování
KIV/PPA1 cvičení 9 Cvičící: Pavel Bžoch. Osnova cvičení Třída String a její metody –Řetězce a operace s nimi.
Ukazatele BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky © Miroslav Balík Fakulta informačních technologií České vysoké.
KIV/PPA1 cvičení 6 Cvičící: Pavel Bžoch. Osnova cvičení Datový typ pole –Jednorozměrná a vícerozměrná –Práce s vektory a maticemi.
Netrvaloppa21 Vytvořte třídu Student pro reprezentaci struktury student na ZČU. Atributy třídy budou fakulta a osobniCislo. Název třídy: Student proměnné.
Vektorové prostory.
POSLOUPNOST úkol 1_41. ZADÁNÍ Sestavte program, který doplní tabulku nepřímé úměrnosti pro hodnoty proměnné x = 1, …, n. Nepřímá úměrnost je zadána uživatelem.
STRING A UKAZATELE. Co to je řetězec? Řetězec v Javě je samostatný objekt. Je konstantní, co znamená, že jednou vytvořený řetězec nelze změnit. Chceme-li.
Počítače a programování 1 7.přednáška. Základy Pole ve třídách a metodách Pole Arrays.
PŘÍKAZ while úkol 1_42.
Ukazatele, řetězce Přednáška č. 3. Ukazatele  Ukazatel (pointer) – typ o velikosti 4 bajty (v 32bit. systémech) pro uložení adresy objektu na který ukazuje.
Soubory BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky © Miroslav Balík Fakulta informačních technologií České vysoké.
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část II.
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část I.
České vysoké učení technické Fakulta elektrotechnická Datové typy, výrazy vstup, výstup Jazyk JAVA A0B36PRI - PROGRAMOVÁN Í v1.02.
Vícerozměrná pole (1) Jazyk C povoluje, aby pole mělo více rozměrů (dimenzí) než jeden Z vícerozměrných polí bývá nejčastěji použí-váno pole dvourozměrné.
Algoritmizace a programování Cykly - For. FOR Předem známe počet opakování Předem známe počet opakování Syntaxe: Syntaxe: for proměnná in range(rozpětí):
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně AUTOR: Ing. Adéla Tomalová NÁZEV: Podpora výuky v technických oborech TEMA: Objektově orientované.
Počítače a programování 2
Programování ENUM, SWITCH,pole jednorozměrná a vícerozměrná, deklarace, inicializace, kopírování, porovnání Erik Král.
Vícerozměrná pole (1) Jazyk C povoluje, aby pole mělo více rozměrů (dimenzí) než jeden Z vícerozměrných polí bývá nejčastěji použí-váno pole dvourozměrné.
C# konzole – Vstup a výstup
Vzorové řešení zápočtového testu
Algoritmizace a programování
Programování v jazyce C++
Dynamické proměnné (1) Proměnné, jejichž počet a (nebo) velikost pa-měti využívané těmito proměnnými se v prů-běhu programu mění Dynamické proměnné lze.
Oblast platnosti identifikátoru (1)
Typ pole (1) Proměnná typu pole představuje kolekci proměnných stejného datového typu, které mohou být označovány společným jménem (identifikátorem) Pole.
C# přehled vlastností.
Typ ukazatel (1) Proměnné typu ukazatel (pointer) uchovávají paměťovou adresu Hodnota ukazatele říká, kde (na jaké adrese) se v paměti nachází nějaký objekt.
MNOŽINY RNDr. Jiří Kocourek.
Transkript prezentace:

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

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

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

Pole Jméno odkazu odkaz-na-pole 1 2 … 6 Indexy prvků Prvek 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é Jméno odkazu odkaz-na-pole 1 2 … 6 Indexy prvků Prvek pole A0B36PRI „PROGRAMOVÁNÍ“ 07

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 ]. Indexy prvků a[ 2 ] Jméno odkazu a 1 2 6 … Adresa prvků Prvek pole A0B36PRI „PROGRAMOVÁNÍ“ 07

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 A0B36PRI „PROGRAMOVÁNÍ“ 07

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 1 2 6 … A0B36PRI „PROGRAMOVÁNÍ“ 07

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; prumer = prumer + teploty[i]; prumer = prumer / 7; na závěr pomocí cyklu vypíšeme odchylky od průměru System.out.println (teploty[i]-prumer); A0B36PRI „PROGRAMOVÁNÍ“ 07

Pole v jazyku Java 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}; A0B36PRI „PROGRAMOVÁNÍ“ 07

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]); A0B36PRI „PROGRAMOVÁNÍ“ 07

Příklad 2 – Výpis pole v opačném pořadí Vstup: n a1 a2 ... ,an , kde ai jsou celá čísla Výstup: čísla ai 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]); } A0B36PRI „PROGRAMOVÁNÍ“ 07

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ů A0B36PRI „PROGRAMOVÁNÍ“ 07

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]; A0B36PRI „PROGRAMOVÁNÍ“ 07

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<a.length; i++)b[i] = a[i]; // kopírování, též System.arrayCopy() b = a; //kopiruje adresu z a do b, nikoliv obsahy poli a a b 10 a b A0B36PRI „PROGRAMOVÁNÍ“ 07 !

Volá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. Paměť dat 4 a 6 b b 6 6 m m ! y 6 y x 4 x A0B36PRI „PROGRAMOVÁNÍ“ 07

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. p 77 5 33 q r ! ! A0B36PRI „PROGRAMOVÁNÍ“ 07

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(). p q 5 33 ! ! A0B36PRI „PROGRAMOVÁNÍ“ 07

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) { ... } A0B36PRI „PROGRAMOVÁNÍ“ 07

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<pole.length; i++) pole[i] = sc.nextInt(); // Navrat odkazu (reference) na vytvorene pole return pole; } Konstrukce pole obsahuje informaci o sve velikosti Zde pole.length – délka pole Pole je indexováno vždy od 0 (v Javě) Poslední (nejvyšší) index má hodnotu (pole.length-1) A0B36PRI „PROGRAMOVÁNÍ“ 07

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) { 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 A0B36PRI „PROGRAMOVÁNÍ“ 07

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<pole.length/2; i++) { pom = pole[i]; pole[i] = pole[pole.length-1-i]; pole[pole.length-1-i] = pom; } public static void main(String[] args) { int[] vstupniPole = ctiPole(); obratPole(vstupniPole); vypisPole(vstupniPole); Metoda obratPole dostane odkaz (referenci) na stejné pole, na jaké odkazuje (referencuje) proměnná vstupniPole ! ! A0B36PRI „PROGRAMOVÁNÍ“ 07

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]; A0B36PRI „PROGRAMOVÁNÍ“ 07

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<tab.length; i++) if (tab[i]!=0) System.out.println("četnost čísla "+(i+MIN)+" je "+tab[i]); A0B36PRI „PROGRAMOVÁNÍ“ 07

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) { A0B36PRI „PROGRAMOVÁNÍ“ 07

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 2. 3. 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) A0B36PRI „PROGRAMOVÁNÍ“ 07

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 p++; } while (!mnozina[p]); } while (p<=pmax); return mnozina; } A0B36PRI „PROGRAMOVÁNÍ“ 07

Příklad 5 -Eratosthenovo síto Funkce pro výpis množiny static void vypis(boolean[] mnozina) { for (int i=2; i<mnozina.length; i++) if (mnozina[i]) System.out.println(i); } Hlavní funkce public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Zadejte max = "); int max = sc.nextInt(); boolean[] mnozina = sito(max); System.out.println("Prvočísla od 2 do "+max); vypis(mnozina); A0B36PRI „PROGRAMOVÁNÍ“ 07

Příklad 6 – Kořeny kvadratické rovnice Zadání: Zapište metody pro řešení kvadratické rovnice a.x2+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í ReX1,ImX1,ReX2,ImX2. Budou-li kořeny reálné bude v ImX1,ImX2 hodnota nulová. A0B36PRI „PROGRAMOVÁNÍ“ 07

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 A0B36PRI „PROGRAMOVÁNÍ“ 07

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 A0B36PRI „PROGRAMOVÁNÍ“ 07

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 A0B36PRI „PROGRAMOVÁNÍ“ 07

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); A0B36PRI „PROGRAMOVÁNÍ“ 07

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]); System.out.println("x1="+koreny[ReX1]+"-j"+(-koreny[ImX1])); System.out.println("x2="+koreny[ReX1]+"+j"+(-koreny[ImX1])); A0B36PRI „PROGRAMOVÁNÍ“ 07

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] <= 0)break;//koef. a = 0 => Chyba-END koren = korenyKvadrRovnice(koef); tiskKorenuKvadrRovnice(koren); } A0B36PRI „PROGRAMOVÁNÍ“ 07

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

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