Ohjelmointi 2 -- kesä 2006 -- Demo 3/11

Demonumero:3/11
Palautus:tiistaina 23.5.2006 klo 18 mennessä.
Laskennallinen tehtävämäärä:
 8 kpl.
Pisteitä saa korkeintaan:
 10 kpl.

(esim. 11 tehtyä kohtaa -> 10 pistettä Korppiin)

Kurssilla saa käyttää apuohjelmistoa, joka löytyy osoitteesta http://www.mit.jyu.fi/vesal/kurssit/ohj2/ali/ -- sivulla on myös ohjeet.

1:

Kirjoita algoritmi, joka tarkistaa, onko merkkijono sama kuin kysymysmerkkejä sisältävä merkkijono (? = mikä merkki vain).

Esimerkki:

jono

maski

tulos

"Kissa"

"K?ss?"

=> samat

"Kiss"

"K?ss?"

=> ei samat

2:

Toteuta edellinen algoritmi Javalla. Käytä esittelyä:

public static boolean onko_samat_kys(String jono, String maski)

ja jonkinlaista pääohjelmaa tyyliin:

... 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ä:

jono

poista

tulos

Catcat

at

=> Cc

Paatti

at

=> Pi

Puatit

at

=> Puit

4:

Kaksi kohtaa:

  1. Mitkä seuraavista muuttujien esittelyistä ovat syntaktisesti oikeita. Mitkä syntaktisesti oikeista ovat hyviä. Miksi tai miksi ei?:

    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
    
  2. 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 luvun 8.5. mukaisesti aliohjelmia käyttäen.

6:

Demokerran 2 mallivastauksessa Etusuku2.java:ssa on kaksi samankaltaista aliohjelmaa. Muuta nämä yhdeksi aliohjelmaksi vaihda_alku_loppu ja toteuta sitten alkuperäiset kaksi aliohjemaa yhden rivin aliohjelmina jotka kutsuvat vaihda_alku_loppu.

Suora linkki java-koodiin: http://www.cc.jyu.fi/~nieminen/oh2/demot/demo2/malli/Etusuku2.java

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".

Kuvat voit "Piirtää" tekstieditorilla käyttäen tolppa- miinus- ja plusmerkkejä ja väkäsiä eli |+->. Tai hyväksyn PNG-muotoon exportatut kuvat, jos jonkun teknisen piirto-ohjelman käyttö tuntuu mukavemmalta.

ks. Viitteet.java, http://www.cc.jyu.fi/~nieminen/oh2/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).

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

tulos

"Kissa"

"K*a"

=> samat

"Kissa"

"K*i"

=> ei samat

"Kissa"

"K*"

=> samat

"Lintu"

"K*"

=> ei samat

Mikäli kuitenkin haluat kokeilla useamman tähden totetusta, niin vinkiksi yksi sana: rekursio.

G1-2:

Hae netistä html-tiedosto http://www.cc.jyu.fi/~nieminen/oh2/demot/demo2/users.html (tarvitset sen salasanan, jolla demovastauksia pääsee katselemaan).

<!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. Suap käyttää kaikkia taitoja, jotka tässä vaiheessa on hallussa (ja halutessaan opetella uusia, koska kyseessä on guru-tehtävä).

Java vinkkejä

(Käyttäen tuota alussa mainittua ali.jar -pakettia)

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);