Juhana Laurinharju 3.11.2009 ---------------------------- import java.util.Scanner; public class Arvauspeli { private static Scanner lukija = new Scanner (System.in); private static void järjestä(int[] taulu) { for (int i = 1; i < taulu.length; i++) { int apu = taulu[i]; int j = i; while (j > 0 && taulu[j-1] > apu) { taulu[j] = taulu[j-1]; j--; } taulu[j] = apu; } } private static boolean binHae(int[] taulu, int haettava) { int alku = 0; int loppu = taulu.length - 1; int keski; while (alku <= loppu) { keski = (alku + loppu)/2; if (taulu[keski] == haettava) return true; else if (taulu[keski] < haettava) alku = keski + 1; else loppu = keski - 1; } return false; } private static int[] lueLuvut(int määrä) { int[] luvut = new int[määrä]; System.out.println("Syötä " + määrä + " lukua"); for (int i = 0; i < luvut.length; i++) { //tehtävä antoi olettaa syötettyjen lukujen olevan oikeaa muotoa luvut[i] = lukija.nextInt(); } return luvut; } private static void arvuuttele(int[] luvut) { int oikein = 0, väärin = 0; System.out.println("Arvaa luku:"); int arvaus = lukija.nextInt(); while (arvaus > 0) { if (binHae(luvut, arvaus)) { System.out.println("Oikein meni!"); oikein++; } else { System.out.println("Ohi meni."); väärin++; } System.out.println("Arvaa luku:"); arvaus = lukija.nextInt(); } System.out.println("Peli on päättynyt. Arvasit " + oikein + " oikein ja " + väärin + " väärin"); } public static void main (String [] args) { int[] onnenLuvut = lueLuvut(1000); järjestä(onnenLuvut); arvuuttele(onnenLuvut); } } /* Arvosteluperusteita: Järjestäminen: 5p - täydet pisteet sai jos piti luvut järjestyksessä lisäyksen yhteydessä tai järjesti ne jollain järjestämisalgoritmilla - virheistä pisteitä lähti seuraavasti: - järjesti taulukon käänteiseen järjestykseen, mutta binäärihaku oletti lukujen kuitenkin olevan normaalissa järjestyksessä: -3p - isommista virheistä meni kaikki pisteet, yleisiä mokia oli: - vaihtoi indeksimuuttujien arvoja taulukon arvojen sijaan - vaihtoi taulukon arvoja tarkistamatta pitääkö - aloitti vaihtojärjestämisen sisemmän silmukan nollasta tai ykkösestä binäärihaku: 5p - virheistä pisteitä lähti seuraavasti: - silmukan toistoehto oli (alku < loppu): -1p - silmukan toistoehto oli (alku != loppu) -3p - vertaili haettavaa arvoa keski-indeksiin taulukon arvon sijasta: -3p - päivittää reunaindeksejä "väärin päin", ts. kasvattaa alkuindeksiä kun pitäisi pienentää loppuindeksiä ja/tai toisinpäin - käytti binäärihakua järjestämättä lukuja (järjestäminen sai olla virheellinen). Pisteitä ei mennyt jos kuitenkin mainitsi kommentissa binäärihaun yhteydessä, että binäärihaku vaatii järjestyksen. - isommista virheistä pisteet meni nollaan, esim: - muutti reunaindeksien arvoja yhdellä sen sijaan että siirtäisi ne keskikohdan yli binäärihausta ja järjestämisestä pystyi kuitenkin saamaan maksimissaan 2+2 pistettä jos ohjelmassa ei ollut mitään muuta kuin metodit näille muut: 8p - kaikki pisteet sai jos luki onnenluvut, arvuutteli käyttäjältä onnenlukuja ja piti yllä statistiikkoja - virheistä pisteitä lähti seuraavasti: - ei onnenlukujen lukua tai käytti satunnaislukuja käyttäjän syöttämien lukujen sijaan: -3p - ei statistiikkoja: -3p - laski ohjelman lopettamisen vääräksi arvaukseksi: -1p - lisäksi pisteitä lähti tapauskohtaisesti isommista syntaksivirheistä ja ohjelman virheellisestä toiminnasta */