22.08.2013 Views

Objektorienterad programmering Undervisning Lärare och ...

Objektorienterad programmering Undervisning Lärare och ...

Objektorienterad programmering Undervisning Lärare och ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Objektorienterad</strong> <strong>programmering</strong><br />

Kursinfo<br />

Kursinformation<br />

Allmänt om <strong>programmering</strong><br />

Java - några inledande exampel<br />

Föreläsning 1<br />

Grundbegrepp: variabler, uttryck, satser, typer.<br />

<strong>Lärare</strong> <strong>och</strong> kurslitteratur<br />

<strong>Lärare</strong><br />

Kursansvarig, föreläsningar <strong>och</strong> övningar Björn von Sydow<br />

Labbhandledning<br />

Emil Djupfeldt, Pelle Evensen, Maria Öhrman, Björn von Sydow<br />

Rekommenderad litteratur<br />

Någon av<br />

David J. Eck: Introduction to Programming using Java, 5th ed.<br />

Kan laddas ner gratis från nätet.<br />

Jan Skansholm: Java direkt.<br />

Vanlig kursbok i kurser på Chalmers; säljs på Cremona.<br />

Kevin Wayne, Robert Sedgewick: Introduction to Programming in<br />

Java<br />

Bästa boken; säljs av nätbokhandlar.<br />

Kursinfo<br />

<strong>Undervisning</strong><br />

Föreläsningar<br />

Tisdagar 13–15 <strong>och</strong> fredagar 10–12.<br />

Allmänna begrepp, exempel, demonstrationer.<br />

Övningar<br />

Torsdagar 13–15 läsvecka 1–8.<br />

Problemlösning individuellt samt genomgångar.<br />

Labbhandledning<br />

Måndagar 13–15, onsdagar 13–15 <strong>och</strong> torsdagar 10–12.<br />

Bokade arbetsplatser <strong>och</strong> handledare på plats.<br />

Kursinfo<br />

Examination<br />

Laborationer<br />

Sex obligatoriska <strong>programmering</strong>suppgifter. Görs i grupper om två<br />

personer.<br />

Deadlines enligt kursens webbplats.<br />

Första labben ska lämnas in i morgon!<br />

Tentamen<br />

Skriftlig tentamen 12 mars på förmiddagen.<br />

Kursbok får inte medföras till tentan.<br />

Ett referensblad (två sidor) om Java medföljer tentatesen.


Kursinfo<br />

Lärandemål, 1<br />

Ur kursplanen: Efter kursen ska ni kunna<br />

Kursinfo<br />

förklara grundläggande begrepp inom imperativ <strong>och</strong> objektorienterad<br />

<strong>programmering</strong>, speciellt som de realiseras i det programspråk som<br />

används i kursen.<br />

beskriva några standardalgoritmer, för till exempel sortering <strong>och</strong><br />

sökning, samt veta var dessa återfinns i språkets standardbibliotek.<br />

definiera enkla subrutinbibliotek med utnyttjande av det använda<br />

programspråkets datatyper <strong>och</strong> styrstrukturer.<br />

definiera klasser som modellerar enkla fenomen i objektorienterad<br />

anda, med inkapslade data som avläses <strong>och</strong> uppdateras via publika<br />

metoder.<br />

Labbar<br />

Kursinfo<br />

Lärandemål, 2<br />

Ur kursplanen: Efter kursen ska ni kunna<br />

Programmering<br />

sätta er in i ett givet program, bestående av flera klasser, i syfte att<br />

felsöka, komplettera eller förbättra programmets beteende enligt<br />

givna anvisningar.<br />

skriva enkla händelsestyrda program med grafiskt gränssnitt.<br />

använda <strong>och</strong> söka i programbibliotek för några standardändamål,<br />

som exempelvis grafiska gränssnitt <strong>och</strong> datastrukturer.<br />

använda enkla verktyg för att skriva in, kompilera, exekvera <strong>och</strong><br />

dokumentera program.<br />

identifiera situationer i er fortsatta utbildning där <strong>programmering</strong> kan<br />

vara ett effektivt hjälpmedel i studierna.<br />

identifiera ert behov av ytterligare kunskaper inom området<br />

<strong>programmering</strong> <strong>och</strong> datavetenskap.<br />

Programmering<br />

Vad är ett program?<br />

En uppsättning instruktioner som anpassar en dator för<br />

att lösa en viss klass av problem.<br />

Vad då för instruktioner?<br />

Datorns inbyggda instruktioner är mycket enkla: addera<br />

två tal, jämför två tal, flytta ett tal i minnet, . . .<br />

Stora program består av miljontals sådana instruktioner.<br />

Hur kan man skriva sådana program?<br />

Skriv program i språk på högre abstraktionsnivå.<br />

Utnyttja många lager av programbibliotek.


Programmering<br />

Programspråk<br />

Olika typer av språk<br />

Imperativa: C, Ada, FORTRAN, . . .<br />

<strong>Objektorienterad</strong>e: C++, Java, C#, Python, . . .<br />

Funktionella: Haskell, ML, F#, . . .<br />

Domänspecifika: Matlab, VHDL, . . .<br />

Varför Java?<br />

Imperativt <strong>och</strong> objektorienterat.<br />

Programmering<br />

Gratis tillgång för olika typer av datorer.<br />

Bra bibliotek, information på nätet.<br />

Mycket använt.<br />

Software Engineering<br />

En del programutvecklingsprojekt tillhör de mest omfattande<br />

ingenjörsprojekt som kan genomföras (tusentals programmerare under<br />

många år).<br />

Att leda <strong>och</strong> organisera sådana projekt innebär stora utmaningar, både<br />

tekniskt <strong>och</strong> administrativt.<br />

Vi kan inte alls beröra dessa svårigheter i den här kursen.<br />

Programmering<br />

Algoritmer <strong>och</strong> datastrukturer<br />

Ofta är huvudsvårigheten att finna en bra<br />

algoritm, som hittar lösningen på<br />

tillräckligt kort tid (<strong>och</strong> utan att använda för<br />

mycket resurser i övrigt.)<br />

När man väl har en bra algoritm är det ofta<br />

inte så svårt att formulera den i ett<br />

programspråk.<br />

För många vanliga problem finns<br />

standardalgoritmer <strong>och</strong> tillhörande<br />

datastrukturer. Vi hinner inte diskutera<br />

dessa i denna kurs, men ska använda en<br />

del biblioteksklasser med sådana<br />

algoritmer <strong>och</strong> datastrukturer.<br />

Exempel<br />

Funktioner i matematiken<br />

En funktion i matte<br />

Vi kan definiera t ex f (x) = x 2 + 3.<br />

Därefter kan vi använda funktionen med olika argument:<br />

T ex har vi att f (7) = 52 (= 7 2 + 3)<br />

<strong>och</strong> att f (−3) = 12 (= (−3) 2 + 3).<br />

Definitions- <strong>och</strong> värdemängd<br />

Vi måste också specificera definitionsmängden, dvs vilken mängd<br />

argumenten tas från, <strong>och</strong> vilken mängd funktionsvärdena tillhör.<br />

För f ovan kan dessa mängder till exempel vara heltalen.<br />

Alternativ definitions- <strong>och</strong> värdemängd<br />

Vi kan också betrakta f ovan som en funktion med de reella talen som<br />

definitions- <strong>och</strong> värdemängd. Då kan vi också beräkna<br />

f (0.6) = 3.36 (= 0.6 2 + 3).


Exempel<br />

Samma funktion i Java<br />

Med heltal som argument <strong>och</strong> resultat<br />

I Java kan man definiera samma funktion:<br />

public static int f(int x) {<br />

return x*x + 3;<br />

}<br />

Försök för tillfället bortse från nyckelorden public, static <strong>och</strong> return<br />

som förklaras senare.<br />

Typen int förekommer på två ställen:<br />

int x säger att argumentet x ska vara ett heltal.<br />

int f . . . säger att resultatet blir ett heltal.<br />

Uttrycket efter return är funktionens resultat (funktionsvärdet).<br />

Exempel<br />

Mer om Example1<br />

Kommentarer<br />

Viktigast: ni kan inte förstå allt fullständigt nu; ni måste se fler<br />

exempel <strong>och</strong> förstå bättre efterhand.<br />

Vi har definierat ett program (en klass), som innehåller definitionen<br />

av f <strong>och</strong> en main-rutin.<br />

Att köra programmet innebär att kommandona i main-rutinen utförs. I<br />

detta fall finns bara ett enda kommando, en utskrift.<br />

Det som skrivs ut är strängen f(1234)= följt av funktionsvärdet<br />

f(1234) (så + betyder här inte addition).<br />

Att funktionsvärdet (som blir 1522759) skrivs ut innebär att<br />

programmet först måste beräkna detta genom att använda funktionen.<br />

En fråga<br />

Vad betyder argumentet till main-rutinen???<br />

Exempel<br />

Vårt första Java-program<br />

Vad blir f (1234)?<br />

Frågan kan besvaras med hjälp av programmet<br />

public class Example1 {<br />

public static int f(int x) {<br />

return x*x + 3;<br />

}<br />

public static void main(String[] args) {<br />

System.out.println("f(1234)=" + f(1234));<br />

}<br />

}<br />

Det finns många saker att förstå här; vi påpekar bara några på nästa bild.<br />

Exempel<br />

Arbetsprocessen<br />

Flera steg krävs innan vi kan få veta funktionsvärdet:<br />

Programtexten skrivs in en texteditor. Man kan använda till exempel<br />

gedit eller emacs.<br />

Programmet sparas i en fil, som för vårt exempel måste heta<br />

Example1.java.<br />

Programmet kompileras (översätts) genom att man i ett<br />

xterm-fönster skriver<br />

> javac Example1.java<br />

Om inga fel upptäcks, så skapas filen Example1.class.<br />

Programmet kan nu köras genom<br />

> java Example1<br />

f(1234)=1522759<br />

>


Exempel<br />

En förbättring av Example1<br />

Ett nytt problem att lösa<br />

Om vi nu vill beräkna f (5678) så måste vi ändra programmet genom att<br />

byta ut 1234 mot 5678 (på två ställen), kompilera om programmet <strong>och</strong> köra<br />

det igen.<br />

En bättre idé<br />

Program som körs kan ges kommandoradsargument:<br />

> java Example2 1234<br />

> 1522759<br />

> java Example2 5678<br />

32239687<br />

><br />

Hur skriver man Example2??<br />

Exempel<br />

Programmet Example2<br />

public class Example2 {<br />

public static int f(int x) {<br />

return x*x + 3;<br />

}<br />

public static void main(String[] args) {<br />

int n = Integer.parseInt(args[0]);<br />

System.out.println(f(n));<br />

}<br />

}<br />

Not<br />

Vi lagrar resultatet av konverteringen i variabeln n.<br />

Sedan använder vi n som argument till f i utskriftskommandot.<br />

Exempel<br />

Användning av kommandoradsargument<br />

Goda nyheter<br />

main-rutinen har direkt tillgång till kommandoradsargumenten: de heter<br />

args[0], args[1] osv.<br />

Dåliga nyheter<br />

args[0] osv är en teckensträng, t ex "1234". Vi säger att args[0] har<br />

typen String. Den kan inte ges som argument till f , som vill ha ett heltal<br />

(av typen int).<br />

Lösningen<br />

Strängen "1234" konverteras till heltalet 1234 av funktionen<br />

Integer.parseInt ur Javas bibliotek.<br />

Programmet Example2 ges på nästa bild.<br />

Exempel<br />

En annan matematisk funktion<br />

Vi definierar funktionen<br />

Frågor<br />

Vad blir S(3)?<br />

n<br />

S(n) = k 2<br />

(= 1 2 + 2 2 + . . . + n 2 )<br />

k=1<br />

Vilken definitionsmängd har funktionen S?<br />

Hur gör du för att räkna ut S(6) i huvudet?<br />

S(6) = 1 2 + 2 2 + 3 2 + 4 2 + 5 2 + 6 2


Exempel<br />

Vad blir S(1000)?<br />

Svaret ges av följande Java-program<br />

public class Example3 {<br />

}<br />

Exempel<br />

public static int squareSum (int n) {<br />

int sum = 0;<br />

for (int k=1; k


Exempel<br />

Finns det bättre sätt?<br />

För välstuderade problem som detta exempel finns ibland andra metoder.<br />

Man kan visa att<br />

för alla positiva heltal n.<br />

Detta ger direkt att<br />

n(n + 1)(2n + 1)<br />

squareSum(n) =<br />

6<br />

squareSum(100) =<br />

1000 · 1001 · 2001<br />

.<br />

6<br />

Att komma på bästa sättet att beräkna en funktion man behöver är i<br />

allmänhet ett svårt problem.<br />

Grunder<br />

Tilldelningssatsen<br />

Grundform<br />

variable = expression;<br />

Både variabeln i vänsterledet <strong>och</strong> uttrycket i högerledet har en typ som<br />

kan bestämmas av kompilatorn.<br />

I det enklaste fallet är dessa samma typ.<br />

Exempel<br />

sum = sum + k*k;<br />

Här har bägge led typen int.<br />

Effekt<br />

Värdet av högerledet beräknas <strong>och</strong> lagras i variabeln i vänsterledet.<br />

Exempel<br />

Att räkna med reella tal<br />

Vad blir 1 + 1/2 + 1/3 + . . . + 1/1000000?<br />

Frågan kan besvaras med hjälp av funktionen<br />

public static double hSum(int n) {<br />

double sum = 0;<br />

for (int k=1; k


Grunder<br />

Typer<br />

Två sorters typer<br />

I Java finns två sorters typer:<br />

Primitiva typer.<br />

Referenstyper. Vi återkommer till dessa.<br />

Primitiva typer<br />

Åtta inbyggda primitiva typer finns i Java:<br />

Fyra heltalstyper: byte, short, int <strong>och</strong> long.<br />

Två flyttalstyper: float <strong>och</strong> double (för "reella tal").<br />

Typen char (för tecken).<br />

Typen boolean (för sanningsvärden).<br />

Ofta använder vi int för heltal <strong>och</strong> double för flyttal.<br />

Grunder<br />

Uttryck (eng. expressions)<br />

Förekomster<br />

Uttryck förekommer bland annat som högerled i tilldelningssatser <strong>och</strong> som<br />

argument i funktionsanrop.<br />

Olika former<br />

Form Exempel<br />

Literal 37 -3.5 true ’C’<br />

Variabel sum n maxVoltage<br />

Operatoruttryck sum + 1.0/i n % 2 == 0<br />

Funktionsanrop hSum(10000) Math.sin(x+y)<br />

Typer<br />

Varje uttryck i ett Javaprogram har en typ som kan bestämmas av<br />

kompilatorn.<br />

Vilka typer har ovanstående exempel?<br />

Grunder<br />

Värden av primitiva typer<br />

Typ Värden<br />

byte Heltal i intervallet [−128, 127] (8 bitar).<br />

short Heltal i intervallet [−32768, 32767] (16 bitar).<br />

int Heltal lagrade med 32 bitar (upp till ca ±2 · 10 9 ).<br />

long Heltal lagrade med 64 bitar (upp till ca ±9 · 10 18 ).<br />

float Flyttal lagrade med 32 bitar (ca 7 sign. siffror).<br />

double Flyttal lagrade med 64 bitar (ca 16 sign. siffror).<br />

Grunder<br />

char Tecken, lagrade med 16 bitars Unicode.<br />

boolean true <strong>och</strong> false<br />

Operatorer<br />

Operatorer på typen int<br />

Aritmetiska operatorer (resultattyp int): +, -, *, /, %.<br />

Jämförelseoperatorer (resultattyp bool): =, ==, !=.<br />

Skiftoperatorer (resultattyp int): .<br />

Operatorer på typen double<br />

Aritmetiska operatorer (resultattyp double): +, -, *, /.<br />

Jämförelseoperatorer (resultattyp bool): =, ==, !=.<br />

Operatorer på typen bool<br />

Logiska operatorer (resultattyp bool): &&, ||.<br />

Unära operatorer<br />

På numeriska typer: +, -. På bool: !.


Grunder<br />

Typen String<br />

Textsträngar som "Hello world!" har typen String.<br />

Operatorn + kan ta två strängar som argument; den betyder då<br />

konkatenering: "Hi" + " there" är samma sak som "Hi there".<br />

Om den ena operanden till + har typ String så görs den andra om till<br />

String <strong>och</strong> konkatenering används.<br />

En viktig skillnad<br />

String s = "10000";<br />

int n = 10000;<br />

De två variablerna s <strong>och</strong> n används på helt olika sätt.<br />

Grunder<br />

Härnäst<br />

I morgon: Obligatorisk labb. Ni måste vara där <strong>och</strong> köra ert första<br />

Java-program. Handledarna prickar av er när ni gjort vad ni ska.<br />

På torsdag: Labbtid på morgonen för den som vill öva mer. Övning på<br />

eftermiddagen där vi övar att skriva enkla funktioner <strong>och</strong> main-rutiner.<br />

På fredag: föreläsning med nya begrepp. Försök förstå dagens<br />

begrepp innan dess.<br />

Om du har en egen dator: Ladda ner Ecks bok <strong>och</strong> läs i kapitel 2.<br />

Bestäm dig för om du vill skaffa Jan Skansholms bok i stället.<br />

Grunder<br />

for-satsen<br />

Syntax-beskrivning: for-statement<br />

for(initialization; continuation-condition; update) {<br />

statements<br />

}<br />

Typvillkor<br />

Typen av continuation-condition måste vara boolean.<br />

Effekt<br />

for-satsen exekveras på följande sätt:<br />

1 Exekvera initialization.<br />

2 Beräkna värdet av continuation-condition.<br />

Om värdet är false, avslutas for-satsen.<br />

Om värdet är true, exekveras först statements, därefter update, <strong>och</strong><br />

därefter fortsätter man med 2).

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!