Grundläggande programmering [email protected] Informationsteknologi Sanningar om programmering Ett MATLAB-program är ett antal MATLABkommandon samlade i en m-fil. Att utveckla och skriva program kallas att programmera. Att skriva ett större program som löser ett större problem är oftast en ganska omfattande uppgift Kräver förarbete med t ex papper och penna innan man sätter sig vid datorn… Programmeringsprocessen innehåller egentligen många moment, inte bara kodning Institutionen för informationsteknologi | www.it.uu.se Informationsteknologi Programmeringsprocessen 1. Formulering av problemet 2. Strukturering av problemet 3. Val av lösningsmetod 4. Kodning 5. Felsökning och testning 6. Dokumentering Institutionen för informationsteknologi | www.it.uu.se 1 Informationsteknologi Programmeringsprocessen Formulering av problemet. Kravspecifikation. Vad ska lösas? Strukturering av problemet. Dela upp i mindre delproblem. Vissa löser man själv (egna funktioner), andra kräver expertkunskaper (MATLAB-funktioner). Val av lösningsmetod. Bestäm lösningsmetod och formulera algoritm, dvs steg-för-steg metod för att lösa de olika delproblemen Institutionen för informationsteknologi | www.it.uu.se Programmeringsprocessen Informationsteknologi Kodning eller implementering algoritmen omformas till programmeringsspråk, dvs i denna kurs till MATLAB-kod. Många vill gärna hoppa direkt till detta moment, eftersom det är roligt att snabbt se resultat. För mindre problem går det oftast bra, men men för större problem är brist på förarbete ofta förödande. Felsökning och testning Ovanligt att program fungerar korrekt från början :-) Måste testköra för olika indata. Försöka hitta felen, för att sedan rätta till dem och köra igen. Institutionen för informationsteknologi | www.it.uu.se Programmeringsprocessen Informationsteknologi Dokumentering För att ett program skall kunna vara användbart för andra, så måste det dokumenteras och kommenteras. Beskriver sina tankegångar i struktureringsmomentet i ett separat dokument och även se till att koden innehåller "lagom med kommentarer” på vettiga ställen (dvs %-rader). Institutionen för informationsteknologi | www.it.uu.se 2 Informationsteknologi Programmeringsprocessen I den här kursen ska vi mest titta på själva kodningen, dvs MATLAB-koden De övriga delarna ingår (mer eller mindre) i olika programmeringskurser Det är ändå en god idé att skissa på lösningen innan man skriver själva koden, fundera över hur problemet ska delas upp i mindre delproblem etc Rita och skissa med papper o penna hur vektorer ”ser ut” och vilka tal som lagras var etc Institutionen för informationsteknologi | www.it.uu.se Programmeringskomponenter Informationsteknologi Programmeringsspråk innehåller några viktiga komponenter som används när man skriver kod. Komponenter för selektion, t ex if-satser iteration, s k loopar, t ex for-satsen Institutionen för informationsteknologi | www.it.uu.se MATLAB: Selektion (if) Informationsteknologi Selektion (val) Formulering av typen: om ... så ... om ... så ... annars ... om ... så ... annars om ... så … Använd if-satsen i MATLAB x = input('Give a number x: '); if x > 0 disp('x is greater than zero!') end Institutionen för informationsteknologi | www.it.uu.se 3 MATLAB: Selektion (if) Informationsteknologi Varianter med else-gren x = input('Give a number x: '); if x > 0 disp('x is greater than zero!') else disp('x is less than or equal to zero!') end Institutionen för informationsteknologi | www.it.uu.se MATLAB: Selektion (if) Informationsteknologi Varianter med else-gren x = input('Give a number x: '); if x > 0 disp('x is greater than zero!') elseif x < 0 disp('x is less than zero!') else disp('x is equal to zero!') end Institutionen för informationsteknologi | www.it.uu.se MATLAB: Selektion (switch) Informationsteknologi Kan även använda switch % Kasta tärning. % result har ett tärningsvärde innan… switch result case {1,3,5} disp('odd number of eyes') case {2,4,6} disp('even number of eyes') otherwise disp('What kind of dice do you have?') end Institutionen för informationsteknologi | www.it.uu.se 4 MATLAB: Iteration (for) Informationsteknologi Iteration Iteration med for innebär att något blir exekverat (utfört) ett förutbestämt antal gånger. % Bygg upp en vektor med for-loop. x = []; % Starta med tom vektor for k = 1:5 x(k) = input('Give element in x:'); end k = 1:5 betyder att k i tur och ordning antar värdena 1, 2, 3, 4, 5 Institutionen för informationsteknologi | www.it.uu.se Informationsteknologi MATLAB: Iteration (for) Körning ger: Give element Give element Give element Give element Give element >> x x = 2 3 in in in in in x:2 x:3 x:5 x:7 x:8 5 7 8 Institutionen för informationsteknologi | www.it.uu.se MATLAB: Iteration (for) Informationsteknologi % Bygg vektor på annat sätt r = []; s = []; for x = -2.0:0.25:-0.75 y = 1 + 1/x; r = [r x]; s = [s y]; end [r; s]' k = -2.0:0.25:-0.75 betyder att x i tur och ordning antar värdena –2, -1.75, ....,-0.50,-0.75 Institutionen för informationsteknologi | www.it.uu.se 5 Informationsteknologi MATLAB: Iteration (for) Resultatet blir en tabell för funktionen f(x)=1+1/x i intervallet [-2,-0.75]: ans = -2.0000 -1.7500 -1.5000 -1.2500 -1.0000 -0.7500 0.5000 0.4286 0.3333 0.2000 0 -0.3333 Institutionen för informationsteknologi | www.it.uu.se MATLAB: Iteration (while) Informationsteknologi Iteration (while) Iteration med while innebär att något blir exekverat (utfört) tills ett visst villkor är uppfyllt x = []; % Tom vektor vid a = 1; while a > 0 % utför så x = [x a]; % a större a = input('Enter value: end start länge som än 0 '); Observera att i while finns ingen ”räknare” motsvarande k och x i for-exemplen Institutionen för informationsteknologi | www.it.uu.se Informationsteknologi MATLAB: Iteration (while) Resultat vid körning: Enter Enter Enter Enter Enter >> x x = 1 value: value: value: value: value: 1 1 2 6 5 -2 2 6 5 Institutionen för informationsteknologi | www.it.uu.se 6 MATLAB: Relationsoperatorer I while-satsen används logiska uttryck MATLAB har flera relationsoperatorer (Booleska operatorer) för jämförelser < Mindre än <= Mindre än eller lika med > Större än >= Större än eller lika med == Lika med ~= Skilt från Informationsteknologi I MATLAB gäller att om något är sant så har det värdet 1 (ett) och om något är falskt så har det värdet 0 (noll). Institutionen för informationsteknologi | www.it.uu.se MATLAB: Logiska operatorer Informationsteknologi Följande logiska operatorer finns i MATLAB: & Och ~ Negation (inte) | Eller Xor Exklusivt eller A&B A|B ~A xor(A,B) A och B: sant om både A och B är sanna A eller B: sant om antingen A, B, eller båda är sanna inte A: sant om A är falskt och falskt om A är sant Exkl eller: sant om A är sant eller om B är sant (ej sant om A och B är sanna) Institutionen för informationsteknologi | www.it.uu.se Programmeringsexempel 1 Informationsteknologi Skriv ett program som läser in två tal , beräknar medelvärdet av dessa och skriver ut resultatet. Analys av problemet a. Vilka indata är nödvändiga? Svar: Två tal b. Av vilken typ är indata? Vektor eller matris? Svar: I detta fall ett tal (skalär) c. Uppkommer det några specialfall? Svar: Inte i det här exemplet. d. Vad är utdata? Vilken datatyp? Svar: Resutatet också ett tal Institutionen för informationsteknologi | www.it.uu.se 7 Programmeringsexempel 1 Informationsteknologi Algoritmformulering Med hjälp av naturligt språk 1. Läs in två tal. 2. Beräkna medelvärdet. 3. Skriv ut medelvärdet. Institutionen för informationsteknologi | www.it.uu.se Programmeringsexempel 1 Informationsteknologi MATLAB-kod % Program som beräknar medelvärdet av % två tal. disp('Ge två tal, så beräknas medelvärdet:'); tal1 = input('Tal1: '); % inläsning tal2 = input('Tal2: '); medel = mean( [tal1, tal2] ); %beräkning texten = ['Medelvärdet av talen är ', … num2str(medel) ]; %utskrift disp( texten ); Institutionen för informationsteknologi | www.it.uu.se Programmeringsexempel 1 Informationsteknologi Exekvering körning av programmet ger följande: >> prog_1 Ge två tal, så beräknas medelvärdet: Tal1: 3 Tal2: 6 Medelvärdet av talen är 4.5 Institutionen för informationsteknologi | www.it.uu.se 8 Informationsteknologi Programmeringsexempel 2 Skriv ett program som läser in två tal och beräkna sedan kvoten och skriv ut denna. Analys av problemet a. Vilka indata är nödvändiga? Svar: Två tal b. Av vilken typ är indata? Svar: Skalärer c. Uppkommer det några specialfall eller komplikationer? Svar: Ja, om nämnaren är lika med noll. d. Vad är utdata? Svar: Kvoten, också en skalär Institutionen för informationsteknologi | www.it.uu.se Programmeringsexempel 2 Informationsteknologi Algoritmformulering 1. 2. Ge ledtext: Ge två tal,.... Läs in värden till variablerna taljare och namnare. 3. Om namnare = 0 så skriv ut ett felmeddelande annars sätt kvot = taljare/namnare 4. Skriv ut resultatet, dvs värdet av kvot, på lämpligt sätt. Institutionen för informationsteknologi | www.it.uu.se Programmeringsexempel 2 Informationsteknologi MATLAB-kod (sparat i m-filen prog2.m) % Program som dividerar två tal disp('Ge två tal så beräknas kvoten.'); taljare = input('Ge täljare: '); namnare = input('Ge nämnare: '); if abs(namnare) < eps %ungefär: == 0 disp('Division med noll!'); else kvot = taljare/namnare; disp(['Kvoten blir: ',num2str(kvot)]); end Institutionen för informationsteknologi | www.it.uu.se 9 Programmeringsexempel 2 Informationsteknologi Exekvering >> prog_2 Ge två tal så beräknas kvoten. Ge täljare: 1 Ge nämnare: 2 Kvoten blir: 0.5 >> prog_2 Ge två tal, så beräknas kvoten. Ge täljare: 2 Ge nämnare: 0 Division med noll! Institutionen för informationsteknologi | www.it.uu.se Informationsteknologi Programmeringsexempel 3 Skriv ett program som läser in heltal, ett i taget, och sedan beräknar summan samt medel av dessa. Resultaten skall skrivas ut. Institutionen för informationsteknologi | www.it.uu.se Programmeringsexempel 3 Informationsteknologi Analys av problemet a. Vilka indata är nödvändiga? Svar: Ett antal heltal. b. Av vilken typ är indata? Svar: skalärer som kan lagras i vektor c. Specialfall eller komplikationer? Svar: Ja, hur ska man veta när man matat in sista talet, dvs stoppvillkor? Dessutom, om antalet tal är 0, ska man då beräkna medel och summa? d. Vad är utdata? Av vilken datatyp? Svar: Summan är ett heltal, men medel är ett reellt tal. Institutionen för informationsteknologi | www.it.uu.se 10 Programmeringsexempel 3 Informationsteknologi Hur löser vi komplikationerna? a. Stoppvillkor? I MATLAB ger return-tangenten tomma matrisen [] när man använder input. Använd detta som stoppvillkor: så länge som tal skild från [] b. Om inga tal matas in? Vektorn talvect blir då tom och ingen beräkning bör ske. Lös detta med if-sats: om talvect skild från [] så beräkna summa och medelvärde annars gör utskrift Institutionen för informationsteknologi | www.it.uu.se Programmeringsexempel 3 Informationsteknologi Algoritm 1. Läs in första talet, tal, med input Initiera vektor talvect: talvect = [] Loop: så länge som tal skilt från [], dvs tomma matrisen (return) Placera tal i vektor talvect: talvect = [talvect; tal] Läs in ett nytt tal, lagra i tal 4. Om talvect skild från tomma mängden, beräkna medelvärdet och summan. I MATLAB med inbyggda funktioner sum och mean 2. 3. Institutionen för informationsteknologi | www.it.uu.se Informationsteknologi Programmeringsexempel 3 disp(’Ge ett antal tal och medelvärde och summa beräknas. Avsluta inmatningen med talet return); tal = input('Ge tal 1: '); talvect = []; i = 1; while tal ~= [] i = i+1 tal = input(['Ge tal nr ', num2str(i), ': ']); talvect = [talvect; tal]; end if talvect ~= [] medel = mean(talvect); summa=sum(talvect); disp(['Summa = ', num2str(summa),... ' och medel = ', num2str(medel)]); else disp('Inga tal har bearbetats.'); end Institutionen för informationsteknologi | www.it.uu.se 11 Informationsteknologi Exempel 1.3: Körning >> whiletest Ge tal nr 1: 5 Ge tal nr 2: 4 Ge tal nr 3: 6 Ge tal nr 4: 7 Ge tal nr 5: 1 Ge tal nr 6: 3 Ge tal nr 7: här ges ett return Summa = 21 och medel = 4.2 Institutionen för informationsteknologi | www.it.uu.se Informationsteknologi Egna funktioner Var lagrar man sin kod? Hittills i m-filer i form av kommandofiler Finns även en annan form av m-filer: funktioner Institutionen för informationsteknologi | www.it.uu.se Egna funktioner Informationsteknologi Funktion kan ses som en en svart låda. Man stoppar in indata och får som resultat utdata. I den svarat lådan utförs beräkningar och liknande Den svarta lådan har egna variabler, för mellanlagring av data, som vi utanför ej behöver bry oss om Enda kommunikation med omvärlden via in- och utdata (in- och utparametrar) indata utdata Institutionen för informationsteknologi | www.it.uu.se 12 Egna funktioner Första raden i funktionsfil inleds med function, därefter utparameterlista, funktionsnamn och inparameterlista. function [y1,y2,…,yn]=funknamn(x1,x2,…,xm) % Kommentarer Satser Informationsteknologi En funktion kan ha noll, en, eller flera in- och utparametrar. Kan t o m ha variabelt antal parametrar Funktioner lagras i m-filer. Filnamnet måste stämma överens med funktionsnamnet, funknamn.m Institutionen för informationsteknologi | www.it.uu.se Informationsteknologi Jämför med inbyggda funktioner Det finns många inbyggda funktioner i MATLAB, t ex för elementär matematik och linjär algebra grafik i 2D och 3D integraler och differentialekvationer statistik kurvanpassning Exempel: if abs(sum(x)) > 10, plot(x,y), end Egentligen: abs.m, sum.m, plot.m Institutionen för informationsteknologi | www.it.uu.se Egna funktioner Informationsteknologi Funktioner körs genom att anropas [b1,b2,…,bn]=filnamn(a1,a2,…,am) Efter anropet behåller inparametrarna sina värden. De påverkas ej av funktionen. I en funktion kan finnas anrop till andra funktioner Institutionen för informationsteknologi | www.it.uu.se 13 Informationsteknologi Egna funktioner: exempel 1 Matematiska funktionen f(x) = sin(x)cos(x) blir så här som MATLAB-funktion function f = sincos(x) % Beräknar sin(x)*cos(x) f = sin(x)*cos(x); Anrop: >> x = 0.5; y = sincos(x) y = 0.4207 OBS. Funktionen lagras i m-filen sincos.m Institutionen för informationsteknologi | www.it.uu.se Egna funktioner: exempel 2 Informationsteknologi Funktion som beräknar medelvärdet av två tal. function z = medelfunk( x, y ) % Beräknar medelvärdet av två tal % Filnamn: medelfunk.m z = ( x + y )/2; Anrop: a=22; b=6; c=medelfunk(a,b); disp(['medel=', num2str(c)]); Ger vid körning resultatet: medel=4 Institutionen för informationsteknologi | www.it.uu.se Informationsteknologi Egna funktioner: exempel 3 function rita_graf % Funktion som plottar x*sin(x) x = linspace(0,1); y = x.*sin(x); plot(x,y); Anrop: >> rita_graf OBS! Inga in- och utparametrar Institutionen för informationsteknologi | www.it.uu.se 14 Informationsteknologi Stora problem och m-filer Hittills haft en m-fil (kommandofil) för varje program när vi löst ett problem. Större problem måste delas upp i delproblem, var och en med egen algoritm Större program blir uppdelade i fler delprogram, dvs flera m-filer per problem vanligen funktionsfiler En m-fil, vanligen kommandofil utgör själva huvudprogrammet – detta styr problemlösningen och anropar funktionerna. Institutionen för informationsteknologi | www.it.uu.se Olika sorters fel Informationsteknologi Det finns tre typer av fel, s.k. buggar som kan inträffa i program: 1. 2. 3. Syntaxfel. Ett grammatiskt fel. Kan ej översätta MATLABkoden till "datorkod". Felmeddelanden från inte alltid så lätta att tolka. Exekveringsfel. Fel som uppkommer under körningen och medför att programmet "kraschar", dvs slutar exekvera, kallas exekveringsfel eller runtimefel. Logiska fel. Programmeraren har tänkt fel, men programmet kör. Svårupptäckt. Institutionen för informationsteknologi | www.it.uu.se Informationsteknologi Vanliga syntaxfel i MATLAB Skrivfel, t ex plott(x,y); Utelämnade tecken, t ex multiplikationstecknet, *: 3(x+5) Felstavad identifierare, t ex skyldigMig = 50; if SkyldigMig > 100 Oidentifierade variabler, t ex glömt nollställa sum for i=1:5 sum=sum+i; end Institutionen för informationsteknologi | www.it.uu.se 15 Informationsteknologi Vanliga syntaxfel Glömd punkt vid elementvisa operationer. Ger ??? Error using ==> ^ Matrix must be square. Slarv med kolon, komma, seminkolon Institutionen för informationsteknologi | www.it.uu.se Goda råd vid programmering Informationsteknologi 1. 2. 3. 4. 5. 6. 7. Ha enbart en sats per rad. Indentera på vettigt sätt. Använd blanka rader för att dela upp koden i segment, t ex före/efter block. Använd vettiga variabelnamn o funktionsnamn Kommentera och förklara variabler Kommentera delar av koden. Ha alltid ett ”kommentarhuvud" i början av filen. Fel kan undvikas om koden är vettig ☺ Institutionen för informationsteknologi | www.it.uu.se 16