Nemnegatív koordinátájú kétdimenziós vektor

Írjunk egy kétdimenziós vektor osztályt!

  • Az osztály gondoskodjon róla, hogy a vektor koordinátái csak nemnegatív számok legyenek!
  • Inicializáláskor a vektort meg lehessen adni 0, 1 vagy 2 értékkel is (ha nem adjuk meg egy koordináta kezdőértékét, akkor az nulla legyen!
  • A vektorhoz lehessen hozzáadni, belőle kivonni más kétdimenziós vektorokat! Továbbá más vektorral lehessen összeszorozni (skaláris szorzat)!
  • A program tagolása (.h: osztálydeklaráció, .cpp: hosszabb implementációjú függvények törzse) a C++ programozók körében elterjedt konvenciók alapján történjen, és védjük le a többszörös beépítésből eredő újradefinicióról szóló hibaüzeneteket. A tesztelő függvény is külön állományba kerüljön.
  • Írjunk egy diagnosztikai függvényt, amely kiírja a tagváltozók értékét, és egy tesztelő függvényt (main), amely teszteli a konstruktorokat és a többi tagfüggvényt.


A megoldásért kattints ide!

Mivel az x és y tagváltozó értéke negatívra állitható, ami az objektum inkonzisztens állapotát jelentené, ezért azok privát tagváltozók lesznek. Mivel kívülről nem hozzáférhetők, lekérdező- és beállítófüggvényeket kell írnunk. A beállítófüggvényeknek ellenőrizniük kell, hogy csak nemnegatív számokat állítunk be.
Ha nem lenne a nemnegatív korlátozás, akkor a tagváltozók publikusak is lehetnének. Általában is igaz, hogy ha egy változó értelmezési tartományának bizonyos értékei nem megengedettek, akkor a változó privát lesz, valamint egy beállító és egy lekérdezőfüggvényt írunk. A beállítófüggvényben fellenőrizzük, hogy csak helyes értéked adjunk a tagváltozónak. Haladóbb technika, hogy a helyelen érték esetén a beállítófüggvény kivételt dob. Ezt ebben a megoldásban nem mutatjuk be. Erre a konstruktorban is figyeljünk oda, például a beállítófüggvény segítségével inicializáljuk a változókat.

A TwoDimVector.h állomány tartalma:

#ifndef TWO_DIM_VECTOR_H
#define TWO_DIM_VECTOR_H // A többszörös beépítés elkerülése

class TwoDimVector

{

      double x,y; // private

public:

    // Elegánsabb default értékkel megoldani, mint 3 konstruktorral

      TwoDimVector(double x=0, double y=0){SetX(x); SetY(y);};

 

      void SetX(double x);    // Értékbeállítás ellenorzéssel

      void SetY(double y);    // Értékbeállítás ellenorzéssel

     

      double GetX(){return x;};  // Érték lekérdezése privát tagváltozóból

      double GetY(){return y;};  // Érték lekérdezése privát tagváltozóból   

 

      void Add(TwoDimVector tdv);         // Összeadás

      void Subtract(TwoDimVector tdv);  // Kivonás

      double Multiply(TwoDimVector tdv); // Szorzás

 

      void Print()const;                       // Publikus kiírófüggvény

 

};

#endif  /* TWO_DIM_VECTOR_H */ // A többszörös beépítés elkerülése

A TwoDimVector.cpp állomány:
#include "TwoDimVector.h"
#include <iostream> 

using namespace std;

// Értékbeállítás ellenorzéssel

void TwoDimVector::SetX(double x)

{

      if(x>=0) this->x=x;

}

 

void TwoDimVector::SetY(double y)

{

      if(y>=0) this->y=y;

}

 

// Összeadás

void TwoDimVector::Add(TwoDimVector tdv)

{

      x+=tdv.GetX();

      y+=tdv.GetY();

}          

 

// Kivonás

void TwoDimVector::Subtract(TwoDimVector tdv)

{

      x-=tdv.GetX();

      y-=tdv.GetY();

} 

 

// Szorzás

double TwoDimVector::Multiply(TwoDimVector tdv)

{

      return x*tdv.GetX() + y*tdv.GetY();

}

 

// Publikus kiírófüggvény

void TwoDimVector::Print()const

{

      cout << x << y << endl; 
}    

Egy lehetséges tesztprogram:
#include "TwoDimVector.h"
#include <iostream> 

using namespace std;
int
main()

{

      // Létrehozzuk az objektumokat

      TwoDimVector tdv1; 

      TwoDimVector tdv2(4);

      TwoDimVector tdv3(2,3);

      TwoDimVector tdv4(4,5);

 

      // Kiiratjuk a tagváltozókat

      tdv1.Print();

      tdv2.Print();

      tdv3.Print();

      tdv4.Print();

 

      // Műveletek végzése

      tdv2.Add(tdv3);

      tdv4.Subtract(tdv3);

     

      // Kiiratjuk a tagváltozókat

      tdv1.Print();

      tdv2.Print();

      tdv3.Print();

      tdv4.Print();

      cout << tdv3.Multiply(tdv4) << endl;

}




2008.01.13. 10:09:13 |  Permalink  |  Hozzászólások száma: 2  |  Tárgyszavak: Osztályok


Írja meg Ön is véleményét!


Hozzászólásokat csak regisztrált, bejelentkezett felhasználóktól tudunk elfogadni!

Hozzászólások


Pt0888 Pt0888  (2017.03.16. 12:39:38)

Illetve a Setter-eknél, csak 1 path van lekezelve. Mi van akkor, ha negatív értékkel próbálok példányosítani? Memóriaszemetet tesz be. Kéne egy else { x = 0;} vagy valami. :)

Pt0888 Pt0888  (2017.03.16. 12:23:48)

A kivonás függvény nem kezeli a esetleges negatív eredményeket. Olyankor érdemes mondjuk 0-ra állítani, ha túlmutat az általunk értelmezett tartományon?