viikon 4 kotitehtävät - mluukkai/OTM2012 GitHub Wiki
Tehtävät 1 ja 2 liittyvät luokkakaavioihin. Tehtävä 4 liitty sekvenssikaavioihin, eli luennon 3 kalvoihin 39-59.
Tehtävä 5 liittyy käsiteanalyysiin eli luennon 3 kalvoihin 16-38.
Seuraavassa on lueteltu käsitteitä, jotka ovat jossain suhteessa keskenään. Mitä suhdetyyppiä (normaali yhteys, kompositio, perintä, riippuvuus, …) kussakin tapauksessa kannattaa käyttää (siis jokaiseen palloon oma suhde). Piirrä esim. pieni luokkakaavio jokaisesta tilanteesta.
- Ruokaileva filosofi käyttää haarukkaa
- Unixissa tiedosto on joko tavallinen tiedosto tai hakemisto
- Tiedosto muodostuu tavuista
- Monikulmion kulmat ovat järjestetty jono pisteitä
- Opiskelija hallitsee Java-kielen
- Ihmisellä on syntymävuosi
- Hiiri, näppäimistö ja Näyttö ovat I/O-laitteita (eli tietokoneen syötelaite)
- Polku yhdistää kaksi kylää
- Monopolissa on 2-8 Pelaajaa. Pelaaja voi olla yksittäinen henkilö tai joukkue. Joukkue koostuu yksittäisistä henkilöistö
Takaisinmallinna seuraava koodi luokkakaaviona:
public class Paaohjelma {
public static void main(String[] args) {
Kurssi ohma = new Kurssi();
Opiskelija o1 = new Opiskelija("Arto", 45);
Opiskelija o2 = new Opiskelija("Matti", 27);
Opiskelija o3 = new Opiskelija("Antti", 55);
ohma.lisaaOpiskelija(o1);
ohma.lisaaOpiskelija(o2);
ohma.lisaaOpiskelija(o3);
ohma.arvosteleOpiskelijat();
ohma.tulostaKurssinTulokset();
}
}
public class ArvosanaLaskin {
public int selvitaArvosana(int pisteet) {
if ( pisteet<30 ) return 0;
else if ( pisteet<35 ) return 1;
else if ( pisteet<40 ) return 2;
else if ( pisteet<45 ) return 3;
else if ( pisteet<50 ) return 4;
return 5;
}
}
public class Kurssi {
private ArrayList<Opiskelija> opiskelijat;
private ArvosanaLaskin arvosanaLaskin;
public Kurssi(){
opiskelijat = new ArrayList<Opiskelija>();
arvosanaLaskin = new ArvosanaLaskin();
}
public void lisaaOpiskelija(Opiskelija opisk){
opiskelijat.add(opisk);
}
public void arvosteleOpiskelijat(){
for ( Opiskelija opisk : opiskelijat ) {
int pisteet = opisk.getPisteet();
int arvosana = arvosanaLaskin.selvitaArvosana( pisteet );
opisk.setArvosana(arvosana);
}
}
public void tulostaKurssinTulokset(){
for ( Opiskelija opisk : opiskelijat )
opisk.tulostaTiedot();
}
}
public class Opiskelija {
private String nimi;
private int pisteet;
private int arvosana;
public Opiskelija(String nimi, int pisteet) {
this.nimi = nimi;
this.pisteet = pisteet;
}
public int getPisteet(){
return pisteet;
}
public void setArvosana(int arvosana){
this.arvosana = arvosana;
}
public void tulostaTiedot(){
System.out.println( nimi+" "+arvosana );
}
}
Piirrä edellisen tehtävän koodia vastaava oliokaavio rivin ohma.lisaaOpiskelija(o2); jälkeisestä tilanteesta.
Takaisinmallinna tehtävän 2 koodi sekvenssikaaviona. Sekvenssikaavio piirretään tilanteesta, jossa kutsutaan luokan Paaohjelma main-metodia.
Toisissa laskareissa oli tehtävänä laatia käyttötapausmalli Harjoitustöiden tuntikirjanpitoa tukevaan järjestelmään.
Tee järjestelmää vastaava määrittelyvaiheen luokkakaavio.
Etene samaan tapaan kuin luennon elokuvateatteri- ja kampaamoesimerkeissä, eli etsi ensin luokkakandidaatit keräämällä viikon 2 laskareissa olevassa tehtäväkuvauksessa esiintyvät substantiivit. Karsi sen jälkeen ylimääräiset luokkakandidaatit, eli attribuutit, synonyymit, tekemistä tarkoittavat sanat ja asiaan kuulumattomat. Tämän jälkeen mieti minkälaisia yhteyksiä luokkien olioilla on. Lopuksi tarkenna yhteydet osallistumisrajoitteilla sekä nimeä yhteydet ja roolit tarvittaessa.
Huomioi luennon 3 kalvon 33 toteamus:
yleensä ei jakseta kerätä kaikkia substantiiveja vaan tehdään esim. synonyymien ja tekemistä tarkoittavien sanojen karsinta samalla kun “kunnollisten” substantiivien etsintä etenee}
Takaisinmallinna alla oleva Ohjelmoinnin jatkokurssin Mäkihyppy-tehtävän ratkaisu luokkakaaviona.
Kuvaa sekvenssikaaviona mäkihypyn toiminta tilanteessa, jossa 2 hyppääjää hyppää yhden kierroksen.
public class Main {
public static void main(String[] args) {
Scanner lukija = new Scanner(System.in);
new Kilpailu(lukija).kay();
}
}
public class Kilpailu {
Scanner lukija;
ArrayList<Hyppaaja> hyppaajat;
public Kilpailu(Scanner lukija) {
this.lukija = lukija;
}
public void kay() {
System.out.println("Kumpulan mäkiviikot");
ilmoittautuminen();
kilpailu();
}
private void ilmoittautuminen() {
System.out.println("");
System.out.println("Syötä kilpailun osallistujat yksi kerrallaan, tyhjällä merkkijonolla siirtyy hyppyvaiheeseen.");
System.out.println("");
hyppaajat = new ArrayList<Hyppaaja>();
while (true) {
System.out.print(" Osallistujan nimi:");
String nimi = lukija.nextLine();
if (nimi.isEmpty()) {
break;
}
hyppaajat.add(new Hyppaaja(nimi));
}
}
private void kilpailu() {
System.out.println("");
System.out.println("Kilpailu alkaa!");
int nro = 1;
while (true) {
System.out.println("Kirjoita 'hyppaa' niin hypätään, muuten lopetetaan:");
String komento = lukija.nextLine();
if (!komento.equals("hyppaa")) {
break;
}
hyppaaKierros(nro);
nro++;
}
System.out.println("Kiitos!");
lopputulokset();
}
private void hyppaaKierros(int kierros) {
System.out.println("Hyppyjärjestys:");
// seuraavassa luodaan ilmentymä ns. anonyymistä sisaluokasta hoitamaan järjestäminen
Collections.sort(hyppaajat, new Comparator<Hyppaaja>() {
@Override
public int compare(Hyppaaja t, Hyppaaja t1) {
return t.getPisteet()-t1.getPisteet();
}
});
for (int i = 0; i < hyppaajat.size(); i++) {
Hyppaaja h = hyppaajat.get(i);
System.out.println(" " + (i + 1) + ". " + h.getNimi() + " (" + h.getPisteet() + " pistettä)");
}
System.out.println("Kierroksen "+kierros+" tulokset");
for (Hyppaaja hyppaaja : hyppaajat) {
System.out.println(" "+hyppaaja.getNimi());
hyppaaja.hyppaa();
System.out.println(" pituus: "+hyppaaja.hypynPituus(kierros-1));
System.out.println(" tuomaripisteet: "+Arrays.toString(hyppaaja.hypynTyyli(kierros-1)));
System.out.println("");
}
}
private void lopputulokset() {
System.out.println("Kilpailun lopputulokset:");
System.out.println("Sija Nimi");
Collections.sort(hyppaajat);
for (int i = 0; i < hyppaajat.size(); i++) {
Hyppaaja h = hyppaajat.get(i);
System.out.println((i+1)+" "+h.getNimi()+ " ("+h.getPisteet()+" pistettä)");
int[] aa = h.hyppyjenPituudet();
System.out.println(" hyppyjen pituudet: "+muotoile(h.hyppyjenPituudet()) );
}
}
private String muotoile(int[] hyppyjenPituudet) {
String mj = "";
for (int i = 0; i < hyppyjenPituudet.length; i++) {
mj+= hyppyjenPituudet[i] + " m ";
}
return mj;
}
}
public class Hyppaaja implements Comparable<Hyppaaja> {
private ArrayList<Hyppy> hypyt = new ArrayList<Hyppy>();
private String nimi;
private int kierroksia;
public Hyppaaja(String nimi) {
this.nimi = nimi;
}
public void hyppaa() {
Hyppy hyppy = new Hyppy();
hypyt.add(hyppy);
kierroksia++;
}
public String getNimi() {
return nimi;
}
public int getPisteet() {
return laskePisteet();
}
public int hypynPituus(int k) {
Hyppy h = hyppy(k);
return hyppy(k).getPit();
}
public int[] hypynTyyli(int k) {
return hyppy(k).getTyyli();
}
public int[] hyppyjenPituudet() {
int[] t = new int[hypyt.size()];
for (int i = 0; i < t.length; i++) {
t[i] = hypynPituus(i);
}
return t;
}
private Hyppy hyppy(int k){
Hyppy h = hypyt.get(k);
return hypyt.get(k) ;
}
private int laskePisteet() {
int p = 0;
for (Hyppy hyppy : hypyt) {
p += hyppy.yhteispisteet();
}
return p;
}
@Override
public String toString() {
return nimi+ " "+laskePisteet();
}
@Override
public int compareTo(Hyppaaja t) {
return t.laskePisteet()-laskePisteet();
}
}
public class Hyppy {
private int pit;
private int[] tyyli;
private Random arpa = new Random();
public Hyppy() {
pit = 60+arpa.nextInt(60);
tyyli = new int[5];
for (int i = 0; i < tyyli.length; i++) {
tyyli[i] = 10+arpa.nextInt(11);
}
Arrays.sort(tyyli);
}
public int getPit() {
return pit;
}
public int[] getTyyli() {
return tyyli;
}
public int yhteispisteet(){
return pit+tyyli[1]+tyyli[2]+tyyli[3];
}
@Override
public String toString() {
return pit+ " "+Arrays.toString(tyyli);
}
}