EDAA20 Programmering och databaser Mål komprimerat se kursplanen för detaljer Läsperiod 1 7.5 hp anna.aelsson@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 2015 1 / 48 EDAA20 (F1-2 programmering) HT 2015 2 / 48 Föreläsning 1-2 Innehåll Checklista 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 Eempel på vad du ska kunna Förklara begreppen: algoritm, program, kompilering, eekvering. 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 eekvera program. Avsnitt i läroboken: 1-3.2, 4 EDAA20 (F1-2 programmering) HT 2015 3 / 48 EDAA20 (F1-2 programmering) HT 2015 4 / 48
Algoritm Eempel på en algoritm Definition En följd av instruktioner som beskriver hur man ska göra för att lösa ett problem. Eempel: 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 2015 5 / 48 EDAA20 (F1-2 programmering) HT 2015 6 / 48 Eempel 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; Sstem.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 e Java. EDAA20 (F1-2 programmering) HT 2015 7 / 48 EDAA20 (F1-2 programmering) HT 2015 8 / 48
Eempel på ett Javaprogram Editera - kompilera - eekvera programmets namn public class Calculator { public static void main(string[] args) { double nbr1 = 12.5; double nbr2 = 0.7; double sum = nbr1 + nbr2; Sstem.out.println("Summan av talen är " + sum); satser som utförs vid eekveringen 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 brter mot språkets grammatik) översätts den till btekod. Btekoden lagras i en fil vars namn har tillägget.class. Eekvera Programmet körs, dvs. btekodsinstruktionerna i programmet utförs. EDAA20 (F1-2 programmering) HT 2015 9 / 48 EDAA20 (F1-2 programmering) HT 2015 10 / 48 Editera - kompilera - eekvera 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 Eekvera Rätta kompileringsfel Rätta eekveringsfel, 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. Eempel på språk: Simula (1967), Smalltalk, C++, Java etc. EDAA20 (F1-2 programmering) HT 2015 11 / 48 EDAA20 (F1-2 programmering) HT 2015 12 / 48
Eempel 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.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 e hårddisk där man lagrar program och data när de inte används. In- och utenheter, t e 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 2015 13 / 48 EDAA20 (F1-2 programmering) HT 2015 14 / 48 Variabel Tilldelningssats Variabler används för att lagra värden som programmet måste komma ihåg. Variablerna måste deklareras. Variabler har en datatp och ett namn. Namnet representerar ett värde i minnet. Vi använder namnet istället för värdet. Ientilldelningssatsgermanenvariabelettnttvärde. Eempel: double nbr1 = 12.5; double nbr2 = 0.7; double sum = nbr1 + nbr2; variabel uttrck nbr1 nbr2 sum 12.5 0.7 13.2 tp namn Eempel: double nbr1; nbr1 Variabeln och uttrcket måste ha samma tp (några undantag finns) EDAA20 (F1-2 programmering) HT 2015 16 / 48 EDAA20 (F1-2 programmering) HT 2015 15 / 48
Variabler i datorns minne Övning Tilldelningssatser 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 Vilka värden har variablerna när följande satser eekverats: int u,,, z; = 10; = 2 * + 1; z = ( + ) + ( - ); = + 1; u z EDAA20 (F1-2 programmering) HT 2015 17 / 48 EDAA20 (F1-2 programmering) HT 2015 18 / 48 Programmet Calculator Förbättrad version Inläsning från tangentbordet import java.util.scanner; public class Calculator { public static void main(string[] args) { Sstem.out.println("Skriv två tal"); Scanner scan = new Scanner(Sstem.in); double nbr1 = scan.netdouble(); double nbr2 = scan.netdouble(); double sum = nbr1 + nbr2; Sstem.out.println("Summan av talen är " + sum); Skapa först en Scanner-objekt som ska användas för att läsa från tangentbordet: Scanner scan = new Scanner(Sstem.in); Med scan.netdouble() läser man nästa tal (av tpen double) som skrivs på tangentordet: nbr1 = scan.netdouble(); nbr2 = scan.netdouble(); EDAA20 (F1-2 programmering) HT 2015 19 / 48 EDAA20 (F1-2 programmering) HT 2015 20 / 48
Import-sats Utskrift i konsolfönstret 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 eemplet importeras klassen Scanner som används för inläsning från tangenbordet. Utskrift av en teckensträng (omges av citationstecken): Sstem.out.println("Skriv två tal"); Utskrift av en variabels värde (OBS! inga citationstecken): Sstem.out.println(sum); Flera saker kan skrivas ut i samma println-sats (med + mellan). Sstem.out.println("Summan av talen är " + sum); EDAA20 (F1-2 programmering) HT 2015 21 / 48 EDAA20 (F1-2 programmering) HT 2015 22 / 48 Alternativ Eempel Alternativ Mönster if (villkor) { satser; // utförs om villkoret är uppfllt Scanner scan = new Scanner(Sstem.in); double nbr1 = scan.netdouble(); int nbr2 = scan.netint(); if (nbr2!= 0) { Sstem.out.println("Kvoten mellan talen är " + (nbr1 / nbr2)); else { Sstem.out.println("Du försökte dividera med 0."); EDAA20 (F1-2 programmering) HT 2015 23 / 48 if (villkor) { satser; // utförs om villkoret är uppfllt else { satser; // utförs annars if (villkor 1) { satser; // utförs om villkor 1 är uppfllt else if (villkor 2) { satser; // utförs annars om villkor 2 är uppfllt else { satser; // utförs annars EDAA20 (F1-2 programmering) HT 2015 24 / 48
Repetition ett bestämt antal gånger Eempel Repetition ett okänt antal gånger Eempel Scanner scan = new Scanner(Sstem.in); int sum = 0; for (int i = 1; i <= 5; i++) { sum = sum + scan.netint(); Sstem.out.println(sum); Scanner scan = new Scanner(Sstem.in); int sum = 0; while (scan.hasnetint()) { sum = sum + scan.netint(); Sstem.out.println(sum); EDAA20 (F1-2 programmering) HT 2015 25 / 48 EDAA20 (F1-2 programmering) HT 2015 26 / 48 Repetition Mönster ett bestämt antal gånger: for (int i = start; i <= slut; i++) { satser; // utförs för i-värdena start, start+1, // start+2,, slut. så länge ett villkor är uppfllt: while (villkor) { satser; Övning Repetition 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 EDAA20 (F1-2 programmering) HT 2015 27 / 48 EDAA20 (F1-2 programmering) HT 2015 28 / 48
Eempel 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.draw(w); Objekt motsvarar verkliga eller tänkta saker. E: kvadrater, fönster, bankkonton, Ett objekt har attribut. E: 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. E: fltta en kvadrat, sätta in pengar på ett bankkonto,... EDAA20 (F1-2 programmering) HT 2015 29 / 48 EDAA20 (F1-2 programmering) HT 2015 30 / 48 Eempel: kvadratobjekt Tilldelningssatser Klass Attribut: läge, sidlängd side 20 Objekt av samma tp beskrivs i en klass. Till eempel kan man skriva en klass Square som beskriver kvadrater. Metoder: fltta move beräkna arean getarea rita draw side 10 40 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 2015 31 / 48 EDAA20 (F1-2 programmering) HT 2015 32 / 48
Skapa objekt Objekt i datorns minne I programmet skapar man objekt genom att skriva new Klassnamn(lista med aktuella parametrar) Eempel: Skapa en kvadrat med läget 20,10 och sidlängden 40: new Square(20, 10, 40) Skapa ett ritfönster med bredden 600 pilar, höjden 600 pilar och med rubriken Square: new SimpleWindow(600, 600, "Square") När ett objekt skapas reserveras det plats för objektets attribut i datorns minne. Eempel på hur ett kvadratobjekt lagras i minnet: 20 10 side 40 47540 47544 47548 Numren på minnescellerna (adresserna) är bara eempel och ingenting vi normalt behöver tänka på. EDAA20 (F1-2 programmering) HT 2015 34 / 48 EDAA20 (F1-2 programmering) HT 2015 33 / 48 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. Eempel: 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. Eempel på hur variabeln sq och det kvadratobjekt sq refererar till kan lagras i minnet. sq side 20 10 40 sq 47540 5200 20 10 side 40 47540 47544 47548 EDAA20 (F1-2 programmering) HT 2015 35 / 48 EDAA20 (F1-2 programmering) HT 2015 36 / 48
Deklarera referensvariabler Referenstilldelning Alla variabler måste deklareras innan man använder dem och få en tp och ett namn. Variabeln sq kan tilldelas en referens till ett kvadratobjekt: En referensvariabel har en klass som tp. Tpen bestämmer vilka slags objekt variabeln får referera till. Eempel: En variabel av tpen Square får referera till ett Square-objekt: sq side 20 10 40 tp 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 2015 37 / 48 EDAA20 (F1-2 programmering) HT 2015 38 / 48 Anropa metoder på objekt Referenstilldelning Värdet null Man kan be ett objekt att utföra något genom att anropa en metod. Eempel: fltta kvadraten 30 piels i -led och 10 piels i -led. En referensvariabel kan även tilldelas värdet null och refererar då inte till något objekt: sq = null; sq null side 20 50 10 20 40 Om referensvariablen har värdet null kan man inte anropa en metod på den. sq EDAA20 (F1-2 programmering) HT 2015 39 / 48 EDAA20 (F1-2 programmering) HT 2015 40 / 48
Referenstilldelning Övning Fll i värden på variabler och attribut när följande satser eekverats: 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 2015 41 / 48 side 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 returtp. metodens namn. de formella parametrarna och deras tper. Eempel: /** Flttar kvadraten avståndet d i -led, d i -led. */ void move(int d, int d); EDAA20 (F1-2 programmering) HT 2015 42 / 48 Specifikation Square /** Skapar en kvadrat med övre vänstra hörnet i, och med sidlängden side. */ Square(int, int, int side); /** Ritar kvadraten i fönstret w. */ void draw(simplewindow w); /** Flttar kvadraten avståndet d i -led, d i -led. */ void move(int d, int d); /** Tar reda på -koordinaten för kvadratens läge. */ int getx(); /** Tar reda på -koordinaten för kvadratens läge. */ int gety(); /** Tar reda på kvadratens area. */ int getarea(); EDAA20 (F1-2 programmering) HT 2015 43 / 48 Metoder Konstruktor /** Skapar en kvadrat med övre vänstra hörnet i, och med sidlängden side. */ Square(int, int, int side); konstruktorns namn samma som klassen formella parametrar tp och namn Konstruktorn används när man skapar ett na objekt med new Eempel: 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 2015 44 / 48
Metoder returtp - void betder att metoden inte returnerar något /** Ritar kvadraten i fönstret w. */ void draw(simplewindow w); /** Flttar kvadraten avståndet d i -led, d i -led. */ void move(int d, int d); metodens namn formella parametrar tp och namn Eempel på användning: EDAA20 (F1-2 programmering) HT 2015 45 / 48 Metoder Metoder som returnerar värden returtp - tp på det värde som returneras **/ Tar reda på -koordinaten för kvadratens läge. */ int getx(); /** Tar reda på -koordinaten för kvadratens läge. */ int gety(); /** Tar reda på kvadratens area. */ int getarea(); Eempel på användning: Sstem.out.println("Kvadratens area: " + sq.getarea()); int a = sq.getarea(); EDAA20 (F1-2 programmering) HT 2015 46 / 48 Anropa metoder Sammanfattning Övning Hitta fel När vi anropar en metod använder vi punktnotation: referens.metodnamn(lista med aktuella parametrar); Eempel: Square sq = new Square(20, 10, 40); 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.draw(w); Sstem.out.println("Arean: " + w.getarea()); De värden som skickas in till metoden kallas aktuella parametrar eller argument. EDAA20 (F1-2 programmering) HT 2015 47 / 48 EDAA20 (F1-2 programmering) HT 2015 48 / 48