Textsträngar från/till skärm eller fil Textsträngar [Kapitel 8.1] In- och utmatning till skärm [Kapitel 8.2] Rekursion Gränssnitt Felhantering In- och utmatning till fil Histogram 2010-10-25 Datorlära, fysikexperiment - del 6 1
Textsträngar (1) Strängar skapas med text inom enkla citattecken: >> str = 'En sträng'; Svenska tecken kan användas. Stora och små bokstäver skiljer sig åt. Strängar kan ses som vektorer av tecken Det går att plocka ut enstaka tecken med indexoperatorn: >> str(7) ä Kolonoperatorn kan användas för att ta ut en delsträng: >> str(4:9) sträng Strängen har, liksom vektorn, en längd >> length(str) 9 2010-10-25 Datorlära, fysikexperiment - del 6 2
Textsträngar (2) Sammanlänkning av strängar: >> str2 = ['En 'sträng'] eller [ En, sträng ] En sträng Uttrycket skapar alltså inte en vektor med två element av typen sträng utan en vektor med tecken. Konvertera tal till text med num2str: >> num2str(47.11) 47.11 Funktionen findstr() letar efter en delsträng i en sträng: >> findstr(str2,'sträng') 4 Resultatet är ett index i strängen eller [] om delsträngen inte hittades. 2010-10-25 Datorlära, fysikexperiment - del 6 3
In- och utmatning Funktionen input används för enkel inmatning av tal: >> x = input('ange ett tal'); Om användaren nu skriver in ett tal, tilldelas x detta värde. För att skriva ut en blandning av tal och text (då num2str inte är tillräcklig) används sprintf : >> s = sprintf('pi är %.3f, med 3 decimaler',pi); >> disp(s) Pi är 3.142, med 3 decimaler Här anger % att det som följer är en utmatning av formaterad data. '.3f' anger att det är ett flyttal (f) med tre decimaler som skall skrivas ut. Det andra argumentet är talet som skall formateras (pi). 2010-10-25 Datorlära, fysikexperiment - del 6 4
In- och utmatning (2) Fler formateringsflaggor till sprintf %d skriver ut ett heltal %X.Yf skriver ut ett tal med Y decimaler och där hela talet skall vara X tecken långt. Bra för att formatera tabeller, varje kolumn blir lika bred: >> s = sprintf('pi är %20.8f, med %d decimaler.',pi,8); >> disp(s) Pi är 3.14159265, med 8 decimaler. Se i hjälpen för sprintf för mer information. 2010-10-25 Datorlära, fysikexperiment - del 6 5
Rekursion En rekursiv funktion anropar sig själv. Ett enkelt exempel är beräkning av fakultet (!) function f=factorial(x) if(x==0) f = 1; else f = x*factorial(x-1); end Vid rekursion finns alltid ett basfall och minst ett rekursivt fall I exemplet ovan är basfallet då x är 0. Rekursion är inte alltid det mest effektiva sättet att lösa ett problem men lösningen kan bli enkel och tydlig. 2010-10-25 Datorlära, fysikexperiment - del 6 6
Gränssnitt För att underlätta arbetet för såväl den som gör funktionen som den som skall använda den. Tänk igenom användandet innan. Skriv kommentarer: Vad funktionen är tänkt att göra Förväntad användning Begränsningar Villkor för parametrar (argument) function r = randomgauss(mean,sigma) % Dra ett slumptal enligt en normalfördelning med % medelvärde mean och standardavvikelse sigma % % parameter mean : Medelvärde % parameter sigma : Standardavvikelse 2010-10-25 Datorlära, fysikexperiment - del 6 7
Felhantering För att rapportera ett fel används funktionen error Bra att använda vid kontroll av argument >> error('minfunktion() Nu har det blivit fel') Error: minfunktion() Nu har det blivit fel Bra att använda vid kontroll av argument. Varna användaren med funktionen warning Oväntat resultat Lång beräkningstid Möjlig brist på precision >> warning('minfunktion() Det här tar tid! ) Warning: minfunktion() Det här tar tid! 2010-10-25 Datorlära, fysikexperiment - del 6 8
Felhantering (2) Exempel function f=factorial(x) % Beräknar fakulteten av ett positivt heltal % parameter x : Positivt heltal if (x < 0) error('factorial() x måste vara positivt') elseif (x > 1000) warning('factorial() det här blir ett stort tal') end if(x==0) f = 1; else f = x*factorial(x-1); end 2010-10-25 Datorlära, fysikexperiment - del 6 9
In- och utmatning till fil Att spara data i textfiler är mycket vanligt. Enkelt både att läsa filerna själv och att låta ett program göra det. Öppna en fil med funktionen fopen och stäng med fclose. filen = fopen('min_textfil.txt','w'); % skriv data här fclose(filen); Första argumentet är ett filnamn, andra argumentet är en sträng 'w' för att skriva och 'r' för att läsa. Funktionen returnerar ett objekt som vi kan använda för att hänvisa till just den här öppna filen. 2010-10-25 Datorlära, fysikexperiment - del 6 10
In- och utmatning till fil (2) På sidan 4 introducerades funktionen sprintf som skapar en formaterad sträng. För filer finns motsvarande funktion fprintf som skriver formaterad text till en fil: datavektor = 1:10; filen = fopen('min_textfil.txt','w'); fprintf(filen,'%d\r\n',datavektor); fclose(filen); I exemplet skrivs alla talen i vektorn ut, ett tal per rad. %d anger att talen som skrivs ut är heltal. %e för flyttal, %f för fixpunktstal och %s för strängar. För att skriva ut en radbrytning använd '\r\n. 2010-10-25 Datorlära, fysikexperiment - del 6 11
In- och utmatning till fil (3) För att läsa från en fil används funktionen fscanf. Filen måste först öppnas för läsning: filen = fopen('min_textfil.txt','r'); datavektor = fscanf(filen,'%d'); fclose(filen); 2010-10-25 Datorlära, fysikexperiment - del 6 12
Histogram Den inbyggda funktionen hist används för att rita ut grafer över klassindelade data. Ett histogram har ett antal klasser eller korgar. Funktionen hist tar vanligen två argument, en vektor med data och ett tal som anger antalet klasser. Intervallet mellan det minsta och största elementen i vektorn delas sedan upp (i antalet klasser). Grafen visar sedan hur många element i vektorn som hamnar i varje klass. 2010-10-25 Datorlära, fysikexperiment - del 6 13
Histogram Exempel: % Födelsemånad för ett antal personer m = [1 4 5 2 3 9 12 1 3 4 9 8 4 10 5 11 6 7 2]; hist(m,12); 2010-10-25 Datorlära, fysikexperiment - del 6 14