Programmering hh.se/db2004 Föreläsning 7: Funktioner Verónica Gaspes www2.hh.se/staff/vero www2.hh.se/staff/vero/programmering Funktioner Statiska metoder 1 Kan ta 0 eller flera argument. 2 Kan producera ett resultatvärde. 3 Kan ha sidoeffekt, till exempel skriva eller rita (mer generell än en funktion i matte.) Användning Både för att definiera matematiska funktioner (räkna ut en formel) och för att skriva modulära program. Center for Research on Embedded Systems IDE-sektionen 1 / 1 2 / 1 Egendefinierade funktioner i Java En Java-funktions anatomi 10 Input sum1to(n) = Σ n i=1 i Output 55 Summor private static long sum1to(int n){ for(int i = 1; i<=n; i++){ sum = sum + i; Headern (eller signaturen) private static long sum1to ( int n ) 1 resultattypen 2 metodnamn 3 argumenttypen 4 argumentvariabeln 3 / 1 4 / 1
En Java-funktions anatomi Styrflöde Kroppen 1 Lokala variabler 2 return-kommandot for(int i = 1; i<=n; i++){ sum = sum + i; Summor igen long x = 0; System.out.println("n 1+...+n"); System.out.println("-------------"); for(int k = 1; k<=n; k++){ x = sum1to(k) ; System.out.println(k+" "+x); Vad händer när man anropar funktionen? 5 / 1 6 / 1 Styrflöde När man anropar en funktion 1 Kontrollen förs över till funktionens kod. 2 Argumentvariabler tilldelas värdena som används i anropet. 3 Funktionens kod exekveras. 4 Returvärdet tilldelas istället för funktionen där man anropat den. 5 Kontrollen återgår till koden där anropet skedde. Detta kallas för pass by value. Räckvidd public class Sums { private static long sum1to(int n){ for(int i = 1; i<=n; i++){sum+=i; public static void main(string []cmdln){ long x = 0; for(int k = 1; k<=n; k++){ x = sum1to(k); System.out.println(k+" "+x); Räckvidd för ett namn: den delen av koden som kan använda namnet. Här kan man inte använda cmdln, N, x. Här kan man inte använda n, sum. 7 / 1 8 / 1
public class Cubes1{ int j = i*i*i; return j; public class Cubes2{ int i = i*i*i; 9 / 1 10 / 1 public class Cubes3{ i = i*i*i; public class Cubes4{ i = i*i*i; 11 / 1 12 / 1
public class Cubes5{ return i*i*i; Primtal private static long primenr (int n){... int n = Integer.parseInt(cmdLn[0]); System.out.println( primenr (n)); 13 / 1 14 / 1 private static boolean isprime (long n) {... private static long primenr(int n){ int count = 1; long i = 2; while(count<n){ i++; if( isprime (i)){count++;... 15 / 1 Slutligen private static boolean isprime(long n) { if (n < 2) return false; for (long i = 2; i*i <= n; i++) { if (n % i == 0) return false; return true; private static long primenr(int n){...... Observera användningen av return-kommandot: då avslutas exekvering av funktionens kod och kontrollen återgår till där funktionen anropades. 16 / 1
Fält som argument Fält som argument Hjälpfunktioner Om man vill skriva ut alla element i ett fält av heltal kan man tänka sig följande hjälpfunktioner: void printlnarray(int[] a) void printarray(int[] a) Observera returtypen void: Java kräver en returtyp hos en funktions signatur, men dessa funktioner producerar inget resultat, de bara har en sidoeffekt. Utskrift av fält private static void printlnarray(int[] a){ printarray(a); System.out.println(); private static void printarray(int[] a){ for(int i = 0; i < a.length; i++){ System.out.print(a[i]+" "); 17 / 1 18 / 1 Pascals triangel Fält som resultat Det är lätt att räkna nästa rad. Kuriosa 1 Summan av rad i är 2 i 2 Summan av 1 i finner man genom att följa andra diagonalen tills i och sedan titta ner och höger. 3 Om andra talet i en rad är primtal har alla tal i raden primtalet som faktor. 4 Rad i är koefficienterna för utvecklingen av (x + y) i Nästa rad i Pascals triangel private static long[] nextrow(long[] row){ long[] thenextrow = new long[row.length+1]; thenextrow[0] = 1; thenextrow[row.length] = 1; for(int i = 1; i < row.length; i++){ thenextrow[i] = row[i-1] + row[i]; return thenextrow; 19 / 1 20 / 1