AVDELING FOR INGENIØRUTDANNING

EKSAMENSOPPGAVE

Emne:
PROGRAMMERING
Emnekode:
LO 127 A
Faglig veileder:
Eva Vihovde
Kjetil Grønning
Grupper:
1AA, 1AB, 1AC, 1IA
Dato:
12.02.2007
Eksamenstid:
09.00 - 14.00
Eksamensoppgaven består av:   Antall sider (inkl. forsiden og vedlegg): 6  Antall oppgaver: 3 Antall vedlegg: 1 
Tillatte hjelpemidler:   Alle trykte og håndskrevne
Kandidaten må selv kontrollere at oppgavesettet er fullstendig. Ved eventuelle uklarheter i oppgaveteksten skal du redegjøre for de forutsetninger du legger til grunn for løsningen.

Les gjennom hele oppgavesettet før du begynner å besvare deloppgavene.

Utarbeidet av (faglærer): Kontrollert av (en av disse): Studieleders/
Fagkoordinators underskrift:
Annen lærerSensorStudieleder/
Fagkoordinator
  
 
   

VÆROBSERVASJONER OG KLIMASTATISTIKK

Du skal lage deler av et program som kan brukes til registrering av observerte temperaturer og nedbør på forskjellige steder. Av hensyn til oppgavens størrelse er programdelene sterkt forenklet i forhold til det som normalt ville kreves av et slikt program. Det er heller ikke tatt med noe kode for et brukergrensesnitt. Programkoden lar seg imidlertid lett utvide og supplere.

Det er et felles krav for alle klassene som inngår i oppgaven at alle datafelter skal ha privat aksess. Der det ikke er spesifikt angitt hva datatypen skal være, må du selv velge en passende datatype.

Datoer skal representeres som objekter av klassen Dato  som følger som et vedlegg til oppgaveteksten. Det er samme klasse som finnes i det nettbaserte kompendiet Introduksjon til programmering som er brukt i undervisningen.


Oppgave 1

Klassen Observasjon som er skissert nedenfor kan brukes til å registrere minimumstemperatur, maksimumstemperatur og nedbør i løpet av et døgn på ett bestemt sted, sammen med døgnets dato.

public class Observasjon
{
  < datafelt for døgnets dato (av type Dato),
    samt verdier for minimumstemperatur, maksimumstemperatur og
    nedbør i løpet av døgnet, alle av type heltallsverdi. >

  //Konstruktør med parametre for datoens dag, måned og år.
  public Observasjon( int d, int m, int å )
  {
    < gir verdi til dato på grunnlag av parametrene,
      initialiserer temperaturer til -100, nedbør til 0. >
  }

  //Konstruktør med parametre for datoens dag, måned og år, samt
   //for minimumstemperatur, maksimumstemperatur og nedbør.
  public Observasjon( int d, int m, int å,
                      int min, int maks, int nedb )
  {
    < initialiserer datafelter på grunnlag av parametrene.
      For temperaturene er det krav om at minimumstemperatur
      er mindre enn eller lik maksimumstemperatur. Dersom
      mottatte verdier for disse ikke oppfyller kravet, skal
      begge datafelter initialiseres til -100.
      For nedbør er det krav om at den ikke er negativ. Dersom
      mottatt verdi ikke oppfyller dette, initialiseres den til 0. >
  }

  < get-metoder for alle datafeltene >

  < set-metode for minimumstemperatur.
    Dersom maksimumstemperatur på forhånd ikke er satt (det vil si
    har initialverdien på -100), skal mottatt verdi godtas.
    Ellers skal den bare godtas dersom den er mindre enn eller
    lik  maksimumstemperaturen.  >

  < set-metode for maksimumstemperatur.
    Dersom minimumstemperatur på forhånd ikke er satt (det vil si
    har initialverdien på -100), skal mottatt verdi godtas.
    Ellers skal den bare godtas dersom den er større enn eller
    lik  minimumstemperaturen. >

  < set-metode for nedbør. Ny verdi skal ikke settes dersom
    den mottatte verdi er negativ. >
}

a) Skriv programkode for klassens datafelter og konstruktører.

b) Programmer klassens get-metoder.

c) Programmer klassens set-metoder.

 


Oppgave 2

Klassen Sted som er skissert nedenfor, representerer observasjoner (av den type som er beskrevet i oppgave 1) for et helt år på ett bestemt sted.

public class Sted
{
  < datafelt for stedets navn, årstallet, samt en array med
    plass for én Observasjon for hver av årets dager. >

  < Konstruktør med parametre for stedets navn og årstallet.
    Konstruktøren initialiserer alle datafeltene. Ved reservasjon
    av plass for observasjoner skal det tas hensyn til om årstallet
    er skuddår eller ikke. >

  < get-metode for stedets navn, samt for årstallet >

  public boolean settInnData( Observasjon obs )
  {
    < Dersom mottatt observasjon har samme årstall som klassen
      gjelder for, skal observasjonen settes inn på første ledige
      plass i observasjonsarrayen. Returverdien skal indikere om
      innsetting ble foretatt eller ikke. >
  }

  public int månedsnedbør( int måned )
  {
    < Dersom parameteren angir et gyldig månedsnummer (fra 1 til
      12), skal metoden summere og returnere nedbørstallene for alle
      registrerte observasjoner for denne måned. Ved ugylig måned
      skal metoden returnere -1. >
  }

  public int våtestMåned()
  {
    < Finner og returnerer månedsnummeret for den måned som
      har størst månedsnedbør i løpet av året (som klassen
      gjelder for). >
  }

  public int årsnedbør()
  {
    < Finner og returnerer summen av all nedbør som er registrert
      i løpet av året. >
  }

  public double snittMintemp()
  {
    < Finner og returnerer gjennomsnittlig minimumstemperatur
      for alle registrerte observasjoner. Dersom det ikke er gjort
      noen observasjoner, skal metoden returnere verdien -100.0. >
  }

  public int årsmakstemp()
  {
    < Finner og returnerer den største maksimumstemperaturen
      som er registrert i løpet av året. Dersom det ikke er gjort
      noen observasjoner, skal metoden returnere verdien -100.0. >
  }

  public String varmesteDager()
  {
    < Finner og returnerer alle datoer som hadde maksimumstemperatur
      lik den største som ble registrert i løpet av året. Datoene skal
      gjengis som det blir gjort av Dato-klassens toString-metode,
      med et mellomrom mellom de forskjellige datoene. >
  }
}

a) Skriv programkode for klassens datafelter, konstruktør og de nevnte get-metodene.

b) Programmer metoden settInnData.

c) Programmer metoden månedsnedbør.

d) Programmer metodene våtestMåned og årsnedbør.

e) Programmer metodene snittMintemp og årsmakstemp.

f) Programmer metoden varmesteDager.

 

Oppgave 3

Klassen Norgesdata som er skissert nedenfor, representerer årsobservasjoner for et antall steder, maksimalt for så mange som konstanten MAXANTALL angir.

public class Norgesdata
{
  private int år;
  private Sted[] steder; //for lagring av registrerte steder
  public static final int MAXANTALL = 100; //maksimalt antall steder
  int antSteder;  //antall registrerte steder

  public Norgesdata( int år )
  {
    < foretar nødvendig initialisering >
  }

  < get-metode for år >

  public boolean nyttSted( Sted s )
  {
    < Registrerer mottatt sted forutsatt at det er plass og at
      stedets år stemmer med det som klassen gjelder for.
      Returverdien indikerer om registrering ble utført. >
  }

  public String varmestSted()
  {
    < Finner og returnerer navnet på det stedet som i løpet av
      året har registrert høyest maksimumstemperatur, sammen med
      denne temperaturen. (Du kan anta at det bare finnes ett slikt
      sted.) I tilfelle manglende observasjoner, skal metoden
      returnere null. >
  }

  public String mestMånedsnedbør()
  {
    < Finner og returnerer navnet på det stedet som i løpet av
      året hadde mest nedbør i løpet av en måned. Det aktuelle
      nedbørstallet skal returneres sammen med stedsnavnet og
      navnet på måneden. I tilfelle manglende observasjoner,
      skal metoden returnere null. >
  }

  public String våtestSted()
  {
    < Finner og returnerer navnet på det stedet som har mest
      nedbør i løpet av året. Det aktuelle nedbørstallet skal
      returneres sammen med stedsnavnet. I tilfelle manglende
      observasjoner, skal metoden returnere null. >
  }

  public String kjøligOgVått( double mintempgrense, int nedbørgrense )
  {
    < Finner og returnerer navnene på alle steder som har
      gjennomsnittlig minimumstemperatur mindre enn første
      parameter angir og som også har årsnedbør større enn
      den grense andre parameter angir. Mellom hvert stedsnavn
      skal det være et mellomrom. I tilfelle det ikke finnes
      noen slike steder, skal metoden returnere en tom streng. >
  }
}

a) Programmer konstruktør, get-metode, og metoden nyttSted.

b) Programmer metoden varmestSted.

c) Programmer metoden mestMånedsnedbør.

d) Programmer metoden våtestSted.

e) Programmer metoden kjøligOgVått.

 

VEDLEGG

public class Dato
{
  private int dag, måned, år;

  public Dato( int d, int m, int å )
  {
    if ( okDato( d, m, å ) )
    {
      dag = d;
      måned = m;
      år = å;
    }
  }

  public String toString()
  {
    return dag + ". " + månedsnavn( måned ) + " " + år;
  }

  public static boolean skuddår( int år )
  {
    if ( (år % 4 == 0) && (år % 100 != 0) || (år % 400 == 0) )
      return true;
    else
      return false;
  }

  public static int månedsdager( int måned, int år )
  {
    int[] dager = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    int antDager = dager[ måned - 1 ];
    if ( måned == 2 && skuddår( år ) )
      antDager++;
    return antDager;
  }

  public static boolean okDato( int dag, int mnd, int år )
  {
    if ( mnd < 1 || mnd > 12 )
      return false;
    else
    {
      int antdg = månedsdager( mnd, år );
      if ( dag > 0 && dag <= antdg )
        return true;
      else
        return false;
    }
  }

  public static String månedsnavn( int mnd )
  {
    String[] navn = { "januar", "februar", "mars", "april", "mai",
                      "juni", "juli", "august", "september",
                      "oktober", "november", "desember" };
    if ( mnd > 0 && mnd < 13 )
      return navn[ mnd - 1 ];
    else
      return "ukjent måned";
  }

  public boolean sammeDato(Dato d)
  {
    return dag == d.dag && måned == d.måned && år == d.år;
  }

  public int getDag()
  {
    return dag;
  }

  public int getMåned()
  {
    return måned;
  }

  public int getÅr()
  {
    return år;
  }
}