252-0027 EinführungindieProgrammierungI 3.0Funk;onen ThomasR.Gross DepartmentInforma;k ETHZürich Uebersicht ! 3.1Parameter ! 3.2Return Copyright(c)Pearson2013.andThomasGross2016 Allrightsreserved. 2 NochmalzurUebung2 ! Sieerinnernsich… ----------------------------------| | | | | +++++++ | | +++++++ | | +++++++ | | +++++++++++++++++++++ | | +++++++++++++++++++++ | | +++++++++++++++++++++ | | +++++++ | | +++++++ | | +++++++ | | | | | ----------------------------------- 3 public static void flag_simple() line(); for (int i=0; i<2; i++) for (int i=0; i<3; i++) for (int i=0; i<3; i++) for (int i=0; i<3; i++) for (int i=0; i<2; i++) line(); } VieleLösungen { redarea(); cross(); core(); cross(); redarea(); public static void line() { for (int i=0; i< 35; i++) System.out.print("-"); System.out.println(); } public static void redarea() { System.out.print("|"); for (int i=0; i<33; i++) System.out.print(" "); System.out.println("|"); } public static void cross() { System.out.print("|"); for (int i=0; i<13; i++) System.out.print(" "); for (int i=0; i<7; i++) System.out.print("+"); for (int i=0; i<13; i++) System.out.print(" "); System.out.println("|"); } 4 EinegrössereFlagge -------------------------------------------------------------------| | | | | | | | | ++++++++++++++ | | ++++++++++++++ | | ++++++++++++++ | | ++++++++++++++ | | ++++++++++++++ | | ++++++++++++++ | | ++++++++++++++++++++++++++++++++++++++++++ | | ++++++++++++++++++++++++++++++++++++++++++ | | ++++++++++++++++++++++++++++++++++++++++++ | | ++++++++++++++++++++++++++++++++++++++++++ | | ++++++++++++++++++++++++++++++++++++++++++ | | ++++++++++++++++++++++++++++++++++++++++++ | | ++++++++++++++ | | ++++++++++++++ | | ++++++++++++++ | | ++++++++++++++ | | ++++++++++++++ | | ++++++++++++++ | | | | | | | | | -------------------------------------------------------------------- 5 public static void flag_by_2() { line_large(); for (int i=0; i<2*2; i++) for (int i=0; i<3*2; i++) for (int i=0; i<3*2; i++) for (int i=0; i<3*2; i++) for (int i=0; i<2*2; i++) line_large(); } EinegrössereFlagge redarea_large(); cross_large(); core_large(); cross_large(); redarea_large(); public static void line_large() { for (int i=0; i< 35*2-2; i++) System.out.print("-"); System.out.println(); } public static void redarea_large() { System.out.print("|"); for (int i=0; i<33*2; i++) System.out.print(" "); System.out.println("|"); } public static void cross_large() { System.out.print("|"); for (int i=0; i<13*2; i++) System.out.print(" "); for (int i=0; i<7*2; i++) System.out.print("+"); for (int i=0; i<13*2; i++) System.out.print(" "); System.out.println("|"); } 6 NochgrössereFlaggen ! Diese"Lösung"lässtnureineVerdoppelungzu… ! WaswennwirauchandereGrössenwollen ! OK,keinechtesThemafürprintln-basierteProgrammeaberesgeht unsjaumdasPrinzip ! WirbraucheneinenWeg,dieAusgabeAnweisungender gewünschtenGrösseanzupassen ! Parametrisierung:mit(veränderbaren)Parameternversehen 7 Parametrisierung ! Parameter:EinWertdeneineaufgerufeneMethodevonder aufrufendenMethodeerhält. ! AufrufendeMethode:"caller" ! Sta_flag_simple,flag_by_2,entwickleflag sodassFlaggen verschiedenerGrössengezeichnetwerdenkönnen. ! WennwireineMethodedeklarierendanngebenwirandassdiese MethodeeinenParameterbraucht,derdieGrössebes`mmt. ! WennwirdieMethodaufrufendanngebenwirden Vergrösserungsfaktoran. Parametrisierung main 1 2 flag flag ----------------------------------| | | | | +++++++ | | +++++++ | | +++++++ | | +++++++++++++++++++++ | | +++++++++++++++++++++ | | +++++++++++++++++++++ | | +++++++ | | +++++++ | | +++++++ | | | | | -----------------------------------------------------------------------------------------------------| | | | | | | | | ++++++++++++++ | | ++++++++++++++ | | ++++++++++++++ | | ++++++++++++++ | | ++++++++++++++ | | ++++++++++++++ | | ++++++++++++++++++++++++++++++++++++++++++ | | ++++++++++++++++++++++++++++++++++++++++++ | | ++++++++++++++++++++++++++++++++++++++++++ | | ++++++++++++++++++++++++++++++++++++++++++ | | ++++++++++++++++++++++++++++++++++++++++++ | | ++++++++++++++++++++++++++++++++++++++++++ | | ++++++++++++++ | | ++++++++++++++ | | ++++++++++++++ | | ++++++++++++++ | | ++++++++++++++ | | ++++++++++++++ | | | | | | | | | -------------------------------------------------------------------- Parameterdeklara`onen GibtandasseineMethodeeinenParameterbrauchtum ausgeführtwerdenzukönnen public static void name(type name) { statement(s); name:ParameterVariable } ! Beispiel: public static void echoPin(int code) { System.out.println(”Die Geheimnummer ist: " + code); } Parameterdeklara`onen GibtandasseineMethodeeinenParameterbrauchtum ausgeführtwerdenzukönnen public static void name(type name) { statement(s); ! WennechoPin aufgerufen } wirddannmussderAufrufer einenint Wertangeben. ! Beispiel: public static void echoPin(int code) { System.out.println(”Die Geheimnummer ist: " + code); } Wert(e)fürParameter BeimAufrufeinerMethodemüssenWertefürdieParameterangegeben werden. name(expression); ! Beispiel: public static void main(String[] args) { echoPin(42); echoPin(12345); } ! Output Die Geheimnummer ist: Die Geheimnummer ist: 42 12345 ParameterundSchleifen ! EinParameterkanndieAnzahlderItera`onen(Ausführungen desRumpfes)einerSchleifekontrollieren public static void main(String[] args) { printPunkt(3); } public static void printPunkt(int times) { for (int i = 1; i <= times; i++) { System.out.println(“."); } } Output:… WiewerdenParameterübergeben? ! Uebergeben:vomAufruferzuraugerufenenMethode ! WenneineMethodeaufgerufenwirddann: ! DerWertwirdinderParameterVariablegespeichert ! DieAnweisungenderMethodewerdenausgeführt(mitdiesemWert fürdieParameterVariable). ! DerWertdenderAufruferübergibtkanndurcheineVariable gegebensein ! DerWertkanndurcheinenAusdruckberechnetwerden WiewerdenParameterübergeben? public static void main(String[] args) { printPunkt(3); printPunkt(7); 3 7 } public static void printPunkt(int times) { for (int i = 1; i <= times; i++) { System.out.println(“."); } } MöglicheFehler ! WenneineMethodeeinenParametererwartetdannmuss dieserauchübergebenwerden. printPunkte(); required // ERROR: parameter value ! DerWertmussdenrich`genTyphben printPunkte(3.7); // ERROR: must be of type int DieRegelnfürUmwandlungengeltenauchhier MehrereParameter ! EineMethodekannmehrereParametererwarten(durch, getrenntinDeklara`onundimAufruf) ! WenndieMethodeaufgerufenwirdmusseinWertfürjeden Parameterangegebenwerden ! Deklara`on: public static void name(type name, ...,type name) { statement(s); } ! Aufruf:name(value, value, ..., value); BeispielmitmehrerenParametern public static void main (String[] args) { Scanner console = new Scanner(System.in); System.out.print("Input lower bound: "); int low = console.nextInt(); System.out.print("Input upper bound: "); int up = console.nextInt(); printOdd(low, up); printOdd(-up, -low); } public static void printOdd(int from, int to) { for (int i=from; i<=to; i++) { if (i%2==1) { System.out.println(i); } } } WiewerdenParameterübergeben? ! WenneineMethodeaufgerufenwird: ! DerübergebeneWertwirdinderParameterVariablegespeichert ! DieAnweisungenderMethodewerdenausgeführt(mitdiesemWertfürdie ParameterVariable). ! DerWert,denderAufruferübergibt,kanndurcheineVariable gegebensein ! DerWertderVariablewirdverwendet ! DieaufgerufeneMethodeerhältdenWertundhatkeineKenntniswie derWertberechnetwurde ! InsbesonderekenntdieaufgerufeneMethodenichtdieVariablendes Aufrufers UebergabevonWerten(“Valueseman`cs”) ! WenneinParameterdurcheineVariableVeinesBasistyps (int,double,boolean)bes`mmtwirddannwirdder WertdieserVariablekopiert(“valueseman;cs”): ! VeränderungenderParameterVariableinderaufgerufenenMethode habenkeineAuswirkungaufV. UebergabevonWerten(“Valueseman`cs”) public static void strange(int x) { x = x + 1; System.out.println("1. x = " + x); } public static void main(String[] args) { int x = 23; strange(x); System.out.println("2. x = " + x); ... } Output: 1. x = 24 2. x = 23 ErgebnisRückgabe ! ParametererlaubenKommunika`onvomAufruferzur aufgerufenenMethode ! BisherwarendieMethodensehreinfachunddrucktenText ! Methodenkönnenabermehr– ! EinRückgabewert(“returnvalue”)erlaubtderaufgerufenen MethodedemAufrufereinenWertzuübermi_eln 27 RückgabeeinesWertes ! EinRückgabewertmussdeklariertwerden public static type name(parameters) { statements; ... return expression; } ! EsgeltendieselbenRegelnfürtypewiebeiderDeklara`on vonVariablenundParametern RückgabeAnweisung ! Dasreturn Statement(RückgabeAnweisung)wertet einenAusdruckaus. ! DerWertwirddannandenAufrufer“zurückgegeben” ! DerAusdruckmusseinenWertdesTypstype(der MethodenDeklara`on)ergeben. ! DieAusführungderreturn Anweisungbeendetdie aufgerufeneMethode. Rückgabeanweisung(“return”) ! return:LiefereeinenWertabalsdasErgebnisdieserMethode ! “sende”dasErgebniszumAufrufer ! DasGegenstückzuParametern: ! ParametersschickenWerteindieaufgerufeneMethode,vom Aufrufer ! RückgabewerteschickenWerteausderMethodezumAufrufer ! EinMethodenaufrufkannTeileinesAusdruckssein. Rückgabeanweisung(“return”) abs(-42) -42 42 main 2.71 3 round(2.71) RückgabeeinesWertes Beispiel: // Returns the slope public static double double dy = y2 double dx = x2 return dy / dx; } of the line between the given points. slope(int x1, int y1, int x2, int y2) { y1; x1; slope(1, 3, 5, 11)liefert2.0 returnohneeinenWert WenneineMethodekeinenWertzurückliefertdannbrauchtein returnStatementkeinenWertzuschicken. . public static void printPoint(int x, int y) { System.out.println(“x = “ + x + “ y = “ + y) ; return; } IndemFallkannmandasreturnStatementauchweglassen (meineEmpfehlung) WeitereBeispiele Einreturn Statementkannaucheinen(arithme`schenoder booleschen)Ausdruckverwenden public static double fToC(double degreesF) { return 5.0 / 9.0 * (degreesF - 32); } MöglicheFehler:Resultatnichtgespeichert ! EinreturnStatementschickteinenWertandenAufrufer ! Namen,dieinderaufgerufenenMethodeverwendetwerden, sindbelanglos(fürdenAufrufer) Wasisthiernichtrich`g? public static void main(String[] args) { slope(0, 0, 6, 3); System.out.println("The slope is " + result); // ERROR: } // result not defined public static double slope(int x1, int x2, int y1, int y2) { double dy = y2 - y1; double dx = x2 - x1; double result = dy / dx; return result; } DenFehlervermeiden ! return schicktdenWertderVariablezurückzumAufrufer. ! DerzurückgegebeneWertmussgespeichertwerden–oderineinem Ausdruckverwendetwerden. ! DerCompilergeneriertkeineWarnungoderFehlermeldung wenndiesvergessenwird. DenFehlervermeiden public static void main(String[] args) { double s = slope(0, 0, 6, 3); System.out.println("The slope is " + s); } public static double slope(int x1, int x2, int y1, int y2) { double dy = y2 - y1; double dx = x2 - x1; double result = dy / dx; return result; } return Anweisungen ! EineMethodekannmehrerereturn Anweisungen enthalten. ! SinnvollfürFallunterscheidungen ! EineMethodedieeinenRückgabewertdeklariertmusseine (odermehrere)return Anweisung(en)enthalten 40 if/elsemitreturn // Returns the larger of the two given integers. public static int max(int a, int b) { if (a > b) { return a; } else { return b; } } ! Methodenkönneneinreturn Statementindurchif/else kontrolliertenBlöckenenthalten ! Dasreturn amEndeeinesPfadesliefertdenRückgabewertfürdiese Methode. if/elsemitreturn ! DieAusführungeinesreturnStatementsbeendetdie aufgerufeneMethode. ! EinemreturnsolltenkeineweiterenAnweisungenfolgen ! AllePfadedurcheineMethodemüsseneinreturn Statemententhalten ! WenndieMethodeeinenRückgabewertdeklarierthat 44 if/else,returnBeispiel ! SchreibenSieeineMethodequadrantdiefüreinPaarvon reellenZahlendenQuadrantenliefertindemdieserPunkt y+ liegt. quadrant 1 quadrant 2 x- x+ quadrant 4 quadrant 3 y- ! Bespiel:quadrant(-4.2, 17.3)liefert2 ! FälltderPunktaufeinederAchsendesKoordinatensystemsliefere0. if/else,returnBeispiellösung public static int quadrant(double x, double y) { if (x > 0 && y > 0) { return 1; } else if (x < 0 && y > 0) { return 2; } else if (x < 0 && y < 0) { return 3; } else if (x > 0 && y < 0) { return 4; } else { // at least one coordinate equals 0 return 0; } } if/else,returnweitereBeispiele ! SchreibenSieeineMethodecountFactorsdiedieAnzahl derFaktoren(Teiler)einerZahlliefert. ! countFactors(24)liefert8da 1,2,3,4,6,8,12,und24alleTeilervon24sind. if/else,returnweitereBeispiele ! Lösung: // Returns how many factors the given number has. public static int countFactors(int number) { int count = 0; for (int i = 1; i <= number; i++) { if (number % i == 0) { count++; // i is a factor of number } } return count; } SichtbarkeitvonVariablennamen ! "Scope" ! 1.Approxima`on ! WeitereAspekteinspäterenVorlesungen 49 Scope(Sichtbarkeitsbereich) scope:DerTeileinesProgrammindemeineVariablesichtbarist. ! Variablemüssendeklariertseinbevorsiesichtbarsind ! Deklara`onenmüsseneindeu`gsein ! SichtbarvonDeklara`onbiszumEndedesBlocks(derdurch{} angegebenwird) ! EineVariabledieineinerforSchleifedeklariertwurdekannnur imRumpfderSchleifeverwendetwerden. ! EineVariabledieineinerMethodedeklariertwurdeexis`ertnurin derMethode. Scope(Sichtbarkeitsbereich) i's scope public static void example() { int x = 3; for (int i = 1; i <= 10; i++) { System.out.println(x+i); } // i no longer exists here x's scope System.out.println(x); } // x ceases to exist here FolgenderSichtbarkeitsregeln ! VariableohneüberlappendenSichtbarkeitsbereichkönnenden selbenNamenhaben. for (int i = 1; i <= 100; i++) { System.out.print("/"); } for (int i = 1; i <= 100; i++) { // OK System.out.print("\\"); } int i = 5; // OK: outside of loop's scope FolgenderSichtbarkeitsregeln ! EineVariablekannineinemSichtbarkeitsbereichnichtmehrmals deklariertwerden. for (int i = 1; i <= 100 * line; i++) { int i = 2; // ERROR: overlapping scope System.out.print("/"); } i = 4; // ERROR: outside scope ! EineVariablekannnichtausserhalbihresSichtbarkeitsbereichesverwendetwerden SichtbarkeitsregelnfürParameterVariable ! DieselbenRegelngeltenfürParameterVariable y's scope Scope(Sichtbarkeitsbereich) public static void function(int k) { int x = 3; int y = k+x; System.out.println(y); } // k ceases to exist here k's scope Scope(Sichtbarkeitsbereich) public static void function(int k) { int x = 3; int y = anotherfct(k+x); System.out.println(y); } // k ceases to exist here k's scope public static void anotherFct(int x) { int y= 5; System.out.println(x+5); } AufrufeinerMethode… ! WenneineMethodeaufgerufenwirdsowirdautoma`sch PlatzfürihreVariablengeschaffen ! LokaleVariable:DeklariertinderMethode ! ParameterVariable:DeklariertinderMethodendeklara`on ! WenneinBlockausgeführtwird(indemVariabledeklariert sind)dannwirdzuBeginnderAusführungdesBlocksPlatzfür dieVariable/ngeschaffen. StringLiterals ! string:EineFolgevonBuchstaben ! NureineZeile,ggf.mitErsatzdarstellungen ! KönnenaucheinenNamenbekommen. String name = "text"; String name = expression; ! Examples: String name = ”Robin Williams"; int x = 3; int y = 5; String point = "(" + x + ", " + y + ")"; Stringparameter public class StringParameters { public static void main(String[] args) { sayHello(”Mark"); String friend = ”Peter"; sayHello(friend); } public static void sayHello(String name) { System.out.println("Welcome, " + name); } } Stringparameter public class StringParameters { public static void main(String[] args) { sayHello(”Mark"); String friend = ”Peter"; sayHello(friend); } public static void sayHello(String name) { Output: System.out.println("Welcome, " + name); } } Welcome, Mark Welcome, Peter Strings ! StringserlaubenZugriffaufdieBuchstabendiedenText ausmachen. ! WeilStringswich`gsindwerdensievomCompilerbesonders behandelt ! Wirha_enschonbeiint unddouble gesehendassprak`sche UeberlegungendieProgrammiererzwingen,sichumDetailszu kümmern ! AuchStringserfahreneineSonderbehandlung ElementeeinesStrings ! AufdieeinzelnenBuchstabeneinesStringswirdmiteinen Indexzugegriffen(Basis0): String name = ”B. Dylan"; index 0 1 character B . 2 3 4 5 6 7 D y l a n ! IndexdeserstenBuchstaben:0 ! IndexdesletztenBuchstabens:1wenigeralsdieLängedesStrings ! DieeinzelnenBuchstabensindWertedes(Basis)char(spätermehr) ! StringssindkeineArrays(Felder). Strings ! ZugriffaufElementeeinesStringserfolgtmit(vordefinierten) Methoden ! AufrufdieserMethodeninPunktnota`on(DotNota`on)(“dot nota`on”) String s = “hello”; s.method(parameterValues); ! FühreMethodemethod fürs aus,“wendemethod aufs an”, rufemethod fürs auf 63 StringMethoden Method name Description indexOf(str) index where the start of the given string appears in this string (-1 if not found) length() number of characters in this string substring(index1, index2) the characters in this string from index1 or (inclusive) to index2 (exclusive); substring(index1) if index2 is omitted, grabs till end of string toLowerCase() a new string with all lowercase letters toUpperCase() a new string with all uppercase letters ! Beispiel String writer = ”S. Beckett"; System.out.println(writer.length()); // 10 StringweitereBeispiele // index 0123456789012 String s1 = "Alice Munro"; String s2 = "Doris Lessing"; System.out.println(s1.length()); // 11 System.out.println(s1.indexOf("e")); // 4 System.out.println(s2.substring(6, 9)); // ”Les" String s3 = s2.substring(1, 7); System.out.println(s3.toLowerCase()); // ”oris l” ! MitdiesemString // index 012345678901234567890123456789012 String class = ”Einfuehrung in die Programmierung"; WiewürdenSiedasWort”die” extrahieren? StringLiterale ! MethodenwiesubstringundtoLowerCase konstruierenundlieferneinenneuenStringzurück,sie modifizierennichtdenStringfürdensieaufgerufenwurden. String s = ”Hello World"; s.toUpperCase(); System.out.println(s); // Hello World ! UmdenWertzuverändernmussdieserwiedereinerVariablen zugewiesenwerden: String s = "Hello World"; s = s.toUpperCase(); System.out.println(s); // HELLO WORLD ScannerMethoden Method Description nextInt() reads an int from the user and returns it nextDouble() reads a double from the user next() reads a one-word String from the user nextLine() reads a one-line String from the user ! JedeMethodewartetbisderBenutzerdieEingabemitder "ENTER"(oder"RETURN")Tasteabschliesst. ! DereingegebeneWertkannweiterverarbeitetwerden. System.out.print("Wie alt sind Sie? "); // prompt int alter = console.nextInt(); System.out.println("Ihre Eingabe " + alter); ! "prompt"(Aufforderung):TextderangibtwelcheEingabeerwartetwird. Strings as user input ! Scanner'snextMethodeliesteinWortalsString. Scanner console = new Scanner(System.in); System.out.print("What is your name? "); String name = console.next(); name = name.toUpperCase(); System.out.println(name + " has " + name.length() + " letters and starts with " + name.substring(0, 1)); Output: What is your name? Chamillionaire CHAMILLIONAIRE has 14 letters and starts with C Strings as user input ! DieMethodenextLineliesteineZeilealsString. System.out.print("What is your address? "); String address = console.nextLine();