Välkommen till Datastrukturer, algoritmer och programkonstruktion eller DOA
Jag: Christer Labbassar: Caroline: Johan:
Agenda, före lunch Inledning om DOA-kursen Backspegel Mål Syfte Examination Om lärande Ordning och reda i C Uttryck, satser, funktioner, moduler, mm Från C till program Projektstruktur
Förändringar (pga Bologna) Kursen anpassad till förändrade lärandemål: tydligare inslag av ADT:er. Tydligare koppling mellan lärandemål och examination. Labbarna är rätt mycket omarbetade följer av lärandemålens förändring
Förändringar (pga kursvärdering) Boken Problem: Många köpte den inte pga pris och tjocklek, några tyckte den var för ordrik Åtgärder: Ny bok, betydligt billigare, mindre text, mer exempel i C-kod, bättre anpassad till ADT-tänk i konkreta kod. Man får ta med boken på duggor och tenta. Labbar Problem: För mycket jobb med labbar på slutet. Några tyckte att de var otydliga. Åtgärder: Förtydligade En ambition att tidigarelägga labbarna Dock: Den stora programmeringsuppgiften bör av naturliga skäl komma in på slutet Det finns inga speciella datum inskrivna på labbuppgifterna...
(forts.) Övningar. Problem: Få gick på övningar. Några var inte nöjda. Åtgärd: Övningar integrerat med lektioner. Material. Problem: Några tyckte att det blev för mycket odokumenterat skrivande på tavlan Åtgärd: Allt väsentligt material kommer att finnas tillgängligt på hemsidan Kursplanering. Problem: Föreläsningar inte tillräckligt långt innan motsvarande labb. Åtgärd: Inget! Min kommentar: Labbar kan vara ett utmärkt sätt att introducera nya saker! Det är inte heller ett-till-ett mellan lektioner och labbar. En del saker får man helt enkelt klura ut själv på labbar (bok, hemsidan, wiki, google...).
Lärandemål Efter kursen ska du kunna... använda abstrakta datatyper i programmeringsuppgifter. definiera och implementera abstrakta datatyper. använda dynamisk minneshantering på ett korrekt sätt avseende allokering, friställande och access. i programmeringsuppgifter använda pekare på ett säkert sätt i olika sammanhang såsom: parametrar, i "structer" och i kommunikation med abstrakta datatyper. analysera enkel programkod avseende tids- och rums-komplexitet. förklara hur några sorterings- och sökalgoritmer arbetar.
Varför läsa DOA-kursen? De flesta kurser på ditt program har den som förkunskapskrav Du blir en bättre programmerare Det är roligt att programmera! Du tar ett steg närmare att bli en färdig ingenjör/datavetare
Examination I kursplanen: TEN1 och LAB1 Du är godkänd på TEN1 om du har klarat duggorna! Se vidare på hemsidan! Utförlig beskrivning av duggorna finns på hemsidan Ta med boken till duggorna! Labbarna (5 st) finns på hemsidan Länkar för ditt lärande finns på hemsidan Använd forum på Blackboard eller mail för riktade frågor
Om lärande Du har ansvar för ditt eget lärande: Du måste driva dig själv, vi kan handleda Jag erbjuder handledning på all icke schemalagd tid: mail, forum Du frågar - jag svarar DU MÅSTE JOBBA MASSOR UTANFÖR SCHEMALAGD TID!!!
Språkkonstruktioner i C Uttryck är något som kan beräknas till ett värde, ex x + y a < 42 b && c! ready Men också t.ex. 99 z Ett uttryck är (en rekursiv definition): En variabel eller konstant En binär operator mellan två uttryck En unär operator före ett uttryck
Mera språkkonstruktioner Satser: beräkningar kan utföras i ett eller flera uttryck som ingår som delar i satsen, ex: if (a < b) x = y + 1; Satser kan påverka exekveringsflödet, ex if (a < b) x = y; z = w; Sats är också en rekursiv konstruktion: Basfall: Tilldelningssats, anrop av void-funktion, varibeldekl. Rekursiva fall: if, while, for, switch, do-while, block.
...mera språkkonstruktioner Funktioner Deklaration = förvarna Definition = funktionen med kod och allt Anrop = användning av funktionen int square(int x); // Declaration int square(int x) { return x*x; } // Definition int main(void) { int x; x = square(42); // Function call return x; }
Övning Är detta giltig kod? int bar(int n){ return n+1; } int foo(int n){ return bar(bar(bar(10))); }
Studera funktionen: float foo(int a){ int i=a; float x; x = (float)i / 2; /* Är i en float eller int här? Vad innebär det att skriva (float)? */ return x; } Är koden nedan korrekt? Är den meningsfull? int foo(int n){ int i=0, x=1, done; do { i++; x = x*i; done = i > n; } while (!done); return x; }
Moduler? Moduler är ett begrepp som finns i flera språk Moduler finns dock inte i C Vi kan åstadkomma modularisering genom att använda filer Implementation i C-fil (körbar kod) Deklaration av exporterade funktioner i H-fil I filen square.h : int square(int x); I filen square.c : #include square.h int square(int x) { return x*x; } I filen arith.c : #include square.h int distance(int x, int y) { } return sqrt(square(x)+square(y);
Räckvidd Funktioner får globla namn (andra funktioner kan anropa dem) Global i hela programmet: extern (är default) Begränsning till filen: static Variabler har 3 nivåer av räckvidd Globala: deklarerade utanför alla funktioner Hela programmet: extern Begränsade till filen: static Lokala: deklarerade i funktionen Nya värden i varje anrop: auto (är default) Värdet ligger kvar till nästa anrop: static
Från C till program C-fil H-fil C-fil Std H-fil Ext. H-fil X X O-fil O-fil Ext. lib C-lib Program
Varför veta detta? För att förstå felmeddelanden För att förstå varför man ska följa konventioner För att förstå varför det inte fungerar
Övning Är detta giltig kod? int foo(int n){ n = 42 ;return n ;}
Projektstruktur Dela alltid upp din koden i flera filer. Huvudregel: Samla de som opererar på samma datatyp (dvs struct) i en C-fil. I H-filen som hör till C-filen skrivs deklarationer av de funktioner i C- filen som man vill ska exporteras I C-filen inkluderas H-filen Andra C-filer (som behöver anropa funktionerna) inkluderar också H- filen structer definieras i C-filen! Samma namn på C-fil och tillhörande H-fil Gör inte en H-fil för alla C-filerna!
H-filer Syftet är att exportera namn, dvs. göra funktionsnamn tillgängliga i andra C-filer så att man tillåts anropa funktionerna. Det är inte en plats att gömma undan krafs som står upptill Det blir en självtest genom att man inkluderar den egna H- filen i C-filen
Abstrakt Data Typ - ADT Kortfattat: Att hålla isär Interface (deklaration av funktioner i H-filer) Implementation (definition av funktioner i C-filer) Användning (algoritmerna som använder funktionerna finns i andra C-filer Syftet är att underlätta konstruktion, återanvändning, testning, felsökning, läsbarhet. Genom att på detta sätt kapsla in implementationsdetaljer kan man undvika onödiga bindningar. Underlättar modifiering och vidareutveckling. Jag återkommer senare med mer precis formulering och exempel