Programmering— Arrayer (Tabeller) Oppgaver til kapittel 5, 6 og 7

Oppgave 1 - Meteorologiske data

Det skal lages et program for registrering og bearbeiding av meteorologiske data. Programmet skal lagre minimumstemperatur, maksimumstemperatur og nedbør for alle dagene i måneden. På grunnlag av disse dataene skal det ved "månedens slutt" skrives ut diverse informasjone som er nærmere beskrevet av klassenes metoder. Programmet består av to klasser, Statistikk og Meteorologi. Nedenfor ser dere skisser av de to klassene. Oppgaven går ut på å erstatte pseudo-koden med java-instruksjoner, slik at dere får et kjørbart program.
Legg merke til at en av metodene i Statistikk-klassen ikke er obligatorisk.


< import-instruksjon(er) >
public class Statistikk
{
  private String måned;
  private int år;
  private int[] minTemp;
  private int[] maxTemp;
  private int[] nedbør;

  public Statistikk(String mnd, int å, int[] min, int[] max, int[] ned)
  {
    < Initialiserer datafeltene >
  }

  public int regndager()
  {
    < Teller opp antall dager som har hatt nedbør på 5 mm eller mer
      og returnerer antallet. >
  }

  public double maksTempSnitt()
  {
    < Finner og returnerer gjennomsnittlig maksimumstemperatur for dager
      med mindre enn 5 mm nedbør.
      Returnerer -100.0 i tilfelle det er ingen slike dager. >
  }

  public int maksTempVariasjon()
  {
    < Finner og returnerer den største temperaturvariasjon som har forekommet
      i løpet av et døgn (i løpet av måneden). >
  }

  // Metoden maksTempVariasjonsDager() er ikke obligatorisk for å få godkjent innleveringen.
  public String maksTempVariasjonsDager()
  {
    < Finner og returnerer en tekst med den eller de datoer  som har en
      temperaturvariasjon lik den maksimale, og informasjon om hvor mange
      dager det gjelder. >
  }

  public void værStatistikk(JTextArea output)
  {
    < Skriver i tekstområdet output de dataene som klassens metoder returnerer.
      Formater utskriften slik at gjennomsnittstemperatur skrives ut med en desimal. >
  }

} // end of class Statistikk

Nedenfor ser du en skisse av klassen Meteorologi. Dere skal også her erstatte all pseudo-kode med java-instruksjoner.

< import-instruksjon(er) >

public class Meteorologi
{
  public static void main(String[] arg)
  {
    < Les inn månedens navn og år, samt antall dager i måneden. ( La det
      være mulig å skrive inn et lavt antall slik det blir lettere teste ut
      programmet.) >

    < Deklarer og opprett 3 heltallsarrayer for følgende data:
      - minimumstemperaturer
      - maksimumstemperaturer
      - nedbør
      for alle månedens dager (dvs. for det antallet dager som brukeres har skrevet inn).
      Arrayenes lengde skal da være lik det antall som brukeren av programmet
      har skrevet inn i. >

    < Brukeren skal skrive inn dagenes minimumstemperaturer,
      maksimumstemperaturer og nedbør, og disse verdiene skal
      lagres i de respektive arrayene. La verdiene for den 1. i måneden
      være lagret på indeks 0, den 2. i måneden på indeks 1, den 3. i måneden
      på indeks 2 osv.
      Sjekk at brukeren skriver inn fornuftige verdier:
      - Minimumstemperaturen må ikke overstige maksimumstemperaturen for samme dag.
      - Temperaturene og nedbørsmengene bør ligge innenfor fornuftig tallområder.
      Hvis verdiene er uakseptable, skal programmet forsette å lese inn verdier
      for den dagen det dreier seg om INNTIL verdiene er innenfor de aksepterte
      områdene. (Hva som defineres som fornuftig område, bestemmer dere selv. >

    < Opprett et Statistikk-objekt. >

    < Opprett et tekstområde av typen JTextArea >

    < Fyll tekstområdet med den teksten som returneres av værStatistikk-metoden
      i Statistikk-klassen. >

    < Vis tekstområdet i et dialogvindu. >

  }

  // Forslag til hjelpe-metode:
  public static int lesTall( String s )
  {
    < Leser og returnerer et tall fra brukeren.
      Variabelen s kan brukes som ledetekst.>
  }

} // end og class Meteorologi
 

Oppgave 2

a) Skriv en metode public static boolean skuddår( int årstall ) {... } som returnerer true eller false avhengig av om verdien til parameteren årstall er et skuddår eller ikke. Et gitt år er skuddår dersom året er delelig med 4, men ikke med 100, eller dersom året er delelig med 400. Årene 1996 og 2000 er f.eks. skuddår, men ikke året 1900.

b) Skriv en metode public static int månedsdager( int måned, int år ) { ... } som returnerer antall dager i måneden angitt ved parameter måned i året angitt ved parameteren år. Det forutsettes at måneden er i intervallet 1 til 12. Metoden skal returnere riktig antall dager for måned nr. 2 også for skuddår (gjør kall på metoden i spørsmål a) for å sjekke om det er skuddår).

c) Skriv en metode public static boolean okDato( int dag, int mnd, int år ) { ... } som returnerer true i tilfelle datoen angitt ved parametrenes verdier er en gyldig dato, dvs. mnd fra 1 til 12, dag mellom 1 og antall dager i vedkommende måned i vedkommende år. (Ta hensyn til skuddår.)

Gjør bruk av metodene i a) og b) når du skal sjekke om datoen er gyldig! Metoden skal returnere false dersom datoen ikke er gyldig.

d) Skriv en metode public static String månedsnavn( int mnd ) { ... } som returnerer navnet på måneden angitt ved parameterverdien. Metoden skal returnere "ukjent måned" i tilfelle måneden ikke finnes.

Tekststrenger (dvs. String-objekter) er på tilsvarende måte som arrayer indeksert fra 0 og oppover. Dvs. første tegn i strengen har indeksposisjon 0, andre tegn har indeksposisjon 1, etc. String-metoden substring kan brukes til å trekke ut en del av en tekststreng. Den del som skal trekkes ut angis ved parametre som representerer indeksposisjoner.

Eksempel Les inn datostrengen "27.09.2010" ved hjelp av instruksjonen

  String input = JOptionPane.showInputDialog( "Skriv dato (dd.mm.åååå):" );

Da vil input.substring( 0, 2 ) returnere strengen "27", input.substring( 3 ,5 ) vil returnere strengen "09" og input.substring( 6 ) vil returnere strengen "2010" (dvs. alt som er igjen fra og med indeksposisjon 6).

Skriv et applikasjonsprogram som leser inn en dato på formatet "dd.mm.åååå", sjekker om en er gyldig og skriver den i så fall ut igjen med månedsnavn. Dersom det f.eks. skrives inn 14.07.1789, skal programmet skrive ut 14. juli 1789. For ugyldig dato skal det skrives ut en feilmelding. Programmet skal gjøre bruk av metodene beskrevet ovenfor. Den klassen du skriver for programmet må derfor inneholde disse metodene i tillegg til main-metoden.

Oppgave 3: Perfekte tall

Et helt tall kalles er perfekt tall dersom tallet er lik summen av alle sine ekte faktorer, inkludert 1. At det er en ekte faktor betyr at faktoren er mindre enn tallet selv. For eksempel er 6 et perfekt tall, siden 6 = 1 + 2 + 3 og 1, 2, 3 er alle de ekte faktorene til 6 (det vil si tall som gir 0 i rest når vi dividerer 6 med dem).

Skriv en metode public boolean perfekt( int tall ) som returnerer true eller false avhengig av om parameteren tall er et perfekt tall eller ikke.

Bruk metoden du har skrevet i et program som skal finne alle perfekte tall innenfor en grense som bruker kan velge ved at programmet leser inn grensen. For alle perfekte tall skal programmet skrive ut tallet sammen med sin faktorsum (tilsvarende som for 6 ovenfor). Utskriften kan plasseres på et tekstområde i en meldingsboks. Til opplysning kan du få vite at det finnes bare 4 perfekte tall mindre enn 10000.

Løsningsforslag

Oppgave 1: Meteorologi/Statistikk.java
Oppgave 1: Meteorologi/Meteorologi.java
Oppgave 2: Datoformat.java
Oppgave 3: PerfekteTall.java
Oppgave 3: Perfektetest.java