Ohjelmointi 2 / 2008

Demo 3 / 28.1

Tehtävät

Viitteissä tyyliin "Luvun 8.5" noudatetaan luentomonisteen numerointia. Demoissa saa käyttää vapaasti aliohjelmapaketteja ../../../../ohj2/ali. Hakemistossa on kirjaston käyttöohje.
1.
Kirjoita algoritmi joka tarkistaa onko merkkijono sama kuin kysymysmerkkejä sisältävä merkkijono (? = mikä merkki vaan). Kysymysmerkki tarkoittaa siis mitä tahansa yhtä kirjainta. TDD: keksi lisää erilaisia testattavia asioita.
 jono        maski
"Kissa"     "K?ss?"    => samat
"Kiss"      "K?ss?"    => ei samat
2.
TDD: Java-toteutus ja testipääohjelma edelliselle algoritmille.
public static boolean onko_samat_kys(String jono, String maski);
...
  if ( onko_samat_kys("Kissa","K?ss?") ) ...
3*.
Kirjoita algoritmi, jolle annetaan kaksi merkkijonoa ja joka poistaa toisesta jonosta kaikki toisen jonon esiintymät. Lopputulokseen ei saa jäädä enää yhtään poistettavan merkkijonon esiintymää (vihje: tee "runsaasti" apualiohjelmia):
 jono      poista        tulos
Catcat      at      =>    Cc
Paatti      at      =>    Pi
Puatit      at      =>    Puit 
TDD: keksi lisää esimerkkejä jotka pitää testata.
Kokeile osaatko tehdä Java-toteutusta jossa automaattinen testi (vapaaehtoinen +1 bonuspiste, eli jos algoritmi JA Java-toteutus, voit merkitä yhteensä kaksi pistettä. Pelkällä Java-toteutuksella vain yksi piste).
4a)
Mitkä seuraavista muuttujien esittelyistä ovat syntaktisesti oikeita. Mitkä syntaktisesti oikeista ovat hyviä:
int    luku1,luku2,luku3,luku4,luku5,luku6;
int    o,l,I;
double lyhyt,short,kort;
int    i,j;
double varpaan_pituus,räpylän_leveys;
int    kissa1,_2_kanaa,3_koiraa;
b)
Keksi hyvät muuttujat kuvaamaan seuraavia tilanteita (ja kirjoita muuttujien esittely):
lasketaan kuorma-autoja ja henkilöautoja
mitataan huoneen "strategiset" tiedot ja lasketaan pinta-ala
5*.
Suunnittele ja kirjoita Java-ohjelma, joka kysyy huoneesta mitatut tiedot ja tulostaa sitten näiden perusteella huoneen pinta-alan ja tilavuuden. Toteuta ohjelma monisteen 8.5 luvun mukaisesti aliohjelmia käyttäen . Katso malliksi java-muut/Matka_a2.java.
6*
Demokerran 2 mallivastauksessa Etusuku2.java :ssa on kaksi samankaltaista aliohjelmaa. Muuta nämä yhdeksi aliohjelmaksi vaihdaAlkuLoppu ja toteuta sitten alkuperäiset kaksi aliohjemaa yhden rivin aliohjelmina jotka kutsuvat vaihdaAlkuLoppu.
7*.
Näytä kuvan avulla (piirrä kuva kunkin sijoituksen jälkeen uudelleen) mitä ovat muuttujien arvot seuraavien sijoitusten jälkeen (kun muuttujat ovat sijoittuneet muistipaikkoihin kuten kuvassa). Piirrä kuvaan myös mihin viitteet b, c ja p loogisesti aina "osoittavat".
ks. Viitteet.java:
int a;
StringBuffer b = new StringBuffer("1");
StringBuffer c = new StringBuffer("2");
StringBuffer p;
a = 19;
p = b;
p.append("0");
p = c;
p.append(a);
c = b;
c.append("3");
     
     a = 19     p = b   p.app(0)  p = c   p.app(a)  c = b   c.app(3) 
    +-----+    +-----+  +-----+  +-----+  +-----+  +-----+  +-----+  
100 |     | a  |     |  |     |  |     |  |     |  |     |  |     |  
    +-----+    +-----+  +-----+  +-----+  +-----+  +-----+  +-----+  
104 |900  | b  |     |  |     |  |     |  |     |  |     |  |     |  
    +-----+    +-----+  +-----+  +-----+  +-----+  +-----+  +-----+  
108 |940  | c  |     |  |     |  |     |  |     |  |     |  |     |  
    +-----+    +-----+  +-----+  +-----+  +-----+  +-----+  +-----+  
112 | ??  | p  |    o+- |    o+- |    o+- |    o+- |    o+- |    o+- 
    +-----+    +-----+  +-----+  +-----+  +-----+  +-----+  +-----+  
                                                                     
Keko:                                                                
    +-----+    +-----+  +-----+  +-----+  +-----+  +-----+  +-----+  
900 | 1   |    |     |  |     |  |     |  |     |  |     |  |     |  
    +-----+    +-----+  +-----+  +-----+  +-----+  +-----+  +-----+  
940 | 2   |    |     |  |     |  |     |  |     |  |     |  |     |  
    +-----+    +-----+  +-----+  +-----+  +-----+  +-----+  +-----+  
8.
Kirjoita Java-ohjelma, joka lukee yhden merkkijonon (rivin) ja tulostaa toisen merkkijonon siten, että merkkijonon 1. ja 2. sana ovat aakkosjärjestyksessä. Tulostetaan aina vain kaksi sanaa, vaikka syötetyssä merkkijonossa olisi useampikin sana. Toteutus mielellään funktion jarjesta_1_2 -avulla (eli kirjoita ko. funktio, vrt Etusuku2.java). TDD: Kirjoita ”kaikki mahdolliset” testattavat tapaukset. Jos teet ”automaattisen” testin, ei tarvitse kysyä merkkijonoa.
B1.
Kirjoita algoritmi (vrt. tehtävä 1) joka tarkistaa onko merkkijono sama kuin mahdollisesti YHDEN (tai ei yhtään, mutta ei enempää, jos saa olla monta *, niin asia vaikeutuu oleellisesti) *-merkin sisältävä jono (*:n kohdalla voi siis olla miten monta, myös 0, ja mitä merkkiä tahansa)
 jono        maski
"Kissa"     "K*a"    => samat
"Kissa"     "K*i"    => ei samat
"Kissa"     "K*"     => samat
"Lintu"     "K*"     => ei samat
Mikäli kuitenkin haluat kokeilla useamman tähden toteutusta, niin vinkiksi yksi sana: rekursio.
G1-2
Hae tiedosto n:\kurssit\ohj2\demot\demo08\demo1\users.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<base target=m1>
...
93 <a href="vesal/index.html?r=">Vesa Lappalainen</a> = 8.5<br>
94 <a href="mattim/index.html?r=">Matti Meikäläinen</a> = 8<br>
95 <a href="teppot/index.html?r=">Teppo Teikäläinen</a> = 9<br>
...

ja tee sitten ohjelma, joka lukee tiedoston ja tulostaa sen muodossa:
93 Vesa Lappalainen = 8.5 - vesal
94 Matti Meikäläinen = 8  - mattim
95 Teppo Teikäläinen = 9  - teppot
eli riisuu pois kaikki rivit, joissa ei ole linkkiä ja linkkiriveistä tulostetaan em. tiedot em. muodossa

Java vinkkejä

Miten merkkijono luetaan:
  String s = Syotto.kysy("Anna jono");
  System.out.println("Jono oli: \"" + s + "\"");
Tiedosto luetaan:
import java.io.*;

/**
 * Luetaan tiedosto ja tulostetaan se näytölle.
 * @author Vesa Lappalainen
 * @version 1.0, 25.01.2002
 */
public class TiedostonLukeminen {

  public static void main(String[] args) throws IOException {
    BufferedReader f = null;
    try {
      f = new BufferedReader(new FileReader("Tiedosto.java"));
    } catch (FileNotFoundException ex) {
      System.out.println("Tiedosto ei aukea!"); return;
    }

    try {
      String rivi;
      while ( ( rivi = f.readLine() ) != null ) {
        System.out.println(rivi);
      }
    } catch (IOException ex) {
      System.out.println("Vikaa tiedostoa lukiessa!"); return;
    } finally {
      f.close();
    }

  }
}
Merkkijonon muuttaminen numeroksi:
  String s = "123";
  int i = Mjonot.erotaInt(s,0);