Kodeforståelsesoppgaver

Oppgave 8.1.1: Enkel structbruk

Hvilken verdi har S etter at vi kjører scriptet oppgave_1.m?
oppgave_1.m
S = struct('antall', 5, 'pris', 100, 'navn', 'Biff');
S.totalpris = S.antall * S.pris;
S.plass = struct('reol', 3,'hylle', 4);
S.plass.avstand = sqrt(S.plass.reol^2 + S.plass.hylle^2); 

Videoforklaring (8:43)

Svar

>> S
S = 
        antall: 5
          pris: 100
          navn: 'Biff'
     totalpris: 500
    plassering: [1x1 struct]
>> S.plassering
ans = 
                   reol: 3
                  hylle: 4
    avstand_fra_inngang: 5
>> 

Oppgave 8.1.2: Utskrift til fil

Hva blir innholdet i filene «oppgave_2_fil_1.txt» og «oppgave_2_fil_2.txt» hvis vi kjører scriptet oppgave_2.m? Anta at du har skrivetilgang til begge filene.

oppgave_2.m
fd = fopen('oppgave_2_fil_1.txt', 'w');
fprintf(fd, 'Linje 2\n');
fclose(fd);
fd = fopen('oppgave_2_fil_2.txt', 'a');
fprintf(fd, 'Linje 2\n');
fclose(fd); 
oppgave_2_fil_1.txt
Linje 1
oppgave_2_fil_2.txt
Linje 1


Videoforklaring (9:18)

Svar

oppgave_2_fil_1.txt
Linje 2
oppgave_2_fil_2.txt
Linje 1
Linje 2

 

 


Oppgave 8.1.3: Formattert utskrift til fil

Hva blir innholdet i filene «oppgave_3_fil.txt» hvis vi kjører scriptet oppgave_3.m? Anta at du har skrivetilgang til alle filer, og rettighet til å lage nye filer.
oppgave_3.m
fd = fopen('oppgave_3_fil.txt', 'w');
fprintf(fd, 'Katten %s spiste %d fisk på %.2f kg\n', 'Mons', 3, 0.75);
fclose(fd);

Videoforklaring (4:34)

Svar

oppgave_3_fil.txt
Katten Mons spiste 3 fisk på 0.75 kg
 

Oppgave 8.1.4: Lesing fra en fil

Hva skrives ut til skjerm hvis vi kjører scriptet oppgave_4.m? Anta at du har lesetilgang til alle filer.
oppgave_4.m
fd = fopen('oppgave_4_fil.txt', 'r');
linje1 = fgetl(fd);
linje2 = fgets(fd);
fprintf('Lengde 1: %d, lengde 2: %d\n', length(linje1), length(linje2));
oppgave_4_fil.txt
Linje 1
Linje 2
Linje 3

 

Videoforklaring (10:34)

Svar

Lengde 1: 7, lengde 2: 8
Lengde 1: 7, lengde 2: 9

(Svaret blir annerledes fordi "ny linje" representeres av to bokstaver, \r og \n, i stedet for bare \n. Hvis filen åpnes med rettigheter 'rt' i stedet for 'r', så vil Matlab oversette alle linjeskift til '\n' og lengde 2 vil bli 8.)

 

 


Oppgave 8.1.5: Rekursjon

Hva skrives ut til skjerm hvis vi kjører scriptet oppgave_5.m?
oppgave_5.m
f(3)
g(3)
f.m
function f(n)
    if n == 0
        fprintf('BOOOM!\n');
    else
        f(n-1);
        fprintf('%d...\n', n);
    end
end
g.m
function g(n)
    if n == 0
        fprintf('BOOOM!\n');
    else
        fprintf('%d...\n', n);
        g(n-1);
    end
end

Videoforklaring (14:56)

Svar

BOOOM!
1...
2...
3...
3...
2...
1...
BOOOM!

Kodeoppgaver

Oppgave 8.2.1: Struct-struktur

Du har begynt på et prosjekt i et fag hvor du skal analysere forekomsten av Pokémon Go-monstre i Trondheim. I prosjektet er et område av Trondheim delt i et rutenett, og prosjektdeltakerne loggfører alle gangene de støter på forskjellige Pokémon. Disse dataene lastes opp til en server, hvor de behandles av et program skrevet i Matlab.

Du skal jobbe med å utvide analysekoden, som er skrevet av tidligere prosjektstudenter. Du irriterer deg umiddelbart over at dataene i programmet er samlet i cellelister, som illustrert under. Du bestemmer deg for å gjøre noe med saken.


a) Lag en funksjon som konverterer data for én forekomst fra en celleliste til en struct med et passende format.
b) Deler av programmet jobber på samlinger av forekomstdata. Lag en funksjon som konverterer en cellematrise med forekomstdata til et passende alternativ som bruker structs. Scriptet opprett_pokemon.m lager en cellematrise du kan teste funksjonen med.

 Utdelt kode

opprett_pokemon.m
pkms_celle = { 'Charmander', 8, 'N',  7; 
               'Pikachu',   10, 'J',  8; 
               'Dewgong',    1, 'A',  1; 
               'Exeggutor',  1, 'S', 10 } 

 

Videoforklaring (21:34) 

Del 1 (7:30)Del 2 (4:55)Del 3 (9:09)
Oppgaveintroduksjon, og løsning av oppgave a).

Generelt om valgene man har for å bruke structs til å
representere samlinger med verdier.

Løsning av oppgave b).

Løsningsforslag

forekomst_struct.m
function retur = forekomst_struct(forekomst_celleliste)
    retur.navn = forekomst_celleliste{1};
    retur.antall = forekomst_celleliste{2};
    retur.pos = struct('rad', forekomst_celleliste{3}, ...
                       'kol', forekomst_celleliste{4});
 
	%% Kan også lage siste felt gradvis:
    % retur.pos.rad = forekomst_celleliste{3};
    % retur.pos.kol = forekomst_celleliste{4};
end 
forekomster_struct.m
function retur = forekomster_struct(forekomst_cellematrise)
    retur.navn = forekomst_cellematrise(:, 1)';
    retur.antall = [forekomst_cellematrise{:, 2}];
    retur.pos.kol = forekomst_cellematrise(:, 3)';
    retur.pos.rad = [forekomst_cellematrise{:, 4}];
end 

 

 

Oppgave 8.2.2: Skriv dagbok

Du ønsker å digitalisere din dagbokskriving, og har funnet ut at du vil lage et Matlab-program for å la deg skrive inn hva som helst og som lagrer det du skriver i en fil. Du vil også at programmet automatisk skal markere hvilken dag hver del av dagboka er skrevet. For å gjøre dette, bestemmer du deg for å lage funksjonen skriv_dagbok(filnavn), som
  • Skriver dagens dato til filen, omringet av to linjer med bindestreker slik at det blir et tydelig skille i filen.
  • Skriver alt brukeren skriver inn til dagboka.

Det er viktig at funksjonen ikke sletter det som står i dagboka fra før, men legger det du skriver til slutt i filen. Hvis brukeren skriver inn en tom linje, skal funksjonen avslutte.

Tips: bruk date()-funksjonen for å få dagens dato som en tekststreng.

Videoforklaring (13:40) 

Del 1 (8:14)Del 2 (5:26)
Oppgaveintroduksjon, og kode for å håndtere skriving av noe til fil.Kode for å produsere teksten som skal skrives til filen.

Løsningsforslag

skriv_dagbok.m
function skriv_dagbok(filnavn)
    % 1. Åpne filen
    fd = fopen(filnavn, 'a');
    if fd == -1
        error('Kunne ikke åpne filen %s\n', filnavn);
    end
    
    % 2. Bruke filen
    
    fprintf(fd, '----------------------------------------\n');
    fprintf(fd, '%s\n', date());
    fprintf(fd, '----------------------------------------\n');
    linje = input('', 's');
    while ~isempty(linje)
        fprintf(fd, '%s\n', linje);
        linje = input('', 's');
    end
    
    % 3. Lukke filen
    status = fclose(fd);
    if status == -1
        error('Kunne ikke lukke filen %s\n', filnavn);
    end
end 

Oppgave 8.2.3: Filanalyse

Lag en funksjon analyser_fil(filnavn), som:
  • Skriver filens innhold til skjerm, linje for linje.
  • Skriver til skjerm hvor mange linjer det er i filen.
  • Skriver til skjerm hvor mange ord det er i filen.

Du kan anta at ord er adskilt av mellomrom i filen.

Videoforklaring (14:30) 

Del 1 (7:28)Del 2 (7:02)
Oppgaveintroduksjon, og kode for å håndtere lesing av tekst fra fil.Kode som behandler teksten lest inn fra fil.

Løsningsforslag

analyser_fil.m
function analyser_fil(filnavn)
    % 1. Åpne filen
    fd = fopen(filnavn, 'r');
    if fd == -1
        error('Kunne ikke åpne filen %s\n', filnavn);
    end
    
    % 2. Bruke filen
    antall_linjer = 0;
    antall_ord = 0;
    while ~feof(fd)
        linje = fgetl(fd);
        % Behandle linjen 
        fprintf('%s\n', linje);
        antall_linjer = antall_linjer + 1;
        ord = strsplit(linje, ' ');
        antall_ord = antall_ord + length(ord);
    end
    fprintf('Antall linjer: %d\n', antall_linjer);
    fprintf('Antall ord: %d\n', antall_ord);
    
    % 3. Lukke filen
    status = fclose(fd);
    if status == -1
        error('Kunne ikke lukke filen %s\n', filnavn);
    end
end 

Oppgave 8.2.4: Tittel

Oppgave 8.2.5: Tittel

Oppgave 8.2.6: Tittel

  • No labels