Lektion 7 - Programmeringsteknik MN1, ht 2003
Daniel Deogun
danield@it.uu.se
9 november 2003
Inneh˚ all
1 L¨osningar till Del I, tenta 2003-01-09 3
1.1 Uppgift1 - (a) . . . 3
1.2 Uppgift1 - (b) . . . 4
1.3 Uppgift1 - (c) . . . 4
1.4 Uppgift2 - (a) . . . 5
1.5 Uppgift2 - (b) . . . 6
1.6 Uppgift3 - (a) . . . 7
1.7 Uppgift3 - (b) . . . 7
1.8 Uppgift3 - (c) . . . 7
1.9 Uppgift4 - (a) . . . 8
1.10 Uppgift4 - (b) . . . 9
1.11 Uppgift4 - (c) . . . 9
1.12 Uppgift5 - (a) . . . 10
1.13 Uppgift5 - (b) . . . 10
1.14 Uppgift5 - (c) . . . 10
2
1 L¨ osningar till Del I, tenta 2003-01-09
1.1 Uppgift1 - (a)
public class Tid {
private int sekunder = 0;
private int minuter = 0;
private int timmar = 0;
public Tid(int tim, int min, int sek) { sekunder = sek;
minuter = min;
timmar = tim;
} //end constructor public Tid(int sek) {
sekunder = sek;
if(sekunder/60 >= 1) { minuter += sekunder/60;
sekunder -= (sekunder/60)*60;
}
if(minuter/60 >= 1) { timmar += minuter/60;
minuter -= (minuter/60)*60;
}
if(timmar > 23)
timmar -= (timmar/24)*24;
} //end constructor public int sekunder() {
return timmar*3600 + minuter*60 + sekunder;
} //end sekunder } //end class
1.2 Uppgift1 - (b)
import extra.Std;
public class Driver {
public static void main(String[] args) { int timmar, minuter, sekunder;
Std.out.print("Skriv in antalet timmar: ");
timmar = Std.in.readInt();
Std.out.print("Skriv in antalet minuter: ");
minuter = Std.in.readInt();
Std.out.print("Skriv in antalet sekunder: ");
sekunder = Std.in.readInt();
Tid t = new Tid(timmar, minuter, sekunder);
} //end main } //end class
1.3 Uppgift1 - (c)
En konstruktor anv¨ands till att skapa objekt. Konstruktorn tilldelar vanligen instansvariablerna i objektet startv¨arden. Det kan finnas flera konstruktorer i en klass eftersom man kanske vill bygga upp objektet p˚a lite olika s¨att. Dvs vissa instansvariabler kanske skall ha standardv¨arden medan andra best¨ammas av skaparen. Om det inte finns n˚agon konstruktor i en klass tillhandah˚aller Java en sk standardkonstruktor, dvs en konstruktor som bara anv¨ands f¨or att skapa objekt av klassen.
4
1.4 Uppgift2 - (a)
public static void main(String[] args) {
¨AggLager lager = new ¨AggLager();
for(int i=0; i<100; i++) lager.l¨asIn();
lager.skrivUt();
} //end main
public void l¨asIn() { double weight;
Std.out.print("Skriv in vikten i ounces: ");
weight = Std.in.readDouble();
if(weight > 2.5) Jumbo++;
else if(weight > 2.25) XL++;
else if(weight > 2) L++;
else if(weight > 1.75) M++;
else if(weight > 1.5) S++;
if(weight > max) max = weight;
else if(weight < min) min = weight;
} //end l¨asIn
public void skrivUt() {
Std.out.println(Jumbo + " Jumbo eggs");
Std.out.println(XL + " Extra Large eggs");
Std.out.println(L + " Large eggs");
Std.out.println(M + " Medium eggs");
Std.out.println(S + " Small eggs");
Std.out.println(" Lightest egg: " + min + " ounces");
Std.out.println(" Heaviest egg: " + max + " ounces");
} //end skrivUt
1.5 Uppgift2 - (b)
En while-stats ¨ar en loop som itererar tills ett villkor inte uppfylls medan en if-sats bara exekverar kroppen en g˚ang om villkoret uppfylls.
Exempel:
while(true) {
... <- Denna kropp kommer att exekveras o¨andligt antal g˚anger }
if(true) {
... <- Denna kropp kommer att exekveras 1 g˚ang }
6
1.6 Uppgift3 - (a)
public void skrivUt() {
String state = "Trafikljuset har f¨oljande status: ";
if(r¨od)
state += "r¨od ";
if(gul)
state += "gul ";
if(gr¨on)
state += "gr¨on";
Std.out.println(state);
} //end skrivUt
1.7 Uppgift3 - (b)
public boolean kollaFunktion() {
return !((r¨od && gr¨on) || (gr¨on && gul));
} //end kollaFunktion
1.8 Uppgift3 - (c)
Trafikljuset har f¨oljande status: r¨od
1.9 Uppgift4 - (a)
import extra.Std;
public class Film { private String titel;
private String huvudRollsInnehavare;
private String regiss¨or;
private int pris;
public Film() {
this("Foo","John Doe","Jane Doe",0);
} //end constructor
public Film(String titel, String huvudRollsInnehavare, String regiss¨or, int pris) {
this.titel = titel;
this.huvudRollsInnehavare = huvudRollsInnehavare;
this.regiss¨or = regiss¨or;
this.pris = pris;
} //end constructor
public String getTitel() { return titel;
} //end getTitel
public String getHuvudRollsInnehavare() { return huvudRollsInnehavare;
} //end getHuvudRollsInnehavare public String getRegiss¨or() {
return regiss¨or;
} //end getRegiss¨or public int getPris() {
return pris;
} //end getPris
public void getFilmData() {
Std.out.println("Skriv in Titel Huvudrollsinnehavare Regiss¨or Pris");
titel = Std.in.readWord();
huvudRollsInnehavare = Std.in.readWord();
regiss¨or = Std.in.readWord();
pris = Std.in.readInt();
} //end getFilmData
public String toString() {
return "Filmtitel: " + titel +
" Huvudrollsinnehavare: " + huvudRollsInnehavare +
" Regiss¨or: " + regiss¨or +
8
" Pris: " + pris;
} //end toString } //end class
1.10 Uppgift4 - (b)
import extra.Std;
public class FilmLager { private Film[] lager;
private int antalFilmer;
public FilmLager(int size) { lager = new Film[size];
antalFilmer = 0;
} //end constructor
public void addFilm(Film film) { if(antalFilmer < lager.length) {
lager[antalFilmer] = new Film(film.getTitel(),
film.getHuvudRollsInnehavare(), film.getRegiss¨or(), film.getPris());
antalFilmer++;
}
} //end addFilm public void print() {
for(int i=0; i<=antalFilmer; i++) Std.out.println(lager[i]);
} //end print } //end class
1.11 Uppgift4 - (c)
Om man bara l¨agger in referensen s˚a kan man “p˚averka” filmen i lagret utifr˚an.
Dvs, trots att filmen ligger i lagret kan den tex tas bort. Om man ist¨allet kopierar referensen s˚a ligger filmen “s¨akert” i lagret.
1.12 Uppgift5 - (a)
I grund och botten finns en JFrame eller Applet. P˚a denna har man lagt en JPanel som har layouten Gridlayout(2,2), dvs ett “rutn¨at” med 2 rader och 2 kolumner. I ruta (1,1) har en JLabel-komponent placerats med texten “C”. I ruta (1,2) har en JLabel-komponent placerats med texten “F”. I ruta (2,1) har en JTextField-komponent placerats. I ruta (2,2) har en JTextField-komponent placerats.
1.13 Uppgift5 - (b)
Vi m˚aste addera en ActionListener f¨or att f˚a reda p˚a h¨andelser som intr¨affat i textf¨altet.
1.14 Uppgift5 - (c)
import javax.swing.JTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import java.awt.GridLayout;
import java.awt.Container;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class Convert extends JFrame{
private Container sole;
public static void main(String[] args) { new Convert().show();
} //end main public Convert() {
sole = getContentPane();
sole.setLayout(new GridLayout(2,2));
setSize(300,100);
setTitle("C-F konverterare");
addLabels();
addListeners();
} //end constructor
private void addLabels() {
JLabel c = new JLabel("C", SwingConstants.CENTER);
JLabel f = new JLabel("F", SwingConstants.CENTER);
sole.add(c);
sole.add(f);
} //end addLabels
10
private void addListeners() {
final JTextField c = new JTextField();
final JTextField f = new JTextField();
c.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
double degrees = Double.parseDouble(c.getText());
f.setText(""+(degrees * 1.8 + 32));
} //end actionPerformed });
f.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
double degrees = Double.parseDouble(f.getText());
c.setText(""+(degrees - 32) * 5/9.0);
} //end actionPerformed });
sole.add(c);
sole.add(f);
} //end addListeners } //end class