Eksamenssett logo
eksamenssett.noTren målrettet
  • Ungdomsskole/VGS
  • Høyskole
  • Ressurser
  • Skolenyttig
  • Forum
eksamenssett.noTren målrettet

Komplett samling av eksamensoppgaver og løsninger for norsk skole.

Om ossFAQPersonvernVilkårAngrerettKontakt

© 2025 Eksamenssett.no · Alle rettigheter forbeholdt

Innholdet er utviklet med AI-verktøy og kvalitetssikres kontinuerlig. Slik jobber vi med kvalitet →

Eksamenssett.no eies og drives av Studenthjelp Privatundervisning AS

Eksamenssett logo
eksamenssett.noTren målrettet
  • Ungdomsskole/VGS
  • Høyskole
  • Ressurser
  • Skolenyttig
  • Forum
eksamenssett.noTren målrettet

Komplett samling av eksamensoppgaver og løsninger for norsk skole.

Om ossFAQPersonvernVilkårAngrerettKontakt

© 2025 Eksamenssett.no · Alle rettigheter forbeholdt

Innholdet er utviklet med AI-verktøy og kvalitetssikres kontinuerlig. Slik jobber vi med kvalitet →

Eksamenssett.no eies og drives av Studenthjelp Privatundervisning AS

Eksamenssett logo
eksamenssett.noTren målrettet
  • Ungdomsskole/VGS
  • Høyskole
  • Ressurser
  • Skolenyttig
  • Forum
eksamenssett.noTren målrettet

Komplett samling av eksamensoppgaver og løsninger for norsk skole.

Om ossFAQPersonvernVilkårAngrerettKontakt

© 2025 Eksamenssett.no · Alle rettigheter forbeholdt

Innholdet er utviklet med AI-verktøy og kvalitetssikres kontinuerlig. Slik jobber vi med kvalitet →

Eksamenssett.no eies og drives av Studenthjelp Privatundervisning AS

Eksamenssett logo
eksamenssett.noTren målrettet
  • Ungdomsskole/VGS
  • Høyskole
  • Ressurser
  • Skolenyttig
  • Forum
eksamenssett.noTren målrettet

Komplett samling av eksamensoppgaver og løsninger for norsk skole.

Om ossFAQPersonvernVilkårAngrerettKontakt

© 2025 Eksamenssett.no · Alle rettigheter forbeholdt

Innholdet er utviklet med AI-verktøy og kvalitetssikres kontinuerlig. Slik jobber vi med kvalitet →

Eksamenssett.no eies og drives av Studenthjelp Privatundervisning AS

Eksamenssett logo
eksamenssett.noTren målrettet
  • Ungdomsskole/VGS
  • Høyskole
  • Ressurser
  • Skolenyttig
  • Forum
  1. Hjem
  2. Informasjonsteknologi
  3. IT 2 – JavaScript
  4. Løsning Vår 2024
VG3

Løsningsforslag Informasjonsteknologi IT 2 – JavaScriptVår 2024

Se eksamensoppgaven
Høst 2024NyereHøst 2023Eldre
Om løsningsforslaget: Dette er et veiledende løsningsforslag laget av eksamenssett.no for REA3049-JS Vår 2024. Vi gir korrekte svar på flervalgsoppgavene med begrunnelse, fullstendig JavaScript-kode for programmeringsoppgavene (5c, 6, 9, 10), og eksempelsvar på drøftingsoppgavene om deepfakes (7–8).

Løsningsforslag – IT 2 JavaScript Vår 2024

Eksamen: REA3049-JS | Semester: Vår 2024 | Tema: OOP, pseudokode, Fibonacci, kalkulator, deepfakes, tidsbruk-datasett, Game of Life

Oppgave 1 – Hva er en klasse?

Riktig svar: En klasse er en mal eller en prototype for objekter.

En klasse definerer hvilke egenskaper og metoder objektene skal ha — selve objektet er en instans. I JavaScript er dette spesielt synlig: klasser er syntaktisk sukker for prototypemønsteret, der alle instanser deler samme prototype-objekt.

Oppgave 2 – Arv og klasserelasjoner

Riktig svar: B er en spesialisering av A.

Når B arver fra A, er B en mer spesialisert versjon av A. Generaliseringen går motsatt vei: A er generaliseringen.

Oppgave 3 – Sporing av pseudokode

Oppgaven: b=4, c=5; FOR a fra 2 til 4: DISPLAY c, DECREMENT b, SET c TO c+b.
Riktig svar: 5 8 10
aDISPLAY cb etter DECREMENTc etter c+b
2535+3 = 8
3828+2 = 10
410110+1 = 11

Oppgave 4 – Sortering av pseudokode

Riktig rekkefølge:
SET num to -2
FOR hver num LESSER THAN OR EQUAL TO 2
  IF num LESSER THAN 0
    IF num % 2 EQUAL TO 0
      DISPLAY num + " er negativt og partall"
    ELSE
      DISPLAY num + " er negativt og oddetall"
    ENDIF
  ELSE IF num EQUAL TO 0
    DISPLAY num + " er null"
  ELSE
    IF num % 2 EQUAL TO 0
      DISPLAY num + " er positivt og partall"
    ELSE
      DISPLAY num + " er positivt og oddetall"
    ENDIF
  ENDIF
ENDFOR

Oppgave 5 – Fibonacci-tall

Oppgave 5a – Hva blir vist?

Riktig svar: 55

Fibonacci-sekvensen: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55. a[10] = 55.

Oppgave 5b – Forklaring

Algoritmen genererer Fibonacci-tallene iterativt: hvert nytt tall er summen av de to foregående, med startverdiene 0 og 1. Iterativ tabulering gir O(n) tid og O(n) plass — mye raskere enn naiv rekursjon som er eksponentiell.

Oppgave 5c – De ti første Fibonacci-partall (JavaScript)

// oppgave5c.mjs — første ti Fibonacci-partall

export function fibonacciPartall(antall = 10) {
  let a = 0n, b = 1n;  // BigInt for å unngå overflyt på store tall
  const partall = [];
  while (partall.length < antall) {
    if (a % 2n === 0n) partall.push(a);
    [a, b] = [b, a + b];
  }
  return partall;
}

console.log(fibonacciPartall().map(String));
// ["0","2","8","34","144","610","2584","10946","46368","196418"]
Flytskjema: Start → SET a=0n, b=1n, partall=[] → LOOP: er partall.length < 10? → JA: er a % 2n == 0n? → JA: legg a i partall → uansett: [a, b] ← [b, a+b] → tilbake til LOOP. NEI: SKRIV partall → Slutt.

Oppgave 6 – Kalkulator-klasse

// kalkulator.mjs

export class KalkulatorFeil extends Error {
  constructor(melding) {
    super(melding);
    this.name = "KalkulatorFeil";
  }
}

export class Kalkulator {
  pluss(a, b) { return a + b; }
  minus(a, b) { return a - b; }
  gange(a, b) { return a * b; }
  dele(a, b) {
    if (b === 0) throw new KalkulatorFeil("Kan ikke dele på null.");
    return a / b;
  }
}

// Test-program
function testKalkulator() {
  const k = new Kalkulator();
  console.assert(k.pluss(2, 3) === 5);
  console.assert(k.minus(10, 4) === 6);
  console.assert(k.gange(3, 7) === 21);
  console.assert(k.dele(20, 4) === 5);

  // Feil 1: Deling på null
  try { k.dele(10, 0); }
  catch (e) { console.log(`OK – fanget: ${e.message}`); }

  // Feil 2: Strengkonkatenering når man forventet tall
  // JS er løs typet, så pluss("2", 3) returnerer "23" — ikke en feil i seg selv,
  // men en kilde til subtile bugs. Bedre: verifiser typer.
  const resultat = k.pluss("2", 3);
  console.log(`Type-pitfall: pluss("2", 3) = ${resultat} (string!)`);

  // Feil 3: NaN propageres
  const ugyldig = k.pluss(NaN, 5);
  console.assert(Number.isNaN(ugyldig));

  console.log("Tester ferdig.");
}

testKalkulator();

Identifiserte feil/unntak: (1) Deling på null — håndtert med KalkulatorFeil. (2) Type-coercion — JavaScripts +-operator gjør strengkonkatenering hvis ett operand er streng. Forsvarsstrategi: valider med typeof a === "number" ved input. (3) NaN-propagering — én NaN-verdi forurenser hele kjeden. Bør sjekkes med Number.isFinite().

Oppgave 7 – Deepfakes (flervalg)

Spm.Riktig svarBegrunnelse
a) Hva er deepfakes?manipulerte medierDeepfakes er video/lyd/bilde manipulert med KI/maskinlæring.
b) Mulig konsekvens?økt risiko for politisk manipuleringSom artikkelen viser — deepfakes brukes for å sverte politiske motstandere.
c) Hvordan avsløre?ved å bruke teknikker fra kildekritikkSjekke avsender, søke etter videoen andre steder, vurdere sannsynlighet.

Oppgave 8 – Deepfakes (drøfting)

Oppgave 8a – Avsløre og forebygge svindel

Hvordan avsløre: Lytte etter unaturlige pauser, robotiske intonasjoner og lyd som ikke matcher leppene. På video — se etter ujevn belysning, kanter mellom ansikt og bakgrunn som flimrer, unaturlige blunkemønstre. Ved kritiske beslutninger — særlig økonomiske transaksjoner — alltid verifisere gjennom en annen kanal.

Forebyggende tiltak i bedriften:

  • Verifikasjonsrutine: Obligatorisk «callback»-prosedyre for alle pengetransaksjoner over en terskel.
  • Kodeord: Hemmelige fraser som ledergruppen bruker til å bekrefte identitet.
  • Opplæring: Regelmessige treningsøkter med simulerte angrep.
  • Tekniske verktøy: Deepfake-deteksjon i videomøteplattformer.
  • To-faktor-godkjenning: Beslutninger som tidligere ble tatt på ett møte, krever nå godkjenning fra to ulike kanaler.

Oppgave 8b – Deepfakes i jobbsøkerprosessen

For: Realistiske press-scenarier kan avsløre faglig modenhet bedre enn et tradisjonelt intervju. Ved åpenhet og samtykke kan det være et legitimt verktøy for stillinger der krisemestring er kritisk.

Mot:

  • Samtykke og transparens: Hvis kandidaten ikke vet at hen møter deepfakes, krenkes prinsippet om informert samtykke (GDPR art. 5).
  • Bruk av kandidatens stemme/ansikt: Krever særskilt grunnlag etter GDPR art. 9 (biometriske data). Hvor lagres modellen? Slettes den etter intervjuet?
  • Strukturell skjevhet: Hvis simuleringene representerer enkelte grupper på bestemte måter, kan de forsterke fordommer.
  • Stress og psykologisk belastning: Deepfake-scenarier kan utfordre virkelighetsoppfatningen og være skadelige for personer med angst.
  • Tillit: En kandidat som har vært utsatt for deepfake-vurdering, kan utvikle grunnleggende mistillit til arbeidsgiver.

Konklusjon: Deepfakes i ansettelsesprosesser kan ha legitime formål, men forutsetter eksplisitt samtykke, klare retningslinjer for sletting av biometriske data, og grundig etisk evaluering før innføring.

Oppgave 9 – Tidsbruk-datasett

// oppgave9.mjs — analyse av SSB-tidsbruk-datasett (2000)
import { readFileSync, writeFileSync } from "node:fs";
import readline from "node:readline/promises";
import { stdin as input, stdout as output } from "node:process";

function tidTilMinutter(verdi) {
  if (!verdi) return 0;
  const [t, m = "0"] = verdi.split(".");
  return Number(t) * 60 + Number(m);
}

function lesData(filsti = "tidsbruk_2000.csv") {
  const linjer = readFileSync(filsti, "utf-8").trim().split(/\r?\n/);
  const [headerLinje, ...rest] = linjer;
  const headers = headerLinje.split(";");
  return rest.map(linje => {
    const verdier = linje.split(";");
    return Object.fromEntries(headers.map((h, i) => [h, verdier[i]]));
  });
}

function visTabell(data, kjonn = "Alle") {
  const rader = kjonn === "Alle" ? data : data.filter(r => r["Kjønn"] === kjonn);
  console.log(`\n${"Aktivitet".padEnd(28)}${"Kjønn".padEnd(10)}${"Tidsbruk".padStart(10)}`);
  console.log("-".repeat(48));
  for (const r of rader) {
    console.log(r["Aktivitet"].padEnd(28) + r["Kjønn"].padEnd(10) + r["Tidsbruk"].padStart(10));
  }
}

// SVG-stolpediagram (uten eksterne bibliotek)
function stolpediagramSvg(data, kjonn) {
  const rader = data.filter(r => r["Kjønn"] === kjonn && (r["Type"] || "aktivitet") === "aktivitet");
  const bredde = 800, hoyde = 500, padding = 80;
  const stolpebredde = (bredde - padding * 2) / rader.length - 4;
  const verdier = rader.map(r => tidTilMinutter(r["Tidsbruk"]));
  const maks = Math.max(...verdier);

  let svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${bredde}" height="${hoyde}">`;
  svg += `<text x="${bredde/2}" y="30" text-anchor="middle" font-size="18" font-weight="bold">Tidsbruk per aktivitet — ${kjonn}</text>`;
  rader.forEach((r, i) => {
    const v = verdier[i];
    const h = ((hoyde - padding * 2) * v) / maks;
    const x = padding + i * (stolpebredde + 4);
    const y = hoyde - padding - h;
    svg += `<rect x="${x}" y="${y}" width="${stolpebredde}" height="${h}" fill="#1976D2"/>`;
  });
  svg += `</svg>`;
  writeFileSync(`stolpe_${kjonn.toLowerCase()}.svg`, svg);
  console.log(`Stolpediagram lagret som stolpe_${kjonn.toLowerCase()}.svg`);
}

async function main() {
  const data = lesData();
  const rl = readline.createInterface({ input, output });
  const kjonn = ((await rl.question("Velg kjønn (Alle / Menn / Kvinner): ")).trim());
  rl.close();
  const normalisert = kjonn[0].toUpperCase() + kjonn.slice(1).toLowerCase();
  visTabell(data, normalisert);
  if (normalisert !== "Alle") stolpediagramSvg(data, normalisert);
}

main();

Oppgave 10 – Game of Life (HTML5 Canvas)

<!DOCTYPE html>
<html lang="no">
<head><meta charset="utf-8"><title>Game of Life</title></head>
<body style="text-align:center;font-family:sans-serif">
<h2>Conways Game of Life</h2>
<canvas id="lerret" width="540" height="540" style="border:1px solid #999"></canvas>
<div>
  <button id="toggle">Start/Pause</button>
  <button id="steg">Steg</button>
  <button id="tom">Tøm</button>
</div>
<script>
const RUTER = 30, CELLE = 18;
const START_LEVENDE = 1 / 3;

class Spillebrett {
  constructor(rader, kolonner) {
    this.rader = rader;
    this.kolonner = kolonner;
    this.celler = Array.from({length: rader},
      () => Array.from({length: kolonner}, () => Math.random() < START_LEVENDE));
  }
  tom() {
    for (let r = 0; r < this.rader; r++)
      for (let k = 0; k < this.kolonner; k++) this.celler[r][k] = false;
  }
  veksle(r, k) { this.celler[r][k] = !this.celler[r][k]; }
  levendeNaboer(r, k) {
    let n = 0;
    for (let dr = -1; dr <= 1; dr++)
      for (let dk = -1; dk <= 1; dk++) {
        if (dr === 0 && dk === 0) continue;
        const nr = r + dr, nk = k + dk;
        if (nr >= 0 && nr < this.rader && nk >= 0 && nk < this.kolonner && this.celler[nr][nk]) n++;
      }
    return n;
  }
  nesteGenerasjon() {
    const ny = this.celler.map(rad => [...rad]);
    for (let r = 0; r < this.rader; r++)
      for (let k = 0; k < this.kolonner; k++) {
        const n = this.levendeNaboer(r, k);
        ny[r][k] = this.celler[r][k] ? (n === 2 || n === 3) : (n === 3);
      }
    this.celler = ny;
  }
}

const brett = new Spillebrett(RUTER, RUTER);
const ctx = document.getElementById("lerret").getContext("2d");
let kjorer = false;

function tegn() {
  for (let r = 0; r < brett.rader; r++)
    for (let k = 0; k < brett.kolonner; k++) {
      ctx.fillStyle = brett.celler[r][k] ? "#1a2b4a" : "#fafafa";
      ctx.fillRect(k * CELLE, r * CELLE, CELLE - 1, CELLE - 1);
    }
}

document.getElementById("lerret").addEventListener("click", e => {
  const r = (e.offsetY / CELLE) | 0;
  const k = (e.offsetX / CELLE) | 0;
  brett.veksle(r, k);
  tegn();
});

document.getElementById("toggle").onclick = () => { kjorer = !kjorer; if (kjorer) loop(); };
document.getElementById("steg").onclick = () => { brett.nesteGenerasjon(); tegn(); };
document.getElementById("tom").onclick = () => { kjorer = false; brett.tom(); tegn(); };

function loop() {
  if (!kjorer) return;
  brett.nesteGenerasjon();
  tegn();
  setTimeout(loop, 200);
}

tegn();
</script></body></html>
Hovedpunkter for sensor:
  • Modell og view skilt: Spillebrett-klassen håndterer regler og tilstand; tegningen skjer i en ren funksjon mot Canvas-konteksten.
  • Synkron oppdatering (alle celler sjekkes mot samme generasjon før noen endres) er kritisk for korrekt Game of Life.
  • De fire reglene implementeres kompakt i én linje: levende → naboer===2 || naboer===3 og død → naboer===3.

Oppgave 11 – Innlevering

123456/
├── oppgave5c/oppgave5c.mjs
├── oppgave6/kalkulator.mjs
├── oppgave9/
│   ├── oppgave9.mjs
│   └── tidsbruk_2000.csv
├── oppgave10/game_of_life.html
└── README.md   (krev: Node.js 18+ for ESM)
Laster…
Nyere løsning
Høst 2024
Eldre løsning
Høst 2023

Alle løsningsforslag for IT 2 – JavaScript

Vår 2025Høst 2024Vår 2024Høst 2023
Se eksamensoppgaven
eksamenssett.noTren målrettet

Komplett samling av eksamensoppgaver og løsninger for norsk skole.

Om ossFAQPersonvernVilkårAngrerettKontakt

© 2025 Eksamenssett.no · Alle rettigheter forbeholdt

Innholdet er utviklet med AI-verktøy og kvalitetssikres kontinuerlig. Slik jobber vi med kvalitet →

Eksamenssett.no eies og drives av Studenthjelp Privatundervisning AS