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

C++ zadanie z klasami

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
434 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,360 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 (158,660 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,480 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,480 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ź 273 wizyt
pytanie zadane 28 grudnia 2022 w C i C++ przez benny13 Obywatel (1,150 p.)
0 głosów
1 odpowiedź 568 wizyt
pytanie zadane 27 listopada 2022 w C i C++ przez benny13 Obywatel (1,150 p.)
0 głosów
1 odpowiedź 434 wizyt
pytanie zadane 25 stycznia 2023 w C i C++ przez benny13 Obywatel (1,150 p.)

93,430 zapytań

142,427 odpowiedzi

322,652 komentarzy

62,792 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

...