Kodeforståelsesoppgaver (total videotid: 52:09)

Oppgave 3.1.1: If-setninger

Hvilken verdi har x, y og z etter at det følgende scriptet har kjørt?
oppgave_1.m
a = 2;
if a + 3 > 4
   x = 1;
end
if a >= 3
  y = 1;
elseif a >= 2
  y = 2;
elseif a >= 1
  y = 3;
end
if a ~= 2
  z = 1;
else
  z = 2;
end

Videoforklaring (5:47)

Svar

x =
     1
y =
     2
z =
     2

Oppgave 3.1.2: Tvilsom bruk av if-setninger

Scriptet under inneholder tre if-setninger. Hva er merkelig med disse?
oppgave_2.m
x = 2;
x == 3;
if true
 x = 4;
end
if x < 0
 y = 1;
elseif x < -1
 y = 2;
elseif x < -2
 y = 3;
else
 y = 4;
end
test = x >= 4;
if test == true
 z = 1;
elseif test == false
 z = 2;
end

Videoforklaring (9:02)

Svar

  1. Første if-setning er merkelig fordi uttrykket er konstant true. Antakeligvis skulle uttrykket på linjen over vært brukt som if-setning-uttrykk.
  2. Andre if-setning er merkelig fordi betingelsene som står etter begge elseif er dekket av betingelsen som står etter if. Siden den første betingelsen sjekkes først, vil koden etter elseif aldri kjøre. Antakeligvis skulle rekkefølgen på betingelsene vært reversert, slik at den strengeste kom først.
  3. Siste if-setning har en unødvendig sjekk på om en sannhetsverdi er true. Dette sjekkes uansett av Matlab. Betingelsen etter elseif dekker alle andre tilfeller, og elseif kunne vært byttet ut med else.

Oppgave 3.1.3: Switch-setninger

 

Hva er variablene x, y og z bundet til etter at følgende script er kjørt?
a = 1;
switch a + 2
    case 1
        x = 1;
    case 1+1
        y = 1;
    case {3, 4, 5}
        z = 1;
    otherwise
        x = 1; y = 2; z = 3;
end

Videoforklaring (4:06)

Svar

 x og y er ubundet, z er bundet til verdien 1.

Oppgave 3.1.4: For-løkker gjentar kodeutførelse

 

Hva gjør denne funksjonen, hvis bat kan være desimaltall og rat kan være et ikke-negativt heltall?
function hat = oppgave_4(bat, rat)
    hat = 1;
    for i = 1:rat
        hat = hat * bat;
    end
end

Videoforklaring (9:54)

Svar

 Den regner ut bat opphøyd i rat.

Oppgave 3.1.5: Iterasjonsvariabel i for-løkke

 

Hva skrives ut hvis vi kjører det følgende scriptet?
for i = 1:3
  if i == 2
    disp('går');
  elseif i == 1
    disp('dette');
  else
    disp('bra');
  end
end

Videoforklaring (6:11)

Svar

dette
går
bra

Oppgave 3.1.6: Tilordning til teller-variabel i for-løkke

 

Hva skrives ut hvis vi kjører det følgende scriptet?
for i = 1:3
  i = i * 2;
  disp(i);
end

Videoforklaring (8:32)

Svar

     2
     4
     6

Oppgave 3.1.7: For-løkke med matriser

 

Hva skrives ut hvis vi kjører det følgende scriptet?
s = 0;
M = [ 1, 2, 3; 4, 5, 6; 7, 8, 9 ];
for c = M
    for e = c
        s = s + e;
    end
end
disp(s);

Videoforklaring (8:37)

Svar

     6
    15
    24

Kodeoppgaver (total videotid: 1:13:04)

Oppgave 3.2.1: Skriv ut velkomstmelding

Du ønsker å lage et Matlab-program som kan hilse deg velkommen når du starter Matlab. Du er svært nøye på at korrekt hilsen brukes til rett tid på dagen, og har laget følgende oversikt over hva du ønsker at Matlab-programmet ditt skal si.

Du vet at du kan avgjøre hvilken time på dagen det er ved hjelp av Matlab-uttrykket hour(datetime('now')), og hvilket minutt det er med Matlab-uttrykket minute(datetime('now')).

Lag et script som skriver ut en hilsen som passer nåværende klokkeslett når det kjøres.

Videoforklaring (12:45)

Løsningsforslag

startup.m
h = hour(datetime('now'));
m = minute(datetime('now'));
if h < 4 || h >= 22
    disp('God natt');
elseif h < 9
    disp('God morgen');
elseif h < 14 || h == 14 && m < 30
    disp('God formiddag');
elseif h < 19 || h == 19 && m < 30
    disp('God ettermiddag');
else
    disp('God kveld');
end

For å få scriptet til å kjøre ved oppstart av Matlab, plasser scriptet i den mappen som Matlab har oppe (i vinduet til venstre i programmet) når Matlab starter. Scriptet må hete startup.m for at det skal fungere.

Oppgave 3.2.2: Konverter fra romersiffer

 

Lag en funksjon som kan konvertere fra et romersiffer til den tilsvarende tallverdien. Konverteringstabellen er oppgitt under. Avslutt med en feilmelding hvis et ugyldig romersiffer gis inn.

Videoforklaring (5:38)

Løsningsforslag

fra_romersiffer.m
function tall = fra_romersiffer(romersiffer)
    switch romersiffer
        case 'I'
            tall = 1;
        case 'V'
            tall = 5;
        case 'X'
            tall = 10;
        case 'L'
            tall = 50;
        case 'C'
            tall = 100;
        case 'D'
            tall = 500;
        case 'M'
            tall = 1000;
        otherwise
            error('Ugyldig romersiffer');
    end
end

Oppgave 3.2.3: Skreddersydd Fahrenheit-oversikt

 

Du har tidligere laget et script som produserer en oversikt over hvilke Fahrenheit-verdier som tilsvarer en rekke Celsius-referanseverdier.  Du vil nå dele dette scriptet med dine venner, og de har ytret et ønske om å kunne bruke andre referanseverdier enn de du har brukt.

Utvid scriptet til å spørre om brukeren ønsker å skrive inn egne referanseverdier, eller om de eksisterende skal brukes. Hvis brukeren ønsker å skrive inn egne verdier, skal scriptet først spørre om hvor mange verdier brukeren vil skrive inn. Deretter skal alle verdiene leses inn, og fortløpende konverteres til Fahrenheit og skrives til skjerm.

Utdelt kode

fahrenheit.m
cels2fahr(-20)
cels2fahr(0)
cels2fahr(18)
cels2fahr(37)
cels2fahr(100) 
cels2fahr.m
function retur = cels2fahr(celsius)
    retur = 9/5*celsius + 32;
end 

Videoforklaring (14:58)

Løsningsforslag

fahrenheit.m
svar = input('Ønsker du å skrive inn egne Celsius-verdier? (ja/nei) ', 's');
if strcmp(svar, 'ja')
    antall = input('Hvor mange verdier? ');
    for i = 1:antall
        celsius = input('Skriv inn Celsius-verdi: ');
        cels2fahr(celsius)
    end
else
    cels2fahr(-20);
    cels2fahr(0);
    cels2fahr(18);
    cels2fahr(37);
    cels2fahr(100);
end

Oppgave 3.2.4: Finn elementposisjon i vektor

 

Lag en funksjon som som tar inn en vektor og en elementverdi, og som returnerer første posisjon hvor vektoren inneholder elementverdien. Hvis vektoren ikke innholder elementverdien, skal funksjonen returnere 0.

Videoforklaring (11:48)

Løsningsforslag

finn_verdi.m
function retur = finn_verdi(vektor, verdi)
    for i = 1:length(vektor)
        if vektor(i) == verdi
            retur = i;
            return;
        end
    end
    retur = 0;
end

Oppgave 3.2.5: Konverter fra romertall

 

I romerriket brukte man bokstavene M, D, C, L, X, V og I til å representere tall, som angitt i tabellen under. En rekke med slike bokstaver representerte summen av bokstavverdiene – for eksempel ville strengen MLX vært tallet 1060. Hvis en bokstav med en lavere verdi kommer før en bokstav med høyere verdi, skal den laveste verdien i stedet trekkes fra den høyeste verdien – for eksempel er strengen IV tallet 4, strengen XC verdien 90, og strengen MCMXCIX verdien 1999.

Lag en funksjon som konverter fra et romertall til tallverdien det representerer. Du kan anta at konverteringsfunksjonen fra_romersiffer er tilgjengelig for å konvertere fra en enkelt romerbokstav til tilsvarende tallverdi.

Utdelt kode

fra_romersiffer.m
function tall = fra_romersiffer(romersiffer)
    switch romersiffer
        case 'I'
            tall = 1;
        case 'V'
            tall = 5;
        case 'X'
            tall = 10;
        case 'L'
            tall = 50;
        case 'C'
            tall = 100;
        case 'D'
            tall = 500;
        case 'M'
            tall = 1000;
        otherwise
            error('Ugyldig romersiffer');
    end
end 

 

Videoforklaring (11:37)

Løsningsforslag

fra_romertall.m
function retur = fra_romertall(romertall)
    retur = 0;
    for i = 1:length(romertall)
        verdi = fra_romersiffer(romertall(i));
        if i < length(romertall) && verdi < fra_romersiffer(romertall(i+1))
            retur = retur - verdi;
        else
            retur = retur + verdi;
        end
    end
end

Oppgave 3.2.6: Eksamensoppgave 

Skriv en funksjon trizero som tar inn en tabell A med like mange rader som kolonner og et flagg (logisk variabel) upper. Hvis upper == true skal alle elementene over hoveddiagonalen nullstilles og hvis upper == false skal alle elementene under hoveddiagonalen nullstilles. Resten av elementene skal beholde sin opprinnelige verdi. Hele tabellen skal returneres etter nullstilling av de angitte elementer. Returner en tom tabell hvis antall rader ikke er lik antall kolonner i inngangstabellen A. Se også figur 1.

Videoforklaring (16:18)

Del 1 (5:32)Del 2 (10:46)
Introduksjon av oppgaven, oppdeling i mindre biter, og løsning av det første, enkleste tilfellet.Løsning av den vanskeligste delen av oppgaven.

Løsningsforslag

trizero.m
function retur = trizero(A, upper)
    if size(A, 1) ~= size(A, 2)
        retur = [];
        return;
    end
    N = size(A, 1);
    for i = 1:N-1
        if upper
            A(i, i+1:N) = 0;
        else
            A(i+1:N, i) = 0;
        end
    end
    retur = A;
end

  • No labels