| 1. hét: make és C ismétlés | 2. hét: pontosság és pontatlanság | 3. hét: azonos nevű függvények, referencia |
| 4. hét: egyszerű osztályok | 5. hét: konstruktor és operator overloading | 6. hét: osztály dinamikus adattaggal |
| 9. hét: >> és << használata I/O-ra, statikus tagok | 10. hét / 1: STL vector | 10. hét / 2: STL string, algorithm |
| 11. hét: generikus algoritmusok és osztályok | 12. hét: öröklés | 13. hét: heterogén kollekció |
| 14. hét: C++11 kitekintő | 15. hét: Nagyházi bemutatás |
Készíts 2D vektor osztályt! A vektor koordinátái (x,y) double típusúak legyenek. Írj main függvényt, amelyben kipróbálod az összes megírt függvényt! Az osztály deklarációját a v2d.h, az osztályon kívül definiált függvények definícióját a v2d.cpp, a main függvényt a main.cpp fájlban helyezd el! Lépésről lépésre fejleszd a tesztelőt (main.cpp) is, hogy kipróbálj minden függvényt.
- Tárold kívülről hozzáférhetetlen módon a síkbeli vektor x, y koordinátáját (valós). Legyen init függvény.
- Készítsd el a következő lekérdező függvényeket: getX, getY, getR, getPhi. Ezek, és a továbbiak közül is akik tehetik, ígérjenek const viselkedést.
- Egészítsd ki az osztályt egy void Print() const tagfüggvénnyel, amivel egy vektor ki tudja íratni magát.
- Készíts setter függvényeket: setX, setY, setR, setPhi.
- Készíts globális Abs függvényt, amely egy vektor hosszát adja (ugyanazt, amit a getR).
- Készíts két sum függvényt, amelyek két vektor összegét adják! Az egyik legyen tagfüggvény, a másik globális függvény! A két függvény egyike sem hívhatja a másikat. A két függvény eltérő paraméterezésű: a globális függvvény két vektort kap, és ezek összegét adja vissza, a tagfüggvény pedig egy paramétert kap, és saját magát adja ehhez a vektorhoz az összegzésnél. A tagfüggvény nem változtathatja meg saját magát, egy új változóba kell tennie az eredményt, és ezt adja vissza. Mindkét függvény definíciója a v2d.cpp-be kerüljön.
- Készíts globális függvényt két vektor skaláris szorzatának kiszámítására!
A globális függvények esetében tilos a .h-ba tenni a megvalósítást. Aki nem tudja az okot, próbálja ki, és értelmezze a linker üzenetét.
1. Alakítsd át a 2D vektor osztályt úgy, hogy x,y koordináták helyett a vektor hosszát és szögét (R, Phi) tárolja! Ha jól csináltad, akkor a main függvényen semmit sem kell változtatnod, ugyanazt az eredményt kell kapnod. A skaláris szorzat kiszámítása: R1*R2*cos(Phi2-Phi1).
2. Készíts a vektor osztályhoz további funkciókat!
| main.cpp pl.: |
#include "v2d.h"
int main() {
vec2D v1, v2, v3;
const double pi = acos(0.0)*2;
v1.init(); v2.init(); v3.init();
v1.setX(1); v1.setY(1);
printf("x=%g, y=%g, r=%g, phi=%g\n", v1.getX(), v1.getY(), v1.getR(), v1.getPhi() * 180 / pi);
v1.Print(); printf("\n");
v1.setX(-1);
v1.setY(1);
printf("x=%g, y=%g, r=%g, phi=%g\n", v1.getX(), v1.getY(), v1.getR(), v1.getPhi() * 180 / pi);
v1.setR(1);
v1.setPhi(pi / 3);
printf("x=%g, y=%g, r=%g, phi=%g\n", v1.getX(), v1.getY(), v1.getR(), v1.getPhi() * 180 / pi);
printf("Abs=%g\n", Abs(v1));
v2.setX(2);
v2.setY(3);
v3 = v1.sum(v2);
printf("v1="); v1.Print();
printf(", v2="); v2.Print();
printf("\nv3=v1+v2: x=%g, y=%g, r=%g, phi=%g\n", v3.getX(), v3.getY(), v3.getR(), v3.getPhi() * 180 / pi);
v3 = sum(v1, v2);
printf("v3=v1+v2: x=%g, y=%g, r=%g, phi=%g\n", v3.getX(), v3.getY(), v3.getR(), v3.getPhi() * 180 / pi);
printf("v1*v2: dot_prod=%g\n", dot_prod(v1, v2));
return 0;
} |
| v2d.h |
#include <cstdio>
#include <cmath>
class vec2D {
double x, y;
public:
void init() { x = y = 0.0; }
double getX()const { return x; }
double getY()const { return y; }
double getR()const { return sqrt(x*x + y*y); }
double getPhi()const { return atan2(y, x); }
void Print()const { printf("(%g, %g)",getX(), getY()); }
void setX(double x) { this->x = x; }
void setY(double y) { this->y = y; }
void setR(double r) { double phi_old = atan2(y, x); x = r*cos(phi_old); y = r*sin(phi_old); }
void setPhi(double phi) { double r_old = sqrt(x*x + y*y); x = r_old*cos(phi); y = r_old*sin(phi); }
vec2D sum(const vec2D &v)const;
};
double Abs(const vec2D &v);
vec2D sum(const vec2D &v1, const vec2D &v2);
double dot_prod(const vec2D &v1, const vec2D &v2); |
| v2d.cpp |
#include "v2d.h"
double Abs(const vec2D &v) { return v.getR(); }
vec2D vec2D::sum(const vec2D &v)const {
vec2D osszeg;
osszeg.setX( getX() + v.getX() );
osszeg.setY( getY() + v.getY() );
return osszeg;
}
vec2D sum(const vec2D &v1, const vec2D &v2) {
vec2D osszeg;
osszeg.setX( v1.getX() + v2.getX() );
osszeg.setY( v1.getY() + v2.getY() );
return osszeg;
}
double dot_prod(const vec2D &v1, const vec2D &v2) {
return v1.getX()*v2.getX() + v1.getY()*v2.getY();
} |