F2: Styrstrukturer, programmeringsteknik (kap. 3 4)

Relevanta dokument
Villkor, if, switch. F2: Styrstrukturer, programmeringsteknik (kap. 3 4) If-kommando forts. If-kommando forts.

Villkor if, switch. F2: Styrstrukturer, programmeringsteknik (kap. 3 4) If-kommando forts. If-kommando forts.

Villkor if, switch. F2: Styrstrukturer, programmeringsteknik (kap. 3 4) If-kommando forts. If-kommando forts.

Föreläsning 2 Styrstrukturer, program. Dagens föreläsning. Villkor

Numeriska Metoder och Grundläggande Programmering för P1, VT2014

Funktioner forts. F3: Funktioner (kap. 5) Parametrar. findgear.m forts

Variabler och konstanter

F3: Funktioner (kap. 5)

Numeriska Metoder och Grundläggande Programmering för P1, VT2014

Variabler. TANA81: Beräkningar med Matlab. Matriser. I Matlab skapas en variabel genom att man anger dess namn och ger den ett värde:

Enklast att skriva variabelnamn utan ; innehåll och variabelnamn skrivs ut

F3: Funktioner (kap. 5) Funktioner forts. Parametrar

MMA132: Laboration 2 Matriser i MATLAB

Komponentvisa operationer,.-notation Multiplikation (*), division (/) och upphöj till (ˆ) av vektorer följer vanliga vektoralgebraiska

Sanningar om programmering

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Introduktion till MATLAB

MATLAB. Python. Det finns flera andra program som liknar MATLAB. Sage, Octave, Maple och...

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 3: Booleans, if, switch

Sanningar om programmering

Uppgift 1 - programmet, Uppg6.m, visade jag på föreläsning 1. Luftmotståndet på ett objekt som färdas genom luft ges av formeln

Tentamen TANA17 Matematiska beräkningar Provkod: DAT1 Godkänd: 8p av totalt 20p Tid: 14:e januari klockan

4.3. Programmering i MATLAB

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

Iteration while-satsen

Logik och Jämförelser. Styrsatser: Villkorssatsen if och repetitonssatsen for. Scriptfiler. Kommentarer. Tillämpningar: Ett enkelt filter.

2 februari 2016 Sida 1 / 23

Föreläsning 2 Programmeringsteknik och C DD1316. Programmering. Programspråk

Dagens program. Programmeringsteknik och Matlab. Administrativt. Viktiga datum. Kort introduktion till matlab. Övningsgrupp 2 (Sal Q22/E32)

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Föreläsning 3. Iteration while-satsen

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

MATLAB the Matrix Laboratory. Introduktion till MATLAB. Martin Nilsson. Enkel användning: Variabler i MATLAB. utvecklat av MathWorks, Inc.

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

Objektorienterad Programmering (TDDC77)

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Kort om programmering i Matlab

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Klassdeklaration. Metoddeklaration. Parameteröverföring

Motivering för programmering. F1: Introduktion, Matlabrepetition (kap. 1 2) Att kunna programmera. Interpreterat/kompilerat

Repetera snabbt vad du lärde dig förra veckan. Du är nu redo att kasta dig in i nästa fas, teorin om villkor.

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

F4. programmeringsteknik och Matlab

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

TANA17 Matematiska beräkningar med Matlab

Objektorienterad programmering

Föreläsning 3-4 Innehåll

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

DD1314 Programmeringsteknik

Programmeringsteknik med C och Matlab

F3: Funktioner (kap. 5)

Outline. For. I istället för att följa det normala ordningen, man ändra den. I i Java får man inte göra hopp hur som helst

Övningsuppgifter kapitel 8

Läsning, skrivning, tangentbord, skärm. F6: Filhantering (kap. 8) Tabell på skärmen. save

Funktioner forts. F3: Funktioner (kap. 5) Parametrar. findgear.m forts

2.4. Teckensträngar och logiska uttryck

Textsträngar från/till skärm eller fil

Mer källkod. Styrstrukturer Val Slingor Operatorer Källkodsexempel med minne. Erik Forslin. Rum 1445, plan 4 på Nada

Dagens föreläsning Programmering i Lisp. - Bindning av variabler (avs 14.6) fria variabler statisk/lexikalisk och dynamisk bindning

TDDC77 Objektorienterad Programmering

Beräkningsverktyg HT07

Kursuppläggning. F1: Introduktion, Matlabrepetition (kap. 1 2) Motivering för programmering. Att kunna programmera

Introduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion

Föreläsning ALGORITMER: SÖKNING, REGISTRERING, SORTERING

For-sats/slinga. Notis

Beräkningsvetenskap föreläsning 2

Inledande matematik för I1. MVE011 läsperiod Matlab vecka 2 övningsuppgifter

Introduktion & MATLABrepetition. (Kap. 1 2 i MATLAB Programming for Engineers, S. Chapman)

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

Föreläsning 2 Programmeringsteknik och C DD1316

Programmering i C, 7,5 hp

Svensk Matlab-terminologi

TAIU07 Matematiska beräkningar med Matlab

TAIU07 Matematiska beräkningar med Matlab

Kort om programmering i Python

TANA17 Matematiska beräkningar med Matlab

Laboration: Grunderna i MATLAB

Föreläsning 4 Programmeringsteknik och Matlab DD1312. Logiska operatorer. Listor. Listor, tupler, strängar och forslingor

16 Programmering TI -86 F1 F2 F3 F4 F5 M1 M2 M3 M4 M5

Datorlära 6. Arbeta med strängar Inmatning med tangentbordet Bygga ett program med inmatning, funktioner, osv

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

Skapa egna funktioner

Enkla datatyper minne

DOM (Document Object Model) är modellen efter vilken en webbläsaren är uppbyggd. Alla objekt/element i webbläsaren finns hierarkiskt ordnade i DOM.

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy cards. Slingor

Tentamen TAIU07 Matematiska beräkningar med MATLAB för MI

Visual Basic, en snabbgenomgång

TSBB14 Laboration: Intro till Matlab 1D

TANA81: Simuleringar med Matlab

MATLAB. Vad är MATLAB? En kalkylator för linlär algebra. Ett programspråk liknande t.ex Java. Ett grafiskt verktyg.

Introduktion till MATLAB, med utgångspunkt från Ada

Data, typ, selektion, iteration

Beräkningsvetenskap och Matlab. Vad är MATLAB? Vad är MATLAB? Användningsområden. Vad är MATLAB? Grunderna i Matlab. Beräkningsvetenskap == Matlab?

Inledande programmering med C# (1DV402) Summera med while"-satsen

Du kan söka hjälp efter innehåll eller efter namn

TDIU01 - Programmering i C++, grundkurs

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Omtentamen i Programmering C, 5p, fristående, kväll,

Transkript:

F2: Styrstrukturer, programmeringsteknik (kap. 3 4) Villkorskommandon, if, switch Villkor, logiska värden, relationsoperatorer, logiska operatorer Skottårsexempel Triangelanalysexempel, strängar Switch, tärningsexempel Felhantering, try-catch, error Repetitionskommando, slinga, for, while, break, continue Kuggväxelexempel, blandad utskrift med disp Datorpecision, eps Testning, avlusning Filläsning- och skrivning, fopen, fscanf, fprintf

Villkor, if, switch Man vill att vissa kommandon ska utföras ast om ett visst villkor är sant. Gör a till den största och b till den minsta av a och b : if b>a % fel, så byt temp = a; a = b; b = temp; Man kan vilja exekvera olika kommandon om villkoret är sant resp. falskt if villkor kommandon1 else kommandon2

If-kommando forts. Ett if-kommando kan innehålla ett annat. if villkor1 kommandon1 if villkor2 kommandon2 else if villkor3 kommandon3 else kommandon4 kommandon5

If-kommando forts. Det finns precis ett till varje if. När några villkor ska undersökas i följd kan man använda elseif if villkor1 if villkor1 kommandon1 kommandon1 elseif villkor2 else kommandon2 if villkor2 else kommandon2 kommandon3 else kommandon3

If-kommando forts. Det finns inget till ett elseif. Man kan utelämna else-delen: if villkor1 kommandon1 elseif villkor2 kommandon2 Man kan fortsätta med else, elseif eller på raden föregånget av»,» eller»;». if b>a; temp = a; a = b; b = temp;

Villkor Ett godtyckligt uttryck kan användas som villkor: 0 är falskt. Skilt från 0 är sant. Sant lagras som 1. Ett uttryck anses sant när realdelen av alla element är nollskilda. Relationsoperatorerna <, <=, >, >=, == och ~= ger logiskt värde som resultat. Logiska värden kan kombineras med de logiska operatorerna ~, &,, && och samt den logiska funktionen xor. Det finns många inbyggda funktioner som ger ett logiskt värde som resultat. Sanningstabeller för ~, &, och xor ~a a&b a b xor(a,b) a a\b 0 1 a\b 0 1 a\b 0 1 --- -------- -------- ---------- 0 1 0 0 0 0 0 1 0 0 1 1 0 1 0 1 1 1 1 1 1 0 Hur många olika funktioner av n logiska variabler finns det?

Villkor forts. Värdet av k ligger mellan 5 och 17 : 5<k<17. Matlab: 5<k & k<17 I Matlab har 5<k<17 annan tolkning: >>k = 1; 5<k<17 ans = 1 Först beräknas 5<k dvs. 5<1 som ju är falskt dvs. 0. Därefter beräknas 0<17 som ju är sant dvs. 1. Det är lätt att skriva fel och förväxla = (tilldelningsoperatorn) och == (likhetsoperatorn). Operander beräknas före operatorn.

Genvägsoperatorerna && och fungerar annorlunda: % c = a && b if ~a c = 0 else c = b % c = a b if a c = 1 else c = b

Exempel: Skottår Enligt den julianska (romerska) kalern är ett år skottår om årtalet är delbart med 4. Enligt den gregorianska, i Sverige sedan 1753 använda, kalern är ast de jämna århundraden som är jämnt delbara med 400 skottår. Låt y vara ett årtal. Sätt leapjul till sant om y är skottår enligt den julianska och leapgreg om y är skottår enligt den gregorianska kalern. Året är ung. 365,2422 dagar och den gregorianska kalern ger 365,2425 dagar dvs. en dag fel på 3236 år. leapjul = mod(y,4)==0; % resten vid div. m 4 y: 1996 2000 2001 2004 2096 2100 2200 2300 2400 2500 leapjul(y): 1 1 0 1 1 1 1 1 1 1

Vi vill ha: leapgreg(y): 1 1 0 1 1 0 0 0 1 0 Delbart med 4 men inte jämnt århundrade som inte är jämt delbart med 400. Delbart med 4 och inte (delbart med 100 och inte delbart med 400). leapgreg = leapjul & ~(mod(y,100)==0 &... mod(y,400)~=0); % alternativt kommando leapgreg = leapjul & mod(y,100)~=0... mod(y,400)==0; Alternativet?

DeMorgans regler : ~(a&b) = ~a ~b ~(a b) = ~a&~b Prova i matlab: Räkna ut sanningstabellerna & jämför a = [0;1]*[1 1]; b = a ; c1 = ~(b & a) c2 = ~b ~a

y: 1996 2000 2001 2004 2096 2100 2200 2300 2400 2500 mod(y, 4)==0: 1 1 0 1 1 1 1 1 1 1 Delbara med 100: mod(y, 100)==0: 0 1 0 0 0 1 1 1 1 1 Inte delbara med 400. mod(y, 400)~=0: 1 0 1 1 1 1 1 1 0 1 Delbara med 100 men inte delbara med 400. mod(y, 100)==0 & mod(y, 400)~=0: 0 0 0 0 0 1 1 1 0 1 Uppfyller inte»delbara med 100 men inte delbara med 400». ~(mod(y, 100)==0 & mod(y, 400)~=0): 1 1 1 1 1 0 0 0 1 0 leapgreg(y): 1 1 0 1 1 0 0 0 1 0

Triangelanalys Avgör om en triangel med sidorna a, b och c är liksidig, likbent, oliksidig, eller ickeexisterande. % Analyserar triangeln med sidorna a, b och c. if a<=0 b<=0 c<=0 'ickeexisterande' elseif a>=b+c b>=c+a c>=a+b 'ickeexisterande' elseif a==b & b==c & c==a 'liksidig' elseif a==b b==c c==a 'likbent' else 'oliksidig'

Triangelanalys forts. Om vi lägger kommandona i filen tri.m så kan vi använda den som kommandofil. >>a = 0; b = 1; c = 2; tri % 0 1 2 ans = ickeexisterande >>a = 3; tri % 3 1 2 ans = ickeexisterande >>a = 1.5; tri % 1.5 1 2 ans = oliksidig >>a = 2; tri % 2 1 2 ans = likbent b = 2; tri % 2 2 2 >>ans = liksidig

Switch-kommando När man vill exekvera olika kommandon för olika värden på ett uttryck kan man använda switch i.s.f. if. switch uttryck case värde1 kommandon1 case värde2 kommandon2 otherwise kommandon Värdena är uttryck eller följder av värden inom»{}» (klammerparenteser) dvs. en celltabell. Om uttryckets värde inte finns med bland värdena utförs

kommandona efter otherwise. Delen otherwise kommandon får utelämnas. Det fungerar som om värdei beräknas varje gång uttryck beräknas. Uttryck ska vara sträng eller skalär. Exempel Låt t vara resultatet av ett tärningskast: >> help rand >> t=randi(6,1) switch t t = case {1,3,5} 5 'Udda antal prickar' >> throw case {2,4,6} ans = 'Jämnt antal prickar' Udda antal prickar otherwise 'Tärningen onormal!'

Felhantering, try-kommandot Vissa typer av fel får Matlab att skriva felmeddelande och stanna >>a = [1]; a(3)??? Index exceeds matrix dimensions. Man kan fånga upp felet så matlab inte stannar och skriva ett eget felmeddelande eller försöka rätta felet: >>a = [1]; >>try >> a(3) >>catch >> '??? Indexfel' >>??? Indexfel

Felhantering forts. Man kan själv rapportera fel med error(felmeddelande). Då skriver Matlab var felet inträffade och felmeddelandet. Om ett sådant fel rapporteras i en m-fil som anropas mellan try och catch skrivs inte felmeddelandet, utan kommandona mellan catch och utförs. Vissa beräkningar ger inte felmeddelande men möjligen varningsmeddelande och ett speciellt felvärde som resultat. 3/0 och 2*realmax ger båda resultatet Inf ( ) och 0/0 ger NaN (not a number). När man konverterar ett värde till någon datatyp som inte kan innehålla värdet lagras det närmaste möjliga värdet. int8(1000) ans = 127

Repetitionskommando, slinga, for Att utföra samma kommandon många gånger är vanligt. När man upprepar för en följd i förväg kända värden använder man for och när man upprepar så länge ett villkor är sant använder man while. for variabel = uttryck kommandon Variabeln kallas slingans styrande variabel. Den sätts i tur och ordning till kolumnerna i den tabell som är resultatet av uttrycket. Uttrycket beräknas bara när exekveringen av for-slingan börjar. Uttrycket är ofta en linjär talföljd, b:s:e.

Kuggväxel Man vill konstruera en kuggväxel där utväxlingen kommer så nära ett givet värde, gear, som möjligt. Man har tillgång till kugghjul med minst min och högst max kuggar. Läs in gear, min och max. Läs min, max och gear. Kontrollera att min, max och gear är större än noll. Låt m gå från min till max, för varje m: Testa alla n Håll reda på de bästa m och n hittills dvs. de som givit det minsta värdet på abs(m/n-gear). Skriv ut bästa värdena. Originalprogram nedan Hur många jämförelser? Smartare?

nmin = input('minsta kuggantal: ') nmax = input('största kuggantal: ') gear = input('önskad utväxling: '); bestdiff = realmax; if ~(gear>0 & max>0 & min>0), disp( data ska vara > 0 ); else for m = nmin:nmax for n = nmin:nmax diff = abs(m/n-gear); if diff<bestdiff, bestdiff = diff; bestm = m; bestn = n; % if % for n % for m disp(['bästa m, n och m/n är ',int2str(bestm),... ', ',int2str(bestn),' och ',num2str(bestm/bestn)]); % if Kan det göras smartare?

Kuggväxel forts. Antag att kommandona finns i kommandofilen kugg.m. >>kugg Minsta kuggantal: 5 Största kuggantal: 50 Önskad utväxling: 3.14159 Bästa m, n och m/n är 22, 7 och 3.1429 Funktionen disp(sträng) skriver ut sin parameter utan omgivande strängparenteser ('). I kommandofilen kan vi med samma resultat skriva: ['Bästa m, n och m/n är ' int2str(bestm)... ', ' int2str(bestn) ' och ' num2str(bestm/bestn)]

While while villkor kommandon Villkoret beräknas när exekveringen av while-slingan börjar och efter varje varv. Exekveringen avbryts när villkoret är falskt. Slingor och villkorskommandon kan innehålla andra slingor och villkorskommandon. Kommandot break innebär att närmast omgivande slinga avbryts och exekveringen fortsätter efter slingans avslutande. Kommandot continue innebär att pågåe varv i närmast omgivande slinga avbryts och nästa varv, om något återstår, exekveras.

eps Ett mått på en numerisk datatyps precision får man med det minsta tal, systeps, för vilket 1+systeps 1. systeps = 1; for i = 1:1000 systeps = systeps/2; if systeps+1==1 break systeps = systeps*2 systeps = 2.2204e-16 I Matlab finns en inbyggd variabel eps med motsvarande betydelse. Matlabs eps kan ändras och påverkar den relativa feltoleransen för vissa kommandon: eps = 2.2204e-16

Testning är ett program korrekt? Att ta reda på om ett program är korrekt är svårt. Hur beskriver (specificerar) man vad programmet ska göra? Hur tolkar man uppdragsgivarens eller framtida kunders önskemål? Man kan systematiskt testa olika fall/indata. Det är sällan möjligt att pröva alla fall/indatakombinationer. När man hittar ett fel kan man försöka rätta detta. Man kan systematiskt resonera om ett program och jämföra resonemangets resultat med programmets specifikation. En algoritm (av Abu Ja far Mohammaed ibn Mûsâ al-khowârizmî som 825 gav ut en algebrabok Kitab al jabr w al-muqabala) är en detaljerad beskrivning av hur man i ett ändligt antal steg löser ett problem.

Programceller Det kan vara praktiskt att indela en kommandofil i»programceller». En cell inleds med en rad som börjar med»%%» och slutar där nästa cell börjar eller filen är slut. Man markerar en cell (gör den aktiv) genom att klicka i den. Utför markerad cell. Utför markerad cell och markera nästa cell. Lägg in en cellbörjan. Visa cellförteckning. Visa info om celler.

Avlusning (eng. debugging) För att följa ett programs exekvering kan man: Testa programmet i delar!! Göra kontrollutskrifter på valda platser Sätta in»brytpunkter» där exekveringen tillfälligt stoppas Sätta in»villkorliga brytpunkter» där exekveringen tillfälligt stoppas om ett villkor är sant»stega» i programmet Indela programmet i»celler» och exekvera en cell i taget Använd kommandot code analyzer för att hitta förslag till förbättringar

Brytpunkter Man kan lägga in brytpunkter där exekveringen hejdas. Klicka i kolumnen t.h. om radnumren. När man når en brytpunkt visas en liten grön pil, i kommandofönstret visas ledtexten»>>k» och man kan titta på och ändra de lokala variablerna. Man fortsätter från brytpunkten med return eller knapparna. spara och kör/fortsätt sätt in/radera brytpunkt radera alla brytpunkter stega/utför en rad gå in i funktion utför och lämna aktuell funktion avsluta avlusning.

Fil-läsning och -skrivning Man läser alla värden från en fil till en variabel med load. Vi vill läsa ett värde i taget. Vi öppnar filen med fopen och om det går bra får vi en filreferens. Om det inte går bra returneras 1. Därefter kan vi läsa med fscanf och skriva med fprintf. filreferens = fopen(filnamn,behörighet) returnerar en filreferens, behörigheten utelämnas eller 'r' för läsning, 'w' för skrivning från början 'a' för skrivning efter tidigare filslut (app, lägg till). En text/sträng är en radvektor med element av typ tecken/char. Det som lagras är teckenkoderna enligt ISO 8859-1, Latin1. uint16('aåäöaåäö -') ans = [97 229 228 246 65 197 196 214 32 45] char(65) ans = A

Fil-läsning och -skrivning [var,läst_antal] = fscanf(filreferens,formatsträng,önskat_antal) returnerar en variabel med värden från filen i var och antalet lästa element i läst_antal (läst_antal får utelämnas), formatsträng beskriver hur data i filen ska tolkas (%d betyder heltal) och önskat_antal anger hur många värden som önskas. fprintf(filreferens,formatsträng,val1, ) skriver värdena val1, på filen enligt formatsträng: %d\n betyder som heltal med radbyte \n efter varje tal). Uppgift: Läs tal från filen in.dat tills talet 0 hittas eller filen är slut och skriv de positiva talen på filen out.dat.

Fil-läsning och -skrivning forts. frin = fopen('in.dat'); frout = fopen('out.dat','w'); % Testa helst att fopen ej har givit -1 [x,count] = fscanf(frin,'%d',1); if count>0 while x~=0 if x>0 fprintf(frout,'%d\n',x); [x,count] = fscanf(frin,'%d',1); if count==0 break, % while % if fclose(frin); fclose(frout);

Fil-läsning och -skrivning forts. Vi lägger koden i kommandofilen io.m och testar. >>type in.dat 2 3 5-7 11 13-17 0 19-23 29 >>io >>type out.dat 2 3 5 11 13 Och med ändrad infil. >>type in.dat 2 3 5-7 11 13-17 19-23 29 >>io >>type out.dat 2 3 5 11 13 19 29

Ö2: 3.2, 3.6, 4.7a, 4.9a, 4.19 L1: Lab1