Differences
This shows you the differences between two versions of the page.
| efinf:blc2016:ruby:arrays [2016/09/25 11:48] – created Ivo Blöchliger | efinf:blc2016:ruby:arrays [2016/09/25 11:51] (current) – [Initialisierung] Ivo Blöchliger | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | {{backlinks> | ||
| + | |||
| + | ===== Array ===== | ||
| + | Ein Array ist eine " | ||
| + | |||
| + | In vielen Programmiersprachen müssen alle Werte im Array den gleichen Typ haben und die Anzahl der Einträge muss am Anfang festgelegt werden und kann danach nicht mehr verändert werden. | ||
| + | |||
| + | In Ruby gelten diese Einschränkungen nicht. Arrays sind extrem flexibel und konfortabel zu benutzen. Der Preis dafür ist eine langsamere Ausführung des Codes. Je nach Art der Array-Manipulation kann der Zeitaufwand schon mal proportional zur Anzahl der Elemente im Array sein (z.B. ein Element löschen oder einfügen). | ||
| + | |||
| + | ==== Initialisierung ==== | ||
| + | <code ruby> | ||
| + | # leeres Array | ||
| + | a = [] | ||
| + | a = Array.new | ||
| + | |||
| + | # Array mit Einträgen | ||
| + | a = [4," | ||
| + | puts a[0] # liefert 4 | ||
| + | p a # Gleicher Effekt wie puts a.inspect | ||
| + | |||
| + | a =%w(das ist ein Array mit Strings) | ||
| + | p a | ||
| + | |||
| + | # Array mit konstantem Wert (Achtung bei Werten, die nicht Zahlen sind) | ||
| + | a = Array.new(10, | ||
| + | p a | ||
| + | a[2]=3 | ||
| + | p a | ||
| + | # Und hier das Problem | ||
| + | a = Array.new(10," | ||
| + | a[2] = " | ||
| + | p a | ||
| + | a[1][0..2]=" | ||
| + | p a | ||
| + | |||
| + | # Array aus Bereich (Range) erzeugen: | ||
| + | a = (10..20).to_a | ||
| + | p a | ||
| + | |||
| + | |||
| + | # Array mit programmatisch erzeugten Inhalten | ||
| + | a = Array.new(10){" | ||
| + | p a | ||
| + | a[1][0..2]=" | ||
| + | p a | ||
| + | |||
| + | a = Array.new(10){|i| i*i} | ||
| + | p a | ||
| + | </ | ||
| + | |||
| + | Arrays können auch Arrays enthalten und damit können mehrdimensionale Arrays abgebildet werden: | ||
| + | |||
| + | <code ruby> | ||
| + | multab = Array.new(5){|i| Array.new(5){|j| i*j}} | ||
| + | p multab | ||
| + | puts multab[3][2] | ||
| + | </ | ||
| + | |||
| + | === Zugriff === | ||
| + | <code ruby> | ||
| + | a = Array.new(10){|i| 100+i*i} | ||
| + | p a | ||
| + | puts " | ||
| + | a[2..4] = [2,3,4] | ||
| + | p a | ||
| + | a.push(1001) | ||
| + | p a | ||
| + | puts a.size | ||
| + | a[15]=200 | ||
| + | p a | ||
| + | puts a.size | ||
| + | </ | ||
| + | |||
| + | ==== Aufgaben ==== | ||
| + | Erzeugen Sie ein Array einer gegebenen Länge mit | ||
| + | * ungeraden Zahlen 1,3,5, etc. | ||
| + | * allen ASCII-Symbolen von 32 bis 126 | ||
| + | * 1000 Würfelzahlen (Hinweis: rand(x) liefert ganzzahlen zwischen 0 und x-1 inklusive). | ||
| + | * den Fibbonacci-Zahlen: | ||
| + | * den Zeilen des Pascal-Dreiecks, | ||
| + | |||
| + | <hidden Lösungen> | ||
| + | <code ruby> | ||
| + | # Ungerade Zahlen: | ||
| + | # Effizient | ||
| + | | ||
| + | # Ineffizient | ||
| + | a = [] | ||
| + | | ||
| + | |||
| + | # ASCII-Zeichen, | ||
| + | a = [] | ||
| + | | ||
| + | # ASCII-Zeichen, | ||
| + | | ||
| + | |||
| + | # Würfelzahlen | ||
| + | a = Array.new(1000){rand(6)+1} | ||
| + | |||
| + | # Fibbonacci Zahlen | ||
| + | # Elegant, ineffizient weil Array dynamisch wächst | ||
| + | a = [0,1] | ||
| + | | ||
| + | # Explizite Formel, Konstanten vorberechnet für Effizienz, Ungenau ab ca. 16 Stellen. | ||
| + | sq5 = Math.sqrt(5.0) | ||
| + | phi = (1.0+sq5)/ | ||
| + | a = Array.new(42){|i| (phi**i/ | ||
| + | |||
| + | # Pascal-Dreieck | ||
| + | a = [[1]] | ||
| + | # Dieser Loop könnte auch auf einer Zeile ohne die Variable temp geschrieben werden. | ||
| + | # Es ist aber wohl klarer, was abgeht. | ||
| + | | ||
| + | temp = Array.new(a.size-1){|i| a[-1][i]+a[-1][i+1]} | ||
| + | a.push([1]+temp+[1]) | ||
| + | } | ||
| + | # Nette Ausgabe (Zeilenumbrüche sind hier nur zur Lesbarkeit und könnten weggelassen werden) | ||
| + | puts a.map.with_index{|linie, | ||
| + | " " | ||
| + | linie.map{|zahl| | ||
| + | | ||
| + | }.join("" | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | </ | ||
| + | ==== Array Methoden ==== | ||
| + | Umfangreiche Übersicht: https:// | ||
| + | |||
| + | === Loops === | ||
| + | * .each{|e| ...} | ||
| + | * .each_with_index{|e, | ||
| + | |||
| + | === Manipulation === | ||
| + | * .map{|e| ...} # Neues Array mit den Resultaten | ||
| + | * .map!{|e| ...} # Array wird überschrieben | ||
| + | * .select{|e| ...} # Neues Array mit jenen Elementen, für die der Block {...} true ergibt | ||
| + | * .join(" | ||
| + | * .sort # Neues Array, sortiert (Vergleiche mit <=>) | ||
| + | * .sort! # Array wird verändert | ||
| + | * .sort! {|a,b| ...Wert <0 wenn a<b, >0 wenn a>0, 0 sonst...} | ||
| + | * .inject(startwert){|akkumulator, | ||
| + | <code ruby> | ||
| + | a = Array.new(100){rand(6)+1} | ||
| + | durchschnitt = a.inject(0){|s, | ||
| + | | ||
| + | a = [" | ||
| + | a.sort | ||
| + | a.sort{|a, | ||
| + | a.map{|e| e.split(" | ||
| + | a.map{|e| temp=e.split(" | ||
| + | | ||
| + | </ | ||