Göm menyn

TDDD44 Problemlösning och programmering

Lästips inför tentan


Allmänna lästips

Till att börja med är det bra att läsa igenom den information som finns på kurshemsidorna under "Tentor". Här finns mycket som svarar på frågorna du antagligen vill ställa.

Att läsa i boken och få grepp om saker är aldrig dumt. Det kan dock vara så att man tycker att man förstår sakerna utan att riktigt kunna tillämpa dem. Vad som ingår i kursen ser man genom att titta i kursinformationen. Exakt vilka sidor man skall läsa är oftast svårt att säga. Det är så mycket som hänger ihop.

Övning på uppgifter är det som ger absolut mest. Gamla tentauppgifter är bra, gamla laborationer också. Kanske man kan komma på egna uppgifter som man kan utföra. Detta ger ju också möjlighet att göra något som är roligt.

Att se på lösningar på uppgifter är inte dumt, MEN att titta på lösningar när man sitter och problemlöser gör ofta att man kommer vidare utan att egentligen lärt sig något. Ett tips är att ta t.ex. 10 gamla tentor och läsa igenom uppgifterna och bilda sig en uppfattning om hur man kanske skulle ha kunnat lösa dem. Därefter titta på lösningarna (observera att de lösningar som ligger på hemsidorna är några av många på varje uppgift). Efter detta tar man och löser ett antal uppgifter utan att titta på lösningsförslagen. Det kan ju vara så att ni kommer på en annan metod som är lika bra som den vi använt (det finns många sådana).

Ingår "alltid" i uppgifterna

Man kan säga att det finns saker som är så generella att de är svåra att undvika i uppgifterna. Även om man inte har dem med så är de i alla fall så nyttiga att det är dumt att inte ha förståelse för dessa. När man programmerar finns det två skilda saker bland dessa. Dels de saker som har med själva språket att göra och dels de saker som har med tankesättet att göra när man programmerar. Den senare av dessa är det svårt att "lära ut". Det är nog så att man måste "öva" på egen hand för att få till skickligheten i detta. Det innebär att det gäller att lösa många problem.

Om vi här begränsar oss till den del som har med själva språket att göra (och i denna kurs speciellt Ada) så har vi ett antal generella språkkomponenter. Här följer en "lista" av sådana.

  • Vanliga satser: Tilldelning (:=), villkor (if, case), repetitioner (loop, while, for), specialsatser (null, exit, return).

  • Definitioner av underprogram: Det gäller för er del att kunna skapa underprogram (procedurer, funktioner och operatorer) då detta är en del av tankesättet i programmering. Underprogram ökar ofta läsbarheten i programmet (vilket ger lättare felsökning) och delar upp problemet i mindre delar (vilket gör att ni lättare finner en lösningsmetod. Obervera att definitionerna av underprogram också inkluderar parameterlistor med typer och moder ("in", "out" och "in out") samt returvärden för funktioner och operatorer.

  • Anrop av underprogram: Procedurer, funktioner och operatorer. Det gäller att det finns både fördefinerade sådana i själva språket (eventuellt i paket) och sådana som ni själva definierar.

  • De grundläggande datatyperna: "Integer", "Float", "Character", "Boolean" och "String". Dessa måste man förstå och kunna hantera för att ha en chans.

  • Några grundläggande attribut: Det finns många attribut som är grundläggande och vi tar upp ett antal exempel här:
        Integer'Last
        Character'First
        Character'Pos('A')
        String'Length
        
  • Vanliga operatorer: Aritmetiska (+, -, *, /, mod, **), logiska (and, or, and then, or else, xor, not), sammaslagning av strängar (&). Vilken prioritetsordning de olika operatorerna har är väsentligt att veta också. Vill man ändra prioritetsordningen får man sätta in parenteser (precis som i matematiken).

  • Uttryck: Dessa används på många ställen (t.ex. i villkor och tilldelningar).

  • Typomvandlingar: Det finns i Ada flera sätt som används för att typomvandla och det skiljer sig från fall till fall. Här är tre exempel:
        I := Integer(F);        ("Casting", det som brukar kallas typomvandling)
        I := Integer'Value(S);  (Attribut med parameter)
        I := To_Integer(Date);  (Anrop av funktion)
        
  • Standardenheter: Det finns i Ada en mängd standardbibliotek och -rutiner. De vi tagit upp i kursen är:
        Ada.Text_IO                        (paket)
        Ada.Float_Text_IO                  (paket)
        Ada.Integer_Text_IO                (paket)
        Ada.Numerics                       (paket)
        Ada.Numerics.Elementary_Functions  (paket)
        Ada.Numerics.Descrete_Random       (generiskt paket)
        Ada.Strings                        (paket)
        Ada.Strings.Fixed                  (paket)
        Ada.Strings.Unbounded              (paket)
        Ada.Sequential_IO                  (generiskt paket)
        Ada.Unchecked_Deallocation         (generisk procedur)
        

Under kursens gång har vi tryckt på att ni skall följa vissa regler vad det gäller programmeringen. Detta för att underlätta för er och för att se till att ni skriver "vettiga" program. Några regler som gäller på tentan som ni bör tänka på är:

  • Fullständig uppräkning: Att räkna upp alla varianter på villkor som finns i en lång "if"-sats (eller "case"-sats) istället för att utföra samma sak med t.ex. upprepning (en "for"-sats eller liknande med en enkel "if"-sats inuti). Detta skapar oftast oläsbar kod och skapar dessutom en massa onödig läsning för den som skall ta över efter er. Detta ger automatiskt komplettering på tentan om man lätt borde se att det skall lösas med t.ex. en "for"-sats.

  • Globala variabler: Det vi menar med detta är egentligen något som kallas "sidoeffekter". Att använda en globalt definierad variabel i ett underprogram kan ge efterverkningar i andra delar av programmet och detta vill man inte ha. Det man skall göra är istället att skicka med data in till (eller ut ur) ett underprogram via parametrar eller som returvärden. En "global variabel" behöver inte nödvändigtvis vara definierad i huvudprogrammet. Det kan lika gärna vara en variabel som är definierad i en funktion som i sin tur har underprogram som utnyttjar funktionens variabel utan att den skickats via en parameterlista. Detta ger automatiskt komplettering på tentan.

Speciella saker just i Ada

Det kan ju vara bra att ha koll på några specialfall i det språk man hanterar. I Ada finns det några saker som vi kanske inte har tagit upp, men som kan vara bra att få reda på så här inför tentan.

  • Talbashantering: Den vanliga "Get" för heltal som finns i Ada klarar av att läsa in tal i olika talbaser. För att läsa in tal i basen tio behöver vi inte göra något speciellt. Det har ni gjort under hela kursen. Vill man däremot kunna mata in t.ex. det binära talet "10101" (som motsvarar 21 i basen 10) skriver man in talet på följande format BAS#TALET#. Vårt exempel skulle alltså skrivas (på tangentbordet):
        2#10101#
        
    "Put" kan skriva ut tal på samma format som ovan. Det finns nämligen en parameter till "Put" som heter "Base".

  • Citationstecken i en sträng: Då citationstecknet (") används som strängmarkering i Ada måste detta tecken specialbehandlas om man vill stoppa in det i en sträng. Det man gör är att man skriver två stycken i rad inuti strängen så motsvarar det ett. Antag att man vill ha de tre tecknen A"B i en sträng. Då får man skriva "A""B" i sin programkod.

  • Apostrof som tecken: På samma sätt som citationstecknet (") är ett specialfall för strängar är apostrofen för tecken. Detta behandlas på samma sätt. Två apostrofer i rad i en teckenkonstant anses vara en apostrof. Vill man t.ex. skriva ut en apostrof på skärmen kan man skriva:
        Put('''');
        
  • Ersättningstecken: Tidigare fanns det inte så många tecken på alla tangentbord som vi har nu. Detta ledde till att man i Ada bestämt sig för att vissa tecken har så kallade ersättningstecken. Vi tar här upp några av dessa så att ni inte råkar illa ut i något sammanhang.
        Tecknet # kan istället skrivas med : (kolon).
        Tecknet | kan istället skrivas med ! (utropstecken).
        Tecknet " kan istället skrivas med % (procent).
        

Ingår i uppgifterna förutom det generella

I kursen tar vi upp en hel del moment som inte behövs för att lösa alla problem. Det är dock så att dessa moment är väsentliga för att man skall kunna skriva program i stort. De uppgifter som inte bara baserar sig på det generella kan dessutom innehålla ett eller flera av nedanstående moment.

  • In- och utmatning (tangentbord): Hur fungerar de olika "Get" och "Put"?

  • Undantag: Fördefinierade och egendefinierade (eng. "exception").

  • Fält: Endimensionella samt flerdimensionella fält (eng. "array"). Ett specialfall är strängar. Det går att definiera fälttyper som inte är begränsade redan i typdefinitionen utan måste specificeras vid deklarationen av variabeln.

  • Poster: (eng. "record").

  • Filhantering: Textfiler och binära filer.

  • Paket: Fördefinierade och egendefinierade (eng. "package"). Uppdelning på filer ("ads" och "adb"). På en tenta kan man ge er ett paket som ni aldrig sett och ni skall kunna utläsa hur man använder detta eller kanske skall ni kunna modifiera eller lägga till saker i ett givet paket.

  • Underprogram: Speciellt att ha dem på separata filer ("ads" och "adb"). Underprogram i underprogram. Synlighet (vilka delar i koden kan man nå från andra delar).

  • Generiska enheter: Kan vara paket, procedurer eller funktioner. Det är viktigt att förstå hur de generiska enheterna används och hur man kan skapa sådana. Speciellt är den generiska "parameterlistan" ("generic"-delen) viktig att kunna tyda.

  • Attribut: Det finns en massa fördefinierade attribut. Se med om dessa i boken. Attribut motsvarar "egenskaper" hos datatyper och variabler.

  • Pekare: Används ofta till att skapa datastrukturer som länkade listor, träd m.m. Man måste se till att man inte får minnesläckor (på tentorna kan det vara så att vi inte bryr oss om minnesläckor i vissa uppgifter, kolla dock med examinator om du är tveksam).

  • Rekursion: Underprogram som anropar sig själva för att lösa problemet. Tänk på att det måste finnas ett slutvillkor som gör att det tar slut någon gång.

  • Matematiska saker: Ofta används datorer till att beräkna saker. Detta skall man ju givetvis kunna klara av som programmerare. Till er hjälp finns det matematiska bibliotek. T.ex. finns det paket med matematiska funktioner:
        Ada.Numerics.Elementary_Functions  (paket)
        
    Serieutvecklingar m.m. är ju inga konstiga saker. Det har ni hållit på med sen tidigare och det är ofta enkelt att överföra t.ex. en serie till en upprepning. Rekursion är ibland trevligt att använda här.

  • Slump eller sannolikheter: I Ada finns flera olika paket för att hantera "slumptal". Man kan tänka sig "slumptal" som är diskreta (t.ex. heltal, tecken, veckodagar m.m.) eller analoga (t.ex. flyttal). De två paket ni har att tillgå för detta är:
        Ada.Numerics.Discrete_Random  (generiskt paket)
        Ada.Numerics.Float_Random     (paket)
        
  • Problemlösning: Detta krävs det övning för att få in tekniken. Generellt kan man dock säga att det är "bra" att dela upp problem och skjuta saker framför sig och att tänka på hur man skall lagra de data man har all "leka" med i uppgiften. Det är alltid bra att rita figurer!

  • Problemområden eller teman: Oavsett vad problemet är skall du försöka se igenom problemställningen och försöka se vad det är för något man kan säga att man är ute efter. Det kan vara att lösningen har med fält, poster, filer, pekare, underprogram eller något annat av ovanstående att göra.

    Det viktiga är inte vilket tema själva uppgiften har. Temat kan ju vara mekanik, ekonomi, biologi, matematik eller vad som helst och samma lösningsförfarande kan appliceras. Det kan t.ex. röra sig om att man skall skriva ut en tabell med tre kolumner av data oavsett vilket av ovanstående områden det gäller.


Sidansvarig: Torbjörn Jonsson
Senast uppdaterad: 2011-02-03