1 Uppgift 1 Klassen Company Banken FinanceTrust som tidigare bara haft privatpersoner som kunder vill nu bygga ut sitt datasystem så att även företag kan registreras som kunder. Skriv klassen Company som kan hantera företagskunder. Data om företaget skall vara företagsnamn, adress och den utlåningsränta banken ger företaget. Vidare skall det finnas ett finansindextal som visar företagets finansiella ställning. Finansindextalet representeras av ett decimaltal mellan 1.0 och 10.0 och bestäms av bankens ekonomer. Du skall skriva klassen Company med två konstruktorer: en standardkonstruktor utan parametrar, och en överlagrad konstruktor där instansvariablerna namn, adress och finansindextal får värden genom parametrar. Vidare skall klassen ha en tostring-metod som returnerar en sträng med värden på objektets instansvariabler. Slutligen skall det finnas en metod finanscheck som bestämmer instansvariabeln utlåningsränta: utlåningsräntan skall vara 0.029, dvs 2.9% om finansindextalet är större än 5, och annars skall utlåningsräntan vara 0.032, dvs 3.2%. Skriv slutligen en main-metod i klassen eller i en egen testklass som gör följande: a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna. b) Anropar metoden finanscheck som bestämmer utlåningsräntan. c) Skriver ut information om Company-objektet m h a tostring-metoden. OBS! Inga metoder utöver de som beskrivs i uppgiften ovan får läggas till // Klassen hanterar ett företag i en bank import java.util.scanner; public class Company { private String namn; private String adress; private double ränta; private double finansindextal; public Company() { namn = "NoName"; adress = "NoAdress"; 1
public Company(String newname, String newadress, double newfinansindex) { namn = newname; adress = newadress; finansindextal = newfinansindex; public void finanscheck() { if (finansindextal > 5.0) ränta = 0.029; else if (finansindextal <= 5.0) ränta = 0.032; public String tostring() { String s = namn + "\n" + adress + "\n" + "Räntesats: " + ränta + "\n" + "Finansindextal: " + finansindextal; return s; public static void main(string[] arg) { Company comp = new Company("HippHurra", "Broadway 1, Uppsala", 7); comp.finanscheck(); //Man behöver inte skriva comp.tostring() System.out.println(comp); 2 Uppgift 2 Nya arbetstillfällen Ett rekryteringsföretag gör statistik på hur många jobb de förmedlat per månad under ett år. Antalet jobb lagras i en array med heltal. Ett exempel på en sådan array med värden inlagda är: 23, 34, 31, 40, 37, 58, 12, 25, 39, 42, 45, 21 I exemplet har företaget lyckats hitta 23 jobb i januari, 34 jobb i februari osv. Din uppgift är att skriva klassen Jobbfix. Klassen finns påbörjad nedan. Arrayen som innehåller antalet skapade jobb under ett år är en instansvariabel. 2
a) Skriv en metod matain som för varje månad frågar efter hur många jobb som skapats och låter användaren mata in värden för årets tolv månader i arrayen. b) Skriv en metod summa som summerar samtliga jobb som skapats under året och returnerar summan. c) Skriv en metod maxvarde som söker rätt på det största värdet i arrayen och returnerar detta. Du behöver inte ta hänsyn till om flera element i arrayen innehåller lika stora tal. d) Skriv slutligen en main-metod i klassen eller i en egen testklass som skapar ett objekt av typen Jobbfix och sedan testar alla metoder så att användaren kan se att metoderna fungerar. OBS! Inga metoder utöver de som beskrivs i uppgiften ovan får läggas till. import java.util.scanner; public class Jobbfix { private int[] jobb; public Jobbfix() { jobb = new int[12]; //Skriv resten av klassen här import java.util.*; public class Jobbfix { private int[] jobb; public Jobbfix() { jobb = new int[12]; 3
public void matain() { for (int i=0; i<12; i++) { Scanner scan = new Scanner(System.in); System.out.print("Mata in data för månad " + (i+1)+ ": "); jobb[i] = scan.nextint(); public int summa() { //variabeln sum måste nollställas först! int sum = 0; for (int i=0; i<12; i++) sum = sum + jobb[i]; return sum; public int maxvärde() { int max = 0; //Ge variablen ett rimligt startvärde: //max kan aldrig vara mindre än 0. for (int i=0; i<12; i++) { if (max < jobb[i]) max = jobb[i]; return max; public static void main(string[] arg) { Jobbfix jf = new Jobbfix(); jf.matain(); System.out.print("Sammanlagt har vi förmedlat " + jf.summa()); System.out.println(" jobb under ett år."); System.out.print("Maximalt har " + jf.maxvärde()); System.out.println(" jobb förmedlats på en månad."); 4
3 Uppgift 3 1. Givet följande klass 1 public class Kopp { 2 3 private int talet; 4 5 public Kopp(int n) { 6 talet = n; 7 8 9 public int get(){ 10 return n; 11 12 13 public void set(int i) { 14 n = i; 15 16 17 public static void main(string[] args) { 18 Kopp[] kafferep = new Kopp[5]; 19 for (int i=1; i<=5; i++) { 20 kafferep[i].set(i); 21 22 23 (a) Vid kompileringsförsöket fås följande felmeddelanden Kopp.java:10: cannot find symbol symbol : variable n location: class Kopp return n; ^ Kopp.java:14: cannot find symbol symbol : variable n location: class Kopp n = i; ^ Förklara vad det beror på och hur man ska lösa problemet. (2p) Svar: Felet är att man försöker använda n som inte är ett attribut i klassen utan en formell parameter i konstruktorn. Den naturliga ändringen är att byta n mot talet i get och set-metoden alternativt att byta namn på attributet talet till n men då måste bytet göras överallt dvs även i konstruktorn. Vanligt förekommande felaktiga svar: 5
Metoderna måste heta getn och setn för att Java skall veta vad som skall returneras eller sättas. Nej, metodernas namn har inget med saken att göra. Ur Javas synpunkt skulle get-metoden kunna heta fasteranki (men det är naturligtvis olämpligt ur mänsklig synpunkt). Det är vad metoden gör (i detta fall alltså return talet) som betyder något. set-metoden måst stå före get-metoden. Nej, i vilken ordning metoderna i en klass skrivs spelar ingen roll (i Java i andra programmeringsspråk kan det ha betydelse) Man måste lägga till n som attribut i klassen. Ja, det kan man göra men då blir det en annan klass (med två attribut) och då bör man ändra i konstruktorn och dessutom ändå ha get och set-metoder för det första attributet (talet) (b) Efter att ha rättat felen går kompileringen bra men när man försöker köra programmet får man följande utskrift Exception in thread "main" java.lang.nullpointerexception at Kopp.main(Kopp.java:20) Förklara vad det beror på och hur man ska lösa problemet. (2p) Svar: Diagnosen betyder att man på rad 20 (kafferep[i].set(i)) försöker utnyttja (följa) en objektreferens som är tom. kafferep[i] innehåller således null. På rad 18 skapar man själva arrayen men man har inte skapat några element. En lösningen är alltså att mellan rad 19 och 20 lägga in raden kafferep(i) = new Kopp(); men då måste man också definiera en parameterlös konstruktor. Den bästa lösningen är att byta rad 20 mot kafferep[i] = new Kopp(i); Vanligt förekommande felaktiga svar: Man missar element 0. Ja, det gör man visserligen men det är inget fel. Det finns inget i Java som säger att man måste börja med att behandla första elementet i en array. Iterationen går för långt - sista elementet har index 0 men loopen går till 5 Ja, det är också sant men det är inte det felet som Java klagar på (det är däremot felet i uppgift c). Felet inträffar redan vid första iterationen dvs när i är 1. (c) När även detta är åtgärdat får man följande fel. Exception in thread "main" java.lang.arrayindexoutofboundsexception: 5 at Kopp.main(Kopp.java:20) Rätta felet! (2p) Svar: Felet är att variabeln i som används som index i arrayen får värdet 5. Arrayen innehåller 5 element och dessa numreras 0, 1, 2, 3, 4. Iteratonsvillkoret i<=5 6
måste således ändras till i<5. (Troligen vill man också ändra undre grånsen från 1 till 0 men det kan man ju inte veta med säkerhet.) 4 Uppgift 4 Diagonalen hos ett parallellogram Du är ansvarig för att skriva en klass som utför beräkningar på parallellogram. Den längsta diagonalen hos ett parallellogram beräknas med formeln ÓÒ Ð=Ô 2 + 2 + 2 cos«där och är sidorna på parallellogrammet och«är parallellogrammets spetsiga vinkel. Du har skapat ramen till klassen 1 och ska nu skriva en metod som beräknar längden på den längsta diagonalen. public class Parallellogram { private double a, b, alpha; public Parallellogram(double starta, double startb, double startalpha) { a = starta; b = startb; alpha = startalpha; // Metod för att beräkna den längsta diagonalen public double longdiagonal() { // Skriv klart metoden Dina uppgifter är: a) Skriv färdigt metoden longdiagonal i klassen. b) Skriv en mainmetod i klassen eller i en testklass. Du ska använda mainmetoden för att beräkna den längsta diagonalen hos parallellogrammet: = 1 5, =2,«=37 5Æ. Skriv sedan ut resultatet av beräkningen. 1 Den trubbiga vinkeln,, kan beräknas genom 180 för den. «, så vi behöver inte deklarera en instansvariabel 7
public class Parallellogram { // Aplha är den spetsiga vinkeln, private double a, b, alpha; // Defaultkonstruktor public Parallellogram() { a = 1; b = 1; alpha = 45; // Överlagrad konstruktor public Parallellogram(double starta, double startb, double startalpha) { a = starta; b = startb; alpha = startalpha; // Beräknar den längsta diagonalen på parallellogrammet. public double longdiagonal() { return Math.sqrt(Math.pow(a,2) + Math.pow(b,2) + 2*a*b*Math.cos(alpha*Math.PI/180)); public static void main(string[] args) { Parallellogram para = new Parallellogram(1.5, 2, 33.5); double dia = para.longdiagonal(); System.out.println(dia); 8