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