• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Szkola programowania rozdzial 11 zad 2

Object Storage Arubacloud
0 głosów
196 wizyt
pytanie zadane 2 grudnia 2017 w C i C++ przez chucksqll Stary wyjadacz (12,930 p.)

Witam. Nie za bardzo wiem jak mam się zabrać za podane zadanie, jakie metody prywatne mają być dodane, i jak to wszystko powiązać wtedy. Proszę o wskazówki.

Treść:

Zmodyfikuj plik nagłowkowy klasy Vectorr i plik implementacjii jej  metod(listingi 11.13 i 11.14)tak ,aby obiekty nie przechowywały w składowych wartości długości i odchylenia wektora. Zamiast tego obiekt powinien obliczać i zwracać te wartości w wyniku wywołania metod magval() (długość wektora) i angval()(kąt wektora). Publiczny interfejs klasy powinien pozostać bez zmian (co do metod publicznych i ich argumentów), sekcję prywatną należy jednak uzupełnić o kilka metod prywatnych i zubożyć o wyeliminowane składowe. Przetestuj nową wersję klasy programem z listingu 11.15, który skoro publiczny interfejs klasy Vector ma pozostać niezmienny powinien nadawać się do wykorzystania.

// randwalk.cpp -- test klasy Vector
// kompilować z plikiem vect.cpp
#include <iostream>
#include <cstdlib>    // prototypy funkcji rand() i srand()
#include <ctime>      // prototyp funkcji time()
#include "vect.h"

int main()
{
    using namespace std;
    using VECTOR::Vector;
    srand(time(0));   // inicjalizacja generatora liczb pseudolosowych
    double direction;
    Vector step;
    Vector result(0.0, 0.0);
    unsigned long steps = 0;
    double target;
    double dstep;
    cout << "Podaj dystans do przejścia (k, aby zakończyć): ";
    while (cin >> target)
    {
        cout << "Podaj długość kroku: ";
        if (!(cin >> dstep))
            break;

        while (result.magval() < target)
        {
            direction = rand() % 360;
            step.reset(dstep, direction, Vector::POL);
            result = result + step;
            steps++;
        }
        cout << "Po " << steps << " krokach delikwent "
            "osiągnął położenie:\n";
        cout << result << endl;
        result.polar_mode();
        cout << " czyli\n" << result << endl;
        cout << "Średnia długość kroku pozornego = "
            << result.magval()/steps << endl;
        steps = 0;
        result.reset(0.0, 0.0);
        cout << "Podaj dystans do przejścia (k, aby zakończyć): ";
    }
    cout << "Koniec!\n";
    cin.clear();
    while (cin.get() != '\n')
        continue;
    return 0;
}

// vect.h -- klasa Vector z operatorem << i przełącznikiem trybu
#ifndef VECTOR_H_
#define VECTOR_H_
#include <iostream>
namespace VECTOR
{
    class Vector
    {
        public:
            enum Mode {RECT, POL};
            // RECT to współrzędne kartezjańskie, POL to współrzędne biegunowe
        private:
            double x;        // wartość składowej poziomej
            double y;        // wartość składowej pionowej
            double mag;      // długość wektora
            double ang;      // kierunek wektora (w stopniach)
            Mode mode;       // RECT lub POL
            // prywatne metody ustawiające składowe
            void set_mag();
            void set_ang();
            void set_x();
            void set_y();
        public:
            Vector();
            Vector(double n1, double n2, Mode form = RECT);
            void reset(double n1, double n2, Mode form = RECT);
            ~Vector();
            double xval() const {return x;}      // zwraca wartość składowej x
            double yval() const {return y;}      // zwraca wartość składowej y
            double magval() const {return mag;}  // zwraca długość
            double angval() const {return ang;}  // zwraca kąt
            void polar_mode();    // ustawia tryb na biegunowy (POL)
            void rect_mode();     // ustawia tryb na kartezjański (RECT)
            // metody przeciążające operatory
            Vector operator+(const Vector & b) const;
            Vector operator-(const Vector & b) const;
            Vector operator-() const;
            Vector operator*(double n) const;
            // funkcje zaprzyjaźnione
            friend Vector operator*(double n, const Vector & a);
            friend std::ostream &
                operator<<(std::ostream & os, const Vector & v);
    };
} // koniec przestrzeni nazw VECTOR
#endif

// vect.cpp -- implementacje metod klasy Vector
#include <cmath>
#include "vect.h"        // włącza plik nagłówkowy <iostream>
using std::sqrt;
using std::sin;
using std::cos;
using std::atan;
using std::atan2;
using std::cout;

namespace VECTOR
{
    // przelicznik radianów na stopnie
    const double Rad_to_deg = 45.0 / atan(1.0);
    // powinno wyjść około 57.2957795130823
    // metody prywatne
    // oblicza długość wektora ze składowych x i y
    void Vector::set_mag()
    {
        mag = sqrt(x * x + y * y);
    }

    void Vector::set_ang()
    {
        if (x == 0.0 && y == 0.0)
            ang = 0.0;
        else
            ang = atan2(y, x);
    }

    // oblicza składową x ze współrzędnych biegunowych
    void Vector::set_x()
    {
        x = mag * cos(ang);
    }

    // oblicza składową y ze współrzędnych biegunowych
    void Vector::set_y()
    {
        y = mag * sin(ang);
    }

    // metody publiczne
    Vector::Vector()          // konstruktor domyślny
    {
        x = y = mag = ang = 0.0;
        mode = RECT;
    }

    // konstruuje wektor o zadanych współrzędnych biegunowych (w trybie 'p')
    // bądź prostokątnych (w domyślnym trybie 'r')
    Vector::Vector(double n1, double n2, Mode form)
    {
        mode = form;
        if (form == RECT)
        {
            x = n1;
            y = n2;
            set_mag();
            set_ang();
        }
        else if (form == POL)
        {
            mag = n1;
            ang = n2 / Rad_to_deg;
            set_x();
            set_y();
        }
        else
        {
            cout << "Niepoprawna wartość trzeciego argumentu Vector() -- ";
            cout << "zeruję wektor\n";
            x = y = mag = ang = 0.0;
            mode = RECT;
        }
    }

    // zerowanie wartości wektora dla zadanych współrzędnych kartezjańskich (dla RECT)
    // albo dla zadanych współrzędnych biegunowych (POL)
    void Vector::reset(double n1, double n2, Mode form)
    {
        mode = form;
        if (form == RECT)
        {
            x = n1;
            y = n2;
            set_mag();
            set_ang();
        }
        else if (form == POL)
        {
            mag = n1;
            ang = n2 / Rad_to_deg;
            set_x();
            set_y();
        }
        else
        {
            cout << "Niepoprawny trzeci argument set() -- ";
            cout << "zeruję wektor\n";
            x = y = mag = ang = 0.0;
            mode = RECT;
        }
    }

    Vector::~Vector()   // destruktor
    {
    }

    void Vector::polar_mode()  // przełącza do reprezentacji biegunowej
    {
        mode = POL;
    }

    void Vector::rect_mode()   // przełącza do reprezentacji kartezjańskiej
    {
        mode = RECT;
    }

    // przeciążone operatory
    // dodawanie dwóch wektorów
    Vector Vector::operator+(const Vector & b) const
    {
        return Vector(x + b.x, y + b.y);
    }

    // odejmowanie wektora b od wektora a
    Vector Vector::operator-(const Vector & b) const
    {
        return Vector(x - b.x, y - b.y);
    }

    // zmienia znak wektora
    Vector Vector::operator-() const
    {
        return Vector(-x, -y);
    }

    // mnoży wektor wywołujący przez n
    Vector Vector::operator*(double n) const
    {
        return Vector(n * x, n * y);
    }

    // funkcje zaprzyjaźnione
    // mnoży n przez wektor a
    Vector operator*(double n, const Vector & a)
    {
        return a * n;
    }

    // wyświetla współrzędne wektora (prostokątne w trybie RECT,
    // biegunowe w trybie POL)
    std::ostream & operator<<(std::ostream & os, const Vector & v)
    {
        if (v.mode == Vector::RECT)
            os << "(x,y) = (" << v.x << ", " << v.y << ")";
        else if (v.mode == Vector::POL)
        {
            os << "(m,a) = (" << v.mag << ", "
                << v.ang * Rad_to_deg << ")";
        }
        else
            os << "Niepoprawny tryb reprezentacji obiektu wektora";
        return os;
    }
} // koniec przestrzeni nazw VECTOR

 

1 odpowiedź

+1 głos
odpowiedź 3 grudnia 2017 przez j23 Mędrzec (194,920 p.)
edycja 3 grudnia 2017 przez j23

W zadaniu masz jasno napisane, że "obiekt powinien obliczać i zwracać te wartości w wyniku wywołania metod magval() (długość wektora) i angval()(kąt wektora)". Teraz obie metody zwracają po prostu wartości pól ang i mag. Twoim zadaniem jest usunięcie tych pól (set_ang() i set_mag() też) z klasy Vector i przeniesienie obliczeń do wspomnianych metod.

Sensu dodawania dodatkowych metod prywatnych nie widzę, ale może w praniu wyjdzie, że trzeba...

Podobne pytania

0 głosów
1 odpowiedź 371 wizyt
pytanie zadane 29 stycznia 2019 w C i C++ przez look Użytkownik (520 p.)
0 głosów
1 odpowiedź 631 wizyt
0 głosów
1 odpowiedź 218 wizyt
pytanie zadane 1 listopada 2017 w C i C++ przez PanJaqb Początkujący (360 p.)

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...