Tehtävä pisteytettiin siten, että toimivasta binäärihausta ja toimivasta järjestysalgoritmista sai kummastakin 4 pistettä ja ohjelmakokonaisuudesta (main-metodi, metodimääritykset) samoin 4. Täysiin ohjelmapisteisiin edellytettiin, että ainakin binäärihaku on määritetty omaan apumetodiinsa. Pisteitä vähennettiin seuraavasti Ohjelmakokonaisuus: - Parametrien välitys metodikutsuissa on virheellinen tai puuttuu kokonaan -1p - Apumetodeja ei ole käytetty vaan kaikki on koodattu pääohjelman sisälle -1p - Metodien määrittelyissa vikaa, esim. määritelty palautusarvo muttei palauteta tai palautusarvoa ei ole määritelty ollenkaan tai static puuttuu -1p - Yritys viitata metodissa toisen metodin muuttujaan -1-2p riipuen virheen toistuvuudesta ja vakavuudesta. - Oleellisia puutteita esim. lukujen asettaminen taulukkoon tai vuorovaikutteisen hakusilmukan puuttuminen -1-2p Yhden tai kaksi pistettä saattoi saada, jos pääohjelmassa oli selvästi yritetty saada aikaiseksi jotain järkevää, vaikkei tuloksena ollutkaan täysin toimiva java-ohjelma. Järjestysalgoritmi: - Jos sisemmässä silmukassa alustus on asetettu int j=1 eikä int j=i+1 -1p (jos siis ulommassa silmukassa i ja sisemmässä j laskurimuuttujana) Binäärihaku: - silmukan lopetusehto virheellinen -1p - ylläpidetään hakualuetta väärin -1-2p - väärä palautusarvo (esim. palautetaan parametrina saatu) -1p Järjestäminen ja haku: - jos vertaillaan indeksejä eikä taulun alkioita -1-2p riippuen toistetaanko virhettä johdonmukaisesti vai onko se yksittäinen lipsahdus - iso ajatusvirhe algoritmissa -2p Useista vastauksista näkyi, että järjestys- ja/tai hakualgoritmi oli opeteltu ulkoa, muttei täysin ymmärretty. Tällöin algoritmiin saattoi tulla kummallisia virheitä, jos sitä ei täysin muistettu, tai ei ollut osattu laatia pääohjelmaa, jossa algoritmeja käytettäisiin. Tämäntyyppinen vastaus ei tuottanut hyviä pisteitä. Mikä tahansa järjestysalgoritmi olisi kelvannut, mutta kaikissa vastauksissa oli käytetty "varman päälle" vaihtojärjestämistä. Opetelkaa jatkossa joku parempikin :-) Pistekeskiarvo oli vähän yli 6 pistettä, jos tyhjät paperit jätetään huomioimatta, tyhjät mukaanlukien 5,8. Esimerkkiratkaisu tehtävään 4. public class Hakupalvelu { // Marja Huovinen /* vaihtojärjestäminen pienimmästä suurimpaan */ private static void järjestä(int[] taulu) { for (int i = 0; i < taulu.length -1; i++) for (int j = i+1; j < taulu.length; j++) if (taulu[i] > taulu[j]) { int apu = taulu[i]; taulu[i] = taulu[j]; taulu[j] = apu; } } /* binäärihaku */ private static int binhae(int[] taulu, int haettava) { int vasen = 0; int oikea = taulu.length-1; int keski; while (vasen <= oikea) { keski = (vasen + oikea) / 2; if (taulu[keski] == haettava) return keski; // löytyi, palautetaan indeksi if (taulu[keski] > haettava) oikea = keski -1; else vasen = keski + 1; } return -1; // ei tärpännyt } public static void main(String[] args) { final int KOKO = 1000; int[] numerot = new int[KOKO]; int jatko; System.out.println("\n***Numerohakupalvelusovellus***\n"); System.out.println("Alustetaan numerotaulukko."); for (int i = 0; i < numerot.length; i++) { System.out.println("Anna " + (i+1) + ". luku:" ); numerot[i] = Lue.kluku(); } järjestä(numerot); do { System.out.println("Nyt voit hakea lukuja taulukosta."); System.out.println("Montako haetaan? " + "(kun annat nollan tai negatiivisen, lopetetaan)"); jatko = Lue.kluku(); for (int i = jatko; i > 0; i--) { System.out.println("Anna haettava luku: "); int tulos = binhae(numerot, Lue.kluku()); if (tulos < 0) System.out.println("Lukua ei löytynyt."); else System.out.println("Luku löytyi indeksistä " + tulos + "."); } } while (jatko > 0); } }