Fizikus C++ labor

1. hét: make és C ismétlés2. hét: pontosság és pontatlanság3. hét: azonos nevű függvények, referencia
4. hét: egyszerű osztályok5. hét: konstruktor és operator overloading6. hét: osztály dinamikus adattaggal
9. hét: >> és << használata I/O-ra, statikus tagok10. hét / 1: STL vector10. hét / 2: STL string, algorithm
11. hét: generikus algoritmusok és osztályok12. hét: öröklés13. hét: heterogén kollekció
14. hét: C++11 kitekintő15. hét: Nagyházi bemutatás

4. hét: egyszerű osztályok

1. feladat

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.

Gyakorló feladat

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!

Órai feladatok mintamegoldása

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();
}