Programutvecklingsteknik 20 mars 2001

Övning 2

  1. Objektmodellera en trevlig bridgekväll för fyra personer! Kvällen består av många givar och i varje giv tas tretton stick. Tänk efter vilka metoder och datastrukturer som kan komma i fråga. Bör konstruktorn i klassen Kort vara public?


  2. Skapa en komponent med tolv knappar som kan användas för att slå in koder. Understa knappraden är * 0 #.


  3. Skissa ett program som med fildialogruta frågar efter en fil och som sedan skriver ut alla ord i filen sorterade i svensk bokstavsordning.

Lösningar



                             ______________________       ____
                            |     Kortbunt         |1   *|Kort|
                            |______________________|-----|____|
                                ^         ^      ^
    ___________     ___      ___|___      |      |
1  |Bridgekväll|1 *|Giv|1  1|Kortlek|     |      |
   |___________|---|   |----|_______|     |      |
        1|         |   |1            13 __|__    |
         |         |   |---------------|Stick|   |   
    ____4|____     |   |     ________  |_____|  _|__ 
   |Deltagare |    |   |1  4|Spelare|1        1|Hand|
   |__________|    |___|----|_______|----------|____|

   Det finns tre sorters kortbuntar: kortleken med 52 kort från början,
   varje stick med fyra kort och varje hand med tretton kort från början.
   Klassen kortlek har en konstruktor som tillverkar alla kort och blandar
   leken. Konstruktorn i Kort behöver bara kunna anropas därifrån, därför
   är det bäst att inte ha konstruktorn public . Så här blir konstruktorn
   bara åtkomlig från paketet card.

   package card                     ;
   public class Kort                {
     private String färg            ; 
     private int valör              ;
     Kort(String färgen,int valören){... //inte public Kort

   Kortbunt kan vara en stack (java.util.Stack duger) men en Hand
   har dessutom fyra sorterade kortvektorer, en för varje färg.

   Observera att Deltagare (Henrik, Gerd, Erik och Ann) och Spelare
   (Syd, Väst, Nord, Öst) är olika klasser. 
   Poäng för given kan beräknas av Giv och ackumulerade poäng av
   Bridgekväll.

2  Komponenterna Label och TextField slås ihop i en behållare Panel.

                  ______
                 |Panel |         ______
                 |______|        |Button|
                    ^            |______|
                  __|______          ^
                 |Knappsats|         |
                 |---------|         |                ___________
                 |  koden  |1   12 __|__             |ActionEvent|
                 |_________|------|Knapp|  lyssnar   |-----------|
                                  |     |<-----------|knapptryck |
                                  |_____|----------->|___________|

  Knappsatsen är en Panel som också minns inslagen kod.
  Streckade pilarna betyder att en Knapp lyssnar efter egna 
  händelser; den ska alltså själv vara en ActionListener.
  Observera att den inre klassen har tillgång till den yttre
  klassens variabel kod utan särskild notation och att super
  inte syftar på den yttre klassen utan på den ärvda klassen Button.

import java.awt.*                                                 ;
import java.awt.event.*                                           ;
public class Knappsats extends Panel implements ActionListener    {
    private String kod=""                                         ;
    public class Knapp extends Button                             {
        public Knapp(String tkn)                                  {
           super(tkn)                                             ;
           addActionListener(Knappsats.this)                      ;
           setBackground(Color.yellow)                            ;
           setFont(new Font("Dialog",Font.BOLD,16))               ;}}
    public Knappsats()                                            {
	setLayout(new GridLayout(4,3))                            ;
	for(int i=1;i<10;i++) add(new Knapp(""+i))                ;
	add(new Knapp("*"))                                       ;
	add(new Knapp("0"))                                       ;
	add(new Knapp("#"))                                       ;
        setVisible(true)                                          ;}
       public String getKod()                                     {
           return kod                                             ;}
       public void actionPerformed(ActionEvent e)                 {
   	   String tkn=e.getActionCommand()                        ;
           if(tkn.equals("*")) kod=""                             ;
           else if(tkn.equals("#")) return                        ;
           else kod+=tkn                                          ;}}
class Knapptest                                                   {
    public static void main(String[] args)                        {
	Frame f=new Frame("Knappsats")                            ;
	Knappsats knappsats=new Knappsats()                       ;
	f.add(knappsats)                                          ;
        f.setSize(150,200)                                        ;
        f.setVisible(true)                                        ;
        while(true) try                                           {
	    Thread.sleep(1000)                                    ;
	    System.out.println(knappsats.getKod())                ;}
	catch(Exception e){}                                      ;}}

3 FileDialog är en komponent som låter en leta bland katalogerna efter
  rätt fil. När man har filnamnet kan man läsa filen till exempel med
  metoderna i Mio (som finns på kursbiblioteket). Exempel:

    public static void main(String[] args)               {
        Frame f =new Frame()                             ;
        FileDialog fildialog=new FileDialog(f)           ;
        fildialog.show()                                 ;
        String filnamn= fildialog.getFile()              ;
        BufferedInputStream filen = Mio.openRead(filnamn);
        while(!Mio.EOF(filen))                           {
	  System.out.println(Mio.getLine(filen))         ;}}}
//skriver ut den valda filen på skärmen

  Problemet med svensk bokstavsordning kan lösas enkelt med klassen
  Collator som tillverkar en strängjämförelsemetod för svenskar så här.

import java.text.*                                                    ;
import java.util.*                                                    ;
class Jämför                                                          {
    static Collator svensk=Collator.getInstance(new Locale("sv","SE"));
    public static void main(String[] args)                            {
	System.out.println(svensk.compare(args[0],args[1]))           ;}}

  Kör man detta testprogram med
      java Jämför åra Öra
  får man utskriften -1, dvs åra sorteras före Öra, som sej bör.

Återstår bara att läsa in filen i en new Vector() och sedan anropa den
sorteringsmetod (lär vara merge sort) som finns i java.util.*.

import java.text.*                                                    ;
import java.util.*                                                    ;
import java.io.*                                                      ;
import java.awt.*                                                     ;
import paket.*                                                        ;
class Sortering                                                       {
    static Collator svensk=Collator.getInstance(new Locale("sv","SE"));
    public static void main(String[] args)                            {
        Frame f =new Frame()                                          ;
        FileDialog fildialog=new FileDialog(f)                        ;
        fildialog.show()                                              ;
        String filnamn= fildialog.getFile()                           ;
        BufferedInputStream filen = Mio.openRead(filnamn)             ;
        Vector v = new Vector()                                       ;
	while(!Mio.EOF(filen)) v.add(Mio.getLine(filen))              ;
	Collections.sort(v,svensk)                                    ;
        for(int i=0;i<v.size();i++) System.out.println(v.get(i))      ;}}



 
  

^ Upp till kurssidan.


Sidansvarig: <henrik@nada.kth.se>
Senast ändrad 14 januari 2004
Tekniskt stöd: <webmaster@nada.kth.se>