Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
date post
15-Jan-2016Category
Documents
view
21download
0
Embed Size (px)
description
Transcript of Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Arrays
Javakurs FSS 2012
Lehrstuhl Stuckenschmidt Tag 2 Arrays, Methodenund RekursionArraysArrays sind Folgen gleichartiger Variablen:Mathematisch: x0, x1, x2, ..., xnJava: x[0], x[1], x[2], ..., x[n]Arrays haben eine feste Lnge
012334121722Deklarieren / InitialisierenDeklarierenBekannt machen (z.B. einer Variable)
InitialisierenZuweisung eines Wertes
int zahl;char buchstabe;zahl = 5;buchstabe = c;Deklarieren eines ArraysDeklarierenBekannt machen (z.B. einer Variable)
zahlen ist eine Folge von ganzen Zahlenwort ist eine Folge von Zeichen
int[] zahlen; char[] wort;Initialisieren eines ArraysInitialisieren mit newAusfhrliche Schreibweise:
Kompakte Schreibweise:
Array besteht aus Default WertenInitialisierung ber die Lnge
int[] zahlen; //Deklarationzahlen = new int[4]; //Default Werteint[] zahlen = new int[4];Initialisieren eines ArraysZuweisen von eigenen Werten
hnlich wie bei primitiven DatentypenJedes Feld muss separat betrachtet werden
zahlen[0]zahlen[1]zahlen[2]zahlen[3]34121722int[] zahlen = new int[4];zahlen[0] = 34;zahlen[1] = 12;zahlen[2] = 17;zahlen[3] = 22;zahlen[0]zahlen[1]zahlen[2]zahlen[3]0000Initialisieren eines ArraysGeht das nicht schneller?Ausfhrliche Schreibweise
Kompakte Schreibweise
Keine Angabe der Lnge!
int[] zahlen; zahlen = new int[]{34, 12, 17, 31};zahlen[0]zahlen[1]zahlen[2]zahlen[3]34121722int[] zahlen =new int[]{34, 12, 17, 31};Initialisieren eines ArraysNicht schnell genug?Kompakte Schreibweise
Vorsicht: Ausfhrliche Schreibweise existiert nicht!
int[] zahlen = {34, 12, 17, 31};zahlen[0]zahlen[1]zahlen[2]zahlen[3]34121722Lnge eines ArraysJeder Array hat eine Variable lengthEntspricht der Lnge des Arraysint und finalAuslesen der Lnge:
Konsolenausgabe:
Das letzte Feld eines Arrays ist length-1!!
int[] zahlen = {34, 12, 17, 31};System.out.println(zahlen.length);4Aufrufen von ElementenZugriff auf die Elemente ber den Index
Konsolenausgabe:
int[] zahlen = {34, 12, 17, 22};System.out.println(zahlen[1]);System.out.println(zahlen[2]);System.out.println(zahlen[4]);zahlen[0]zahlen[1]zahlen[2]zahlen[3]341217221217Aufrufen von ElementenZugriff auf die Elemente ber den Index
Konsolenausgabe:
int[] zahlen = new int[4];System.out.println(zahlen[1]);System.out.println(zahlen[2]);System.out.println(zahlen[4]);zahlen[0]zahlen[1]zahlen[2]zahlen[3]000000Arrays und for-SchleifenPerfekt zum Durchlaufen von Arrays
Konsolenausgabe:
char[] alphabet = {a, b, c, ..., y, z};for(int n = 0; n < alphabet.length; n++){ System.out.print(char[n] + );}a b c d e f g h i j k ...Arrays und for-SchleifenBerechnung der Summe
Konsolenausgabe:
int[] zahlen = {34, 12, 17, 22};int sum = 0; for(int n = 0; n < zahlen.length; n++){ sum += zahlen[n];}System.out.println(sum);85Arrays und for-SchleifenErweiterte for-Schleife
Konsolenausgabe:
int[] zahlen = {34, 12, 17, 22};int sum = 0; for(int zahl : zahlen){ sum += zahl;}System.out.println(sum);85Arrays und for-SchleifenErweiterte for-SchleifeKurze Schreibweise
Entspricht:for(int zahl : zahlen){ //bla} for(int n = 0, zahl; n < zahlen.length; n++){ zahl = zahlen[n]; //bla}Arrays und for-SchleifenTypische Suche in einem Array
Konsolenausgabe:
int position = 0;for(int n = 0; n < alphabet.length; n++){ if(alphabet[n] == d){ position = n + 1; break; }} System.out.println(position);4Mehrdimensionale ArraysArrays von ArraysErste Dimension stellen die Zeilen darZweite Dimension stellen die Spalten dar
01211380123412170Verweis 1 Verweis1. Array2. Array3. ArrayMehrdimensionale ArraysNichtrechteckige ArraysJede Zeile kann eine eigene Gre haben!01234Hallo0123Welt0Verweis 1 VerweisDeklarieren und InitialisierenDeklarierenquivalent wie beim eindimensionalen Array
Keine Unterschied zwischen rechteckigen und nichtrechteckigen Arrays
int[][] matrix; char[][] halloWelt;Initialisieren eines ArraysInitialisieren mit newRechteckige Arrays:
Nichtrechteckige Arrays
int[][] matrix = new int[2][3]char[][] halloWelt = new char[2][];halloWelt[0] = new char[5];halloWelt[1] = new char[6]Initialisieren eines ArraysZuweisen von eigenen Wertenhnlich wie bei eindimensionalen ArrayJedes Feld muss separat betrachtet werden
int[][] matrix = new int[2][3];zahlen[0][0] = 11;zahlen[0][1] = 3;zahlen[0][2] = 8;01211380120000Verweis 1 VerweisInitialisieren eines ArraysGeht das nicht schneller?
Mengenklammern trennen Dimensionen
int[] matrix = {{11, 3, 8},{34, 12, 17}};01211380123412170Verweis 1 VerweisHallo Weltchar[][] halloWelt = {{'H', 'a', 'l', 'l', 'o'}, {'W', 'e', 'l', 't'}};
for(char[] wort : halloWelt){ for(char c : wort){ System.out.print(c); }}01234Hallo0123Welt0Verweis 1 VerweisString in ArraytoCharArray()Wandelt einen String in einen Array umString str = Hallo;str.toCharArray();01234HalloArray ExceptionsArray Index Out Of Bounds Exception
Index im Array nicht vorhandenNull Pointer Exception
2te Dimension noch nicht initialisiert
int[] zahlen = {12, 32, 24, 17};System.out.println(zahlen[4]);char[][] halloWelt = new char[2][];System.out.println(halloWelt[0][0]);MethodenFunktionen einer Klasse/Objektes
Aber warum Methoden?Zerlegung komplexer Programme in kleine TeileWiederkehrende Programmteile schon verfgbar
public static void halloWelt(){ System.out.println(Hallo Welt!);}Aufbau von MethodenMethoden bestehen aus:Methodenkopf
Methodenrumpf
{ System.out.println(Hallo Welt!);}public static void halloWelt()private static double mwSt(double betrag){ return betrag * 0.19;}Aufbau von MethodenMethodenkopfSichtbarkeitMethodentyp (Rckgabetyp)MethodennameMethodenparameter
public static void halloWelt()Beschreibt den Typ einer MethodeName der MethodeParameter der MethodeAufbau von MethodenMethodenkopfSichtbarkeitMethodentyp (Rckgabetyp)MethodennameMethodenparameter
private static double mwSt(double betrag)Beschreibt den Typ einer MethodeName der MethodeParameter der MethodeAufbau von MethodenMethodenrumpf ffnenden KlammerFolge von Anweisungenreturn (optional bei void) Schlieende Klammer
{ return betrag * 0.19;}{ System.out.println(Hallo Welt!);}ReturnreturnEin Rckgabewert pro MethodeBeendet Methode (vorzeitig)
static void sqrt(double d){ if ( d < 0){ return; } System.out.println(Math.sqrt(d));}static int soNicht(){ int i = 0; return i; i = 2; //Unreachable Code}31MethodentypenvoidVerwendung fr Methoden ohne RckgabewerteBzw fr Methoden die keinen Wert berechnenreturn optional ohne Wertpublic static void halloWelt(){ System.out.println(Hallo Welt!);}32MethodentypenDatentypenVerwendung fr Methoden mit RckgabewerteBentigt returnRckgabewert muss der selbe Datentyp seinint, char, double... aber auch Objekte
public static double mwSt(int betrag){ return betrag * 0.19;}
public static double mwSt(double betrag){ System.out.println(Methode mit fester MwSt!); return betrag * 0.19;}MethodenparameterParametrisierte Funktionbergabe von Werten an eine MethodeMethode kann diese Werte verwendenGenerische Methoden mglich
public static double mwSt(double betrag, double satz){ System.out.println(Methode mit variabler MwSt!); return betrag * satz;}MethodenparameterWertbergabebergabe von Werten an Methode bei AufrufBei gleichem Methodennamen wird mit Parameter zwischen den einzelnen Methoden differenziert
Konsolenausgabe:
public static void main(String[] args){ System.out.println(mwSt(10)); System.out.println(mwSt(10,0.19));}Methode mit fester MwSt!1.9Methode mit variabler MwSt!1.9RekursionZurcklaufenEine Funktion durch sich selbst zu definieren
Problem Binrzahl ist spiegelverkehrt!
static void inBinaer(int dezimal){ while(dezimal > 0){ System.out.print(dezimal % 2); dezimal = dezimal / 2; }}RekursionZurcklaufenEine Funktion durch sich selbst zu definieren
Problem Binrzahl ist spiegelverkehrt!
static void inBinaer(int dezimal){ if(dezimal < 2) System.out.print(dezimal); else{ inBinaer(dezimal / 2); System.out.print(dezimal % 2); }}Rekursionstatic int fakul(int zahl) { if(n == 0) return 1; else return fakul(n-1)* n;}fakul(4) = *4*23**11*4*23**1fakul(0)*4*23*fakul(1)*4*3fakul(2)*4fakul(3)Wie funktioniert Rekursion?38*4*32*4*23*1*4*23**1Rekursionstatic int fakul(int zahl) { if(n == 0) return 1; else return fakul(n-1)* n;}fakul(4) = *4*23**11*46Wie funktioniert Rekursion?2439Wechselseitige RekursionZwei oder mehr FunktionenWechselseitigen Bezug aufeinander
Problem Binrzahl ist spiegelverkehrt!
static boolean istUngerade(int zahl) { if(zahl == 0) { return false; } return istGerade(zahl-1);}
static boolean istGerade(int zahl) { if(zahl == 0){ return true; } return istUngerade(zahl-1);}Endlose RekursionTerminiert nicht (hnlich wie bei Schleifen)
Fragen?