import java.util.Random;
import java.text.*;
/**
* Arpanoppa on olio, jolla voidaan mallintaa arpanopan toiminnallisuutta.
* Arpanopan sivujen määrä on asetettavissa alustuksen yhteydessä. Lisäksi
* olio ylläpitää tilastotietoja, jotka on tulostettavissa näytölle.
* <p>
* Seuraavassa esimerkkiohjelmassa luodaan ensin ilmentymä
* kuusisivuisesta arpakuutiosta, jota heitetään kunnes heitettyjen
* silmälukujen yhteenlaskettu summa on vähintään 100.
* Heittojen lopuksi tulostetaan tilastotiedot heitoista.
*
* <pre>
* // Luodaan ilmentymä Arpanoppa-oliosta.
* Arpanoppa noppa = new Arpanoppa();
*
* // Esitellään muuttuja, johon tallennetaan heitettyjen
* // silmälukujen summa.
* int heittojensumma = 0;
*
* // Heitetään noppaa niin kauan, kuin heitettyjen silmälukujen
* // summa on alle 100.
* while (heittojensumma < 100)
* heittojensumma = heittojensumma + noppa.heita();
*
* // Tulostetaan heittojen tilastotiedot.
* noppa.tilasto();
* </pre>
*
* Seuraavassa esimerkkiohjelmassa luodaan ilmentymä kaksisivuisesta
* arpanopasta, jolla heitetään kruunaa ja klaavaa.
*
* <pre>
* // Luodaan ilmentymä Arpanoppa-oliosta.
* Arpanoppa kolikko = new Arpanoppa(2);
*
* // Tarkistetaan tuliko kruuna vai klaava..
* if (kolikko.heita() == 1) {
* System.out.println("Kruuna");
* } else {
* System.out.println("Klaava");
* }
* </pre>
*
* @author Mauri Heinonen
* @version 2.0
* @see java.util.Random
*/
public class Arpanoppa {
/**
* Random-olion ilmentymä.
*/
Random generator = new Random();
/**
* Arpanopan sivujen määrä.
* Sivujen määrä asetetaan alustuksen yhteydessä.
*/
final int sivuja;
/**
* Arponopan heittojen kokonaismäärä.
*/
int heittoja;
// Piirrettävän palkin maksimipituus.
final int maxpituus = 40;
/**
* Taulukko, johon tallennetaan tilastotietoa
* heitetyistä arvoista.
*/
private int[] tilastotaulukko;
/**
* Luokan konstruktori. Luo oletusarvoisesti
* kuusisivuisen nopan.
*/
public Arpanoppa() {
this(6);
}
/**
* Luokan konstruktori. Luo nopan, jossa on
* haluttu määrä sivuja sekä alustaa tilastotaulukon.
*
* @param alustus nopan sivujen lukumäärä
*/
public Arpanoppa(int alustus) {
sivuja = alustus;
tilastotaulukko = new int[alustus];
heittoja = 0;
}
/**
* Heittää noppaa ja palauttaa nopan silmäluvun.
*
* @return heitetty silmäluku
*/
public int heita() {
// Muodostetaan uusi silmäluku.
int heitetty = generator.nextInt(sivuja) + 1;
// Päivitetään tilastotaulukko.
tilastotaulukko[heitetty-1] = tilastotaulukko[heitetty-1] + 1;
// Kasvatetaan heittojen määrää yhdellä.
heittoja = heittoja + 1;
// Palautetaan heitetty silmäluku.
return heitetty;
}
/**
* Tulostaa tilastotietoja nopalla heitetyistä
* silmäluvuista.
*
* Metodi tulostaa seuraavan kaltaisen tilaston:
* <pre>
* Heittojen tilastotiedot
* 1 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 52 (52%)
* 2 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 48 (48%)
*
* Heittoja yhteensä 100 kappaletta.
* </pre>
*/
public void tilasto() {
// Muuttujien esittely.
int suurin=0; // Suurin heittomäärä.
int pituus; // Palkin X-merkkien määrä.
String silmaluku; // Silmäluvusta muodostettava merkkijono.
String palkki; // Merkeistä muodostettu palkki.
String maara; // Määrästä muodostettava merkkijono.
String prosentti; // Prosentista muodostettava merkkijono.
// Tulostetaan taulukon otsake.
System.out.println("Heittojen tilastotiedot\n");
// Selvitetään suurin heittomäärä.
for (int i=0; i < tilastotaulukko.length; i++) {
if (tilastotaulukko[i] > suurin) {
suurin = tilastotaulukko[i];
}
}
// Käydään lävitse taulukon jokainen solu ja tulostetaan
// kullekin silmäluvulle tilastotietorivi.
for (int i=0; i < tilastotaulukko.length; i++) {
// Muodostetaan silmäluvusta neljän merkin merkkijono.
silmaluku = " " + (i+1);
silmaluku = silmaluku.substring(silmaluku.length() - 4);
// Lasketaan palkin X-merkkien määrä.
pituus = (int)(((float)tilastotaulukko[i]/suurin)*maxpituus);
// Alustetaan palkki tyhjäksi merkkijonoksi.
palkki = "";
// Muodostetaan palkin X-merkkin osuus.
for (int j=1; j <= pituus; j++) {
palkki = palkki + "X";
}
// Muodostetaan palkin välilyöntimerkkien osuus.
for (int j=1; j <= (maxpituus - pituus); j++) {
palkki = palkki + " ";
}
// Muodostetaan heittojen määrästä kuuden merkin mittainen
// merkkijono.
maara = " " + tilastotaulukko[i];
maara = maara.substring(maara.length()-6);
// Muodostetaan prosenttiluku.
MessageFormat mf = new MessageFormat("{0,number,percent}");
Object[] luku = {new Float((float)tilastotaulukko[i]/heittoja)};
prosentti = mf.format(luku);
// Tulostetaan tilastorivin tiedot.
System.out.println(silmaluku + " " + palkki + " " + maara + " (" + prosentti + ")");
}
// Tulostetaan heittojen kokonaismäärä.
System.out.println("\nHeittoja yhteensä " + heittoja + " kappaletta.");
}
}Appletit:
DoupleClick HelloButton HelloButtonExample1 HelloButtonExample2 HelloButtonExample3 HelloButtonExample4 HelloClick HelloClick2 HelloColor HelloFont HelloImage HelloLine HelloStatus HelloWorld2 HelloWorldApplet MyEvent ScrollingText
Itsenäiset:
Break Continue HelloWorld Jatka Kertoma Kertotaulu Koe KoeNro LueMerkki LueMjonoon LueTied Merkkijono Silmukat Summaa Tahdet Tietotyypit Tilavuus Laskuri EnsimmaisetMetodit Lue LueTietoja Muunnos MuuttujienAlkeet Tulostus Arpanoppa