IT2 - Prøve - 06.04.2017


Del I - Teori - Leveres på papir.

1 Hvilke tre typer feil har vi i programmer?

Se notatet Programmeringsfeil og debugging og side 135 i læreboken.

Logiske feil: Feil som gjør at koden ikke gjør det den skal gjøre etter spesifikasjonene.

Syntaktiske feil:

2 Følgende kode har en feil:

function finn(so: String,felt: String,t: Array):int {
   var funnet: Boolean = false;
   var indeks: int = -1;
   var i: int = 0;
   while( (i<t.length) && !funnet ) {
      if(t[i][felt]==so): {
         funnet = true;
         indeks = i;
      }
      i++;
   }
   return indeks;
}

og genererer derfor feilmeldingen: "1084: Syntax error: expecting identifier before colon." Hva er feilen?

Det er et ekstra kolon, merket rødt, i linje 6 i koden.
Feilmeldingen skyldes at når kompilatoren forventer variabelnavn:datatype når den finner et
kolon. (Variabelnavn er "identifier", altså et navn som identifiserer en variabel.)

3 Beskriv kort hvilke hovedpunkter (kapitteloverskrifter) som bør være med i en kravspesifikasjon.

Se notatet Planlegging og dokumentasjon og side 163 i læreboken.

  • Oppdragsgivers ønsker, men lages i samarbeid med utviklere.
  • Hensikten med systemet?
  • Hva skal systemet gjøre?
  • Hvilke krav skal settes til systemet?
    • Tidsfrister
    • Kostnader
    • Nøyaktighet
    • Pålitelighet
    • Ytelse
    • Sikkerhet
  • 4 Hva er hensikten og det man tilstreber ved såkalt objektorientert programmering?

    Se notatet OOP og side 155 i læreboken.

  • Lage stabil og feilfri programvare.
  • Lage programvare med bedre struktur.
  • Gi muligheter til å forbedre planleggingen av programvare.
  • Lage programvare som er enklere å vedlikeholde. (Rette og forbedre.)
  • Gjenbruk av programvare som fungerer bra og er godt uttestet og godt laget.
  • Utvidbarhet av programvare som fungerer bra og er godt uttestet og godt laget.
  • 5 Hvilke tillegg/mekanismer må et objektorientert språk ha i tillegg til variabler, tabeller, valg- og løkker og funksjoner?

    Se notatet OOP og side 152-154 i læreboken.

    6 Gi eksempler der det er rimelig å ha en lytterfunksjon koblet til flere komponenter.

    Se side 214 i lærebok.

    Radioknapper, sjekkbokser, piltaster og tastaturbehandling er eksempler.
    Når samme ting må gjøres for flere komponenter, som for eksempel en oppdatering av brukergrensesnittet som må skje uansett hvilken komponent som har endret på noe.

    7 Hvilken egenskap i et hendelsesobjekt kan vi bruke til å finne ut hvilken komponent som utløste hendelsen?

    Se side 221 i læreboken.

    currenttarget: Denne egenskapen inneholder komponenten som utløste hendelsen.

    target: Denne egenskapen er komponenten som levererer hendelsen.
    Eksempelvis kan stage fange opp KeyboardEvent fra alle tastene i tastaturet.
    Da er target lik stage, som
    leverer hendelsen og currenttarget tasten som utløste hendelsen.

    8 Når vil en lytterfunksjon tikk() bli utført hvis vi har gjort denne oppkoblingen:

    stage.addEventListener(Event.ENTER_FRAME, tikk);

    Se side 226 i læreboken.

    I samme takt som bildehastigheten (framerate), normalt 24 ganger i sekunder.

    9 Skriv kode som legger inn og setter opp en numerisk stepper i brukergrensesnittet, slik at brukeren bare kan velge 10,20,30,40 og 50.

    Se side 239 i læreboken

    (Innlegging i brukergrensesnitt må gjøres i Flash, forutsetter navn ns.)
    ns.minimum = 10;
    ns.maximum = 50;
    ns.stepSize = 10;
    ns.value = 10;

    10 Hvilken egenskap i Slider og NumericStepper inneholder tallet brukeren har valgt?

    Se side 239 i læreboken og oppgave 9: ns.value inneholder valgt verdi.

    Del II - Programmering

    Levers i mappen: Prøve 060417 i ItsLearning

    1

    Lag en applikasjon som skal se omtrent slik ut:

    Applikasjonen skal oppdatere pris-feltet hver gang du endre input i noen av de andre komponentene.
    Legg inn en pristabell som i hvertfall har med tre flyplasser. (Vi ser bort fra valg av dato.)

    Løsningsskisse:

    /*
       Del II - 06.05.2017
       Bestilling av flytur
       GUI:
          fraCb, tilCb
    	  antallNs, enveiRb, turreturRb
    	  prisTa
    */
    /// --- Datastruktur --- ///
    // Indekser til kombobokser og tabeller:
    const GARDERMOEN:  int    =  0;
    const VARNES:      int    =  1;
    const FLESLAND:    int    =  2;
    const RABATT:      int    = 10;  // 10% rabatt på tur-retur
    const FEILMELDING: String = "Du må velge flyplasser!";
    var   pristabell: Array   = 
       [
          [       0,    1200,     1100],
          [    1200,       0,     1000],
          [    1100,    1000,        0]
       ];
    /// --- Programstruktur --- ///
    // variabler
    var pris:        Number  = 0.0;
    var grunnpris:   Number  = 0.0;   // Fra pristabell
    var antall:      int     = 1;
    var turretur:    Boolean = false; // Tur/retur eller en vei
    var gyldigInput: Boolean = false;
    // Funksjoner/underprogram
    // Lytterfunksjon:
    function noeBleEndret(evt: Event): void {
       hentBrukerInput();
       if( gyldigInput ) {
          pris = beregnPris();
          prisTa.text = pris.toFixed(0);
       }//if
    }//noeBleEndret()
    function hentBrukerInput():void {	
       var fra: int = fraCb.selectedIndex;
       var til: int = tilCb.selectedIndex;
       if( (fra >= 0) && (til >= 0) ) {
          grunnpris = pristabell[fra][til]; 
          antall = antallNs.value;
          turretur = turreturRb.selected;
          gyldigInput = true;
       }else{
          prisTa.text = FEILMELDING;
          gyldigInput = false;
       }//if bruker har valgt flyplasser	
    }//hentBrukerInput()
    function beregnPris(): Number {
       var pris: Number = grunnpris;
       if( turretur ) {
          pris = 2*grunnpris*(100-RABATT)/100;
       }//if
       return antall*pris;
    }//beregnPris()
    // Hovedprogram:
    // Kobler opp lytterfunksjonen:
    fraCb.addEventListener(Event.CHANGE,noeBleEndret);
    tilCb.addEventListener(Event.CHANGE,noeBleEndret);
    antallNs.addEventListener(Event.CHANGE,noeBleEndret);
    // Henger lytter på radioknapp-gruppen:
    enveiRb.group.addEventListener(Event.CHANGE,noeBleEndret);