Programmering hh.se/db2004 Föreläsning 10: Objektorienterad programmering - datatyper Verónica Gaspes www2.hh.se/staff/vero www2.hh.se/staff/vero/programmering Påminnelse: en datatyp för bilder Vad är en bild? För att kunna göra bildbehandling, som till exempel i en digitalkamera, kan man tänka på en bild som en matris av färgpunkter (pixels). Pixlar Högst upp till vänster: rad 0, kolumn 0 Längst ner till höger: rad 4, kolumn 6 Bredd: 7 kolumner Höjd: 5 rader I varje ruta, en referens till ett färgobjekt Center for Research on Embedded Systems IDE-sektionen 1 / 21 2 / 21 En datatyp för bilder Spegelbild API public class Picture datatyp för bildbehandling Picture(String s) skapa en bild från en fil Picture(int w, int j) skapa en w ggr h tom bild int width() bildens bredd int height() bildens höjd Color get(int i, int j) färgobjekt i pixel (i,j) void set(int i, int j, Color c) bestäm färgobjektet i pixel (i,j) till c void show() visa bilden i ett fönster void save(string s) spara bilden till en fil För ett visst y återfinns färgpunkten i x i width 1 x 3 / 21 4 / 21
Spegelbild En metod private static Picture flipx(picture p){ int w = p.width(); int h = p.height(); Picture pic = new Picture(w,h); for(int x = 0; x<w;x++){ for(int y = 0; y<h; y++){ pic.set(x,y,p.get(w-x-1,y)); return pic; 5 / 21 En liten sammanfattning om objekt En typ är en mängd värden och de operationer man kan göra med dessa värden. I Java kan man använda klasser för att definiera nya datatyper (vi kommer att definiera våra egna i nästa föreläsning, idag fortsätter vi att se hur dessa datatyper används). Värden (motsvarar literaler i primitiva typer) För att skapa objekt måste man använda det reserverade ordet new tillsammans med datatypens konstruerare (den heter exakt som klassen och kan ha argument). Operationer (är metoder som klassen erbjuder) För att tillämpa en operation använder man objektets namn, punktoperatorn och metodens namn (med eventuella argument). 6 / 21 Exempel Vi har tittat på både färger och bilder: vi har diskuterat vilka ideer som ligger bakom klassernas API. Fast vi inte vet hur dessa ideer är implementerade har vi kunnat skriva klientprogram. Referenstyper Både fält och datatyper som implementeras med klasser (String, Color, Picture,.... Alltså alla typer som inte är primitiva) delar vissa egenskaper som vi sammanfattar nu. Referenser är namn Ett objekt och dess namn Ta mitt hus som objekt. Jag skriver adressen på ett papper och ger det till en hantverkare. Det som står på papperet ändras inte när hantverkaren förändrar mitt hus, till exempel genom att måla det rosa. Jag skulle till och med kunnat ha skrivit flera lappar som jag delade ut till flera hantverkare! När rörmokaren kommer efteråt för att sätta in ett badkar så är huset rosa! I kod Picture a = new Picture("baboon.jpg"); Picture b = a; a.set(i,j,color1); b.set(i,j+1,color1); Tilldelningen kopierar namnet! Metoderna ändrar samma objekt! 7 / 21 8 / 21
Oföränderliga objekt Att jämföra objekt Vill man att objekt av en viss typ inte skall kunna ändras så erbjuder man inga metoder som kan förändra objekt. Till exempel så är färger och strängar oföränderliga. (Vi tittar på strängar senare idag). APIn för bilder erbjuder metoden set som gör att en bild kan förändras. Bilder är föränderliga objekt! När man använder == med referenser (namn) kollas det om de pekar (namger) samma objekt. Metoden kollar inte om objekten har samma värde! I kod Color a = new Color(142, 213, 87); Color b = new Color(142, 213, 87); Color c = b; a==b är falsk medan b==c är sann! Kolla APIn för klassen Color: det finns en metod equals för att jämföra färgvärden! Både a.equals(b) och b.equals(c) är sanna. 9 / 21 10 / 21 En till datatyp: strängar Vad är en sträng? En sträng är en indicerad följd av char-värden. Strängar dyker upp i många tillämpningar eftersom vi kommunicerar med många program med strängar (t ex kommandoraden, textfiler), många program hanterar strängar (t ex blogg, mail) och man använder strängar för att modellera saker (t ex i molekylärbiologi). DNA Strängar med tecken A, C, T och G. 11 / 21 En datatyp för strängar API public class String Ur Javas datatyp för strängar String(String s) int length() char charat(char i) String substring(int i, int j) boolean contains(string sub) boolean startswith(string pre) boolean endswith(string post) int indexof(string p) int indexof(string p, int i) String concat(string t) int compareto(string t) String replaceall(string a, String b) String[] split(string delim) boolean equals(string t) 12 / 21
Strängar i Java Språkstöd Java erbjuder lite stöd för strängar, till exempel literaler så att man slipper använda konstruerare och operator + så att man slipper använda metoden concat. Ett String-värde är inte samma sak som ett fält av char! Skillnad i kod - fält for(int i = 0; i<a.length; i++) {... a[i]... Strängar i Java Varför detta? Det är inte ovanligt att program bearbetar jättelånga strängar eller massor med strängar. Klassen String erbjuder många användbara metoder och gör det på ett effektivt sätt! Skillnad i kod - strängar for(int i = 0; i<s.length(); i++) {... s.charat(i)... 13 / 21 14 / 21 Palindrom? private static boolean ispalindrome(string s){ int N = s.length(); for(int i = 0; i< N/2; i++){ if(s.charat(i)!= s.charat(n-1-i)){ return false; return true; Palindrom? private static boolean ispalindrome(string[] a){ // all elements in s together String s = ""; for(int i = 0; i<a.length; i++){ s = s.concat(a[i]); return ispalindrome(s); 15 / 21 16 / 21
Filnamn och efternamn private static String[] filenameandsurname(string filename){ String[] result = new String[2]; int dot = filename.indexof("."); result[0] = filename.substring(0,dot); result[1] = filename.substring(dot+1, filename.length()); return result; Radutskrifter private static void printalllineswith(string query){ while(!stdin.isempty()){ String line = StdIn.readLine(); if(line.contains(query)){ System.out.println(line); 17 / 21 18 / 21 Vad är en gen? Genomik I genomik representerar man ett genom som en sträng med tecken från {A, C, T, G Gener En gen är en delsträng av ett genom som har en funktion. Dessa delsträngar är sådana att 1 delsträngen ATG föregår dem (start codon) 2 de består av en multipel av 3 nukleotider (bokstäver) 3 en av delsträngarna TAG, TAA eller TGA efterföljer dem. (stop codon) Hitta alla gener! Läs in en genom från standard input och skriv ut alla gener. Start codon och stop codon skall anges på kommandoraden. 19 / 21 Hitta alla gener! 1 Läs in genomet 3 tecken i taget! 2 Om man ser ett start codon, kommer man ihåg platsen! 3 Om man ser ett stop codon och är mitt i en möjlig gen (alltså har man sett en start codon) skriver man ut genen! 4 Man måste hitta ett sätt att skilja mellan att man har sett ett start codon eller inte: eftersom alla heltal >= 0 kan markera positionen av en start codon kan vi använda -1 för att markera att vi börjar leta efter en sådan! 20 / 21
Hitta alla gener int beg = -1; for (int i = 0; i < genome.length() - 2; i++) { String codon = genome.substring(i, i+3); // start codon if (codon.equals(start)) beg = i; // stop codon if ((codon.equals(stop)) && beg!= -1) { // check putative gene alignment String gene = genome.substring(beg+3, i); if (gene.length() % 3 == 0) { System.out.println(gene); beg = -1; 21 / 21