Programmering H2014 — obligatorisk innlevering nr. 1

Programmering H2014 — obligatorisk innlevering nr. 2

Innleveringsfrist for 2. obligatoriske oppgave mandag 6. oktober kl.15.

Besvarelser kan leveres av grupper på inntil 3 studenter. For å få godkjent innleveringen, kreves det at det leveres kjørbare programmer som oppfyller spesifikasjonene i oppgavene.

Filene med programmenes kildekode sendes på e-post på følgende måte:
Emne på e-posten: Oblig2, 2014
Innhold i e-posten: Gruppemedlemmene med fullt navn, studentnummer og klasse/linje.
Vedlegg: .java-filene. Kompilerte filer (.class-filer)trengs ikke å legges ved.

Oppgaven skal sendes til: programmeringhioa@gmail.com

Pass på at det i kildekoden er brukt innrykk, layout og kommentarer i samsvar med god programmeringsstil. På toppen av hver klasse bør det være en kommentar som forteller hva klassen er ment for, og eventuell annen nyttig info, samt navn, studentnummer og klasse for gruppemedlemmene.

Dersom det oppdages at en gruppe har kopiert løsningen til en annen gruppe, vil ingen av de to gruppene få godkjent innleveringen! (Og derved miste muligheten til å ta eksamen i kurset.)

Det vil ikke bli gitt karakter på innleveringen, bare Godkjent/Ikke godkjent.

Innleveringen må være godkjent for å kunne gå opp til slutteksamen i faget!
Husk å skrive tydelig gruppemedlemmenes navn, studentnummer og klasse/linje på alle kildefilene som hører til programmene.

Oppgavene bygger på lærestoffet i kapitlene 1, 2, 3 og 4, 5, 6, 7, samt eksemplene og ukeoppgavene som er gjennomgått. Du bør ha lest og forstått, disse kapitlene og oppgavene før du går i gang med oppgaven.

Oppgave 1 - Tallspill

Du får som oppgave å lage et program for et tallspill. Spillet skal kunne kjøres gjentatte runder inntil spilleren velger å avslutte. For hver runde skal programmet foreta følgende:

Programmet skal generere et tilfeldig helt tall (slumptall) mellom 0 og 200 (ingen av grensene inkludert). Spilleren skal prøve å gjette på dette tallet. For hver gjetning, som foretas ved at det vises en slik innlesingsboks:

skal brukeren få beskjed om gjetningen er større enn eller mindre enn det ukjente tallet, som i følgende eksempel:

Så skal ny innlesing foretas. Slik skal det fortsette inntil spilleren har gjettet riktig. Da skal det gis beskjed om dette sammen med antall gjetninger som ble foretatt, som i følgende eksempel:

Deretter skal spilleren bli spurt om hun ønsker flere runder, ved at det vises en slik boks:

En slik boks får du vist ved å bruke følgende kode:

    String[] alternativ = { "Ja", "Nei"};
    int svar = JOptionPane.showOptionDialog( null,
          "Vil du prøve en runde til ?",
          "Gratulerer!", JOptionPane.YES_NO_OPTION,
          JOptionPane.QUESTION_MESSAGE, null, alternativ,
          alternativ[ 0 ] );

Heltallsverdien som blir returnert fra boksen vil være en av følgende, avhengig av hvilken knapp det ble klikket på for å gi svar:

    JOptionPane.YES_OPTION, JOptionPane.NO_OPTION, JOptionPane.CLOSED_OPTION

Disse verdiene må det testes på for å kunne avgjøre om det skal foretas en ny runde, eller om spillet skal avsluttes. Dersom spilleren svarer Ja for å ta en ny runde, skal programmet trekke et nytt, ukjent tall som det nå skal gjettes på, og tellevariabelen for antall gjetninger skal nullstilles. Ønsker spilleren å avslutte spillet, skal programmet avslutte etter at følgende hilsen er vist:

Programmet skal organiseres i form av klassene Tallspill og Tallspilltest som er skissert nedenfor.

import javax.swing.*;

public class Tallspill
{
  < Nødvendige datafelt. >

  public int nyttTall()
  {
    < Trekker og returnerer et slumptall mellom 0 og 200. >
  }

  public void visMelding(String melding)
  {
    < Viser parameterens innhold i en meldingsboks. >
  }

  private void forLite( int tall )
  {
    < Viser melding om at parameterens verdi er for
      lite tall og ber spilleren prøve igjen. >
  }

  private void forStort( int tall )
  {
    < Viser melding om at parameterens verdi er for
      stort tall og ber spilleren prøve igjen. >
  }

  public void avsluttRunde( int antall, int gjetning )
  {
    < Viser melding om at det ble gjettet riktig
      og antall gjetninger som ble brukt.
      Parametrene gir opplysninger om dette. >
  }

  public void kjørSpill()
  {
    < Kjører en spillrunde ved å trekke et tall,
      nullstille tellevariabel, innhente gjentatte
      gjetninger fra bruker inntil det gjettes riktig.
      Når det skjer, avsluttes runden med passe
      meldinger til spilleren. >
  }
}
import javax.swing.*;

public class Tallspilltest
{
  < Driverklasse som oppretter et Tallspill-objekt
    og kjører spillet gjentatte runder inntil
    brukeren velger å avslutte. >
}

Oppgave 2

Du skal lage et program som trekker tilfeldige tall og lagrer dem i en array. Hvor mange tall som skal trekkes er avhengig av arrayens lengde, som er parameter i klassens konstruktør. (Hele arrayen skal fylles!) Programmet skal imidlertid bare lagre de tall som ikke er trukket allerede. (Dvs. arrayen skal inneholde KUN ÈN forekomst av hvert tall.) Alle tall som trekkes skal være i intervallet 100 til 1000, begge grenser inkludert. Disse grensene skal defineres som navngitte konstanter.
Når alle tallene er generert og lagret i arrayen, skal programmet finne den største, minste og gjennomsnittlige verdien av tallene i arrayen. I tillegg skal det finne den verdien som er nærmest gjennomnstittetsverdien.
Til slutt skal programmet skrive ut, i et tekstområde, tallene i arrayen, samt resultatet av beregningene som er beskrevet over:

Programmet skal lages etter følgende skisse:

<  Nødvendige import-setninger >

public class UnikeTall
{
   < Deklarasjon av array for lagring av tilfeldige heltall
     og andre nødvendige variabler og/eller konstanter.  >

   < Konstruktør som mottar arrayens lengde som parameter og
     oppretter arrayen.  >

   < Metode som skal undersøke om et gitt tall finnes i arrayen fra før.
     Tallet det letes etter skal mottas som parameter.
     Metoden skal returnere true hvis tallet finnes i arrayen.
     Hvis ikke skal metoden returnere false. >

   < Metode som skal fylle arrayen med tilfeldige tall mellom 100 og 1000,
     begge grenser inkludert. Metoden skal gjøre dette på en måte
     som sikrer at alle tallene er forskjellige. Metoden skal ikke ha
     parametre og heller ikke returnere noen verdi.  >

   < Metode som finner og returnerer det minste tallet i arrayen. >

   < Metode som finner og returnerer det største tallet i arrayen. >

   <  Metode som beregner og returnerer den gjennomstnittlige verdien
     (double-verdi) av tallene i arrayen.  >

   < Metode som returnerer den heltallsverdien som ligger nærmest
     gjennomsnittverdien. Hint! Her kan du bruke Math.abs(...) som
     returnerer absoluttverdien til uttrykket mellom parentesene. >

   < Metode som viser tallene i arrayen i et tekstområde, som mottas
     som parameter. I tillegg skal det, i tekstområdet, skrives ut
     opplysninger om hvilket tall som er minst, hvilket som er størst,
     hva som er gjennomsnittsverdien, og hvilken heltallsverdi som
     er nærmest gjennomnittet, jfr bildet over. Gjennomsnittverdien
     skal skrives ut med en desimal. Legg inn mellomrom mellom tallene
     og skriv ut et passende antall tall per linje. >
  }
}

Pass på følgende:

Lag en driver-klasse som innholder main-metoden og som utfører nødvendige instruksjoner for å teste ut metodene i klassen UnikeTall og få vist bildet over på skjermen.
Arrayen bør ha mellom 50 0g 100 elementer.

Oppgave 3

Lag et program som leser inn en tekststreng fra brukeren:

Programmet skal telle opp og skrive ut antall forekomster av de forskjellige bokstavene i den innleste teksten, altså antall a-er, antall b-er, etc.

Du skal ikke skille mellom store og små bokstaver. Både 'A' og 'a' skal telle som en a.

Hint 1:
Det kan være lurt å konverterer teksten til kun å inneholde bokstaver av samme type, dvs. enten bare små, eller bare store. Dette får du til ved å bruke String-metodene toUpperCase() eller toLowerCase().

String s = "Eksempel";
s.toUpperCase() gir "EKSEMPEL"
s.toLowerCase() gir "eksempel"

Hint 2:
Opprett to arrayer:

Eks: Bokstaven som er lagret i tegn[i] har sin frekvens (dvs. antall forekomster i teksten) lagret i frekvens[i].

Lykke til!