23
} Programmeringsteknik för D LÖSNINGSFÖRSLAG TILL ÖVNINGAR } EDA016 2015/2016

Programmeringsteknik för Dfileadmin.cs.lth.se/cs/Education/EDA016/2015/ovn-losn... · 2015-08-26 · i en utskrift normalt anger att en text läggs till i utskriften. Vid ... 6 2

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programmeringsteknik för Dfileadmin.cs.lth.se/cs/Education/EDA016/2015/ovn-losn... · 2015-08-26 · i en utskrift normalt anger att en text läggs till i utskriften. Vid ... 6 2

}Programmeringsteknik för D

LÖSNINGSFÖRSLAG TILL ÖVNINGAR}EDA016

2015/2016

Page 2: Programmeringsteknik för Dfileadmin.cs.lth.se/cs/Education/EDA016/2015/ovn-losn... · 2015-08-26 · i en utskrift normalt anger att en text läggs till i utskriften. Vid ... 6 2

LUNDS TEKNISKA HÖGSKOLA EDA016 ProgrammeringsteknikInstitutionen för datavetenskap 2015/2016

Övning 1

1. int sum = 3 + 8 + 12;System.out.println("Summan är: " + sum);

Alternativt kan man t.ex. lagra termerna i varsin variabel, för att sedan räkna ut resul-tatet. Vilket kan vara en fördel om man i framtiden vill bygga ut programmet för att t.ex.låta värdena bero av andra saker eller använda samma termer i en annan uträkning.

//Alternativ lösning:int a = 3;int b = 8;int c = 12;int sum2 = a + b + c;System.out.println("Summan är: " + sum2);

Det är även möjligt att ha uträkningen direkt i utskriften (om man inte behöver använ-da summan till något annat än just att skriva ut den en gång). Tänk på att ett plusteckeni en utskrift normalt anger att en text läggs till i utskriften. Vid uträkning i en utskriftskulle det krävas extra parenteser:

System.out.println("Summan är: " + (a+b+c));

2. Följande variabler finns efter de två första tilldelningssatserna:

2nbrA5nbrB

och efter tredje, fjärde respektive femte tilldelningssatsen:

2nbrA5nbrB20nbrC

4nbrA5nbrB20nbrC

4nbrA5nbrB0nbrC

3. a) Parentesen runt c + d i tilldelningssatsen int e = ... är onödig. Om den uteläm-nas görs ändå c + d först, eftersom den additionen står först.

b) 6 2 6 8 9

c) 7 2 10 4 9

4. Man måste använda en variabel (här kallar vi den temp) för att ”mellanlagra” det enavärdet. Satser:

int temp = a;a = b;b = temp;

2

Page 3: Programmeringsteknik för Dfileadmin.cs.lth.se/cs/Education/EDA016/2015/ovn-losn... · 2015-08-26 · i en utskrift normalt anger att en text läggs till i utskriften. Vid ... 6 2

LUNDS TEKNISKA HÖGSKOLA EDA016 ProgrammeringsteknikInstitutionen för datavetenskap 2015/2016

Övning 2

Följ punkterna och gör som det står; döp filerna till samma namn som klassen .java och läggi katalog med samma namn som paketet. Nedan finns koden som är given, i mer klipp-och-klistra-vänlig form utan radnummer:

package greeting;

public class Hello {public static void main(String[] args) {

String name = javax.swing.JOptionPane.showInputDialog("What name?");javax.swing.JOptionPane.showMessageDialog(null, "Hello " + name);

}}

package greeting;

import se.lth.cs.pt.window.SimpleWindow;

public class WindowApp {public static void main(String[] args) {

SimpleWindow w = new SimpleWindow(200, 200, "App");w.setLineColor(java.awt.Color.PINK);w.moveTo(100,100);w.writeText("Hello Pink Panter!");while (true) {

w.waitForMouseClick();w.lineTo(w.getMouseX(), w.getMouseY());w.writeText("Hello Pink Panter!");

}}

}

package greeting;

import se.lth.cs.pt.window.SimpleWindow;import java.awt.Color;

/*** A collection of greeting methods.*/public class Greet {

/*** Asks for a name and then greets politely.*/public static void swingGreeting(){

String name = javax.swing.JOptionPane.showInputDialog("What name?");javax.swing.JOptionPane.showMessageDialog(null, "Hello " + name);

}

/*** Greeting of pink creature. Allows user to spam click but not too far down.* Each click is awarded one point.** @param color the color of the greeting* @return the number of points earned*/public static int panterGreeting(Color color){

SimpleWindow w = new SimpleWindow(200, 200, "App");w.setLineColor(color);w.moveTo(100,100);w.writeText("Hello Pink Panter!");int points = 0;while (w.getMouseY() < 180) {

w.waitForMouseClick();points = points + 1; //earn a point for each clickw.lineTo(w.getMouseX(), w.getMouseY());w.writeText("Your hello-points: " + points);

}return points;

}}

3

Page 4: Programmeringsteknik för Dfileadmin.cs.lth.se/cs/Education/EDA016/2015/ovn-losn... · 2015-08-26 · i en utskrift normalt anger att en text läggs till i utskriften. Vid ... 6 2

4

package greeting;

/** A polite Greetings App. */public class GreetApp {

/** Starts the App. */public static void main(String[] args) {

Greet.swingGreeting();int pts = Greet.panterGreeting(java.awt.Color.PINK);System.out.println("You earned " + pts + " points!");

}}

Page 5: Programmeringsteknik för Dfileadmin.cs.lth.se/cs/Education/EDA016/2015/ovn-losn... · 2015-08-26 · i en utskrift normalt anger att en text läggs till i utskriften. Vid ... 6 2

LUNDS TEKNISKA HÖGSKOLA EDA016 ProgrammeringsteknikInstitutionen för datavetenskap 2015/2016

Övning 3

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

System.out.println("Skriv starttid och sluttid (timmar och minuter):");Scanner scan = new Scanner(System.in);int startHour = scan.nextInt();int startMin = scan.nextInt();int stopHour = scan.nextInt();int stopMin = scan.nextInt();int minutes = 60 * (stopHour - startHour) + (stopMin - startMin);System.out.println("Tidsavstånd i minuter: " + minutes);

}}

2. För att skriva ut tidsavståndet i timmar och minuter subtraherar vi timmarna för sig,minuterna för sig. Vi måste ta hänsyn till att minutskillnaden kan bli negativ och i så fallkorrigera det. Nya satser (efter inläsningssatserna):

int diffHour = stopHour - startHour;int diffMin = stopMin - startMin;if (diffMin < 0) {

diffMin = diffMin + 60;diffHour = diffHour - 1;

}System.out.println("Tidsavstånd: " + diffHour +

" timmar, " + diffMin + " minuter");

Den andra varianten, med heltalsdivision:

int minutes = 60 * (stopHour - startHour) + (stopMin - startMin);int diffHour = minutes / 60;int diffMin = minutes % 60;System.out.println("Tidsavstånd: " + diffHour +

" timmar, " + diffMin + " minuter");

3. Följande ritas:

5

Page 6: Programmeringsteknik för Dfileadmin.cs.lth.se/cs/Education/EDA016/2015/ovn-losn... · 2015-08-26 · i en utskrift normalt anger att en text läggs till i utskriften. Vid ... 6 2

6

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

SimpleWindow w = new SimpleWindow(600, 600, "ErrorTest"); // parameterSquare sq = new Square(100, 200, 50); // deklarationwhile (sq.getX() < 300) { // parentes

sq.draw(w);sq.move(10, 10);

}}

}

5. a) Efter satsen sq2 = sq1 refererar båda referensvariablerna till samma objekt:

203040

xy

sidesq1sq2

b) Satsen sq1 = null sätter referensvariabeln till null – objektet som variabeln refererartill påverkas inte:

203040

xy

sidenullsq1

sq2

6. Variablerna sq1 och sq2 innehåller samma värde efter andra tilldelninssatsen:

4754047540

xyside

sq1

3040

20

52005204...

...

...475404754447548

...

sq2

Page 7: Programmeringsteknik för Dfileadmin.cs.lth.se/cs/Education/EDA016/2015/ovn-losn... · 2015-08-26 · i en utskrift normalt anger att en text läggs till i utskriften. Vid ... 6 2

LUNDS TEKNISKA HÖGSKOLA EDA016 ProgrammeringsteknikInstitutionen för datavetenskap 2015/2016

Övning 4

1. a) public class Max {public static void main(String[] args) {

int max = Integer.MIN_VALUE;System.out.println("Skriv talen:");Scanner scan = new Scanner(System.in);while (scan.hasNextInt()) {

int nbr = scan.nextInt();if (nbr > max) {

max = nbr;}

}System.out.println("Största talet = " + max);

}}

b) Byt namn på variabeln max till (det nu lämpligare) namnet min och tilldela den ettstort startvärde:

int min = Integer.MAX_VALUE;

Vänd på jämförelsen i if-satsen:

if (nbr < min) ...min = nbr;...

2. a) y = Math.sin(20 * Math.PI / 180);

b) z = a * Math.exp(x) + b * Math.exp(-Math.cos(x));

c) hyp = Math.hypot(a, b); // eller: hyp = Math.sqrt(a * a + b * b);

3. (int) Math.round(x)

4. a) if (n % 2 == 0) ...

b) if (n % 10 == 0) ...

c) digit1 = number / 100;digit2 = (number % 100) / 10; // eller: digit2 = (number / 10) % 10;digit3 = number % 10;

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

double sum = 0;Scanner scan = new Scanner(System.in);for (int i = 0; i < 30; i++) {

double temperature = scan.nextDouble();sum = sum + temperature;

}double averageTemperature = sum / 30;System.out.println("Medeltemperatur: " + averageTemperature + " grader");

7

Page 8: Programmeringsteknik för Dfileadmin.cs.lth.se/cs/Education/EDA016/2015/ovn-losn... · 2015-08-26 · i en utskrift normalt anger att en text läggs till i utskriften. Vid ... 6 2

8

}}

6. Scanner scan = new Scanner(System.in);double limit = scan.nextDouble();double smallSum = 0;double largeSum = 0;for (int i = 0; i < 100; i++) {

double nbr = scan.nextDouble();if (nbr < limit) {

smallSum = smallSum + nbr;} else if (nbr > limit) {

largeSum = largeSum + nbr;}

}System.out.println("Summan av tal < " + limit + " = " + smallSum);System.out.println("Summan av tal > " + limit + " = " + largeSum);

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

int daySalary = 1;int totalSalary = 0;int days = 0;while (totalSalary < 1000000) {

totalSalary = totalSalary + daySalary;days = days + 1;daySalary = 2 * daySalary;

}System.out.println("Man måste arbeta " + days + " dagar.");

}}

8. a) a > 5

b) a > 2

c) a <= 2

d) a <= 2 || a >= 9

e) a >= 0 && a <= 10

f) ready

g) !ready

Page 9: Programmeringsteknik för Dfileadmin.cs.lth.se/cs/Education/EDA016/2015/ovn-losn... · 2015-08-26 · i en utskrift normalt anger att en text läggs till i utskriften. Vid ... 6 2

LUNDS TEKNISKA HÖGSKOLA EDA016 ProgrammeringsteknikInstitutionen för datavetenskap 2015/2016

Övning 5

1. public class Car {private String nbr; // registreringnummerprivate Person owner; // ägare

/** Skapar en bil med registreringsnummer licenseNbrsom ägs av personen owner. */

public Car(String licenseNbr, Person owner) {nbr = licenseNbr;this.owner = owner;

}

/** Tar reda på bilens registreringsnummer. */public String getLicenseNbr() {

return nbr;}

/** Tar reda på bilens ägare. */public Person getOwner() {

return owner;}

/** Sätter bilens ägare till newOwner. */public void changeOwner(Person newOwner) {

owner = newOwner;}

}

2. Minnessituation:

"ABC123"nbrowner

pc1c2

"XYZ789"owner

"Bo Ek"name

"Eva Alm"name

3. public class RailwayCoach {private int seats; // antalet platser i vagnenprivate int free; // antalet lediga platser

/** Skapar en vagn med nbrSeats platser. */public RailwayCoach(int nbrSeats) {

seats = nbrSeats;free = nbrSeats;

}

9

Page 10: Programmeringsteknik för Dfileadmin.cs.lth.se/cs/Education/EDA016/2015/ovn-losn... · 2015-08-26 · i en utskrift normalt anger att en text läggs till i utskriften. Vid ... 6 2

10

/** Tar reda på antalet platser i vagnen. */public int getNbrSeats() {

return seats;}

/** Tar reda på antalet lediga platser. */public int getNbrFreeSeats() {

return free;}

/** Bokar n platser i vagnen. Det får förutsättas att n är <= antaletlediga platser. */

public void makeReservation(int n) {free = free - n;

}}

4. public class Person {private int age;

/** Skapar en person med åldern age. */public Person(int age) {

this.age = age;}

/** Undersöker om denna person är äldre än personen p. Returnerardå true, annars false. */

public boolean isOlderThan(Person p) {return age > p.age;

}}

Observera att det går bra att nå den andra personens (p) attribut age direkt med punktno-tation. Det beror på att p har typen Person och den kod vi skriver finns i klassen Person.Ett attribut deklarerat private är privat för klassen (och inte för ett specifikt objekt).

5. Här visas två möjliga lösningar. De skiljer sig i hur man säkerställer att de två slumptalenär olika. I den första lösningen används en while-sats för att dra nya slumptal tills de tvåär olika:

public class TwoRandomNumbers {public static void main(String[] args) {

Random rand = new Random();int nbr1 = rand.nextInt(100) + 1;int nbr2 = rand.nextInt(100) + 1;while (nbr2 == nbr1) {

nbr2 = rand.nextInt(100) + 1;}System.out.print("Två slumptal: ");if (nbr1 < nbr2) {

System.out.println(nbr1 + ", " + nbr2);} else {

System.out.println(nbr2 + ", " + nbr1);}

}}

Page 11: Programmeringsteknik för Dfileadmin.cs.lth.se/cs/Education/EDA016/2015/ovn-losn... · 2015-08-26 · i en utskrift normalt anger att en text läggs till i utskriften. Vid ... 6 2

11

While-satsen ovan kan potentiellt behöva köras flera gånger (även om det är rätt osan-nolikt). Man kan därför utgå från att det andra slumptalet bara ska ha 99 utfall:

public class TwoRandomNumbers {public static void main(String[] args) {

Random rand = new Random();int nbr1 = rand.nextInt(100) + 1;int nbr2 = rand.nextInt(99) + 1;if (nbr2 >= nbr1) {

nbr2++;}System.out.print("Två slumptal: ");if (nbr1 < nbr2) {

System.out.println(nbr1 + ", " + nbr2);} else {

System.out.println(nbr2 + ", " + nbr1);}

}}

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

System.out.println("Skriv startvärdet i talföljden (a0)");Scanner scan = new Scanner(System.in);int a = scan.nextInt();System.out.println(a);int length = 1;while (a != 1) {

if (a % 2 == 0) {a = a / 2;

} else {a = 3 * a + 1;

}System.out.println(a);length = length + 1;

}System.out.println("Antal tal = " + length);

}}

Page 12: Programmeringsteknik för Dfileadmin.cs.lth.se/cs/Education/EDA016/2015/ovn-losn... · 2015-08-26 · i en utskrift normalt anger att en text läggs till i utskriften. Vid ... 6 2

LUNDS TEKNISKA HÖGSKOLA EDA016 ProgrammeringsteknikInstitutionen för datavetenskap 2015/2016

Övning 6

1. a) /** Hittar minsta talet i vektorn v. */public static int min(int[] v) {

int minNbr = Integer.MAX_VALUE;for (int i = 0; i < v.length; i++) {

if (v[i] < minNbr) {minNbr = v[i];

}}return minNbr;

}

b) /** Undersöker om talen är sorterade i växande ordning. */public static boolean isSorted(int[] v) {for (int i = 0; i < v.length - 1; i++) {

if (v[i] > v[i + 1]) {return false;

}}return true;

}

c) /** Undersöker om vektorerna v1 och v2 är lika, dvs. om de är likalånga och alla v1[i] == v2[i]. */

public static boolean equal(int[] v1, int[] v2) {if (v1.length != v2.length) {

return false;}for (int i = 0; i < v1.length; i++) {

if ( v1[i] != v2[i]) {return false;

}}return true;

}

2. a) 33

b) 100

c) 1

3. I remove flyttas det sista elementet i apartments-vektorn till ”hålet” där det borttagnaelementet fanns. Det går bra att göra så, eftersom ordningen mellan elementen inte harnågon betydelse. I countApartments görs två genomgångar av vektorn: först en för atthitta det maximala antalet rum, sedan en för att registrera antalet rum.

12

Page 13: Programmeringsteknik för Dfileadmin.cs.lth.se/cs/Education/EDA016/2015/ovn-losn... · 2015-08-26 · i en utskrift normalt anger att en text läggs till i utskriften. Vid ... 6 2

13

public class Register {private Apartment[] apartments;private int n;

public Register(int maxSize) {apartments = new Apartment[maxSize];n = 0;

}

public void add(Apartment a) {apartments[n] = a;n++;

}

public void remove(int id) {int i = 0;while (i < n && apartments[i].getId() != id) {

i++;}if (i < n) {

apartments[i] = apartments[n - 1];n--;

}}

public int[] countApartments() {int max = 0;for (int i = 0; i < n; i++) {

if (apartments[i].getNbrOfRooms() > max) {max = apartments[i].getNbrOfRooms();

}}

int[] count = new int[max];for (int i = 0; i < n; i++) {

int rooms = apartments[i].getNbrOfRooms();if (rooms > 0) {

count[rooms - 1]++;}

}return count;

}}

Page 14: Programmeringsteknik för Dfileadmin.cs.lth.se/cs/Education/EDA016/2015/ovn-losn... · 2015-08-26 · i en utskrift normalt anger att en text läggs till i utskriften. Vid ... 6 2

LUNDS TEKNISKA HÖGSKOLA EDA016 ProgrammeringsteknikInstitutionen för datavetenskap 2015/2016

Övning 7

1. public class Experiment {private Die die1;private Die die2;

/** Skapar ett experiment där tärningarna d1 och d2 kastas */public Experiment(Die d1, Die d2) {

die1 = d1;die2 = d2;

}

/** Kastar tärningarna n gånger, räknar antalet gånger summan blev2, 3, 4, ..., 11, 12. Returnerar antalen i en vektor */

public int[] makeExperiment(int n) {int[] result = new int[11];for (int i = 0; i < n; i++) {

int index = die1.roll() + die2.roll() - 2;result[index]++;

}return result;

}}

2. /** Returnerar en vektor med antal olika siffror av varje sort sombehövs för nummer mellan start och stop där intervallet mellannumren är interval. */

public int[] nbrDigits(int start, int stop, int interval) {int[] digits = new int[10];for (int i = start; i <= stop; i = i + interval) {

int nbr = i;while (nbr != 0){

digits[nbr % 10]++;nbr = nbr / 10;

}}return digits;

}

14

Page 15: Programmeringsteknik för Dfileadmin.cs.lth.se/cs/Education/EDA016/2015/ovn-losn... · 2015-08-26 · i en utskrift normalt anger att en text läggs till i utskriften. Vid ... 6 2

15

3. /** Skriver ut namnet på de städer som besöks, i tur och ordning, när manpåbörjar en resa i staden med namnet startTown (det förutsätts att detfinns en stad med det namnet). */

public void printTour(String startTown) {for (int i = 0; i < towns.length; i++) {

towns[i].setVisited(false);}int startPos = 0;while (!towns[startPos].getName().equals[startTown)) {

startPos++;}Town current = towns[startPos];System.out.println(current.getName());current.setVisited(true);for (int i = 1; i < towns.length; i++) {

current = getNearest(current);System.out.println(current.getName());current.setVisited(true);

}}

/* Tar reda på den obesökta stad som ligger närmast staden t. */private Town getNearest(Town t) {

double minDist = Double.MAX_VALUE;Town nearest = null;for (int i = 0; i < towns.length; i++) {

if (towns[i] != t && !towns[i].isVisited() &&towns[i].getDistanceTo(t) < minDist) {minDist = towns[i].getDistanceTo(t);nearest = towns[i];

}}return nearest;

}

Page 16: Programmeringsteknik för Dfileadmin.cs.lth.se/cs/Education/EDA016/2015/ovn-losn... · 2015-08-26 · i en utskrift normalt anger att en text läggs till i utskriften. Vid ... 6 2

LUNDS TEKNISKA HÖGSKOLA EDA016 ProgrammeringsteknikInstitutionen för datavetenskap 2015/2016

Övning 8

1. /** Tar reda på elementet med index i, k. */public double get(int i, int k) {

return a[i][k];}

/** Adderar matrisen m till denna matris (matriserna förutsätts vara lika stora). */public void add(Matrix m) {

for (int i = 0; i < a.length; i++) {for (int k = 0; k < a[i].length; k++) {

a[i][k] += m.a[i][k];}

}}

/** Beräknar spåret av matrisen, dvs summan av diagonalelementen från övrevänstra hörnet till nedre högra hörnet. */

public double trace() {double sum = 0;for (int i = 0; i < a.length; i++) {

sum += a[i][i];}return sum;

}

2. /** Undersöker om strängarna s1 och s2 är lika långa och allatecknen i s1 är lika med motsvarande tecken i s2. */

public static boolean equals(String s1, String s2) {if (s1.length() != s2.length()) {

return false;}for (int i = 0; i < s1.length(); i++) {

if (s1.charAt(i) != s2.charAt(i)) {return false;

}}return true;

}

3. /** Bildar en sträng som innehåller tecknen i s i omvänd ordning. */public String reverse(String s) {

StringBuilder sb = new StringBuilder();for (int i = s.length() - 1; i >= 0; i--) {

sb.append(s.charAt(i));}return sb.toString();

}

16

Page 17: Programmeringsteknik för Dfileadmin.cs.lth.se/cs/Education/EDA016/2015/ovn-losn... · 2015-08-26 · i en utskrift normalt anger att en text läggs till i utskriften. Vid ... 6 2

17

4. /** Krypterar strängen plainText med krypteringsnyckeln key. */public static String encrypt(String plainText, long key) {

Random rand = new Random(key);StringBuilder sb = new StringBuilder();for (int i = 0; i < plainText.length(); i++) {

char plainChar = plainText.charAt(i);int codeNbr = plainChar + rand.nextInt(256);if (codeNbr >= 256) {

codeNbr = codeNbr - 256;}char codeChar = (char) codeNbr;sb.append(codeChar);

}return sb.toString();

}

Beräkningen av det krypterade tecknet har för tydlighets skull delats upp i flera steg. Mankan också göra så här:

char codeChar = (char) ((plainText.charAt(i) + rand.nextInt(256)) % 256);

Page 18: Programmeringsteknik för Dfileadmin.cs.lth.se/cs/Education/EDA016/2015/ovn-losn... · 2015-08-26 · i en utskrift normalt anger att en text läggs till i utskriften. Vid ... 6 2

LUNDS TEKNISKA HÖGSKOLA EDA016 ProgrammeringsteknikInstitutionen för datavetenskap 2015/2016

Övning 9

1. a) int sum = 0;for (int i = 0; i < cards.size(); i++) {

sum += cards.get(i).getRank();}

b) int pos = 0;while (pos < cards.size() && !(cards.get(pos).getSuit() == Card.SPADES &&

cards.get(pos).getRank() == 12)) {pos++;

}if (pos >= cards.size()) {

pos = -1;}

Alternativ lösning:

int pos = -1;for (int i = 0; i < cards.size(); i++} {

if (cards.get(i).getSuit() == Card.SPADES && cards.get(i).getRank() == 12) {pos = i;break;

}}

c) Card aCard = new Card(s, r);int pos = 0;while (pos < cards.size() && cards.get(pos).getRank() < aCard.getRank()) {

pos++;}cards.add(pos, aCard);

2. public class PhoneDirectory {private ArrayList<Person> persons; // personerna i katalogen

/** Skapar en tom telefonkatalog. */public PhoneDirectory() {

persons = new ArrayList<Person>();}

/* Tar reda på personen med namnet name. Returnerar null om ingensådan person finns. */

private Person findPerson(String name) {for (int i = 0; i < persons.size(); i++) {

if (persons.get(i).getName().equals(name)) {return persons.get(i);

18

Page 19: Programmeringsteknik för Dfileadmin.cs.lth.se/cs/Education/EDA016/2015/ovn-losn... · 2015-08-26 · i en utskrift normalt anger att en text läggs till i utskriften. Vid ... 6 2

19

}}return null;

}

/** Lägger in en person med namnet name och telefonnumret nbr (om personeninte redan finns i katalogen). Om personen lagts in ska true returneras,annars false. */

public boolean insert(String name, String nbr) {if (findPerson(name) == null) {

persons.add(new Person(name, nbr));return true;

} else {return false;

}}

/** Tar bort personen med namnet name ur registret. */public void delete(String name) {

for (int i = 0; i < persons.size(); i++) {if (persons.get(i).getName().equals(name)) {

persons.remove(i);}

}}

/** Tar reda på telefonnumret till personen med namnet name. Ompersonen inte finns i katalogen returneras null. */

public String findNbr(String name) {Person p = findPerson(name);if (p != null) {

return p.getPhoneNbr();} else {

return null;}

}

/** Returnerar en lista med namnen på de personer vars namnbörjar med strängen s. */

ArrayList<String> startsWith(String s) {ArrayList<String> list = new ArrayList<String>();for (int i = 0; i < persons.size(); i++) {

if (persons.get(i).getName().startsWith(s)) {list.add(persons.get(i).getName());

}}return list;

}

/** Returnerar en sträng som representerar telefonkatalogen.Strängen innehåller personens namn och telefonnummer medradslutstecken mellan de olika personernas uppgifter.Om telefonkatalogen är tom ska en tom sträng returneras. */

public String toString() {if (persons.size() == 0) {

return "";}StringBuilder sb = new StringBuilder();sb.append(persons.get(0).getName());sb.append(’ ’);sb.append(persons.get(0).getPhoneNbr());for (int i = 1; i < persons.size(); i++) {

Page 20: Programmeringsteknik för Dfileadmin.cs.lth.se/cs/Education/EDA016/2015/ovn-losn... · 2015-08-26 · i en utskrift normalt anger att en text läggs till i utskriften. Vid ... 6 2

20

sb.append(’\n’);sb.append(persons.get(i).getName());sb.append(’ ’);sb.append(persons.get(i).getPhoneNbr());

}return sb.toString();

}}

Page 21: Programmeringsteknik för Dfileadmin.cs.lth.se/cs/Education/EDA016/2015/ovn-losn... · 2015-08-26 · i en utskrift normalt anger att en text läggs till i utskriften. Vid ... 6 2

LUNDS TEKNISKA HÖGSKOLA EDA016 ProgrammeringsteknikInstitutionen för datavetenskap 2015/2016

Övning 10

1. a) Man anger arv med extends och anropar superklassens konstruktor med super:

public class Person {private String name;

public Person(String name) {this.name = name;

}}

public class Student extends Person {private String program;

public Student(String name, String program) {super(name);this.program = program;

}}

b) Observera Student- och Teacher-objekten: attributet name har ärvts från Person, mendet syns inte på objekten.

DBo EkNils Nilsson CS

Eva Alm

c) 1) p = s är korrekt — p får referera till Student-objekt eftersom Student är en sub-klass till Person, och s refererar garanterat till ett Student-objekt; 2) s = p är felaktigt— p kan ju referera till andra slags objekt än Student-objekt; 3) s = t är felaktigt —s får inte referera till Teacher-objekt; 4) s = (Student) p är korrekt — referensenkonverteras explicit till Student (men det kan bli fel under exekvering).

d) s = (Student) p ger ClassCastException om p under exekvering inte refererar tillett Student-objekt (eller till ett objekt av en subklass till Student).

e) super.toString() betyder att toString-metoden i superklassen anropas. Utskrift:

Nils NilssonBo Ek, DBo Ek, D

Notera att samma sats, System.out.println(p.toString()), ger två olika resultat.Det beror på att Java använder dynamisk bindning för metodanrop: första gångenrefererar p till ett Person-objekt och Person.toString() anropas, andra gången re-fererar p till ett Student-objekt och Student.toString() anropas.

Anmärkning: toString anropas automatiskt när man ger ett objekt som parametertill print eller println. I stället för System.out.println(p.toString()) kan manalltså skriva System.out.println(p).

21

Page 22: Programmeringsteknik för Dfileadmin.cs.lth.se/cs/Education/EDA016/2015/ovn-losn... · 2015-08-26 · i en utskrift normalt anger att en text läggs till i utskriften. Vid ... 6 2

22

2. public static void partition(int[] v, Condition cond) {int first = 0;while (first < v.length && cond.evaluate(v[first])) {

first++;}for (int i = first + 1; i < v.length; i++) {

if (cond.evaluate(v[i])) {int temp = v[i];v[i] = v[first];v[first] = temp;first++;

}}

}

Anmärkning: metoden fungerar även utan den inledande while-satsen.

Page 23: Programmeringsteknik för Dfileadmin.cs.lth.se/cs/Education/EDA016/2015/ovn-losn... · 2015-08-26 · i en utskrift normalt anger att en text läggs till i utskriften. Vid ... 6 2

LUNDS TEKNISKA HÖGSKOLA EDA016 ProgrammeringsteknikInstitutionen för datavetenskap 2015/2016

Övning 11

1. Metoden behöver två parametrar: vektorn som ska sorteras och antalet tal. Metoden föralla sina indata via parametrarna och bör därför vara en statisk metod.

public static void sort(int[] sequence, int n) {for (int i = 1; i < n; i++) {

int nbr = sequence[i];int k = i - 1;while (k >= 0 && sequence[k] > nbr) {

sequence[k + 1] = sequence[k];k--;

}sequence[k + 1] = nbr;

}}

2. När referenser förs över som parametrar används värdeanrop, precis som för alla typer avparametrar. Men det är värdet av referensen som kopieras till metoden — det skapas intenågon kopia av objektet. I metoden use kommer alltså variabeln pa att referera till sammaobjekt som a, och när man utför pa.set(10) så ändras innehållet i objektet.

Utskrift (kommentarerna inom parentes skrivs inte ut):

value = 5 (före anropet av use)value = 5 (första print i use)value = 10 (andra print i use)value = 10 (efter anropet av use)

3. Satsen pa = new A(10) i use medför att den formella parametern pa sätts att refereratill ett nytt objekt. Variabeln a påverkas inte. När man lämnar use så försvinner allaparametrar och lokala variabler — det medför att objektet med value = 10 inte längrekan nås och att det kommer att tas bort av skräpsamlaren.

Utskrift:

value = 5value = 5value = 10value = 5

23