INTRODUKTION TILL PROGRAMMERING Föreläsning 4 (27.11.2007) INNEHÅLL: Referenstyper Tabeller Strängar Operatorer: tilldelning Operatorer: upp- och nedräkning Repetitionssatser: do-satsen Repetitionssatser: for-satsen Jonny Karlsson 27.11.2007
Referenstyper En referenstyp kan vara en arraytyp, klasstyp eller gränssnittyp. Dessa typer behandlas i vissa viktiga avseenden annorlunda än de primitiva datatyperna (de datatyper vi lärt oss hittils dvs. int, float osv.). En referenstyps värde kallas för objekt Referenstyperna kan i princip bli hur många som helst eftersom de kan skapas av programmeraren själv. Jonny Karlsson 27.11.2007
Tabeller Är en variant av referenstyp (arraytyp). Används för att lagra en mängd olika variabler av samma datatyp i datorns minne. Brukar även kallas för vektorer eller ”arrays” En tabell kan behövas när man vill göra ett program som skall beräkna t.ex. medeltalet av ett visst antal värden. Tabeller behövs även vid lagring av teckensträngar i datorns minne. En tabells värden eller element brukar man kalla för medlemmar. Jonny Karlsson 27.11.2007
Tabeller Deklaration av en tabell int [ ] a; eller int a [ ]; Detta deklarerar variabeln a som är en tabell av typen int. Variabeln a är egentligen en referens till en array och specificerar ingen längd på arrayen. Jonny Karlsson 27.11.2007
Tabeller Att skapa tabeller Till skillnad från primitiva datatyper (t.ex. int) måste en tabell skapas (liksom andra referenstyper) innan ett värde kan tilldelas en medlem. a = new int[10]; En tabell med plats för 10 värden av typ int skapasoch a knyts till denna array. new är ett nyckelord som används för att skapa nya objekt. Jonny Karlsson 27.11.2007
Tabeller Skillnaden mellan variabler av primitiv typ och referenstyp: x = 360; //värdet 360 skrivs in i variabeln x dvs. den plats i minnet som betecknas //med x a = new int[10] //En tabell med plats för 10 heltal skrivs ej in i a, utan a tilldelas en //referens/pekare/handtag till tabellen som finns på en helt annan //plats i minnet Variablen a ovan berättar alltså på vilken plats i minnet tabellen finns. Variabeln a är alltså i detta fall en referenstyp och a-variabelns värde, dvs referensvärdet till minnesplatsen, är ett objekt Jonny Karlsson 27.11.2007
Tabeller När man skapar en tabell med nyckelordet new initialiseras automatiskt alla medlemmar av tabellen till ett visst värde. Exempel: int tab[] = new int[5]; //alla 5 medlemmarna i tabellen tab initialiseras till 0. Samma //gäller även andra tabeller av numerisk typ. Längden på en tabell kan i programkoden fås med: tab.length; //tab.length skulle i exemplet ovan ha värdet 5 Jonny Karlsson 27.11.2007
Tabeller Tilldelning av värden åt tabellmedlemmar En tabells medlemmar kan tilldelas värden på följande sätt: float tabell[]; //deklarerar en tabell av typen float tabell = new float[4]; //skapar en tabell med 4 medlemmar tabell[0] = 1.5; //första platsen/medlemmen i tabellen får värdet 1.5 tabell[1] = 22.89; //andra ’’ får värdet 22.89 tabell[2] = 11.4; //andra ’’ får värdet 11.4 tabell[3] = 48.96; //andra ’’ får värdet 48.96 OBS! första platsen i en tabell är 0 och inte 1 Ovanstående programkod skulle resultera i följande tabell En viss tabellmedlem betäcknas med- och är åtkomlig m.h.a. ett indexvärde. index värde 1.5 1 22.9 2 11.4 3 48.96 Jonny Karlsson 27.11.2007
Strängar Definierar en ändling följd av tecken. (teckensträng) I Java ugör strängar en klass kallad String. Klassen String innehåller en samling metoder för att manipulera strängar (en del av dessa tas upp lite senare) String är också liksom tabeller en referenstyp Jonny Karlsson 27.11.2007
Strängar En sträng deklareras enligt följande: String s; En sträng deklareras och initialiseras: String s2 = ”Kalle Anka”; En sträng tilldelas ett värde: s2 = ”Musse Pigg”; Jonny Karlsson 27.11.2007
Strängar Två strängar kan konkateneras/slås ihop med + operatorn: String str1 = ”Kalle”, str2 = ”Anka”; nystring = str1 + str2; //innehållet i nystring blir ”KalleAnka”; Två strängar kan jämföras på samma sätt som primitiva datatyper m.h.a. jämförelseoperatorn (==). Se exemplet nedan: String s = ”pelle”; String s2 = ”pelle”; If(s == ”pelle”) //denna if-sats blir ”true” if(s == s2) //denna if-sats blir ”true” If(s2 == ”ville”) //denna if-sats blir ”false” Jonny Karlsson 27.11.2007
Operatorer: tilldelning = Tilldelningsoperator Det som finns till höger om tilldelningsoperatorn utvärderas, och resultatet lagras i den variabel som finns till vänster om tilldelningsoperatorn. Exempel: a = a + b; //resultatet av a + b lagras i variabeln a Tilldelningssatsen ovan kan förenklas på följande sätt: a += b; //ger samma resultat som a = a + b Samma förenkling kan göras med samtliga aritmetiska operatorer: a -= b; //ger samma resultat som a = a - b a *= b; //ger samma resultat som a = a * b a /= b; //ger samma resultat som a = a / b Jonny Karlsson 27.11.2007
Operatorer: upp- och nedräkning ++ Uppräkningsoperator -- Nedräkningsoperator En uppräknings- eller en nedräkningsoperator placeras antingen före eller efter en operator/uttryck. ++heltal Prefix heltal++ Postfix Nedräkningsoperatorn minskar en variabels värde med 1 och uppräkningsoperatorn ökar en variabels värde med 1 Jonny Karlsson 27.11.2007
Operatorer: upp- och nedräkning int helatal = 0; heltal = helatal - 1; //heltal har nu värdet -1 --heltal; //heltal har nu värdet -2 heltal = heltal + 1; //heltal har nu värdet -1 heltal++; //heltal har nu värdet 0 Jonny Karlsson 27.11.2007
Operatorer: upp- och nedräkning Det har betydelse om man använder prefix (operatorn före variabeln) eller postfix (operatorn efter variabeln). Följande satser ger olika resultat: (låt oss anta att heltal har värdet 1) //sats1: a = heltal++; //a får värdet 1 och heltal får värdet 2. (a tilldelas värdet i heltal och //först sen inkrementeras heltal med 1 //sats2: a = ++heltal; //a får värdet 2 och heltal får värdet 2. (heltal inkrementeras först //med 1 och sedan tilldelas variabeln a värdet i variabeln heltal Jonny Karlsson 27.11.2007
Repetitionssatser: do-satsen while(uttryck); do-satsen är likadan som while-satsen med den skillnaden att utrycket testas först efter utförd sats. I while-satsen testas uttrycket före utförd sats. { scanf(”%d”, &i); gör någåt med i; } while(i < 0); Jonny Karlsson 27.11.2007
Repetitionssatser: for-satsen Är mycket användbar! Har följande allmänna form: for(uttyck1; utryck2; utryck3) sats; Satsen ovan är ekvivalent med följande while-sats: utryck1: while(uttryck2) { sats; uttryck3; } Jonny Karlsson 27.11.2007
Repetitionssatser: for-satsen for(uttyck1; utryck2; utryck3) sats; uttryck1 = Utförs allra först och endast en gång. Är ofta en initialisering av en variabel. uttryck2 = Jämförelseuttryck t.ex. (a < b). Om detta uttryck är sant utförs sats. Om detta uttryck är falskt hoppar programmet bort från for-satsen uttryck3 = Utförs alltid efter sats. Är vanligen en inkrementering av den variabel som initialiserats i uttryck1 Jonny Karlsson 27.11.2007
Repetitionssatser: for-satsen Exempel: programmet läser in 10 värden från tangentbordet och sparar dessa i tabell int tabell = new int[10]; int index; for(index = 0; index < 10; index = index+1) tabell[index] = input.readInt(); Exempel2: Se simulering av for-satsen Jonny Karlsson 27.11.2007
Problem 1 Gör ett Java-program som ritar en triangel av gångertecken enligt önskad höjd, se programkörningen nedan. Om använderan t.ex. anger höjden 4, skall programmet rita ut ett gångertecken på första raden, 2 gångertecken på andra raden, .... och 4 gångertecken på fjärde och sista raden. Lös problemet med for-satser! Se lösning Jonny Karlsson 27.11.2007
Problem 2 Gör ett Java-program som frågar efter N antal helatal. N måste vara ett heltal mellan 5 och 10. Om ett felaktigt värde ges ber programmet användaren mata in N pånytt (lös problemet med do-satsen). Sedan ber programmet användaren mata in N antal heltal och visar till slut heltalen på bildskärmen i omvänd ordning (använd for-satser vid inläsning och visning på bildskärmen). Jonny Karlsson 27.11.2007