Informtik I Kpitel 6 Ausdrücke hben einen Wert sin(mth.pi) wird zu 1 sin(kreisrdius) wird zur Lufzeit usgewertet Elementre Konzepte von Progrmmiersprchen Zusmmenfssung des Kpitel 6 Küchlin, Weber, Einführung in die Informtik, 2.Auflge 16.1.2004 Anweisungen Zuweisungen kreisrdius = 2.67; Anweisungen zur Ablufsteuerung elementre Verzweigungen» if-then-else, switch, goto höhere Schleifenkonstrukte» while, do-while, for Dtentypen elementre (primitive types) schon eingebut (chr, short, long, int, flot, double) strukturierte (structured types) rry, String, eigene Klssen Deklrtion von Konstnten public finl sttic int MYPI=3.1415927; Vriblen int kreisrdius; Unterprogrmme Prozeduren kein Rückgbewert public sttic void meineprozedur(..){... Funktionen ein Rückgbewert public sttic int meinefunktion(..){... dienen der Kpselung, lso der Strukturierung in Jv werden sie ls Methoden einer Klsse relisiert 1 2
Vriblen, Referenzen, Zuweisungen Synt Schlüsselwörter und die zugehörige Grmmtik meist in BNF (Bckus-Nur-Form) if_sttement ::= "if" "(" epression ")" sttement [ "else" sttement ] Vrible Deklrtion: int; Zuweisung: =23; BNF Inde of JAVA lnguge grmmr, http://cui.unige.ch/jv/javaf/ Semntik Bedeutung/ Sinn des Codes chrkterisiert durch: <Typ, Nme, Referenz, Wert> int = 23; Speicher 23 L-Wert R-Wert Referenzvrible, Reihungsvrible Schlüsselwörter in Jv bstrct, finlly, public, ssert, flot, return, boolen, for, short, brek, goto, sttic, byte, if, strictfp, cse, implements, super, ctch, import, switch, chr, instnceof, synchronized, clss, int, this, const, interfce, throw, continue, long, throws, defult, ntive, trnsient, do, new, try, double, pckge, void, else, privte, voltile, etends, protected, while, finl Literle ds Literl 12 ht z.b. die Bedeutung/ den Wert 12 inhlt steht für einen String mit dem Wert inhlt Nmen bezeichnen Vriblen, Klssen, Methoden Nmenskonvention bechten! (ichbinmethode, ichvrible, ICHKONSTANTE) Referenzvrible (Eplizit in Jv nicht möglich) Reihungsvrible int[ ] = new int[ ]{42, 23, 65; ist Referenz druf, wohin y zeigt (C++: int* = &y;) Stck Hep y 23 42 23 65 3 4
Gnzzhl-Arithmketik Typkonversion Jv-Arithmetik nch Typ der Opernden 3/ 2 = 1, weil Gnzzhlrithmetik (1 [Rest 1]) Überluf schneidet zusätzliche Bits b (2 31-1) + 1 = -2 31 (bei 32bit-Integer-Arithmetik) Grund: Zweierkomplementdrstellung: 01 11111 11111 11111 11111 11111 11111 [2 31-1] +00 00000 00000 00000 00000 00000 00001 [1] =10 00000 00000 00000 00000 00000 00000 [-2 31 ] ddurch Ring und kein out of rnge eplizite Typkonversion (int) 13.6 ergibt ein Integer mit dem Wert 13 Jv schneidet hier den Nchkommteil b (= Runden zur 0) implizite Typkonversion Typverengung hin zu einem Typ mit ungenuerem Wertebereich (double -> int) Typufweitung hin zu einem Typ mit genuerem Wertebereich (int -> double) z.b. <double> + <int> -> <double>» 12.6 + 10 ergibt ein Double mit dem Wert 22.6 Stichpunkte Stichpunkte Gleitkomm-Arithmetik (+Infinity,...) Anweisungen Zuweisungsopertoren (Wert des Ausdrucks) Arithmetische Opertoren Blöcke, Gültigkeitsbereich, Lebensduer Adressrechnung (dynmisch/ sttisch) Boolesche Opertoren Rechnen uf Bitmustern (&, ) Ausdrücke (Präfi, Postfi, Infi, Roundfi, Mifi) (Präzedenz von Opertoren = Bindungskrft) Bedingte Anweisungen Schleifenkonstrukte Mrken brek und continue 5 6
Unterprogrmme Unterprogrmme Prmeteruebergbe clss Unterprogrmme{ Kopf Rumpf Ergebnistyp Nme formle Prmeter public sttic int (int, int y){ return +y; Prmeterübergbe cll by vlue (Werteufruf, JAVA) Signtur public sttic void (String[] rgs){ int = 7; int b = 8; System.out.println( (, b) ); ktuelle Prmeter cll by reference (Referenzufruf) cll by nme (Nmensufruf) Unterprogrmme Unterprogrmme Prmeteruebergbe Überldung von Methoden z.b. für generisches Progrmmieren mithilfe unterschiedlicher Signturen clss MyMth{... public double (double, double y){... public flot (flot, flot y){... public int (int, int y){...... cll by vlue (Der einzige Übergbemechnismus in Jv) clss CllByVlue{ sttic int = 7; sttic int b = 8; public sttic void (String[ ] rgs){ System.out.println( +b: +(, b)); System.out.println( : +); System.out.println( b: +b); public sttic int (int, int y){ int res = +y; ++; es wird eine Kopie der Werte ngelegt =7; b=8; =7; y=8; =7; b=8; =8; y=8; =7; b=8; Stck Stck Stck 7 8
Unterprogrmme Prmeteruebergbe Cll by vlue mit zusmmengesetzten Typen (geschieht in Jv bei Vriblen vom Typ einer Klsse inkl. Arrys) clss PssReferenceByVlue{ sttic int[ ] = new int[ ]{7, 8; public sttic void (String[ ] rgs){ System.out.println( [0]+[1]: +()); System.out.println( [0]: +[0]); System.out.println( [1]: +[1]); public sttic int (int[ ] ){ int res = [0]+[1]; [0]++; es wird eine Kopie eines Zeigers uf die Werte übergeben Stck Hep 7 8 Stck Hep Stck Hep Cll by reference vs. Cll by vlue ON REFERENCES sttic void Min(string[] rgs){ = new int[ ]{7, 8; chnge(); bzw. chnge(ref ); Pss reference by vlue: sttic void chnge(int[ ] ){ [0]++; = new int[ ]{2, 3; Cll by reference: sttic void chnge(ref int[ ] ){ [0]++; = new int[ ]{2, 3; Stck chnge Stck chnge Hep Hep chnge chnge 2 3 2 3 2 3 Unterprogrmme Prmeteruebergbe Unterprogrmme Prmeteruebergbe cll by reference (In Jv nicht möglich, ber z.b. in C# (ref), C++ (&), Pscl (vr)) public clss CllByReference{ sttic int[ ] = new int[ ]{7, 8; public sttic void Min(String[ ] rgs) { Console.WriteLine("[0]+[1]: "+(ref )); Console.WriteLine("[0]: "+[0]); Console.WriteLine("[1]: "+[1]); public sttic int (ref int[ ] ){ int res = [0] + [1]; [0]++; C#! es wird eine Referenz, lso ein Linkswert, übergeben, der formle Prmeter wird zum Alis für den ktuellen Prmeter Stck Hep 7 8 Stck Hep Stck Hep cll by nme (gibt es in Jv nicht, ber z.b. in VisulBsic) D der Mechnismus der Nmensübergbe in Jv nicht direkt vorgesehen ist, gehen wir im folgenden Beispiel dvon us, dss wir eine Klsse Assozitivspeicher hben, die die Methoden int getvluebynme(string nme) und setvluebynme(string nme, int vlue) enthält. clss CllByNmeSimultion{ sttic Assozitivspeicher A = new Assozitivspeicher(); public sttic void (String[ ] rgs){ A. setvluebynme(, 7); A. setvluebynme( b, 8); System.out.println( +b: +(, b )); System.out.println( : +A. getvluebynme( )); System.out.println( b: +A. getvluebynme( b )); Assozitivspeicher A Nme b Wert 7 8 int getvluebynme(string Nme); setvluebynme(string Nme, int vlue); public sttic int (String n1, String n2){ int res = A. getvluebynme(n1)+a. getvluebynme(n2); A. setvluebynme( n1, A. getvluebynme(n1)+1) es wird ein Nme übergeben Nme b Wert 9 10
Rekursion Rekursion hben wir usführlich uf früheren Folien im Tutorium behndelt! Siehe sum_in_jv! (vor llem die Kontete!) Endrekursion public sttic int sum_rek(int n){ if ( n == 0 ) return 0; return ( n + sum_rek( n-1 ) ); public sttic int sum_endrek(int n){ return sum_endrekhelp( n, 0 ); public sttic int sum_endrekhelp(int n, int res){ if ( n == 0 ) return sum_endrekhelp( n-1, res+n ) ); es wird nur leerer Kontet erzeugt endrekursiv -> itertiv endrekursiv itertiv public sttic int sum_rek(int n){ return sum_endrek( n, 0 ); public sttic int sum_endrekhelp(int n, int res){ if ( n == 0 ) return sum_endrekhelp( n-1, res+n ) ); public sttic int sum_iter(int n){ int k = n; int res = 0; while ( k >= 0) { res = k + res; k = k - 1; 11