>> 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.
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.
(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.
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