CD5250 - Objektorienterad programutveckling med C++, 5 poäng, period 4, 2002

Laboration 2

intro

Syftet med labben är att ni skall få bekanta er med klasser och objekt-tänkandet och hur detta implementeras i C++.

Tänk på:

  • Gör alltid en h-fil och en cpp fil per klass.
  • Var omsorgsfull, ni skall använda en del av klasserna i kommande labbar.
  • Efter avklarad laboration bör du kunna:

  • Dela upp ett givet problem i olika objekt och klassificera dem.
  • Skapa klasser i C++.
  • I alla uppgifterna skall ni använda er av const på alla platser där det passar. Dvs, ni skall ha helt klart för er vilka variabler m.m. som skall ändras resp. inte ändras och få fram det i källkoden!

    A. koordinat

    Skapa en klass (Point) som beskriver koordinater (en punkt) i ett tvådimensionellt plan. Objekt skapade ur denna klass skall sedan t.ex. kunna användas för att representera koordinaterna för en pixel på bildskärmen. Det skall, förutom lämpliga konstruktörer, finnas metoder för att läsa, respektive ändra koordinaterna samt en metod print för att skriva ut koordinaten på bildskärmen. Skapa även en defaultkonstruktor (konstruktor utan argument). Denna kommer att behövas i senare uppgifter.

    En utskrift av en koordinat skulle t.ex. kunna se ut så här: (240, 160)

    B. geometriska objekt

    I denna uppgift skall ni skapa tre olika geometriska klasser; linje, cirkel och rektangelklasser. Dessa objekt skall använda sig av koordinatklassen från föregående uppgift för att beskriva olika egenskaper i respektive klass.

    Skriv ett litet program där ni använder er av dessa klasser och testar att de har ett lämpligt gränssnitt. Undvik att skriva ut text direkt från klassernas metoder.

    Line

    Skapa en klass som beskriver linjer, vilka har två datamedlemmar av klassen koordinat (som ni skrev i föregående uppgift). Klassen skall ha:

  • Lämpliga konstruktörer, som exempelvis tar linjens start- och slutkoordinater som inargument.
  • En metod som beräknar och returnerar linjens längd (avståndet mellan start- och slutkoordinaterna).
  • En metod print som skriver ut linjen på bildskärmen.
    En utskrift av en linje skulle t.ex. kunna se ut så här: (240, 160) - (320, 80)
  • Circle

    Skapa en klass Circle som beskriver cirklar med hjälp av dess färg, läge (en koordinat) och radie. Klassen skall ha:

  • Lämpliga konstruktörer.
  • En metod som returnerar cirkelns radie.
  • Metoder som flyttar cirkeln samt ändrar dess storlek.
  • Metoder som beräknar och returnerar cirkelns area och omkrets.
  • Rectangle

    Skapa en klass som beskriver en rektangel. Rektangeln skall bestå av två koordinater, (left,top) och (right, bottom). Klassen skall ha:

  • En konstruktör, som tar rektangelns dimensioner som inargument (bredd, höjd).
  • En konstruktör som tar två koordinater som inargument.
  • Metoder för att ändra och returnera rektangelns dimensioner.
  • En metod som beräknar och returnerar rektangelns area.
  • En metod för att flytta rektangeln.
  • C. klassvariabler

    Tänk er nu att ni använder de tidigare skapade klasserna Line, Circle och Rectangle. Vid ett visst tillfälle vill ni ta reda på hur många instanser det finns av klassen Point (som Line, Circle och Rectangle var och en använder sig av). För att kunna göra detta kan man förse klassen Point med en klassvariabel (static class member), dvs en variabel som det alltid finns exakt en (och endast en) förekomst av oavsett hur många instanser av klassen man skapat. Denna variabel delas sedan av samtliga objekt i klassen. Om man initierar klassvariabeln till noll, låter konstruktorn öka värdet av denna varje gång man skapar en ny instans och låter destruktorn minska värdet varje gång en instans tas bort så kan man hålla reda på hur många instanser som finns för tillfället.

    Uppgift:
  • Inför en klassvariabel i klassen Point för att hålla reda på hur många instanser det finns.
  • Inför även en klassvariabel som bestämmer vad som skall vara instansernas default-position. Denna default-position skall användas om inga koordinater har skickats till konstruktören.
  • Klassvariablerna skall givetvis inte vara åtkomliga utanför objektet (förslagsvis protected).

    D. klassmetoder

    Klassvariablerna i klassen Point kan man komma åt från vilket Point-objekt som helst, men om man inte har skapat någon instans ännu, hur gör man då? Lösningen är att använda sig av en klassmetod (även kallad statisk medlemsmetod), vilken kan anropas utan något objekt.

    Uppgift:

    Implementera klassmetoder som returnerar antalet existerande instanser, samt metoder för att läsa och sätta aktuella default-koordinater.

    E. funktionsmallar

    Skriv en mall (template) för en funktion som sorterar en array av godtyckliga element i stigande ordning. Utgå från funktionen nedan som sorterar en array bestående av heltal med hjälp av en bubble-sort algoritm.

    Ni skall till att börja med kunna sortera float, int och double genom följande anrop: (där "arr" är av motsvarande typ som dess template-argument)

  • sort<int>(arr, len);
  • sort<float>(arr, len);
  • sort<double>(arr, len);
  • #include <iostream>
    using namespace std;
    
    void sort(int * arr, int len)
    {
       bool changed;
       do
       {
          changed = false;
          for (int i = 0; i < len-1; i++)
          {
             if (arr[i] > arr[i+1])
             {
                // Här använder vi en template-funktion från STL som byter innehåll i två integers
                swap<int>(arr[i], arr[i+1]);
                changed = true;
             }
          }
       } while (changed);
    }
    Exempel 1.Bubble-sort för integers.
CD5250
Nyheter
Kursinformation
Föreläsningar
Labbar
Projektuppgift
Gott och blandat
C --> C++
STL-intro
Size-klassen
Visual C++
Kursplan
Schema
Underrubriker
koordinat
geometriska objekt
klassvariabler
klassmetoder
funktionsmallar
Ansvarig lärare: Stefan Råmonth - stefan.ramonth@realfast.se
Senast uppdaterad: