Numeriska Metoder och Grundläggande Programmering för P1, VT2014 Föreläsning 2: Styrstrukturer & Programmeringsstrategi (Kap. 3 4 i MATLAB Programming for Engineers, S. Chapman) January 21, 2014
Innehåll: Programmeringsstrategi if-satsen switch-satsen try/catch-konstruktionen while-slingan for-slingan avlusning av kod Testning
Styrsatser Tidigare exempel visade sekventiell exekvering av kod. Här villkorad exekvering av kod: Förgrenad exekvering: if-, switch-satser, och för felhantering try/catch-konstruktionen, Upprepad exekvering: while-, och for-slingan Nödvändigt för allt utom de enklaste uppgifter. Större och mer komplicerade program kräver också mer eftertanke innan man börjar skriva programmet.
Programmeringsstrategi Hur beskriver man vad programmet ska göra? Tolka uppdragsgivarens (arbetsgivare, användare, du själv) önskemål Strategi: 1. Definiera uppgiften/problemet 2. Identifiera in- och utdata 3. Välj en algoritm 4. Implementera algoritmen (i Matlab) 5. Testa programmet Algoritm: detaljerad beskrivning av hur man i ett ändligt antal steg löser en uppgift. Punkt 3 leder ofta till delproblem där hela strategin upprepas i mindre skala.
if-satsen Används då ett avsnitt av kod (en eller flera kommandon) bara ska exekveras under vissa förutsättningar Undersöker om ett villkor är uppfyllt i f v i l l k o r kommandon i f v i l l k o r kommandon, a l t 1 e l s e kommandon, a l t 2 Exempel PEng calc roots.m i f v i l l k o r 1 kommandon, a l t 1 e l s e i f v i l l k o r 2 kommandon, a l t 2 e l s e kommandon, a l t 3
if-satsen Exempel: c l e a r d i s p ( Jag t a r r o t e n ur e t t t a l. ) t a l = i n p u t ( Ange e t t r e e l l t t a l : ) ; i f t a l <0 d i s p ( Roten b l i r komplex : ) e l s e d i s p ( Roten b l i r r e e l l : ) d i s p ( s q r t ( t a l ) )
villkor och datatypen logical I villkor används uttryck vars resultat är av datatypen logical; möjliga värden true/false. Tal kan också användas (0 ger false, annars true) Relationsoperatorer ger resultat av typen logical. Ex: ==, =, >, <=,... Många inbyggda funktioner också. Ex: strcmp(str1,str2) ger true om två strängar är identiska, false annars isinf(x) ger true om variabeln x fått värdet Inf. (T.ex. division med 0.) isreal(x) ger true om variabeln x är ett reelt tal. (T.ex. isreal(2+i) ger false). Många inbyggda is -funktioner i Matlab Logiska operatorer & och, eller, ~ icke,... opererar på logiska variabler
villkor och datatypen logical c l e a r a = 0. 1 ; a > 0 ans = 1 a < 0 ans = 0 whos Name S i z e Bytes C l a s s A t t r i b u t e s a 1 x1 8 double ans 1 x1 1 l o g i c a l d i a r y o f f
villkor och datatypen logical Villkor på tabeller ger åtkomst av utvalda element: a = 2:2 a = 2 1 0 1 2 i c k e n e g = a>=0 i c k e n e g = 0 0 1 1 1 r o t e n = s q r t ( a ( a>=0)) r o t e n = 0 1.0000 1.4142 whos Name S i z e Bytes C l a s s A t t r i b u t e s a 1 x5 40 double ans 1 x1 1 l o g i c a l
switch-satsen Används som if-satsen i vissa särskillda fall: Flera villkor ska kontrolleras på samma variabel Alla villkor är av typen variabel = värde Variabeln är ett tal (==) eller en sträng (strcmp) Undersöker om ett villkor är uppfyllt s w i t c h v a r c a s e 1 kommandon, a l t 1 c a s e {2,3} kommandon, a l t 2 c a s e {4,5} kommandon, a l t 3 o t h e r w i s e u p p s a m l i n g s f a l l
switch-satsen Exempel: d i s p ( Vad s a e g e r d j u r e t? ) d j u r =... i n p u t ( V a e l j d j u r ( mus/ko/and/ anka ) :, s ) ; s w i t c h d j u r c a s e mus d i s p ( Pip ) c a s e ko d i s p ( Mu! ) c a s e { and, anka } d i s p ( Kvack! ) o t h e r w i s e d i s p (? )
try/catch-konstruktionen Normalt avbryts exekveringen av ett program om ett fel uppstår. try/catch-konstruktionen låter oss bestämma själva vad som händer vid fel: Vi kan ta hand om all felhantering själva, eller t.ex. ta hand om ett vanligt användarfel, och låta programmet avbrytas vid övriga fel t r y kommandon catch me f e l h a n t e r i n g Mycket användbart vid avlusning (speciellt funktionsanrop, återkommer i nästa föreläsning) Man kan själv generera felmeddelanden via error.
try/catch-exempel, PEng s.117 c l e a r % i n i t i a l i z e an a r r a y a = rand ( 1, 1 0 ) ; t r y % Try to d i s p l a y an element i n d e x = i n p u t (... Enter s u b s c r i p t o f element to d i s p l a y : ) ; d i s p ( [ a ( i n t 2 s t r ( i n d e x ) ) =... num2str ( a ( i n d e x ) ) ] ) ; catch % I f we get h e r e an e r r o r o c c u r r e d d i s p ( [ I l l e g a l s u b s c r i p t :, i n t 2 s t r ( i n d e x ) ] ) ; d i s p ( E x e c u t i o n c o n t i n u e s here )
Annat try/catch-exempel (dagboksfil) c l e a r a = l i n s p a c e ( 0, 1, 6 ) ; t ry, a ( 1 0 ), catch me, whos Name S i z e Bytes C l a s s A t t r i b u t e s a 1 x6 48 double me 1 x1 807 MException d i a r y o f f Variabeln me är ett exempel på en sammasatt datatyp. Återkommer senare i kursen.
try/catch-exempel (dagboksfil) me me = <a h r e f = matlab : helppopup MException s t y l e = f i d e n t i f i e r : MATLAB: b a d s u b s c r i p t message : I n d e x e x c e e d s m a t r i x d i m e n s i o n s cause : {} s t a c k : [ 0 x1 s t r u c t ] d i a r y o f f
try/catch-exempel (dagboksfil) Vi kan använda Matlab-funktionen strcmp, tillsammans med if-satser för att ta hand om vissa utvalda fel. strcmp (me. message,... I n d e x e x c e e d s m a t r i x d i m e n s i o n s. ) ans = 1 strcmp (me. message, Annat meddelande ) ans = 0 d i a r y o f f
try/catch-exempel a = rand ( 1, 1 0 ) ; i d x = 1 1 ; t r y a ( i d x ) catch me i f strcmp (me. message,... I n d e x e x c e e d s m a t r i x d i m e n s i o n s. ) d i s p ( [ a har, i n t 2 s t r ( l e n g t h ( a ) ),... element ] ) e l s e throw (me)
while-slingan Används för att upprepa ett avsnitt av kod Används när man i förväg inte vet antalet upprepningar Kodavsnittet upprepas så länge villkoret är uppfyllt w h i l e v i l l k o r kommandon Exempel: Låt en användare mata in ett godtyckligt antal mätpunkter.
while-slingan Exempel: c l e a r tx = [ ] ; d i s p ( Mata i n p u n k t e r ( t i d, p o s i t i o n ) ) d i s p ( Tom inmatning a v s l u t a r. ) w h i l e e x i s t ( svar, var ) isempty ( s v a r ) s v a r = i n p u t ( Ange k o o r d i n a t e r, [ t, x ] : ) ; tx = [ tx ; s v a r ] ; d i s p ( tx ) Exempel PEng stats 3.m
for-slingan Används som while-slingan, när man vet antal upprepningar i förväg Index-variabeln tilldelas ett värde i taget ur tabellen (oftast en radvektor) i slingans huvud Ändra inte for-slingans index inne i slingan f o r k=k0 : s t e g : k1 kommandon f o r k =1:2:15 d i s p ( [ k =, i n t 2 s t r ( k ) ] ) f o r k=v e k t o r kommandon f o r k=[4 1 6 7 4 ] d i s p ( [ k =, i n t 2 s t r ( k ) ] ) Exempel: summera alla tal i en lista som uppfyller något villkor.
for-slingan Exempel: c l e a r s = 0 ; f o r k =2:100 i f i s p r i m e ( k ) s = s+k ; d i s p ( [ s =, i n t 2 s t r ( s ) ] ) Det finns också en inbyggd funktion sum som vi kunde använt med logisk indexering. Hur?
break och continue Används i for- eller while-slingor i samband med logiska villkorsuttryck continue Gå direkt till nästa upprepning av slingan utan att exekvera resten av satserna inne i slingan. break Avbryt slingan utan att exekvera resten av satserna inne i slingan. Ex: bc.m
Avlusning Provkör för att upptäcka Syntaxfel (språkfel), t.ex. ett felaktigt tecken som gör att kommandona inte kan exekveras Exekveringsfel (fel under körning), t.ex. felaktig indexering Felaktiga resultat. Kräver (viss) kunskap om resultatet (i vissa fall).
Testning Hur vet man att programmets resultat är korrekta? Främst: Systematisk manuell testning av olika fall/indata Skriv ett program som automatiskt testar olika fall/indata