Dynamiczna alokacja a konstruktory. (Pomoc w zadaniu)
Aplikacja się kompiluje, brak błędów w logu, jednak nie działa poprawnie. Opis zadania prezentuje się następująco: Napisz funkcję main() wczytującą liczbę wieloboków, N, a następnie liczby wierzchołków kolejnych wieloboków. Program powinien utworzyć tablicę N obiektów typu Wielobok a następnie posortować ją rosnąco ze względu na obwód wielokąta i wypisać.
Niestety nie mogę znaleźć błędu w kodzie więc wstawiam całość.
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <cmath>
using namespace std;
class Point
{
int x;
int y;
public:
Point();
void print() const;
double dist( const Point & );
friend void print_point( const Point & );
};
class Wielobok
{
int n;
Point * vertices;
public:
Wielobok() { };
Wielobok( int );
Wielobok( const Wielobok & );
~Wielobok();
void print() const;
double circum();
};
void print_point( const Point & P ) {
cout << "(" << P.x << ", " << P.y << ") ";
}
int main()
{
srand( time( NULL ) );
int n, ile;
cout << "Podaj liczbe wielobokow: "; cin >> n;
Wielobok * polygons = new Wielobok[ n ];
cout << "Podawaj liczbe wierzcholkow kolejnych wielobokow";
for( int i = 0; i < n; i++ ) {
cout << "\nWielobok " << i + 1 << ": "; cin >> ile;
Wielobok X( ile );
polygons[ i ] = X
}
bool guard = true;
while( guard ) { guard = false;
for( int j = 0; j < n - 1; j++ )
{
if( polygons[ j ].circum() > polygons[ j + 1 ].circum() ) {
swap( polygons[ j ], polygons[ j + 1 ] );
guard = true;
}
}
} int k = 0;
cout << "\nPosortowane wieloboki wg obwodu: \n";
while( k < n ) {
cout << k + 1 << ". --> "; polygons[ k ].print(); cout << "\n";
k++;
}
delete[ ] polygons;
return 0;
}
Point::Point()
{
this->x = rand() % 21 - 10;
this->y = rand() % 21 - 10;
}
void Point::print() const
{
printf( "(%i, %i)", x, y );
}
double Point::dist( const Point & P )
{
return sqrt( pow( P.y - y, 2 ) + pow( P.x - x, 2 ) );
}
Wielobok::Wielobok( int n )
{
this->n = n;
this->vertices = new Point[ n ];
for( int i = 0; i < n; i++ ) {
Point x;
vertices[ i ] = x;
}
cout << "Wielobok(): "; }
Wielobok::Wielobok( const Wielobok & wb )
{
this->n = wb.n;
this->vertices = new Point[ n ];
for( int i = 0; i < n; i++ ) {
Point x;
vertices[ i ] = x;
}
cout << "(Copy ctor)--> Wielobok(): "; print();
}
Wielobok::~Wielobok()
{
cout << "~Wielobok(): "; delete[ ] vertices;
}
void Wielobok::print() const
{
cout << n << "-kat o wierzcholkach: ";
for( int i = 0; i < n; i++ ) print_point( vertices[ i ] );
}
double Wielobok::circum()
{
double circ = 0;
for( int i = 0; i < n - 1; i++ ) {
circ += vertices[ i ].dist( vertices[ i + 1 ] );
if( i == n - 2 ) circ += vertices[ n - 1 ].dist( vertices[ 0 ] );
}
return circ;
}
Tak wygląda konsola:
Podaj liczbe wielobokow: 3
Podawaj liczbe wierzcholkow kolejnych wielobokow
Wielobok 1: 3
Wielobok(): ~Wielobok():
Wielobok 2: 4
Wielobok(): ~Wielobok():
Wielobok 3: 5
Wielobok(): ~Wielobok():
Posortowane wieloboki wg obwodu:
1. --> 3-kat o wierzcholkach: (10683768, 10686056) (-2, -8) (4, 3)
2. --> 4-kat o wierzcholkach: (10724160, 10687328) (-3, -10) (-4, 6) (6, 10)
3. --> 5-kat o wierzcholkach: (10724160, 10687328) (-3, -10) (-4, 6) (6, 10) (4, -5)
~Wielobok(): ~Wielobok(): ~Wielobok():
Process returned 0 (0x0) execution time : 5.434 s
Press any key to continue.
Po dłuższej analizie wydaje mi się że znalazłem winowajce. Mianowicie jest to ten kawałek kodu:
int n, ile;
cout << "Podaj liczbe wielobokow: "; cin >> n;
Wielobok * polygons = new Wielobok[ n ];
cout << "Podawaj liczbe wierzcholkow kolejnych wielobokow";
for( int i = 0; i < n; i++ ) {
cout << "\nWielobok " << i + 1 << ": "; cin >> ile;
Wielobok X( ile );
polygons[ i ] = X;
}
Zamieniając go w ten sposób:
int n, ile;
cout << "Podaj liczbe wielobokow: "; cin >> n;
Wielobok * polygons = new Wielobok[ n ];
cout << "Podawaj liczbe wierzcholkow kolejnych wielobokow";
for( int i = 0; i < n; i++ ) {
cout << "\nWielobok " << i + 1 << ": "; cin >> ile;
Wielobok X( ile );
polygons[ i ] = X;
polygons[ i ].print();
}
for( int i = 0; i < n; i++ ) { cout << endl; polygons[ i ].print(); }
W konsoli wygląda to następująco:
Podaj liczbe wielobokow: 3
Podawaj liczbe wierzcholkow kolejnych wielobokow
Wielobok 1: 3
Wielobok(): 3-kat o wierzcholkach: (-1, -4) (0, 8) (2, -6) ~Wielobok():
Wielobok 2: 4
Wielobok(): 4-kat o wierzcholkach: (9, -2) (0, 1) (-5, -4) (3, -9) ~Wielobok():
Wielobok 3: 5
Wielobok(): 5-kat o wierzcholkach: (0, 4) (2, -6) (-8, -4) (-10, 5) (-8, -5) ~Wielobok():
3-kat o wierzcholkach: (14222712, 14225000) (0, 8) (2, -6)
4-kat o wierzcholkach: (14263104, 14226272) (2, -6) (-8, -4) (-10, 5)
5-kat o wierzcholkach: (14263104, 14226272) (2, -6) (-8, -4) (-10, 5) (-8, -5)
Posortowane wieloboki wg obwodu:
1. --> 3-kat o wierzcholkach: (14222712, 14225000) (0, 8) (2, -6)
2. --> 4-kat o wierzcholkach: (14263104, 14226272) (2, -6) (-8, -4) (-10, 5)
3. --> 5-kat o wierzcholkach: (14263104, 14226272) (2, -6) (-8, -4) (-10, 5) (-8, -5)
~Wielobok(): ~Wielobok(): ~Wielobok():
Process returned 0 (0x0) execution time : 1.408 s
Press any key to continue.
Wierzchołki wieloboków wyświetlają się poprawnie w pętli, jednak po wyjściu z niej wartości zostały zmienione.