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