2D1310 Programmeringsteknik Magnus Rosells övningar
2D1310 Övningsanteckningar
Övning 4
Viktiga ord
klass, instansmetod, klassmetod, konstruktormetod, this,
instans/objekt,instansvariabel, klassvariabel, lokalvariabel,
static, public, private
Titta på programmet från slutet av förra övningen.
Uppgift: Skriv om rektangelprogrammet så att man kan skapa
instanser av klassen Rektangel och använd en sådan för att
åstadkomma samma sak.
import java.io.*;
class Rektangel{
static PrintStream utdata = System.out;
// instansvariabler
private int höjd;
private int längd;
// Konstruktor
public Rektangel(){}
// Konstruktor
public Rektangel(int höjd, int längd){
this.höjd = höjd;
this.längd = längd;
}
// instansmetod
public int area(){
return höjd*längd;
}
// instansmetod
public void rita(){
int h = höjd; // lokal variabel
while(h-- >0){
ritaRad(längd);
}
}
// instansmetod
public void ritaRad(){
int l = längd; // lokal variabel
while(l-- >0)
utdata.print("*");
utdata.println();
}
}
class Uppgift{
static PrintStream utdata = System.out;
public static void info(){
System.out.println("Välkommen till rektangelprogrammet!");
System.out.println("Programmet beräknar arean av en rektangel");
System.out.println("med heltalssidor och ritar ut den på skärmen!");
}
public static void main(String[] args) throws IOException{
info();
utdata.print("Rektangelns höjd: ");
String höjdString = System.in.readLine();
int höjd = Integer.parseInt(höjdString);
utdata.print("Rektangelns längd: ");
String längdString = System.in.readLine();
int längd = Integer.parseInt(längdString);
Rektangel r = new Rektangel(höjd, längd);
r.rita();
int area = r.area();
utdata.println("Rektangeln har arean: "+area+" a.e.");
}
}
static, public, private
static - klass-metod eller -variabel, annars instans-metod eller -variabel
public - metoden eller variabeln syns utifrån (från andra klasser)
private - metoden eller variabeln syns inte utifrån (från andra klaser)
Uppgift: Skriv en klass Bok som beskriver böcker. Varje
bok ska ha egenskaperna författare, titel och stulen. Stulen ska vara sann
om boken är stulen (från biblioteket som vi ska bygga upp) och falsk annars.
Då böckerna skapas är de naturligtvis inte stulna. Dessutom ska det finnas
en metod läs() som man använder om man vill läsa boken. Då en bok läses är
det 25% risk att den blir stulen.
Hakparentesvektor (array)
datatyp[] variabelnamn; // deklaration
ex: int[] vec;
variabelnamn = new datatyp[heltal]; // skapar vektor
// med längden heltal
// och tilldelning till variabeln
ex: vec = new int[5];
variabelnamn[heltal] = värde av datatyp; // tilldelning till
// en av vektorns platser
ex: vec[2] = 12;
variabelnamn[heltal]; // åtkomst av en av vektorns platser
ex: System.out.println(vec[1]);
En hakparentesvektor numreras från 0 till längden minus ett.
ex: System.out.println(vec.length); // skriver ut längden av vektorn vec
// vec.length innehåller vektorns längd
Uppgift: Vad gör programdelen?
int[] vec = new int[7];
for(int i = 0; i < vec.length; i++)
vec[i] = i;
for(int i = 0; i < vec.length; i++)
System.out.println(2 * vec[i]);
Rita minnesbild!
Uppgift: Skriv ett program som skapar fyra böcker,
enligt klassen Bok vi just skrivit. Lägg de fyra böckerna i en array.
Skriv ut titeln på alla böcker som inte är stulna.
public class Register{
public static void main(String[] args){
Bok[] böcker = new Bok[4];
böcker[0] = new Bok("Mumintrollen","Jansson");
böcker[1] = new Bok("Flugornas herre","Golding");
böcker[2] = new Bok("Javaboken","Franzen");
böcker[3] = new Bok("Das Kapital","Marx");
for(int i = 0; i < böcker.length; i++){
if(!böcker[i].geStulen())
System.out.println(böcker[i].geTitel());
}
}
}
Bibliotek
Titta på följande program när ni gör lab4. Principen är mycket lik,
nästan bara olika namn. Klassen Bok behövs naturligtvis också.
public class Huvudklass{
public static void main(String[] args){
Bibliotek biblan = new Bibliotek();
while(!biblan.allaStulna()){
biblan.läsAlla();
biblan.status();
}
}
}
class Bibliotek{
private static final int maxAntalBöcker = 1000;
private static int antalBöcker = 4;
private Bok[] böcker;
public Bibliotek(){
böcker = new Bok[maxAntalBöcker];
böcker[0] = new Bok("Mumintrollen","Jansson");
böcker[1] = new Bok("Flugornas herre","Golding");
böcker[2] = new Bok("Javaboken","Franzen");
böcker[3] = new Bok("Das Kapital","Marx");
}
public boolean allaStulna(){
int böckerKvar = 0;
for(int i = 0; i < antalBöcker; i++)
if(!böcker[i].geStulen())
böckerKvar++;
if(böckerKvar == 0)
return true;
else
return false;
}
public void läsAlla(){
for(int i = 0; i < antalBöcker; i++)
böcker[i].läs();
}
public void status(){
for(int i = 0; i < antalBöcker; i++){
System.out.print(böcker[i].geTitel()+"\t");
if(böcker[i].geStulen())
System.out.println("\t Snodd");
else
System.out.println("\t Ledig");
}
System.out.println();
}
}
Rita minnesbild över programmet!
Särfall - Exceptions
Då vissa metoder körs uppstår särfall (problem) som det inte är självklart
hur de bör behandlas inuti metoderna. Särfallet kastas (throws) i stället
vidare av metoden till den metod som anropade den. I denna metod har man
kanske mer information om hur man bör behandla problemet. I sådana fall
fångar man särfallet (catch) och gör något åt det. Annars kastar man vidare
det till nästa metod (den metod som anropar den metod som anropar den
metod i vilken särfallet uppstod) osv. Om den första metoden i anropskedjan
(i vårt fall för det mesta main()) kastar särfallet innebär det att man
struntar i problemet helt och hållet.
För att kasta ett särfall skriver man throws NamnetPåSärfallet
sist i metodhuvudet. readLine() kastar ett IOException; här följer ett
exempel på hur man kastar ett sådant.
class Exempel{
static BufferedReader stdin =
new BufferedReader(new InputStreamReader(System.in));
public static void metod() throwsIOException{
stdin.readLine(); // anrop till readLine()
}
public static void main() throws IOException{
metod(); // anrop till metoden metod()
}
}
Hur man fångar särfall tar vi senare.
Vector
Hakparentesvektorer (arrayer) skapas med en viss längd som inte kan ändras.
Klassen Vector beskriver en vektor som inte har den begränsningen.
I sådana vektorer kan bara stoppa in referensdatatyper (alltså inte
primitiva datatyper). Man kan dessutom lagra olika typer av objekt
i vektorn, tex en String följd av flera Bok-objekt (om man skrivit
en klass Bok).
// För att kunna använda Vector måste man importera den
import java.util.Vector;
// Skapa vektor (deklarera variabel och instansiera)
Vector vec = new Vector();
// Skriva ut vektorns längd
System.out.println(vec.size());
// Stopppa i nytt element (hamnar sist)
vec.add(element);
// Plocka ut elementet (som har datatypen Data) på plats x.
Data d = (Data) vec.elementAt(x);