/******************************************************* * Ohjelmoinnin jatkokurssi, syksy 2009, Harjoitus 2 * Malliratkaisuja ******************************************************/ /******************************************************* *Tehtävä 1&2 *******************************************************/ public class Opiskelija { private String etunimi; private String sukunimi; private int koepisteet; // saa olla vain 0-50 private int harjoituspisteet; // saa olla vain 0-10 public Opiskelija(String etunimi, String sukunimi) { this.etunimi = etunimi; this.sukunimi = sukunimi; this.koepisteet = 0; this.harjoituspisteet = 0; } //--------------------------- public String getEtunimi() { return this.etunimi; } public String getSukunimi() { return this.sukunimi; } public int getPistesaalis() { return this.koepisteet + this.harjoituspisteet; } //--------------------------- /******************************************************* !!!Tehtävä alkaa!!! *******************************************************/ /* * Metodi palauttaa false, jos annettu parametri ei ole * kelvollinen. Tällöin koepisteiden arvoa ei muuteta (olisiko * joku muu tapa parempi?). * Jos parametri on kelvollinen, muutetaan koepisteiden arvoa ja * palautetaan true */ public boolean setKoepisteet(int pisteet){ //palautetaan false, jos parametri ei kelpaa if(pisteet < 0 || pisteet >50 ) return false; //kelvolliset pisteet this.koepisteet = pisteet; return true; } /* * Metodi palauttaa false, jos annettu parametri ei ole * kelvollinen. Tällöin harjoituspisteiden arvoa ei muuteta * (olisiko joku muu tapa parempi?). * Jos parametri on kelvollinen, muutetaan harjoituspisteiden * arvoa ja palautetaan true. */ public boolean setHarjoituspisteet(int pisteet){ //palautetaan false, jos parametri ei kelpaa if(pisteet < 0 || pisteet > 10) return false; this.harjoituspisteet = pisteet; return true; } /* * Metodi käy if-lauseet läpi (ensimmäiseen toteen asti) joka * kerta, kun sitä kutsutaan. Jos metodia käytetään usein, voisi * olla järkevämpää luoda erillinen private int arvosana - * muuttuja, johon arvosana laskettaisiin aina, kun pisteitä * muutetaan. */ public int arvosana(){ int pisteet = this.harjoituspisteet + this.koepisteet; if(pisteet < 30) return 0; if(pisteet < 35) return 1; if(pisteet < 40) return 2; if(pisteet < 45) return 3; if(pisteet < 50) return 4; return 5; } /* * Vertaillaan Opiskelijoita. Järjestysperusteena on * ensisijaisesti Opiskelijan pistesaalis, sitten sukunimi ja * etunimi. Mikäli kaikki täsmäävät, palauttaa metodi 0. */ public int compareTo(Opiskelija verrattava){ //verrataan pisteitä if(this.getPistesaalis() > verrattava.getPistesaalis()) return -1; if(this.getPistesaalis() < verrattava.getPistesaalis()) return 1; //yhtäsuuret pistesaaliit, verrataan sukunimeä if(this.sukunimi.compareTo(verrattava.getSukunimi()) < 0) return -1; if(this.sukunimi.compareTo(verrattava.getSukunimi()) > 0) return 1; //sama sukunimi, verrataan etunimiä if(this.etunimi.compareTo(verrattava.getEtunimi()) < 0) return -1; if(this.etunimi.compareTo(verrattava.getEtunimi()) > 0) return 1; return 0; } } Tässä myös vaihtoehtoinen toteutustapa compareTo –metodille. Samat ehdoton esitetty huomattavasti tiiviimmin. Tämä versio on kuitenkin ehkä hieman vaikealukuisempi. public int compareTo(Opiskelija verrattava){ if(this.getPistesaalis() > verrattava.getPistesaalis()) return -1; if(this.getPistesaalis() < verrattava.getPistesaalis()) return 1; if(this.sukunimi.compareTo(verrattava.getSukunimi())!=0) return this.sukunimi.compareTo(verrattava.getSukunimi()); return this.etunimi.compareTo(verrattava.getEtunimi()); } /******************************************************* *Tehtävä 3&4 ******************************************************** import java.util.Scanner; public class OpiskelijaTietokanta { private static Scanner lukija = new Scanner(System.in); /* * Apuohjelma, jonka avulla voi syöttää tiedot "tietokantaan" */ private static void pyydaTiedot(Opiskelija[] taulu){ String etunimi, sukunimi; for(int i=0; i < taulu.length; i++){ System.out.println("Anna etunimi "); etunimi = lukija.next(); System.out.println("Anna sukunimi "); sukunimi = lukija.next(); taulu[i] = new Opiskelija(etunimi, sukunimi); System.out.println("Anna koepisteet"); int koepisteet = lukija.nextInt(); while(!taulu[i].setKoepisteet(koepisteet)){ System.out.println("Virheelliset koepisteet. Anna koepisteet uudelleen (0-50):"); koepisteet = lukija.nextInt(); } System.out.println("Anna harjoituspisteet"); int harjoituspisteet = lukija.nextInt(); while(!taulu[i].setHarjoituspisteet(harjoituspisteet)){ System.out.println("Virheelliset harjoituspisteet. Anna harjoituspisteet uudelleen (0-10):"); harjoituspisteet = lukija.nextInt(); } } } /* * Järjestetään taulukko. */ private static void jarjestaTaulu(Opiskelija[] taulu){ Opiskelija apu; for(int i=0; i 0){ apu = taulu[i]; taulu[i] = taulu[j]; taulu[j] = apu; } } } } /* * Tulostetaan taulukko. */ private static void tulostaTaulu(Opiskelija[] taulu){ System.out.println("Tulos \t\tNimi"); for(int i=0; i