Pole (array) Motivace Častá úloha práce s větším množstvím dat stejného typu o Př.: průměrná teplota za týden a odchylka od průměru v jednotlivých dnech Console.Write("Zadej T pro.den: "); double t = Double.Parse(Console.ReadLine()); Console.Write("Zadej T pro.den: "); double t = Double.Parse(Console.ReadLine()); // atd. Console.Write("Zadej T pro 7.den: "); double t7 = Double.Parse(Console.ReadLine()); double tprumer = (t + t + t + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je 0", tprumer); Základní jmy Console.Write("Odchylka T pro.den: 0", t - tprumer); Console.Write("Odchylka T pro.den: 0", t - tprumer); // atd. Console.Write("Odchylka T pro 7.den: 0", t7 - tprumer); o nelze řešit cyklem s stupným výčtem průměru o nevýhody: algoritmus nevykazuje znaky hromadnosti (teploty za měsíc, rok???) obtížná manipulace s daty (jak na hledání extrémů?) le = strukturovaný datový typ, složen z většího množství ložek (prvky le) (item) le = homogenní datová struktura ( Pole prvků typu array of ) všechny prvky le stejný datový typ index prvku (item index) zice prvku od začátku le Vytvoření le le = proměnná deklarace: jakýkoli datový typ omezeno velikostí paměti typ[] JmenoPole = new typ[cetprvku]; o Příklady: const int POCET_PRVKU = 7; double[] teplota = new double[pocet_prvku]; string[] zaznamy = new string[0000];
Práce s lem Po prvcích typicky v cyklu for const int POCET_PRVKU = 7; double[] teplota = new double[pocet_prvku]; double tprumer = 0; // nacteni prvku z klavesnice for (int i = 0; i < teplota.length; i++) Console.Write("Zadej T pro 0.den: ", i + ); teplota[i] = double.parse(console.readline()); tprumer += teplota[i]; Index // vycet a vypis prumeru tprumer /= teplota.length; Console.WriteLine("Prumerna teplota je 0", tprumer); // vycet a vypis odchylek for (int i = 0; i < teplota.length; i++) Console.WriteLine("Odchylka T pro 0.den: ", i +, teplota[i] - tprumer); Vlastnost;čet prvků Poznámky výsledek výrazu pro index: celé číslo teplota[] teplota[*k+] teplota[.5] // liché prvky // špatně o typicky proměnná typu int jmenovaná i prvek le = proměnná jednoduchého typu
double[] teplota = new double[7]; tprumer += teplota[i]; dalsipole[5] = *sin(teplota[*i]); Meze le vždy od 0 do čet prvků teplota[0] //. prvek teplota[] // 4. prvek teplota[pocet_prvku-] // slední prvek teplota[pocet_prvku] // nejčastější chyba Délka le: Vlastnost jen pro čtení Length typu int int cetprvku = teplota.length; // 7 Pole a paměť int[] = new int[]; int[] = new int[] [0] [] [] referenční proměnná (odkaz) data lze rozdělit deklaraci odkazu a vznik le: odkaz nikam nesměřuje (obsah proměnné: null) int[] ; // prazdny odkaz [] = 0; // chyba, le není vytvořeno = new int[]; // muzeme uzivat [] = 0; // OK velikost le i za běhu programu Console.Write("Zadej delku le: "); int delka = Int.Parse(Console.ReadLine()); double[] le = new double[delka]; Práce s referenční proměnnou int[] p = new int[]; int[] p = new int[]; // p = p; //
p p p[0] p[] p[] p[0] p[] p[] p odkazuje na stejná data jako p p p p[0] p[] p[] p[0] p[] p[] Inicializace le o jakákoli změna v p se projeví se i v p (a naopak) o k původním datům v li p se již nelze dostat!!! Nové le prvky hodnotu: 0, 0.0, false, inicializace int[] p = new int[],, ; int[] p = -87,, 4, 589 ; Vícerozměrná le Pravoúhlá = le s více indexy o indexy = matice, nejčastější případ o indexy = D le ( kvádr ) Základní principy = D le C# dva typy: o Pravoúhlé (D tvar obdélníku) o Nesymetrické každý řádek uze D deklarace: // délku doplní překladač jiný čet sloupců typ[,] jmenopole = new typ[radku, sloupcu]; o např. int[,] le = new int[, ]; 4
Inicializace v deklaraci int[,] le =,,,,, D le = D le, jehož prvky jsou D le Zjištění rozměrů: o Vlastnost Rank o Vlastnost Length čet dimenzí le čet všech prvků o Metoda int GetLength(int dimenze) dimenze Práce s vícerozměrným lem nejčastěji vnořené cykly for o Příklad: Součet dvou matic C = A+B Nesymetrická vrací čet prvků v dimenzi const int RADKU = ; const int SLOUPCU = ; int[,] A = new int[radku, SLOUPCU]; int[,] B = new int[radku, SLOUPCU]; int[,] C = new int[radku, SLOUPCU]; for (int i = 0; i < A.GetLength(0); i++) // pres radky for (int j = 0; j < A.GetLength(); j++) // v radku pres sloupce C[i, j] = A[i, j] + B[i, j]; (Jagged Array) každý řádek jiný čet sloupců důvody: úsra místa, rychlost příklad uložení informace o průměrné teplotě dnech, měsících v jednom roce leden únor JA 8 9 0 leden únor pravoúhlé 8 9 0 listopad prosinec listopad prosinec 5
Pole a metody Pole jako parametr D i vícerozměrná le stejné Příklad: metoda, která vytiskne le na obrazovku static void Main(string[] args) int[] = new int[5]; [] = 45; TiskPole(); static void TiskPole(int[] p) for (int i = 0; i < p.length; i++) Console.WriteLine(p[i]); do metody se předává (kopíruje) uze referenční proměnná, nikoli kompletní data!!! = volání odkazem: o rychlé o prvky le lze uvnitř metody změnit Před voláním metody [0] [] [] V metodě p Kopie odkazu [0] [] [] p[0] p[] p[] práce s původními daty Po skončení metody p [0] [] [] p[0] p[] p[] o na čtu prvků nezáleží 6
Příklad: Metodu, která vynásobí le skalárem static void Main(string[] args) int[] = new int[5] 5, -, 56, 0, 888 ; PoleKratSkalar(, 4); není nutné ref či out static void PoleKratSkalar( int[] p, int skalar) for (int i = 0; i < p.length; i++) p[i] *= skalar; Pole jako návratová hodnota metody vrací se uze odkaz, s daty se nic neděje Příklad: Metoda, která sečte dva vektory rychlé static int[] SectiVektory(int[] v, int[] v) if (v.length!= v.length) return null; int[] vektor = new int[v.length]; for (int i = 0; i < vektor.length; i++) vektor[i] = v[i] + v[i]; return vektor; static void Main(string[] args) int[] le =,, ; int[] le =,, ; int[] soucetpoli = SectiVektory(le, le); výsledek výrazu = odkaz na data 7