252-0027 Einführung in die Programmierung I 3.0 Funk

Werbung
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();
Herunterladen