[C++] klasy Punkt, Prosta

olka_d
Użytkownik
Użytkownik
Posty: 28
Rejestracja: 6 cze 2009, o 16:25
Płeć: Kobieta
Podziękował: 1 raz

[C++] klasy Punkt, Prosta

Post autor: olka_d »

Witam,
Nie wiem czemu mi program nie działa, pomożecie?

Kod: Zaznacz cały

#include<stdio.h>
#include<string.h>
#include<math.h>

class Punkt {
public:
	Punkt (); //utorz obiekt niezainicjowany- konstruktor
	Punkt(float x, float y); //utworz obiekt ze wspolrzednych (x,y)- konstruktor
	float x (); //wypisz wspolrzedna x
	float y (); //wypisz wspolrzedna y
private:
	float wsp_x; //wspolrzedna x
	float wsp_y; //wspolrzedna y
};
Punkt::Punkt(float x, float y)
{
	wsp_x=x;
	wsp_y=y;
}
Punkt::Punkt()
{
}
float Punkt::x()
{
	return wsp_x;
}
float Punkt::y()
{
	return wsp_y;
}
class Prosta {
public:
	Prosta(float Punkt_p1,float Punkt_p2); //utworz prosta prz pomocy dwoch punktow
	float odleglosc(float Punkt_p); //znajdz odleglosc od punktu p
private:
	//ax+by+c=0
	float a;
	float b;
	float c;
};

Prosta::Prosta(Punkt p1,Punkt p2) //wyznacz prosta biegnaca przez punkty p1 i p2
{
	if(p1.x()==p2.x())
	{
		a=1;
		b=0;
		c=-p1.x();
	}
	else
	{
		a=p2.y()-p1.y();
		b=p1.x()-p2.y();
		c=p1.y()*p2.x()-p2.y()*p1.x();
	}
}
float Prosta::odleglosc(Punkt_p) //zwraca dystans od punktu p do linii
{
	return fabs(a*p.x()+b*p.y()+c)/sqrt(a*a+b*b);
}

int main ()
{
	float x1,x2,x3,x4,y1,y2,y3,y4;

	printf("Podaj współrzędną x dla pierwszego dowolnego punktu: ");
	scanf("%ld", &x1);
	printf("Podaj współrzędną y dla pierwszego dowolnego punktu: ");
	scanf("%ld", &y1);
	printf("Podaj współrzędną x dla drugiego dowolnego punktu: ");
	scanf("%ld", &x2);
	printf("Podaj współrzędną y dla drugiego dowolnego punktu: ");
	scanf("%ld", &y2);
	printf("Podaj współrzędną x dla trzeciego dowolnego punktu: ");
	scanf("%ld", &x3);
	printf("Podaj współrzędną y dla trzeciego dowolnego punktu: ");
	scanf("%ld", &y3);
	printf("Podaj współrzędną x dla czwartego dowolnego punktu: ");
	scanf("%ld", &x4);
	printf("Podaj współrzędną y dla czwartego dowolnego punktu: ");
	scanf("%ld", &y4);
	Punkt p1(x1,y1); //deklaracja punktu p1
	printf("Wspolrzedne punktu p1 to: %ld",p1.x(),p1.y()); //wypisz na ekranie wspolrzedne punktu p1
	Punkt p2(x2,y2);
	printf("Wspolrzedne punktu p2 to: %ld",p2.x(),p2.y());
	Punkt p3(x3,y3);
	printf("Wspolrzedne punktu p3 to: %ld",p3.x(),p3.y());
	Punkt p4(x4,y4);
	printf("Wspolrzedne punktu p4 to: %ld",p4.x(),p4.y());
	Prosta f1(p1,p2); //deklaracja prostej f1
	Prosta f2(p3,p4);
	printf("Odleglosc miedzy punktem p1 a prosta f1 wynosi: %ld",f1.odleglosc(p1));
	printf("Odleglosc miedzy punktem p1 a prosta f2 wynosi: %ld",f2.odleglosc(p1));
	printf("Odleglosc miedzy punktem p4 a prosta f1 wynosi: %ld",f1.odleglosc(p4));
	printf("Odleglosc miedzy punktem p4 a prosta f2 wynosi: %ld",f2.odleglosc(p4));

	return 0;
}
A błędy jakie pisze mi kompilator to:
error C2511: 'Prosta::Prosta(Punkt,Punkt)' : overloaded member function not found in 'Prosta'
error C2065: 'Punkt_p' : undeclared identifier
error C2448: 'Prosta::odleglosc' : function-style initializer appears to be a function definition
error C2664: 'Prosta::Prosta(float,float)' : cannot convert parameter 1 from 'Punkt' to 'float' available that can perform this conversion, or the operator cannot be called
i ten ostatni błąd jest powtórzony 5 razy.
Z góry dziękuję za pomoc.
Ostatnio zmieniony 17 mar 2014, o 16:09 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa tagu w nazwie tematu.
Awatar użytkownika
Szemek
Użytkownik
Użytkownik
Posty: 4819
Rejestracja: 10 paź 2006, o 23:03
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 43 razy
Pomógł: 1407 razy

[C++] klasy Punkt, Prosta

Post autor: Szemek »

Błędy na etapie kompilacji to chyba najłatwiejsze błędy do wykrycia i naprawienia, dlatego warto się podszkolić z angielskiego.

Kod: Zaznacz cały

error C2511: 'Prosta::Prosta(Punkt,Punkt)' : overloaded member function not found in 'Prosta'
error C2664: 'Prosta::Prosta(float,float)' : cannot convert parameter 1 from 'Punkt' to 'float' available that can perform this conversion, or the operator cannot be called
brakuje przeciążonej metody, która przyjmowałaby jako argumenty obiekty klasy Punkt
nie można dokonać konwersji pomiędzy typami (obiektem klasy Punkt, a float)
Zamiast:
Prosta(float Punkt_p1,float Punkt_p2);
powinno być:
Prosta(Punkt p1, Punkt p2);

Kod: Zaznacz cały

error C2065: 'Punkt_p' : undeclared identifier
error C2448: 'Prosta::odleglosc' : function-style initializer appears to be a function definition
Brak identyfikatora 'Punkt_p', a poza tym definicja funkcji (metody) musi odpowiadać deklaracji funkcji (metody)
Zamiast:
float odleglosc(float Punkt_p);
float Prosta::odleglosc(Punkt_p)
powinno być:
float odleglosc(Punkt p);
float Prosta::odleglosc(Punkt p)

Jedna rzecz, której Visual Studio nie zgłosi jako błędu czy ostrzeżenia:
%ld - używamy do typu double
%f - używamy do typu float

Jak wypisujesz współrzędne to pamiętaj o wszystkich współrzędnych:
Zamiast:
printf("Wspolrzedne punktu p1 to: %ld",p1.x(),p1.y());
powinno być:
printf("Wspolrzedne punktu p1 to: (%f, %f) \n",p1.x(),p1.y());

Przy wypisywaniu dodawaj sobie znak końca linii \n, bo wszystko sklei się i ciężko cokolwiek przeczytać z konsoli.

Poprawiony kod:
Ukryta treść:    
olka_d
Użytkownik
Użytkownik
Posty: 28
Rejestracja: 6 cze 2009, o 16:25
Płeć: Kobieta
Podziękował: 1 raz

[C++] klasy Punkt, Prosta

Post autor: olka_d »

Dzięki wielkie
krystian1863
Użytkownik
Użytkownik
Posty: 121
Rejestracja: 3 maja 2010, o 17:23
Płeć: Mężczyzna
Lokalizacja: Ostrołęka
Podziękował: 14 razy
Pomógł: 2 razy

[C++] klasy Punkt, Prosta

Post autor: krystian1863 »

A jak zmodyfikować ten kod zeby dal sie skompilować w C?
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10218
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2361 razy

[C++] klasy Punkt, Prosta

Post autor: Dasio11 »

Znajdzie się jedynie daleki odpowiednik, ponieważ \(\displaystyle{ \text{C}}\) nie wspiera programowania obiektowego i nie ma w nim klas. Najmniejsza odległość, na jaką można się zbliżyć, to:

1. Zadeklarować struktury:

Kod: Zaznacz cały

struct Punkt
{
    float wsp_x;
    float wsp_y;
};

struct Prosta
{
    float a;
    float b;
    float c;
};
2. Zdefiniować "metody":

Kod: Zaznacz cały

void Punkt_ctor( struct Punkt* p )
{}

void Punkt_ctor_f( struct Punkt* p, float x, float y )
{
    p->wsp_x = x;
    p->wsp_y = y;
}

float x( struct Punkt* p )
{
    return p->wsp_x;
}

float y( struct Punkt* p )
{
    return p->wsp_y;
}

Prosta_ctor( struct Prosta* s, struct Punkt p1, struct Punkt p2 )
{
    /* kod */
}

float odleglosc( struct Prosta* s, struct Punkt p )
{
    /* kod */
}
3. Pamiętać, żeby po każdej deklaracji instancji każdej struktury samodzielnie wywołać odpowiedni ctor. ;-)

Elegancko będzie również w takich funkcjach jak x, y, odleglosc doczepić kawałek nazwy, który mówi, że dana funkcja jest przez nas traktowana jako metoda danej klasy. Na przykład:

Kod: Zaznacz cały

float Prosta_odleglosc( struct Prosta* s, struct Punkt p )
{
    /* kod */
}
Pozwoli to uniknąć kolizji nazw w przyszłości, na które \(\displaystyle{ \text{C}}\) niestety jest bardzo czuły.
Ale radzę jednak robić takie rzeczy w \(\displaystyle{ \text{C}{++}}\). :-)
ODPOWIEDZ