UPPSALA UNIVERSITET Institutionen för lingvistik och filologi Mats Dahllöf http://stp.ling.uu.se/ matsd/uv/uv11/pst1/ Programmering för språkteknologer I Anteckningar 1: Grundläggande saker 1 Programmering grundkomponenter Data finns i variabler och är deklarerade som tillhöriga en viss typ. Enkla instruktioner/operationer. Subrutiner: Namngivna underprogram. Kontrollmekanismer: Göra saker villkorligt en gång eller upprepat. Läs Eck, 1.3 1.5 (Resten av Kapitel 1 allmänbildning; Quiz bra). 2 Variabler och typer Variabler använder vi för att hålla reda på den information som ett program bearbetar. Variabler är av olika sorter, och i Java håller man mycket strikt koll på variablernas innehåll. Varje variabel deklareras som tillhörig en viss typ. int mittheltal = 3; String mittord = "tomaterna"; Dessa satser deklarerar de två variablerna mittheltal och mittord som varande av typerna int och String. Typen int avser heltal (eng. integer ) med vissa storleksbegränsningar och String avser strängar, alltså sekvenser av tecken. Dessa satser tilldelar även variablerna konkreta värden, och visar hur heltal och strängar skrivs. Deklaration och tilldelning kan göras separat, så här: String mittord; mittord = "tomaterna"; // deklaration // tilldelning Det vanliga är dock att man deklarerar och gör en första tilldelning (initierar variabeln) på samma rad. Notera även att vi kan skriva kommentarer med hjälp av //. Allt som kommer efter // på en rad räknas som kommentar och tolkas ej som programkod. Läs Eck, 2.2 (om variabler och enkla typer). 2.1 Javas datatyper tre huvudsakliga sorter Det finns tre huvudsakliga sorter av dataentiteter i Java: Objektstyper/klasstyper är den prototypiska formen för godtyckliga behållare för data i objektorienterad programmering. De kan fånga olika typer av struktur. De ingår i begreppshierarkier och är alla av överordnade typen Object. Klasserna kan vara standardklasser som ingår i Java (som String) eller vara användardefinierade. 1
Enkla typer för enkla värden som är generellt användbara, alltså sanningsvärden, olika sorts tal och tecken. Det finns åtta stycken. Fält (arrayer): linjära behållare med fast längd för godtyckliga typer av dataentiter, indexerade från 0 till n 1, om längden är n. Man måste konkret deklarera vad ett fält skall innehålla, t.ex. int[] för fält av int (heltal), String[] för fält av String-objekt (strängar). Läs Eck, 5.1 (om variabler, referenser och objekt). 2.2 Några enkla typer boolean int long float double char sanningsvärde, med värdena true och false. heltal. heltal, större intervall. decimaltal. decimaltal, större intervall och precision. tecken. 3 Objekt och metoder, några första punkter En viktig typ av värden på variabler är s.k. objekt. Dessa är givetvis av central betydelse i objektorienterad programmering, som Java exemplifierar. Typen String är en objektstyp (dock inte int, som bara är en enkel typ ). En annan viktig sak i objekt-orienterad programmering är metoder. Dessa representerar saker man kan göra och man kan definiera egna metoder eller använda befintliga (som finns färdiga i Java). Ett viktigt sätt att använda metoder är att utföra dem på objekt. Objekt och metoder passar ihop, och detta är en grundprincip i objekt-orienterad programmering. Två metoder som man kan utföra på String-objekt är substring och length. substring är en fördefinierad metod som utförs på ett String-objekt och utifrån två heltal ger oss en delsträng, nämligen den delsträng som börjar på positionen som anges av första talet och avslutas vid positionen som anges av andra talet (tecknet där inkluderas ej). Det är viktigt att bestämma att returtypen för metoden just är String. De två heltalen skickas till metoden som s.k. argument. Vi får på så sätt ett metodanrop genom att t.ex. skriva mittord.substring(mittheltal,6), där variablerna införts som ovan. Detta metodanrop returnerar "ate" (som ligger på positionerna 3 5 i mittord = "tomaterna"). Sammanfattningsvis tillhör metoden klassen String och dess returtyp är (också) String och den tar två argument, båda av typen int. I dokumentationen ställs det upp så här, (se http://download.oracle.com/javase/6/docs/api/java/lang/string.html): public String substring(int beginindex, int endindex) Metoden length är enklare. Den ger ett int-värde från strängen men tar inget argument. public int length() Det kan se ut så här när vi använder denna metod. int mittandraheltal = mittord.length(); Läs Eck, 2.3 (om strängar). 2
4 Skriva och köra program Man anropar en viss klass, som exempel (HelloWorld), som måste ligga i filen HelloWorld.java, och där måste det finnas en (klass)metod main, som ger den procedur som skall utföras. Läs Eck, 2.1. 4.1 Kompilera ett program Så här kompilerar vi vårt program i Linux, med kommandot javac(ompilator). Detta kan ge oss varningar och felmeddelanden, men i detta fall är kompilatorn helt nöjd. Den har därmed skapat en fil som heter HelloWorld.class med sådan bytekod som Javainterpretatorn kör. mindator> javac HelloWorld.java 4.2 Köra ett program Vi kan bara köra ett program efter kompilering, och det vi kör är bytekodsfilen (i detta fall HelloWorld.class). Vi kan t.ex. anropa den så här (extensionen.class skrivs inte ut): mindator> java HelloWorld 5 For-slingor public class ForExempel { public static void main (String[] kommradsarg) { TextIO.put("Ange ett tal: "); int num = TextIO.getlnInt(); // Vi skriver ut så många plustecken. for (int i=0; i < num; i++) { System.out.print("+"); ; System.out.println(""); ForExempel.java 6 Strängar och for-slingor Läs Eck, 3.4 (for-slingor). Läs Eck, 2.4.3 (TextIO.java behövs även här.). ForExempel2.java 3
public class ForExempel2 { public static void main (String[] kommradsarg) { TextIO.put("Ange ett ord: "); String word = TextIO.getlnWord(); // Vi skapar och skriver ut alla "unigram". for (int i=0; i < word.length(); i++) { System.out.println(word.substring(i,i+1)); ; Ger detta (Ange ett ord: är programmets prompt): mindator> javac ForExempel2.java mindator> java ForExempel Ange ett ord: huset h u s e t 7 While-slingor Läs Eck, 3.1.2 (while-slingor). 8 Övningar Läs Eck, 2.4.3 (ladda ned TextIO.java, som behövs för dessa övningsprogram). (I) Gör övningar Eck kapitel 2. Quiz är också bra. (II) Gör om for-slingan till en helt ekvivalent while-slinga i ForExempel2.java. (III) Gör om Ecks övning 2.4 anpassad för svenska mynt och valuta! 9 Laborationer serie 1 (inlämning) (1) Utgå från ForExempel2.java och utforma programmet så att det skriver ut bigram istället. Och skulle fungera väl för et godtyckligt långt inputord. Alltså, t.ex.: mindator> java ForExempelBi Ange ett ord: raset ra as se et 4
(2) Utgå från ForExempel2.java och utforma programmet så att det skriver ut ngram av godtycklig längd (n) istället. Och skulle fungera väl för et godtyckligt långt inputord. Alltså, t.ex.: Ange ett ord: Göteborg och ange ngram-längd: 5 Göteb ötebo tebor eborg (3) Utgå från ForExempel.java och utforma ett program (så enkelt och generellt som möjligt) som ger denna typ av beteende: Ange ett tal: 7 + ++ +++ ++++ +++++ ++++++ +++++++ 5