• No results found

EDAA20 / TFRG65 Programmering och databaser. Föreläsning 3, , Niklas

N/A
N/A
Protected

Academic year: 2022

Share "EDAA20 / TFRG65 Programmering och databaser. Föreläsning 3, , Niklas"

Copied!
28
0
0

Loading.... (view fulltext now)

Full text

(1)

EDAA20 / TFRG65

Programmering och databaser

Föreläsning 3, 2020-09-07, Niklas Fors, @Zoom

(2)

Programmering

Databaser

F föreläsningar, L datorlaborationer (obligatoriska), R resurstid

FD föreläsningar databaser, LD datorlaborationer databaser

(obligatoriska), S seminarieövning (obligatorisk)

Anmäl er till databaslabben!

(se Moodle för länk)

Finns ej i schemat då det inte har hunnit bli uppdaterat än.

Men passet finns och Zoom-länk finns i Moodle.

(3)

public class Sum {

public static void main(String[] args) { int sum5 = 0;

for (int i = 1; i <= 5; i++) { sum5 = sum5 + i;

}

System.out.println("1 + 2 + ... + 5 = " + sum5);

int sum20 = 0;

for (int i = 1; i <= 20; i++) { sum20 = sum20 + i;

}

System.out.println("1 + 2 + ... + 20 = " + sum20);

} }

Programmet skriver ut:

1 + 2 + ... + 5 = 15 1 + 2 + ... + 20 = 210

(4)

public class Sum {

public static void main(String[] args) { int sum5 = 0;

for (int i = 1; i <= 5; i++) { sum5 = sum5 + i;

}

System.out.println("1 + 2 + ... + 5 = " + sum5);

int sum20 = 0;

for (int i = 1; i <= 20; i++) { sum20 = sum20 + i;

}

System.out.println("1 + 2 + ... + 20 = " + sum20);

} }

Programmet skriver ut:

1 + 2 + ... + 5 = 15 1 + 2 + ... + 20 = 210

Typ samma kod, fast olika slutvillkor.

Hur kan vi slippa duplicerad kod?

(5)

public class Sum {

public static void main(String[] args) { int sum5 = sumTo(5);

int sum20 = sumTo(20);

System.out.println("1 + 2 + ... + 5 = " + sum5);

System.out.println("1 + 2 + ... + 20 = " + sum20);

}

public static int sumTo(int n) { int sum = 0;

for (int i = 1; i <= n; i++) { sum = sum + i;

}

return sum;

} }

Vi bryter ut koden till en metod sum med parametern n.

Nu kan vi anropa metoden sum med olika argument för att beräkna olika summor! Dvs, nu återanvänder vi koden för liknande beräkningar.

(6)

public class Sum {

public static void main(String[] args) { int sum5 = sumTo(5);

int sum20 = sumTo(20);

System.out.println("1 + 2 + ... + 5 = " + sum5);

System.out.println("1 + 2 + ... + 20 = " + sum20);

}

public static int sumTo(int n) { int sum = 0;

for (int i = 1; i <= n; i++) { sum = sum + i;

}

return sum;

} }

Vi bryter ut koden till en metod sum med parametern n.

Nu kan vi anropa metoden sum med olika argument för att beräkna olika summor! Dvs, nu återanvänder vi koden för liknande beräkningar.

Metodanrop av sumTo med argumentet 5

Metod sumTo med returtypen int och parametern n av typen int

Metoden returnerar värdet sum. Värdet måste vara kompatibelt med returtypen (dvs, en int/heltal)

Parametern n används

(7)

public static int sumTo(int n) { ...

}

Parametrar

• En metod kan ha noll eller flera parametrar, och varje parameter har ett namn och en typ

• Parametrarna är bara åtkomliga inuti metoden

• De skapas när metoden anropas och försvinner när metoden har exekverat färdigt

• Argumenten överförs till parametrarna när metoden anropas

• Argument 1 överförs till parameter 1, osv

• Typerna av argumenten ska matcha parametertyperna

(8)

public static int sumTo(int n) { ...

return ...;

}

Returtyp

• En metod har en returtyp, exempelvis int, double eller String

• Ange void som returtyp när inget värde ska returneras

• Metoden måste returnera (med return) ett värde som är kompatibelt med returtypen, annars får man kompileringsfel

• Är returtypen void behöver man inte ha en return-sats

(9)

Modifierare

• public – Metoden kan även anropas utanför klassen

• private – Metoden kan bara anropas inuti klassen

• static - Metoden hör till klassen och anropas inte på något objekt (senare kommer vi att skriva metoder utan static)

public static int sumTo(int n) { ...

}

(10)

public static void main(String[] args) {

...

int sum5 = sumTo(5);

...

}

Ett anrop av en metod innebär att exekveringen fortsätter med den första satsen i den anropade metoden.

När den anropade metoden är klar återupptas exekveringen i den metod där anropet gjordes.

public static int sumTo(int n) { int sum = 0;

...

return sum;

}

Exekvering av metodanrop

Argumentet 5 överförs till parametern n

Returvärdet överförs till anropssidan

Lokala variabler, som sum, skapas när metoden anropas och försvinner när metoden har exekverat färdigt.

(11)

public class CircleProgram {

public static void main(String[] args) { System.out.println("Ange radie: ");

Scanner scan = new Scanner(System.in);

double radius = scan.nextDouble();

System.out.println("Area: " + calcArea(radius));

System.out.println("Omkrets: " + calcCircumference(radius));

}

public static double calcArea(double radius) { return Math.PI * radius * radius;

}

public static double calcCircumference(double radius) { return 2 * Math.PI * radius;

} }

Ett annat program med metoder som läser in radien av en cirkel och beräknar cirkelns area och omkrets.

(12)

Metoden main

• Metoden main är en särskild metod som anropas av Java-systemet när programmet startas. main-metoden är alltså startpunkten för programmet.

• Java kräver att metoden är deklarerad på följande sätt:

(det går dock att byta namn på parametern args) public class CircleProgram {

public static void main(String[] args) { ...

} }

(13)

public class Asterisk {

public static void main(String[] args) { printAsterisks(5);

}

public static void printAsterisks(int n) {

} }

Övning

Skriv färdigt metoden printAsterisks som ska skriva

ut n antal asterisker (*)

(14)

public class Asterisk {

public static void main(String[] args) { printAsterisks(5);

}

public static void printAsterisks(int n) { for (int i = 1; i <= n; i++) {

System.out.println("*");

} } }

Övning

Skriv färdigt metoden printAsterisks som ska skriva

ut n antal asterisker (*)

(15)

public class Asterisk {

public static void main(String[] args) { printAsterisks(5);

}

public static void printAsterisks(int n) { for (int i = 1; i <= n; i++) {

System.out.println("*");

} } }

Övning 2

Hur ska man göra för att skriva ut en godtycklig sträng n gånger?

(16)

public class Asterisk {

public static void main(String[] args) { printString(5, "-");

}

public static void printString(int n, String s) { for (int i = 1; i <= n; i++) {

System.out.println(s);

} } }

Övning 2

Hur ska man göra för att skriva ut en godtycklig sträng n gånger?

(17)

Block

Block omges av klammerparenteser { } och är satser som hör ihop

public static void printAsterisks(int n) { ... // Satserna i en metod

}

for (int i = 1; i <= n; i++) {

... // Satserna som utförs i en for-sats }

Variabler deklarerade inuti ett block är inte synliga utanför blocket.

(18)

Kommentarer

Man kan kommentera sin Java-kod med /* */ eller //

/* En kommentar som kan sträcka sig över flera rader och kan beskriva vad metoden printAsterisks gör */

public static void printAsterisks(int n) { ... // Satserna i en metod

}

// En kommentar på en rad som beskriver for-satsen for (int i = 1; i <= n; i++) {

... // Satserna som utförs i en for-sats

}

(19)

Konstanter

I Klassen Math finns konstanten Math.PI:

public static final double PI = 3.14159265358979323846;

• Man kan deklarera egna konstanter för värden som inte ska ändras.

Exempel:

public static final int NBR_CARDS = 52;

• final betyder att värdet inte får ändras

(20)

public class EvenNumbers {

public static void main(String[] args) { System.out.println("Skriv ett heltal: ");

Scanner scan = new Scanner(System.in);

int n = scan.nextInt();

if (isEven(n)) {

System.out.println(n + " är ett jämnt tal.");

} else {

System.out.println(n + " är ett udda tal.");

} }

public static boolean isEven(int n) { ...

} }

Övning – Implementera metoden isEven

Ledtråd: använd operatorn %

(21)

public class EvenNumbers {

public static void main(String[] args) { System.out.println("Skriv ett heltal: ");

Scanner scan = new Scanner(System.in);

int n = scan.nextInt();

if (isEven(n)) {

System.out.println(n + " är ett jämnt tal.");

} else {

System.out.println(n + " är ett udda tal.");

} }

public static boolean isEven(int n) { if (n % 2 == 0) {

return true;

} else {

return false;

} } }

(22)

public class EvenNumbers {

public static void main(String[] args) { System.out.println("Skriv ett heltal: ");

Scanner scan = new Scanner(System.in);

int n = scan.nextInt();

if (isEven(n)) {

System.out.println(n + " är ett jämnt tal.");

} else {

System.out.println(n + " är ett udda tal.");

} }

public static boolean isEven(int n) { return n % 2 == 0;

}

}

Eftersom uttrycket resulterar i ett logiskt värde

(true eller false), så kan vi returnera värdet direkt

(23)

Logiska uttryck

• Logiska uttryck används bland annat som villkor i if- och while-satser:

if (x < 5) { ...

}

while (true) { ...

}

• Logiska uttryck resulterar i ett värde som är antingen true eller false.

• Variabler av typen boolean kan tilldelas logiska uttryck:

boolean ok = true;

ok = false;

ok = x < 5;

(24)

de Morgans lagar

Antag att A och B är två logiska uttryck. Då gäller:

!(A && B) ó !A || !B

!(A || B) ó !A && !B

Att x tillhör intervallet [5, 10] kan skrivas som:

x >= 5 && x <= 10

Att x inte tillhör intervallet [5, 10] är negation till ovanstående:

!(x >= 5 && x <= 10)

Som kan förenklas till:

x < 5 || x > 10

(enligt regeln ovan)

(25)

public class Minimum {

public static void main(String[] args) { System.out.println("Skriv två heltal: ");

Scanner scan = new Scanner(System.in);

int n1 = scan.nextInt();

int n2 = scan.nextInt();

int min;

if (n1 < n2) { min = n1;

} else { min = n2;

}

System.out.println("Minsta talet är " + min);

} }

Minsta talet av två tal

Hur ska vi hantera godtyckligt många tal?

(26)

Hitta minsta talet

Uppgift: leta upp det minsta talet bland en följd av tal

Lösningsidé: gå igenom tal för tal och håll reda på det minsta talet hittills Algoritm i psuedokod:

min = <stort tal>

för varje tal {

tal = <nästa tal>

om tal < min { min = tal

}

}

(27)

public class ComputeMin {

public static void main(String[] args) { Scanner scan = new Scanner(System.in);

int min = Integer.MAX_VALUE;

while (scan.hasNextInt()) { int nbr = scan.nextInt();

if (nbr < min) { min = nbr;

} }

System.out.println("Minsta talet är " + min);

} }

Minsta talet av en följd av tal

hasNextIntreturnerar trueom det finns ett heltal att läsa in.

Inmatningen kan stoppas om användaren skriver in något annat än ett heltal (exempelvis en bokstav).

(28)

Konstanter för minsta och största tal

int i1 = Integer.MIN_VALUE; // -2147483648 int i2 = Integer.MAX_VALUE; // 2147483647

double d1 = Double.MIN_VALUE; // 4.9E-324 (OBS! minsta möjliga // positiva flyttal) double d2 = Double.MAX_VALUE; // 1.8E308

double d3 = -Double.MAX_VALUE; // -1.8E308

Med E menas "gånger 10 upphöjt till"

References

Related documents

• Notera att vi inte har skapat Dice-objekten än, utan enbart en vektor med plats för 5 referensvariabler som inte pekar på något (null). dices null

one phase, called the access phase, containing memory accesses (or loads) from the original task and only necessary computations to support the memory accesses, with the purpose

Det var ju som de har sagt tidigare här, inte bara en nackdel utan också en fördel att man kunde utnyttja varandras resultat och varandras kunskap och det blev lite utav

More precisely, we identify a message language equipped with a convergent rewrite system such that after a completed protocol run, the first problem mentioned above

We study Vasicek’s closed form approximation for large portfolios with the mixed binomial model using the beta distribution and a two-factor model inspired by Merton as

In JUnit3.8 Framework, testing technique is deployed dynamically using Java Reflection API. The reflection works for JUnit3.8, when test objects are created and test methods

Most importantly, we consider Juliet testcases as good benchmarks to test the tools because we found that it fulfills the criteria (seven desiderata) listed and explained in 3.5

public class GTKParser extends java.lang.Object Field Summary private static int[] resultBorder private static java.lang.String themeDir (package private)