Created by Unknown User (benjambj), last modified on 16.09.2016
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
Første if-setning er merkelig fordi uttrykket er konstant true. Antakeligvis skulle uttrykket på linjen over vært brukt som if-setning-uttrykk.
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.
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.
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