2D1387 Programsystemkonstruktion med C++ Laboration 1: Grundläggande C++ 31 augusti 2005

Relevanta dokument
2D1387 Programsystemkonstruktion med C++ Laboration 1: Grundläggande C++ 2 september 2006

DD2387 Programsystemkonstruktion med C++ Laboration 1: Grundläggande C++ 4 september 2008

DD2387 Programsystemkonstruktion med C++ Laboration 1: Grundläggande C++ 23 augusti 2011

DD2387 Programsystemkonstruktion med C++ Laboration 1: Grundläggande C++ 11 september 2012

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Torsdag 7 januari 2016, 14:00-18:00

Programsystem konstruktion med C++ (2D1387) Innehåll. övning 2 klasser och arv

Programsystemkonstruktion med C++: Övning 2. Karl Palmskog september 2010

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Programmering B med Visual C

Klasser. Kapitel 2. Kapitel 2 - Klasser, medlemmar och arv. Klasser. Klasser Medlemmar Arv

TDIU01 Programmering i C++

Det finns många flaggor till g++,

Programmering i C++ EDA623 Mer om klasser. EDA623 (Föreläsning 6) HT / 26

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

Tentamen EDAF30 Programmering i C++

Tommy Färnqvist, IDA, Linköpings universitet

Programmering i C++ EDA623 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT / 33

2D1387, Programsystemkonstruktion med C++ 01/02 1

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Tisdagen den 28 oktober 2014, 08:00-12:00

Del2 Klasser, medlemmar och arv Ämnesområden denna föreläsning:

C++-programmets beståndsdelar

TENTAMEN CD5250. Objektorienterad programutveckling med C++, 5p. Datum: , Tid: 14:00-19:00

Tentamen EDAF30 Programmering i C++

Programsystemkonstruktion med C++

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } C++, Övning 1

TDIU01 - Programmering i C++, grundkurs

Övriga byggstenar. Övriga byggstenar. Några tips under programutveckling. Beroenden Pekare till funktioner Typkonvertering

TDDC76 - Programmering och Datastrukturer

grundläggande C++, funktioner m.m.

Kapitel 3. Synlighet. Kapitel 3 - Klassanvändning, operatorer och pekare. Synlighet

TDDC76 - Programmering och Datastrukturer

Introduktion till arv

1 Klasser och objektorientering Vad är objektorientering?

Operatoröverlagring. endast operatorsymboler definierade i C++ kan överlagras = += -= *= /= %= ^= &= = <<= >>= < > <= >= ==!= && > ->*, [ ] ( )

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Kapitel 1. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Kapitel 1 grunderna i C++

2D1387 Programsystemkonstruktion med C++

2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursassistent: Mårten Björkman,

TDDI14 Objektorienterad programmering

Kapitel 6 - Undantag

TDIU20 - Objektorienterad programmering i c++ - föreläsning 4

Innehåll. 1 Kort om dynamisk polymorfism. 2 Arv i C++ 3 Multipelt arv. 4 Något om statisk polymorfism. class Container {

2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursens hemsida:

SP:PROG3 HT12 Tenta

Tentamen *:85/2I4123 C

TDIU01 - Programmering i C++, grundkurs

TDDC76 Programmering och datastrukturer

Tentamen EDAF30 Programmering i C++

Synlighet. Namespace Scope-operatorn Klasser Vänner

Klasser. Det är egentligen nu som kursen i programmeringsteknik börjar..., s k objektorienterad programmering.

Pekare. Pekare. Varför använder vi pekare? Vad är en pekare? Pekare. Deklaration/initiering av pekare

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Innehåll. Pekaren this Självreferens. Klasser Resurshantering, representation. Överlagring av operatorer. Överlagring av operatorer

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

C++ Objektorientering - Klasser. Eric Elfving

Objektorienterad programmering i Java I

Inledning. Vad är ett datorprogram, egentligen? Olika språk. Problemlösning och algoritmer. 1DV433 Strukturerad programmering med C Mats Loock

KARLSTADS UNIVERSITET 12/8/09 informatik & datavetenskap Johan Öfverberg, Kerstin Andersson Laboration 4, ISG A04 och DVG A08 HT-09

C++ Objektorientering - Klasser. Eric Elfving Institutionen för datavetenskap

TDIU01 - Programmering i C++, grundkurs

Objektorienterad programmering i Java

Dynamisk bindning och polymorfism

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

TDDC76 - Programmering och Datastrukturer

Övning 4. Arv och andra relationer

TDDC76 - Programmering och Datastrukturer

5 Arv och dynamisk bindning FIGUR

DD2387 Programsystemkonstruktion med C++ Tentamen 2

TDDC76 - Programmering och Datastrukturer

Tillämpad programmering

Laboration 1: Figurer i hierarki

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Kapitel 5. Strömmar. Utmatning

Minnestilldelning (allokering) och frigörande (avallokering) av minne

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Objektorientering - Arv och polymorfi. Eric Elfving Institutionen för datavetenskap

Värmedistribution i plåt

allokeras på stacken dynamiskt new delete

Det objektorienterade synsättet. Objekt. Datorprogrammet kan uppfattas som en slags modell av den verklighet programmet skall samverka med.

Laboration 1 - Grunderna för OOP i Java

Övningar Dag 2 En första klass

Algoritmbiblioteket (STL) Designstrategi Generiska algoritmer som fungerar på godtyckliga samlingsdatatyper, vilka har iteratorer.

Objektsamlingar i Java

Arrayer. results

Innehåll. Resurshantering. Resource handles. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 6. Resurshantering

1 Funktioner och procedurell abstraktion

Programmering i C++ EDA623 Mallar. EDA623 (Föreläsning 12) HT / 29

Strömmar och strängar

Malmö högskola 2007/2008 Teknik och samhälle

Innehåll. Pekare Syntax

Övningsuppgifter kapitel 8

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Föreläsning 3. Programmering, C och programmeringsmiljö

Arv bakgrund (kap. 9)

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

TDP004. Minne och pekare. Eric Elfving Institutionen för datavetenskap

maxlist-1. Indexerad lista Länkad lista

Transkript:

2D1387 Programsystemkonstruktion med C++ Laboration 1: Grundläggande C++ 31 augusti 2005 I den här labben kommer du att lära dig att använda grundläggande C++ såsom klasser, loopar, variabler och minneshantering. Ni får jobba i grupper om högst två personer. Vid återkopplingssamtalet ska alla gruppmedlemmar kunna svara på frågor om alla delar av koden. Läs igenom hela lydelsen innan du börjar. För att uppgifterna ska kännas mindre lösryckta hänger de ofta ihop. Allmäna krav: Din kod ska vara modulariserad i klasser och filer. Ditt program ska inte läcka minne, så var noga med dina konstruktorer och destruktorer. Ditt program ska visa att du behärskar const på ett korrekt sätt. I denna labb ska du inte använda dig av containerklasser i STL. Du får t.ex. inte använda STL-klassen vector för att implementera din vektorklass. Se till att dina program är indenterade (M-x indent-buffer iemacs). Använd fullständiga meningar när du svarar på frågeställningarna. Redovisning Närduärklarmedlabbenskadukopiera din kod till en ny katalog. Den ska gå att kompilera med gcc 3.4.2. På katalogen ska följande finnas: Källkod till alla uppgifter. En makefile som kan kompilera med make all och städa med make clean. En README-fil med personuppgifter över dig och din labbkamrat. Fullständigt namn, personnummer och epost som ni läser av. Förteckning över filerna och skriftliga svar på frågeställningarna. I övrigt ska inga onödiga filer förekomma. Sätt läs-rättigheter på katalogen/katalogerna så att vi kan komma åt dina filer: fs sa KATALOG alba:cprog05 all På kurshemsidan finns ett enkelt webformulär där du skickar in sökvägen till din lösning. Skicka inte epost. Sista inlämningsdatum för bonus är söndag 25 september 2005 (v.38). För att kunna erhålla bonuspoäng om 3p krävs att labben är inlämnad i tid, att du bokat tid för ett återkopplingssamtal och närvarar vid tiden du bokat. Förberedelser (Om du redan gjort följande behöver du inte göra det igen.) Skriv namn på labbkvittot. För att få rätt labbmiljö ska du skriva följande: 1

datan> res checkin cprog05 datan> course join cprog05 När labblydelsen hänvisar till filer i kurskatalogen avses /info/cprog05/labbar/lab1 Lycka till! Uppgifter 1.1 (iteration, pekare) Det finns ett klassiskt program som brukar kallas för Hello world. Denna uppgift går ut på att skriva ett program som skriver ut olika varianter på texten Hello world!. Programmet ska kunna ta en text och/eller ett tal som argument. Exempelkörning: datan> hello Hello world! datan> hello C++ Hello C++! datan> hello 3 C++ lurigt! Hello C++ C++ C++! datan> hello 2 Hello world world! datan> Denna uppgift är alltså inte en övning i objektorienterad programmering utan en introduktion till C++. Tips: Använd argv och argc. Använd atoi för att översätta en char * till ett tal (om strängen inte representerar ett tal får man noll). Vi ska använda kompilatorn g++ för att översätta programkoden till ett körbart program. Lägg till g++ genom att skriva module add gcc/3.4.2. För att kompilera ditt program skriver du följande: > g++ -c myfile1.cpp > g++ -c myfile2.cpp > g++ -o myprog myfile1.o myfile2.o Du kan också skriva > g++ -o myprog myfile1.cpp myfile2.cpp 1.2 (avlusare, debugger) Kompilera ditt program från föregående uppgift med (flaggan -g lägger till felsökningsinformation i din körbara fil): > g++ -g -o myprog myprog.cpp Starta avlusaren (debuggern) DDD med: > module add ddd > ddd myprog 2

Sätt ut brytpunkter (breakpoints) där du vill att programmet ska stanna under körning genom att högerklicka på en rad och välja Set breakpoint. Starta programmet genom att klicka på Run eller välja Run... under Program-menyn. När programmet stannar på din brytpunkt, dubbelklicka på valfri variabel i ditt program och denna visas. Alternativt kan du hålla muspekaren över en variabel för att se dess värde. Experimentera lite med avlusaren, prova att stega med Next och Step. Vad är skillnaden dem emellan? Hur avrefererar (följer) jag en pekare såsom argv? 1.3 (konstruktion, destruktion, temporära objekt) a) Skapa en klasshierarki med minst tre nivåer. Låt din klasshierarki representera något naturligt: t.ex. djur, grafiska objekt eller möbler. Lägg sedan till defaultoch kopieringskonstruktor, destruktorer och tilldelningsoperator (operator=()) i varje klass och lägg in utskrift av en text som förklarar vilken konstruktor, destruktor respektive funktion det är som exekveras. Tips: Det kan vara nyttigt att ha en konstruktor som tar namnet på objektet som argument. b) Instansiera objekt av klasserna och kör funktionerna i dem. Skrivs texterna ut i den ordning du tänkt dig? Redovisa förutom källkod även utskrift av en körning. c) Fyll i egen text i de streckade strängarna nedanför. Vad skriver ditt program ut? Varför? När frigörs objekten? När skapas temporära objekt?... class A { public: A() {cout << " " << endl; } A(const A & ref) {cout << " " << endl; } ~A() {cout << " " << endl; } A(char * s) {cout << " " << s << endl;} A & operator=(const A & s) {cout << " " << endl; return *this;} }; int main() { A a("my name is a"); A b = a; // vad är skillnaden A c(a); // mellan dessa A d; // tre tekniker? d = a; A *aa = new A[5]("I m part of an array"); 3

delete aa; no_ref(a); with_ref(a); // Problem! // Bildas temporära objekt? // Bildas temporära objekt? } return 0; void no_ref(a a) {} void with_ref(const A &a) {} 1.4 (operatoröverlagring, minneshantering) Skapa en vektorklass Vector för heltal (int). Du får inte använda klassen vector i STL. Låt storleken vara fixerad och bestämmas av ett argument till konstruktorn. Implementera tilldelningsoperator och kopieringskonstruktor. Vektorklassen ska även överlagra indexoperatorn [] för åtkomst av elementen: int x = 2; int i = vektor[7]; vektor[3] = x; // OBS, ska fungera! Prova din vektor med filen oper.cpp i kurskatalogen. Tips: Tänk på att operatorn [] måste vara en konstant medlemsfunktion i vissa fall. När och varför? Hur kopierar man vektorn? : Vector b = a; a[0] = 1; // b ska inte ändras av denna sats. Tänk även på vad som händer i följande fall (dvs då vektorn förväntas kopiera sig själv): Vector v; v = v; 1.5 (mallar) a) Modifiera din vektorklass Vector från uppgift 1.4 så att den kan lagra en godtycklig datatyp genom att använda mallar (templates). Din nya klass ska dessutom kunna ändra storlek efter den skapats. Instansiering av din klass ser då ut som: class A; Vector<int> ivect; Vector<A *> apvect; b) Du ska också lägga till ny funktionalitet i din klass: push_back(t) lägger till ett element sist i vektorn insert(int i, T) lägger till ett element före plats i erase(int i) tar bort ett element på plats i clear() tar bort alla element 4

size() ger antal element i vektorn sort(bool ascending = true) sorterar vektorn i angiven riktning på enklast möjliga sätt. (Observera att byte av två element kräver tilldelningsoperator och att alla datatyper som ska jämföras måste definiera operator<.) Prova din nya vektorklass med filen vector.cpp. Betygshöjande extrauppgifter Extrauppgift 1.1 (4p) Skriv en dynamiskt allokerad matrisklass Matrix för heltal genom att använda Vector. Klassen ska ha en del funktionalitet som förklaras nedan. Åtkomst till elementen ska ges enligt följande exempel: int x = matris[7][2]; matris[3][1] = x; Låt matrisklassen definiera std::ostream &operator<<(std::ostream &, const Matrix &) så att man kan skriva ut matrisen med cout: Matrix m; std::cout << m << std::endl; Testa din matrisklass med filen matrix.cpp. Extrauppgift 1.2 (6p) Använd Matrix för att implementera en labyrintlösare. Låt elementen i matrisen motsvara en ruta i labyrinten. Prova din labyrintlösare med filen maze.cpp. Skapa en funktion read(const char **data) som initierar matrisen med en labyrint. För den som vill ha större/andra labyrinter finns en labyrintgenerator maze_generator.cpp som genererar C++-syntax. Extrauppgift 1.3 (5p) Utöka funktionaliteten så att man kan hantera aritmetik för matriser. Antingen kan du bygga ut din befintliga klass eller skriva en ny klass och använda dig av arv eller aggregat. Var beredd att försvara ditt designbeslut vid redovisningen. Implementera tilldelningsoperator och kopieringskonstruktor samt identitet (sätter kvadratisk matris till identitetsmatrisen), negation och transponering. Överlagra operatorer för matrisaritmetik +, - och * samt * för skalärmultiplikation. Tips: Tänk över retur- och argumenttyper: vilka är const och vilka kan inte vara referenser? Vilka funktioner är const? Många av de föreslagna operatorerna delar funktionalitet. Utnyttja detta för att underlätta implementationen. Extrauppgift 1.4 (4p) Använd mallar för att implementera en klass Hypercube som hanterar liksidiga matriser med godtycklig dimension. Ta hjälp av Matrix eller Vector för implementationen. Exempel: 5

Hypercube<3> n(7); // kub med 7*7*7 element Hypercube<6> m(5); // sex dimensioner, 5*5*...*5 element m[1][3][2][1][4][0] = 7; Hypercube<3> t(5); t = m[1][3][2]; // tilldela med del av m t[1][4][0] = 2; // ändra t, ändra inte m std::cout << m[1][3][2][1][4][0] << std::endl; // 7 std::cout << t[1][4][0] << std::endl; // 2 Extrauppgift 1.5 (6p) Implementera en specialisering Vector<bool> som använder så lite minne som möjligt, dvs representerar en bool med en bit. Använd någon stor heltalstyp (såsom unsigned int) för att spara bitarna. Observera att du ska kunna spara ett godtyckligt antal bitar. Skapa funktionalitet så att vektorn kan konverteras till och ifrån ett heltal (i mån av plats). Implementera all funktionalitet från Vector som t.ex. size. Du behöver inte implementera insert och erase om du inte vill. Extrauppgift 1.6 (5p) Skapa en iteratorklass till Vector<bool> som uppfyller kraven för en random-access-iterator (dvs har pekarliknande beteende). Ärv från std::iterator<...> (genom #include <iterator>) för att lättare få rätt typdefinitioner. Låt din iterator ärva från din const_iterator eftersom den förra ska kunna konverteras till den senare. Du behöver inte implementera reverse_iterator eller const_reverse_iterator om du inte vill. Exempel: Vector<bool> v(31); // initiera med bitarna 1111 Vector<bool> w; // tom vektor std::copy(v.begin(), v.end(), std::back_inserter(w)); std::cout << std::distance(v.begin(), v.end()); // konstant iterator och konvertering Vector<bool>::const_iterator it = v.end(); Extrauppgift 1.7 (3p) Låt Vector<bool> överlagra operatorer för booleska operationer:, &, och ˆ. Använd datorns hårdvara i största möjliga utsträckning genom att använda booleska operationer på unsigned int. Skapaäven en funktion weight som räknar antalet satta bitar (ettor). Använd de booleska operationerna för detta, dvs gör helst beräkningen utan att titta på varje bit separat. Fundera på vad som händer om vektorerna har olika storlek. 6