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

C++ zadanie z klasami

Object Storage Arubacloud
0 głosów
259 wizyt
pytanie zadane 28 grudnia 2022 w C i C++ przez benny13 Obywatel (1,150 p.)

Cześć! Potrzebuję pomocy przy zadaniu w c++. W programie utworzyłem tablicę wskaźników na klasę bazową Shape z funkcją virtual Total(suma pól i obwodów figur) , ustawiłem ją na 9 obiektów Circle oraz Rectangle, teraz potrzebuję za jej pomocą policzyć sumę pól i obwodów figur z tej tablicy za pomocą pętli oraz metod (w funkcji main), natomiast niestety nie wiem, jak to zrobić. Oto kod:

#include <iostream>
#include <math.h>

class Shape {
	public:
	virtual float Total() {
		return 0;
	}
	
};

class Point2D {
	
	float x;
	float y;
	
	public:	
		Point2D(float x, float y) {
			this->x = x;
			this->y = y;
		}
	
		int getX() {
			return x;
		}
		
		int getY() {
			return y;
		}
		
		void setX(float x) {
			this->x = x;
		}
		
		void setY(float y) {
			this->y = y;
		}
	
};

class Circle : public Shape {
	
	float r;
	Point2D center;
	
	public:
		
		Circle(float x, float y, float r): center(x,y) {
			center.setX(x);
			center.setY(y);
			this->r = r;
		}
		
		void print() {
			
			std::cout << "Wlasnosci obiektu Circle: " << std::endl;
			std::cout << "Srodek: " << center.getX() << " " << center.getY() << std::endl;
			std::cout << "Dlguosc promienia: " << this->r << std::endl;
		}
	
};

class Rectangle : public Shape{
	
	private:
		
	int firstSize;
	int secondSize;
	
	public:
		
	Rectangle() {
		firstSize = 1;
		secondSize = 1;	
	}
	
	Rectangle(int first, int second):firstSize(first>=0?first:1), secondSize(second>=0?second:1)  {	
	
	}
	
	Rectangle(const Rectangle& rect1) {
		firstSize = rect1.firstSize;
		secondSize = rect1.secondSize;
	}
		
	int getFirstSize() {
		return firstSize;
	}
	
	int getSecondSize() {
		return secondSize;
	}
	
	void setFirstSize(int size) {
		if(size > 0) {
			firstSize = size;
		}
		
		else {
			std::cout << "Podales niepoprawna wartosc - bok nie moze wynosic 0 ani byc ujemny!" << std::endl;
		}	
	}
	
	void setSecondSize(int size) {
		if(size > 0) {
			secondSize = size;
		}
		
		else {
			std::cout << "Podales niepoprawna wartosc - bok nie moze wynosic 0 ani byc ujemny!" << std::endl;
		}	
	}
		
	float area() {
		float area;
		area = firstSize * secondSize;
		return area;
	}
	
	float perimeter() {
		float perimeter;
		perimeter = (2 * firstSize) + (2 * secondSize);
		return perimeter;	
	}
	
	float diagonal() {
		float diagonal;
		diagonal = sqrt((firstSize * firstSize) + (secondSize * secondSize));
		return diagonal;
	}
	
	float volume (float height) {
		float volume;
		volume = firstSize * secondSize * height;
		return volume;
	}
};


int main() {
	
	
	int n;
	Rectangle r1(3,5);
	Rectangle r2(7,3);
	Rectangle r3(6,8);
	Circle c1(3,5,4);
	Circle c2(8,6,2);
	
	Shape*tab[9] = {&r1, &r2,&r3, &c1, &c2, new Rectangle(7,4), new Rectangle(9,7), new Circle(4,8,3), new Circle(1,3,4)};
	for(int i=0; i<n; i++) {
		tab[i]->Total();
}
	
	return 0;
}

Z góry dzięki za pomoc :)

komentarz 28 grudnia 2022 przez Oscar Nałogowiec (29,320 p.)

Po pierwsze zmień:

    virtual float Total() {
        return 0;
    }

na:

    virtual float Total() = 0;

Będzie to tzw funkcja pure virtual. Obiektów z takimi funkcjami nie można powołać do istnienia - istnieje tylko typ. Każda pochodna klasa "rzeczywista" musi przykryć funkcje pure virtual. Kompilator wygeneruje ci odpowiednie błędy.

Natomiast sumowanie to klasyka. Potrzeba zadeklarować zmienną na obliczenie sumy, wstępnie wyzerowaną.

   float suma = 0; 
   for(int i=0; i<n; i++) {
        suma += tab[i]->Total();
   }

 

Dodawanie obwodu (w metrach)  i powierzchni ( w metrach kwadratowych) jest bez sensu, ale matematyka nie protestuje.

Kolega niżej w odpowiedzi słusznie sugeruje by wirtualnymi były oddzielnie funkcje zwracające obwód i powierzchnie.

2 odpowiedzi

+2 głosów
odpowiedź 28 grudnia 2022 przez mokrowski Mędrzec (155,460 p.)

Zacznij od tego:

#include <iostream>
#include <math.h>

class Shape {
public:
    virtual ~Shape() = default;

    virtual float area() const = 0;
    virtual float perimeter() const = 0;
    virtual float diagonal() const = 0;
};

class Point2D {

    float x;
    float y;

public:
    Point2D(float x_, float y_)
    	: x{x_}, y{y_} {
    }

    float getX() const {
        return x;
    }

    float getY() const {
        return y;
    }

    void setX(float x_) {
        x = x_;
    }

    void setY(float y_) {
        y = y_;
    }

};

class Circle : public Shape {

    float r;
    Point2D center;

public:

    Circle(float x_, float y_, float r_): center{x_,y_}, r{r_} {
    }

    float area() const override {
    	    // TODO: Tu podaj odpowiedni wzór
    	    return 0.0F;
    }

    float perimeter() const override {
    	    // TODO: Tu podaj odpowiedni wzór
    	    return 0.0F;
    }

    float diagonal() const override {
    	    // TODO: Tu podaj odpowiedni wzór
    	    return 0.0F;
    }

    void print() const {

        std::cout << "Wlasnosci obiektu Circle:\n";
        std::cout << "Srodek: " << center.getX() << " " << center.getY() << '\n';
        std::cout << "Dlugosc promienia: " << r << '\n';
    }

};

class Rectangle : public Shape {

private:

    int firstSize;
    int secondSize;

public:

    Rectangle()
    	: firstSize{1}, secondSize{1} {
    }

    Rectangle(int first, int second)
    	: firstSize{first >= 0 ? first: 1}, secondSize{second>=0?second:1} {
    }

    Rectangle(const Rectangle& rect1)
    	: firstSize{rect1.firstSize}, secondSize{rect1.secondSize} {
    }

    int getFirstSize() const {
        return firstSize;
    }

    int getSecondSize() const {
        return secondSize;
    }

    void setFirstSize(int size) {
        if(size > 0) {
            firstSize = size;
        }

        else {
            std::cout << "Podales niepoprawna wartosc - bok nie moze wynosic 0 ani byc ujemny!\n";
            // TODO: Zastanów się jak obsłużyć ten błąd. Czy załamać program?
        }
    }

    void setSecondSize(int size) {
        if(size > 0) {
            secondSize = size;
        }

        else {
            std::cout << "Podales niepoprawna wartosc - bok nie moze wynosic 0 ani byc ujemny!\n";
            // TODO: Zastanów się jak obsłużyć ten błąd. Czy załamać program?
        }
    }

    float area() const override {
        return firstSize * secondSize;
    }

    float perimeter() const override {
        return (2 * firstSize) + (2 * secondSize);
    }

    float diagonal() const override {
        return sqrt((firstSize * firstSize) + (secondSize * secondSize));
    }

    float volume (float height) const {
        return firstSize * secondSize * height;
    }
};


int main() {
    Rectangle r1(3,5);
    Rectangle r2(7,3);
    Rectangle r3(6,8);
    Rectangle r4(6,7);
    Circle c1(3,5,4);
    Circle c2(8,6,2);
    Circle c3(6,4,4);
    Circle c4(3,5,5);

    float sum_area = 0.0F;

    Shape * elements[] = {&r1, &r2, &r3, &r4, &c1, &c2, &c3, &c4};

    for (const auto & s: elements) {
    	    sum_area += s->area();
    }
    std::cout << "Area sum: " << sum_area << '\n';

}

 

komentarz 28 grudnia 2022 przez benny13 Obywatel (1,150 p.)
Bardzo dziękuję!!
+1 głos
odpowiedź 28 grudnia 2022 przez TOWaD Mądrala (6,000 p.)
edycja 28 grudnia 2022 przez TOWaD

Pana Mirka kurs 6:02 4:55,  tu jest wyjaśnione funkcje wirtualne. I moim zadaniem wirtualnymi powinny być funkcje: area(), perimeter(), a suma pól i obwodów to jakieś odpowiednie pola statyczne w klasie Shape i funkcja która je dodaje, nie wirtualna. Tylko nie wpisuj "kocham Jolkę ...", bo to akurat nie prawda, można wywołać wirtualną funkcję.

Edit:: Coś w ten sposób, a tu coś o wirtualnych tak że.

Edit2:: Trochę nie bardzo z tym delete, ale wygląda że usuwa obiekty po zmodyfikowaniu kodu. Ale nie jestem pewien co do tej konstrukcji

Shape*tab[n] = {......, new Rectangle(7,4), new Rectangle(9,7), new Circle(3), new Circle(4)};
i tej:
for(int i=5; i<n; i++) { delete tab[i];}

 

komentarz 28 grudnia 2022 przez benny13 Obywatel (1,150 p.)
Dziękuję!!! :)
komentarz 28 grudnia 2022 przez TOWaD Mądrala (6,000 p.)

Chciałem zgodnie z tym z tym Linkem i tezą (krzaq)  z 4programmers zrobić, ale niestety już nie pamiętam  c++ w poważniejszych sprawach. Tylko tak, ale nie koniecznie to jest oki.

Podobne pytania

0 głosów
1 odpowiedź 222 wizyt
pytanie zadane 28 grudnia 2022 w C i C++ przez benny13 Obywatel (1,150 p.)
0 głosów
1 odpowiedź 268 wizyt
pytanie zadane 27 listopada 2022 w C i C++ przez benny13 Obywatel (1,150 p.)
0 głosów
1 odpowiedź 219 wizyt
pytanie zadane 25 stycznia 2023 w C i C++ przez benny13 Obywatel (1,150 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...