EDAA20 Programmering och databaser Mål komprimerat se kursplanen för detaljer Läsperiod 1 7.5 hp anna.axelsson@cs.lth.se http://cs.lth.se/edaa20 Mer information finns på kursens webbsida samt på det utdelade kursprogrammet. Vad du ska lära dig: Programmering Lösa problem med hjälp av dator Grundläggande programmering Grundläggande objektorientering och programspråket Java Databaser Lagra data i relationsdatabaser Använda SQL för att hämta data från databaser EDAA20 (F1-2 programmering) HT 2016 1 / 54 EDAA20 (F1-2 programmering) HT 2016 2 / 54 Om att lära sig programmera Föreläsning 1-2 Innehåll Programmering är kul! Programmering tar tid (fundera ut lösningar, hitta fel ). Man lär sig programmera genom att träna. Skriv program, testa, hitta på egna program, experimentera Men inte bara - glöm inte bort teorin. Starten är viktig. Häng med från början! Det man lär sig kommer att byggas på och användas genom hela kursen. De olika undervisningsmomenten (övningar, labbar, föreläsningar ) finns av en anledning och kompletterar varandra. Introduktion till programmering Introduktion vad är programmering? Praktisk information om kursen Skriva små program i programspråket Java Skriva program som använder färdiga klasser Undervisningsmoment: föreläsning 1-2 övning 1 laboration 1-2 Avsnitt i läroboken: 1-3.2, 4 EDAA20 (F1-2 programmering) HT 2016 3 / 54 EDAA20 (F1-2 programmering) HT 2016 4 / 54
Algoritm Exempel på en algoritm Definition En följd av instruktioner som beskriver hur man ska göra för att lösa ett problem. Exempel: matrecept program Problem: Beräkna summan av talen 12.5 och 0.7 och skriv ut summan. Algoritm: Tal nr 1 är 12.5 Tal nr 2 är 0.7 Summan = tal nr 1 + tal nr 2 Skriv ut summan EDAA20 (F1-2 programmering) HT 2016 5 / 54 EDAA20 (F1-2 programmering) HT 2016 6 / 54 Exempel på programkod Program Problem: Beräkna summan av talen 12.5 och 0.7 och skriv ut summan. Programkod: double nbr1 = 12.5; double nbr2 = 0.7; double sum = nbr1 + nbr2; System.out.println("Summan av talen är " + sum); Definition Stegvisa instruktioner till datorn som beskriver hur ett problem ska lösas. I instruktionerna manipuleras information (data) Instruktionerna skrivs i ett programspråk, t ex Java. EDAA20 (F1-2 programmering) HT 2016 7 / 54 EDAA20 (F1-2 programmering) HT 2016 8 / 54
Exempel på ett Javaprogram Editera - kompilera - exekvera programmets namn public class Calculator { public static void main(string[] args) { double nbr1 = 12.5; double nbr2 = 0.7; double sum = nbr1 + nbr2; System.out.println("Summan av talen är " + sum); satser som utförs vid exekveringen Detta är ett litet, men fullständigt program, som beräknar summan av två tal och skriver ut det i konsolfönstret datorns skärm. Editera Skriv in programkoden och spara i en fil vars namn har tillägget.java. Kompilera Programkoden kontrolleras. Om koden är korrekt (dvs. inte bryter mot språkets grammatik) översätts den till bytekod. Bytekoden lagras i en fil vars namn har tillägget.class. Exekvera Programmet körs, dvs. bytekodsinstruktionerna i programmet utförs. EDAA20 (F1-2 programmering) HT 2016 9 / 54 EDAA20 (F1-2 programmering) HT 2016 10 / 54 Editera - kompilera - exekvera Objektorientering Editera Större datorprogram måste delas upp i hanterliga delar. Man kan inte hålla tusentals programrader i huvudet samtidigt! Calculator.java Kompilera Calculator.class Exekvera Rätta kompileringsfel Rätta exekveringsfel, logiska fel, ändra Objektorientering är ett sätt att göra detta. Man utgår från de data programmet ska arbeta med, alltså de verkliga saker (objekt) som finns i problemet. I programmet skriver man klasser som innehåller programkod som beskriver dessa objekt. Objektorientering har varit populärt sedan slutet av 80-talet. Exempel på språk: Simula (1967), Smalltalk, C++, Java etc. EDAA20 (F1-2 programmering) HT 2016 11 / 54 EDAA20 (F1-2 programmering) HT 2016 12 / 54
Exempel på program med objekt Datorns delar public class DrawSquare { public static void main(string[] args) { SimpleWindow w = new SimpleWindow(600, 600, "Square"); Square sq = new Square(20, 10, 40); sq.draw(w); sq.move(30, 10); sq.draw(w); Vad händer när man kör programmet? Processor eller CPU (central processing unit) den enhet i datorn som utför instruktioner. Primärminne används för att lagra program och dess data när programmen används. Sekundärminne, t ex hårddisk där man lagrar program och data när de inte används. In- och utenheter, t ex skärm, tangentbord, mus för att kommunicera med människor. Kommunikationskanaler för att kommunicera med andra datorer eller apparater. EDAA20 (F1-2 programmering) HT 2016 13 / 54 EDAA20 (F1-2 programmering) HT 2016 14 / 54 Variabel Datatyper Variabler används för att lagra värden som programmet måste komma ihåg. Variablerna måste deklareras. Variabler har en datatyp och ett namn. Namnet representerar ett värde i minnet. Vi använder namnet istället för värdet. typ namn Exempel: double nbr1; nbr1 De data som behandlas i ett program är av olika typer, t.ex. heltal, reella tal, tecken, referenser Typ int double boolean char Referens (Klass) Kan innehålla heltal reellt tal (tal med decimaldel) logiska värden (true eller false) tecken referens till objekt EDAA20 (F1-2 programmering) HT 2016 15 / 54 EDAA20 (F1-2 programmering) HT 2016 16 / 54
Tilldelningssats Variabler i datorns minne Ientilldelningssatsgermanenvariabelettnyttvärde. Exempel: double nbr1 = 12.5; double nbr2 = 0.7; double sum = nbr1 + nbr2; variabel uttryck nbr1 nbr2 sum 12.5 0.7 13.2 Variablernas värden lagras i datorns primärminne. Minnet är uppdelat i olika minnesceller. Vid deklarationen av en variabel reserveras det plats för variabeln i minnet. Vid tilldelning läggs variabelns värde i motsvarande minnescell/er. nbr1 12.5 nbr2 0.7 sum 13.2 5200 5208 5216 Variabeln och uttrycket måste ha samma typ (några undantag finns) När en variabel används hämtas dess värde från minnet. EDAA20 (F1-2 programmering) HT 2016 17 / 54 EDAA20 (F1-2 programmering) HT 2016 18 / 54 Övning Tilldelningssatser Programmet Calculator Förbättrad version Vilka värden har variablerna när följande satser exekverats: int u, x, y, z; x = 10; y = 2 * x + 1; z = (y + x) + (y - x); x = x + 1; u x y z import java.util.scanner; public class Calculator { public static void main(string[] args) { System.out.println("Skriv två tal"); Scanner scan = new Scanner(System.in); double nbr1 = scan.nextdouble(); double nbr2 = scan.nextdouble(); double sum = nbr1 + nbr2; System.out.println("Summan av talen är " + sum); EDAA20 (F1-2 programmering) HT 2016 19 / 54 EDAA20 (F1-2 programmering) HT 2016 20 / 54
Inläsning från tangentbordet Import-sats Skapa först en Scanner-objekt som ska användas för att läsa från tangentbordet: Scanner scan = new Scanner(System.in); Med scan.nextdouble() läser man nästa tal (av typen double) som skrivs på tangentordet: nbr1 = scan.nextdouble(); nbr2 = scan.nextdouble(); Genom att skriva en import-sats först i filen talar vi om att vi kommer att använda en klass från ett klasspaket (en samling redan färdiga klasser). import java.util.scanner; I det här exemplet importeras klassen Scanner som används för inläsning från tangenbordet. EDAA20 (F1-2 programmering) HT 2016 21 / 54 EDAA20 (F1-2 programmering) HT 2016 22 / 54 Utskrift i konsolfönstret Alternativ if Exempel Utskrift av en teckensträng (omges av citationstecken): System.out.println("Skriv två tal"); Utskrift av en variabels värde (OBS! inga citationstecken): System.out.println(sum); Flera saker kan skrivas ut i samma println-sats (med + mellan). System.out.println("Summan av talen är " + sum); Scanner scan = new Scanner(System.in); double nbr1 = scan.nextdouble(); int nbr2 = scan.nextint(); if (nbr2!= 0) { System.out.println("Kvoten mellan talen är " + (nbr1 / nbr2)); else { System.out.println("Du försökte dividera med 0."); EDAA20 (F1-2 programmering) HT 2016 23 / 54 EDAA20 (F1-2 programmering) HT 2016 24 / 54
Alternativ if Mönster if (villkor) { satser; // utförs om villkoret är uppfyllt Övning if-sats Skriv satser för att läsa in ett heltal och sedan skriva ut om det inlästa talet är positivt, har värdet 0 eller är negativt. if (villkor) { satser; else { satser; // utförs om villkoret är uppfyllt // utförs annars if (villkor 1) { satser; // utförs om villkor 1 är uppfyllt else if (villkor 2) { satser; // utförs annars om villkor 2 är uppfyllt else { satser; // utförs annars EDAA20 (F1-2 programmering) HT 2016 25 / 54 Repetition ett bestämt antal gånger for Exempel EDAA20 (F1-2 programmering) HT 2016 26 / 54 Repetition ett bestämt antal gånger for Mönster Scanner scan = new Scanner(System.in); int sum = 0; for (int i = 1; i <= 5; i++) { sum = sum + scan.nextint(); System.out.println(sum); Utförs för i-värdena start, start+1, start+2,, slut. for (int i = start; i <= slut; i++) { satser; EDAA20 (F1-2 programmering) HT 2016 27 / 54 EDAA20 (F1-2 programmering) HT 2016 28 / 54
Övning for-sats Repetition ett okänt antal gånger while Exempel Skriv satser för att beräkna och skriva ut summan 1 + 2 + 3 + 4 + + 50 Skriv satser för att beräkna och skriva ut summan 2 + 4 + 6 + 8 + + 50 Scanner scan = new Scanner(System.in); int sum = 0; while (scan.hasnextint()) { sum = sum + scan.nextint(); System.out.println(sum); EDAA20 (F1-2 programmering) HT 2016 29 / 54 EDAA20 (F1-2 programmering) HT 2016 30 / 54 Repetition ett okänt antal gånger while Mönster Övning while-sats Skriv satser som läser heltal och summerar dem. En 0:a markerar att talen är slut. Summan ska skrivas ut. Ex: Indata: 23 1 11 7 0 ger utskriften 42. Utförs så länge ett villkor är uppfyllt: while (villkor) { satser; EDAA20 (F1-2 programmering) HT 2016 31 / 54 EDAA20 (F1-2 programmering) HT 2016 32 / 54
Exempel på program med objekt Repris Objekt Vi ska se närmare på vad som händer i detta program där vi skapar och använder objekt: public class DrawSquare { public static void main(string[] args) { SimpleWindow w = new SimpleWindow(600, 600, "Square"); Square sq = new Square(20, 10, 40); sq.draw(w); sq.move(30, 10); sq.draw(w); Objekt motsvarar verkliga eller tänkta saker. Ex: kvadrater, fönster, bankkonton, Ett objekt har attribut. Ex: En kvadrat har en sidlängd och ett läge, ett fönster har bredd och höjd, ett bankkonto har ett kontonummer och ett saldo, Man kan utföra metoder på objekt. Ex: flytta en kvadrat, sätta in pengar på ett bankkonto,... EDAA20 (F1-2 programmering) HT 2016 33 / 54 EDAA20 (F1-2 programmering) HT 2016 34 / 54 Exempel: kvadratobjekt Klass Attribut: läge x, y sidlängd side side 40 Attributen är variabler som håller reda på objektets data. Metoder: flytta move beräkna arean getarea rita draw Metoder innehåller programkod för att göra något med objektet. x y 20 10 Objekt av samma typ beskrivs i en klass. Till exempel kan man skriva en klass Square som beskriver kvadrater. Klassen innehåller programkod för att deklarera attributen och för vad som ska hända i de olika metoderna. Till att börja med använder vi färdigskrivna klasser. Senare ska vi se hur man skriver egna klasser. EDAA20 (F1-2 programmering) HT 2016 35 / 54 EDAA20 (F1-2 programmering) HT 2016 36 / 54
Skapa objekt Objekt i datorns minne I programmet skapar man objekt genom att skriva new Klassnamn(lista med aktuella parametrar) Exempel: Skapa en kvadrat med läget 20,10 och sidlängden 40: new Square(20, 10, 40) Skapa ett ritfönster med bredden 600 pixlar, höjden 600 pixlar och med rubriken Square: new SimpleWindow(600, 600, "Square") När ett objekt skapas reserveras det plats för objektets attribut i datorns minne. Exempel på hur ett kvadratobjekt lagras i minnet: x 20 y 10 side 40 47540 47544 47548 Numren på minnescellerna (adresserna) är bara exempel och ingenting vi normalt behöver tänka på. EDAA20 (F1-2 programmering) HT 2016 38 / 54 EDAA20 (F1-2 programmering) HT 2016 37 / 54 Referensvariabel Referensvariabel och objekt i datorns minne Vi behöver ett namn på objektet. Därför kopplar vi en referensvariabel till objektet. En referensvariabel kan innehålla en referens till ett objekt. Exempel: Variabeln sq refererar till ett kvadratobjekt: Det som egentligen lagras i en referensvariabel är ett heltal adressen till det objekt referensvariabeln refererar till. Pilen vi ritat i föregående bild är motsvarar denna adress. Exempel på hur variabeln sq och det kvadratobjekt sq refererar till kan lagras i minnet. sq x y side 20 10 40 sq 47540 5200 x 20 y 10 side 40 47540 47544 47548 EDAA20 (F1-2 programmering) HT 2016 39 / 54 EDAA20 (F1-2 programmering) HT 2016 40 / 54
Deklarera referensvariabler Referenstilldelning Alla variabler måste deklareras innan man använder dem och få en typ och ett namn. Variabeln sq kan tilldelas en referens till ett kvadratobjekt: En referensvariabel har en klass som typ. Typen bestämmer vilka slags objekt variabeln får referera till. Exempel: En variabel av typen Square får referera till ett Square-objekt: sq x y side 20 10 40 typ namn Square sq; sq Ofta gör man deklarationen och tilldelningen i samma sats: Square sq = new Square(20, 10, 40); EDAA20 (F1-2 programmering) HT 2016 41 / 54 EDAA20 (F1-2 programmering) HT 2016 42 / 54 Anropa metoder på objekt Referenstilldelning Värdet null Man kan be ett objekt att utföra något genom att anropa en metod. Exempel: flytta kvadraten 30 pixels i x-led och 10 pixels i y-led. sq.move(30, 10); En referensvariabel kan även tilldelas värdet null och refererar då inte till något objekt: sq = null; sq null x y side 20 50 10 20 40 Om referensvariablen har värdet null kan man inte anropa en metod på den. sq.move(30, 10); sq EDAA20 (F1-2 programmering) HT 2016 43 / 54 EDAA20 (F1-2 programmering) HT 2016 44 / 54
Referenstilldelning Övning Fyll i värden på variabler och attribut när följande satser exekverats: Square sq1 = new Square(25, 25, 50); Square sq2 = new Square(10, 10, 20); sq1 = sq2; sq1.move(50, 50); sq1 sq2 EDAA20 (F1-2 programmering) HT 2016 45 / 54 x y side x y side Specifikation För att kunna skapa och använda objekt av en klass måste vi få information om klassen; vilka metoder som finns och vilka parametrar som ska skickas med. En specifikation är en beskrivning av klassens metoder med en kort beskrivning av vad metoden gör. metodens returtyp. metodens namn. de formella parametrarna och deras typer. Exempel: /** Flyttar kvadraten avståndet dx i x-led, dy i y-led. */ void move(int dx, int dy); EDAA20 (F1-2 programmering) HT 2016 46 / 54 Specifikation Square /** Skapar en kvadrat med övre vänstra hörnet i x,y och med sidlängden side. */ Square(int x, int y, int side); /** Ritar kvadraten i fönstret w. */ void draw(simplewindow w); /** Flyttar kvadraten avståndet dx i x-led, dy i y-led. */ void move(int dx, int dy); /** Tar reda på x-koordinaten för kvadratens läge. */ int getx(); /** Tar reda på y-koordinaten för kvadratens läge. */ int gety(); /** Tar reda på kvadratens area. */ int getarea(); EDAA20 (F1-2 programmering) HT 2016 47 / 54 Metoder Konstruktor /** Skapar en kvadrat med övre vänstra hörnet i x,y och med sidlängden side. */ Square(int x, int y, int side); konstruktorns namn samma som klassen formella parametrar typ och namn Konstruktorn används när man skapar ett nya objekt med new Exempel: Square sq = new Square(20, 10, 40); En klass kan ha flera konstruktorer (som skiljer sig åt när det gäller parametrarna). EDAA20 (F1-2 programmering) HT 2016 48 / 54
Metoder returtyp - void betyder att metoden inte returnerar något /** Ritar kvadraten i fönstret w. */ void draw(simplewindow w); /** Flyttar kvadraten avståndet dx i x-led, dy i y-led. */ void move(int dx, int dy); metodens namn formella parametrar typ och namn Exempel på användning: sq.move(30, 10); EDAA20 (F1-2 programmering) HT 2016 49 / 54 Metoder Metoder som returnerar värden returtyp - typ på det värde som returneras **/ Tar reda på x-koordinaten för kvadratens läge. */ int getx(); /** Tar reda på y-koordinaten för kvadratens läge. */ int gety(); /** Tar reda på kvadratens area. */ int getarea(); Exempel på användning: System.out.println("Kvadratens area: " + sq.getarea()); int a = sq.getarea(); EDAA20 (F1-2 programmering) HT 2016 50 / 54 Anropa metoder Sammanfattning Övning Hitta fel När vi anropar en metod använder vi punktnotation: referens.metodnamn(lista med aktuella parametrar); Exempel: Square sq = new Square(20, 10, 40); sq.move(30, 10); int a = sq.getarea(); Observera att parenteserna ska vara med även om inga aktuella parametrar ska skickas med. OBS! I nedanstående kod finns några fel: Rätta till felen: Square sq = new Square(20, 10); sq.draw(w); SimpleWindow w = new SimpleWindow(600, 600, "Square"); sq.move(30, 10); sq.draw(w); System.out.println("Arean: " + w.getarea()); De värden som skickas in till metoden kallas aktuella parametrar eller argument. EDAA20 (F1-2 programmering) HT 2016 51 / 54 EDAA20 (F1-2 programmering) HT 2016 52 / 54
Kontrollera koden Checklista När man anropar en metod kan man kontrollera att man anropar metoden på rätt typ av objekt. Vilken typ har objektuttrycket före punkten? Finns metoden tillgänglig idenklassen? objektuttrycket före punkten har ett värde skilt från null. antal aktuella parametrar (argument) stämmer. argumentens typer stämmer. Exempel på vad du ska kunna Förklara begreppen: algoritm, program, kompilering, exekvering. Skriva enkla program som använder färdiga klasser. deklarera variabler och tilldela dem värden skapa och använda objekt använda if-, for- och while-satser läsa in värden från tangentbordet, skriva ut på skärmen Editera, kompilera och exekvera program. EDAA20 (F1-2 programmering) HT 2016 53 / 54 EDAA20 (F1-2 programmering) HT 2016 54 / 54