Datanom Programkonstruktion med Java

Lektionsoversigt

Opdateret 9. november 1999

1. Introduktion til objektorienteret programmering - torsdag 2. september 1999

Vi startede med en generel introduktion til programkonstruktion. Én af vanskelighederne består i at man skal lære flere forskellige ting i en vis dybde før man kan programmere:

Når undervisningssproget er Java er der yderligere et par vanskeligheder der skal overkommes; men forfatteren af lærebogen har forsøgt at kompensere for disse ekstra vanskeligheder - bl.a. gennem den pakke (package), der refereres til flere gange. Vi har downloadet denne pakke og installeret den, så den skulle være tilgængelig på alle vore maskiner.

I dag startede vi forfra i bogen; men de kommende gange vil vi springe lidt frem og tilbage - til næste gang er det således kap. 7, der står på programmet.

Jeg uddelte en note om problemløsningsteknik, som jeg vil vende tilbage til i den kommende tid: Strategi for problemløsning i forbindelse med programmering. Jeg uddelte også en note der kan supplere emnet næste gang: Basale typer og kontrolstrukturer i Java.

 

2. Løkker (iterationer) i Java - torsdag 9. september 1999

Jeg brugte følgende stikord i undervisningen:

While (sålænge)

Faldgruber

Do .. while

For

3. Selektioner i Java - torsdag 16. september 1999

Jeg brugte følgende stikord i undervisningen:

IF statement

Boolske udtryk og variabler

Indlejrede (nestede) if sætninger

Switch

En supplerende tekst om sammenligninger og forgreninger i Java.

4. Numeriske data i Java - torsdag 23. september 1999

Jeg brugte følgende stikord i undervisningen:

Variabler

Aritmetiske udtryk

Konstanter

Math klassen

5. Om at definere instantierbare klasser - torsdag 30. september 1999

    1. for at undgå at programmet bliver for stort (kompleksitet)
    2. fordi man ikke kan løse alle problemer med prædefinerede klasser

Instantierbare klasser

Constructors

Visibility modifiers

Lokale variabler, returværdier, parametre

6. Applets - torsdag 7. oktober 1999

GUI objekter

Tilføj en Action Listener

Absolut positionering af GUI objekter

Klassen Button

Konvertering af tekst til en numerisk værdi

7. Tegn og strenge - torsdag 14. oktober 1999

Tegn

Strenge

Primitive typer kontra reference typer

StringBuffer

Objekter som parametre

Objekter som returværdier

Kommende obligatorisk opgave

I nær fremtid skal vi lave en obligatorisk opgave. Man får mulighed for selv at definere den opgave, man vil arbejde med; men man kan også lave en af de opgaver, jeg foreslår. For at man kan danne sig et indtryk af, hvordan opgaven kan formuleres, er her et eksempel på en opgave med en sværhedsgrad, som er passende for en obligatorisk opgave:

Motionsløb

I forbindelse med afholdelse af et motionsløb er du blevet bedt om at udarbejde et program (applet), som kan udskrive den øjeblikkelige topstilling i løbet.

Problemet er, at løberne ikke starter samtidig; men når de starter, tidsstemples et kort med løberens nummer og navn. Kortet stemples igen, når løberen passerer målstregen.

Du sidder med en computer ved målstregen og registrerer oplysningerne efterhånden som løberne kommer ind. Du indtaster løberens nummer, navn, starttid og sluttid.

Af dit skærmbillede skal hele tiden fremgå de hidtil bedst placerede løbere.

 

8. Arrays - torsdag 28. oktober 1999

Et array er en samling af data værdier, som er af samme type.

Array grundbegreber

Arrays bestående af objekter

Overførsel af arrays som parametre

Self pointeren

To-dimensionale arrays

9. Kommende obligatorisk opgave - torsdag 4. november 1999

Det er vigtigt, at man også lærer noget om programmering gennem løsning af den obligatoriske opgave. De næste to (måske tre) aftner vil vi derfor arbejde i fællesskab med opgaven. Til næste gang skal man overveje og medbringe skitser, der viser, hvordan man forestiller sig, at programmets skærmbillede kan udformes. Man skal også overveje hvilke klasser og datastrukturer (arrays), man får brug for.

Desuden skal man medbringe alle de løsningsforslag, ideer og problemer, man har. Det gælder uanset om man arbejder med motionsløbet eller en anden opgave, man selv har defineret.

Vi gennemgik nogle forslag til udformning af skærmbilledet. Derefter talte vi om udformningen af en klasse, der skulle rumme oplysninger om løberne. Herunder talte vi også om muligheden af at arve fra en Person klasse. Et forslag til specifikation af de to klasser følger herefter:

Person klassen:

// Data members

String navn;

int alder;

char koen;

// Metoder

// Constructors

Person (String navn, int alder, char koen)

Person ()

// Mutators

void setNavn(String navn)

void setAlder(int alder)

void setKoen(char koen)

// Accessors

String getNavn()

Default navn er blank

int getAlder()

Default alder er 0

char getKoen()

Default køn er blank, 'K' for kvinder, 'M' for mænd

Loeber klassen arver fra Person

// Data members

int nr;

int start;

int slut;

// Metoder

// Constructors

Loeber (int nr, String navn)

Loeber ()

// Mutators

void setNr(int nr)

void setStart(int start)

Tiden angivet i hele sekunder siden midnat

void setSlut(int slut)

Tiden angivet i hele sekunder siden midnat

void setStart(String start)

Tiden angivet i tekstformat ttmmss

void setSlut(String slut)

Tiden angivet i tekstformat ttmmss

// Accessors

int getNr()

public int getTid()

Tiden angivet i hele sekunder 

10. Kommende obligatorisk opgave - torsdag 11. november 1999

Til denne aften skal du programmere klasserne Person og Loeber (evt. kun Loeber) samt en simpel sorteringsrutine (bubblesort).

Vi brugte det meste af tiden på at diskutere de problemer, man havde oplevet mens man prøvede at løse opgaven.

Her følger koden til Person klassen:

 

class Person

 

{

 

 

private String navn;

 

 

private int alder;

 

 

private char koen;

 

 

public Person (String navn, int alder, char koen)

 

 

{

 

 

 

this.navn = navn;

 

 

 

this.alder = alder;

 

 

 

this.koen = koen;

 

 

}

 

 

 

 

 

 

 

public Person ()

 

 

 

{

 

 

 

 

this ("", 0, ' ');

 

 

}

 

 

 

 

 

 

 

public void setNavn(String navn)

 

 

{

 

 

 

 

this.navn = navn;

 

 

}

 

 

 

 

 

 

 

public void setAlder(int alder)

 

 

{

 

 

 

 

this.alder = alder;

 

 

}

 

 

 

 

 

 

 

public void setKoen(char koen)

 

 

{

 

 

 

 

this.koen = koen;

 

 

}

 

 

 

 

 

 

 

public String getNavn()

 

 

{

 

 

 

 

return navn;

 

 

}

 

 

 

 

 

 

 

public int getAlder()

 

 

{

 

 

 

 

return alder;

 

 

}

 

 

 

 

 

 

 

public char getKoen()

 

{

 

 

return koen;

 

}

}

 

Her følger koden til Loeber klassen, som arver fra Person klassen:

class Loeber extends Person

{

 

private int nr;

 

private int start;

 

private int slut;

 

 

 

public Loeber (int nr, String navn)

 

{

 

 

super(navn, 0, ' ');

 

 

this.nr = nr;

 

 

this.start = 0;

 

 

this.slut = 0;

 

}

 

 

 

 

 

public Loeber ()

 

{

 

 

this(0, "");

 

}

 

 

 

 

 

public void setNr(int nr)

 

{

 

 

this.nr = nr;

 

}

 

 

 

 

 

public void setStart(int start)

 

{ // input i sekunder

 

 

this.start = start;

 

}

 

 

 

 

 

public void setSlut(int slut)

 

{ // input i sekunder

 

 

this.slut = slut;

 

}

 

 

 

 

 

public void setStart(String start)

 

{ // ttmmss

 

 

Integer omregn;

 

 

omregn = new Integer(start);

 

 

int tid = omregn.intValue();

 

 

int sekunder;

 

 

sekunder = (tid / 10000) * 3600;

 

 

tid = tid % 10000;

 

 

sekunder += (tid / 100) * 60;

 

 

sekunder += tid % 100;

 

 

this.start = sekunder;

 

}

 

 

 

public void setSlut(String slut)

 

{ // ttmmss

 

 

Integer omregn;

 

 

omregn = new Integer(slut);

 

 

int tid = omregn.intValue();

 

 

int sekunder;

 

 

sekunder = (tid / 10000) * 3600;

 

 

tid = tid % 10000;

 

 

sekunder += (tid / 100) * 60;

 

 

sekunder += tid % 100;

 

 

this.slut = sekunder;

 

}

 

 

 

 

 

public int getNr()

 

{

 

 

return nr;

 

}

 

 

 

 

 

public int getTid()

 

{

 

 

return (slut - start);

 

}

 

 

 

 

}

Her følger noget af koden til Motion klassen:

import javabook.*;

import java.awt.*;

import java.awt.event.*;

 

public class Motion extends Frame implements ActionListener

{

 

private static MainWindow mainWindow;

 

private static TextField nr;

 

private static TextField navn;

 

private static TextField start;

 

private static TextField slut;

 

private static Label label1;

 

private static Label label2;

 

private static Label label3;

 

private static Label label4;

 

private static Button opret;

 

private static TextArea topScore;

 

// Her defineres en tabel med plads til 100 løbere:

 

private Loeber[] loebere = new Loeber[100];

 

// I antal huskes, hvor mange løbere der er oprettet indtil nu:

 

private int antal = 0;

 

 

 

public void actionPerformed(ActionEvent event)

 

{

 

 

// Indsæt ny løber sidst i tabellen

 

 

loebere[antal] = new Loeber();

 

 

Integer i = new Integer(nr.getText());

 

 

loebere[antal].setNr(i.intValue() );

 

 

loebere[antal].setNavn(navn.getText() );

 

 

loebere[antal].setStart(start.getText() );

 

 

loebere[antal].setSlut(slut.getText() );

 

 

antal++;

 

 

// Her kommer Bubblesort

 

 

// Her kommer Udskrift (f.eks. i TextArea)

 

 

// Blankstilling af felter (klar til ny indtastning)

 

 

nr.setText("");

 

 

navn.setText("");

 

 

start.setText("");

 

 

slut.setText("");

 

}

 

 

 

 

 

public Motion ()

 

{

 

 

mainWindow = new MainWindow("Motionsløb");

 

 

mainWindow.setLayout(null);

 

 

label1 = new Label("Nr");

 

 

label2 = new Label("Navn");

 

 

label3 = new Label("Start");

 

 

label4 = new Label("Slut");

 

 

label1.setBounds(100, 40, 100, 20);

 

 

label2.setBounds(100, 70, 100, 20);

 

 

label3.setBounds(100,100, 100, 20);

 

 

label4.setBounds(100,130, 100, 20);

 

 

mainWindow.add(label1);

 

 

mainWindow.add(label2);

 

 

mainWindow.add(label3);

 

 

mainWindow.add(label4);

 

 

nr = new TextField("");

 

 

navn = new TextField("");

 

 

start = new TextField("");

 

 

slut = new TextField("");

 

 

nr.setBounds (200, 40, 40, 20);

 

 

navn.setBounds (200, 70,300, 20);

 

 

start.setBounds(200,100, 80, 20);

 

 

slut.setBounds (200,130, 80, 20);

 

 

mainWindow.add(nr);

 

 

mainWindow.add(navn);

 

 

mainWindow.add(start);

 

 

mainWindow.add(slut);

 

 

opret = new Button("Opret");

 

 

opret.setBounds(200,170, 40, 20);

 

 

mainWindow.add(opret);

 

 

opret.addActionListener(this);

 

 

topScore = new TextArea(10, 5);

 

 

topScore.setBounds(100, 250, 600, 200);

 

 

topScore.setFont(new Font("Courier", Font.PLAIN, 14));

 

 

mainWindow.add(topScore);

 

 

mainWindow.show();

 

}

 

 

 

 

}

 

Bemærk oprettelsen af det nye løber objekt i tabellen før der indsættes data. Jeg sagde fejlagtigt i torsdags, at det ikke var nødvendigt; men det er det altså.

11. Kommende obligatorisk opgave - torsdag 18. november 1999

Til denne aften skal du programmere en simpel sorteringsrutine (bubblesort), som vi ikke nåede sidste torsdag. Endelig skal vi have sat de forskellige dele sammen, så vi får hele programmet til at virke. Hvis I ønsker programmet kommenteret skal I aflevere det denne aften. Hvis I afleverer senere får I kommentarer via e-mail.

På denne aften gennemgik jeg de sidste detaljer omkring løsningen af den obligatoriske opgave. Mit forslag til en vejledende løsning findes i den zippede fil motion.zip.

Et alternativt løsningsforslag fra Lars Hansen findes i filen motion01.zip.

12. Repetition og eksamensforberedelse

Tidsplan for eksamensafvikling.