Laboration: Programmering

Beräkningsvetenskap I/KF
Sept 2013
Laboration: Programmering
Grundläggande strukturer i programmering
I programmering arbetar man med ett fåtal s k kontrollstrukturer. Dessa strukturer finns på ett
eller annat sätt representerade inom alla programmeringsspråk. I den här delen av laborationen får du arbeta med dessa strukturer i Matlab.
Kort introduktion
De grundläggande kontrollstrukturer som finns i programmering är
• Alternativ
if (och switch)
• Upprepning (loopar) for och while
Att göra sedan du läst introduktionen ovan
1. If-satser
a) Skriv in följande kod och spara i scriptfilen (kommandofilen) iftest.m:
% Program som testar if-satser
x = input('Ge ett tal: ');
if x > 4
disp('x är större än 4');
end
Kör sedan programmet (dvs kör scriptet) och testa att programmet fungerar.
b) Lägg till en else-gren till programmet:
% Program som testar if-satser
x = input('Ge ett tal: ');
if x > 4
disp('x är större än 4');
else
disp('x är mindre eller lika med 4');
end
Spara programmet och kör för att undersöka hur det fungerar.
Beräkningsvetenskap I/KF
Sept 2013
c) Lägg till ytterligare en gren i if-satsen:
% Program som testar if-satser
x = input('Ge ett tal: ');
if x > 4
disp('x är större än 4');
elseif x < 4
disp('x är mindre än 4');
else
disp('x är lika med 4');
end
Kör programmet och testa att det fungerar.
d) Nedanstående kod fungerar i Matlab, men kanske inte som man tänkt sig. Det finns
nämligen ett logiskt fel i koden, fundera på vilket.
x = input('Ge ett tal: ');
if x > 0
disp('x är positivt');
elseif x <= 0
disp('x är negativt eller noll');
elseif (x == 0)
disp('x är lika med noll');
end
e) Implementera följande algoritm i Matlab:
1. Läs in två tal, x och y
2. Om x+y > 0 beräkna w = x + y , skriv ut w
annars om x+y = 0, sätt w = 0 och skriv ut w
annars skriv ut att talet är imaginärt
Var uppmärksam på:
> Att if-satsernas grenar inte logiskt överlappar varandra
> Indentera koden, dvs gör indrag av text mellan if och end
OBS! Uppgiften fortsätter nedan…
Beräkningsvetenskap I/KF
Sept 2013
2. Repetitionssatser, for och while
a) Skriv in följande kod och spara i kommandofilen fortest.m:
% Program som testar for-satser
n = input('Ge antal hej: ');
for i=1:n
disp(['Loopindex: ',num2str(i)]);
disp('Hej hopp');
end
Spara och kör programmet och försök förstå hur det fungerar
b) Ändra koden så att enbart vart tredje Hej hopp skrivs ut, dvs gör om loopen så att det
blir i steg om 3. Kom ihåg att principen för kolonnotationen ovan var
startvärde:steg:slutvärde, detsamma gäller kolonnotationen i for-loopar.
c) Fibonacci Leonardo, även kallad Leonardo från Pisa, 1194-1250, var en italiensk
matematiker som bl a har namngivit en talserie, Fibonaccis talföljd där varje tal är
summan av de två föregående. Förutsatt att de två första talen är 1 ger det en talföljd 1, 1,
2, 3, 5, 8, 13,… .
Talföljden är en enkel modell av kaniners
fortplantning under ideala förhållanden. Om
vi har två kaniner (av olika kön får man anta)
i ursprungsläget, följer antalet kaniner per
månad talföljden ovan.
Man kan även hitta det s k gyllene snittet i
talföljden. Kvoten mellan ett tal och föregående tal i talföljden går nämligen mot
gyllene snittet.
(Gyllene snittet:
1+ 5
).
2
Algoritmen för att beräkna denna talföljd kan se ut så här:
1. Läs in antal Fibonaccital och lagra i variabeln n, med ledutskrift ”Ge antal
Fibonaccital”
2. Initiera vektor med Fibonaccital, fib = [1; 1]
3. För i=3:n
Beräkna nytt Fibonaccital, f = fib(i-1)+fib(i-2);
Placera i vektorn fib, fib = [fib; f]
4. Skriv ut Fibonaccitalen
Implementera algoritmen som ett Matlab-script. Lagra i filen Fibonacci1.m och kör
sedan programmet och testa att det fungerar.
OBS! Uppgiften fortsätter nedan…
Beräkningsvetenskap I/KF
Sept 2013
d) I algoritmen ovan har man kontroll över hur många tal i serien som beräknas. Talen blir
snabbt väldigt stora och det kan vara bättre att kontrollera hur stora tal som beräknas.
Man vet då på förhand inte hur många varv loopen kommer att snurra, utan den ska
stanna då ett visst villkor är uppfyllt (en viss storlek är uppnådd). I sådana lägen använder
man en while-loop istället, i algoritmen nedan skrivs det som ”Så länge som”.
Algoritmen blir nu t ex:
1. Läs in övre gräns för Fibonaccital och lagra i variabeln limit, ledutskrift ”Ge
övre gräns för talen”
2. Initiera vektor med Fibonaccital, fib = [1; 1]
3. Initiera räknare, n = 3
4. Beräkna det första talet, f = fib(n-1)+fib(n-2)
4. Så länge som (f <= limit)
Placera i vektorn fib, fib = [fib; f]
Räkna upp räknare, n = n+1
Beräkna nytt Fibbonaccital, f = fib(n-1)+fib(n-2);
5. Skriv ut Fibonaccitalen
Implementera algoritmen i en ny kommandofil Fibonacci2.m. Kör programmet och
undersök om det fungerar.
Om du har tid kan du själv i Matlab undersöka kopplingen mellan gyllene snittet och
talföljden.
Var uppmärksam på:
> Den principiella skillnaden mellan for-loop och while-loop och när man
använder vad
> att det inte finns någon ”varvräknare” inbyggd i while-loopen