[ potato @ 29.08.2006. 00:27 ] @
Zadatak glasi: Kooristeći principe objektnoorijentisanog programiranja rješiti zadatak:
Dato je n tacaka u ravni svojim koordinatama. Napisati program za ispitivanje da li medu zadatim tačkama postoje četiri koje predstavljaju koordinate tjemena pravougaonika.
Code:


Ja sam uradio ovako:

//#include <stdio.h>
#include <iostream>

using namespace std;

int main()
{
    int tacke_x[100];
    int tacke_y[100];
    int duzine_kordinate_x[100][3];
    int n,i,j,duzina,trenutna_duzina_x=2;
    cout << "Unesi broj tacaka: ";
    cin >> n;
    for (i=1;i<=n;i++)
    {
        cout << i <<". tacka unesi x,y ";
        cin >> tacke_x[i];
        cin >> tacke_y[i];
    }
    for (i=1;i<=n;i++)
    for (j=1;j<=n;j++)
    {
        if (tacke_y[i]==tacke_y[j])
        {
            if (tacke_x[i]!=tacke_x[j])
            if (tacke_x[i]<tacke_x[j]) 
            {
                duzina=tacke_x[j]-tacke_x[i];
                duzine_kordinate_x[trenutna_duzina_x][0]=i;//pamti jednu tacku
                duzine_kordinate_x[trenutna_duzina_x][1]=j;//pamti drugu tacku tj. indexe
                duzine_kordinate_x[trenutna_duzina_x][2]=duzina;
            } 
            else
            {
            duzina=tacke_x[i]-tacke_x[j];
            duzine_kordinate_x[trenutna_duzina_x][0]=j;// na nuli je bliza tacka
            duzine_kordinate_x[trenutna_duzina_x][1]=i;
            duzine_kordinate_x[trenutna_duzina_x][2]=duzina;
            }
            trenutna_duzina_x++;
        }
    }
    trenutna_duzina_x--;
    for (i=1;i<=trenutna_duzina_x;i++)
    for (j=2;j<=trenutna_duzina_x;j++)
    {
            
        if (duzine_kordinate_x[i][2]==duzine_kordinate_x[j][2])
        {
            if (abs(tacke_y[duzine_kordinate_x[i][0]]-tacke_y[duzine_kordinate_x[j][0]])
                ==abs(tacke_y[duzine_kordinate_x[i][1]]-tacke_y[duzine_kordinate_x[j][1]]))
            cout <<"Pravugaonik cine tacke :" <<duzine_kordinate_x[i][0]<<duzine_kordinate_x[i][1]<<duzine_kordinate_x[j][0]<< duzine_kordinate_x[j][1];
        }
    }
}    



Kad kompajlira sve je uredu, ali kad unesem sve koordinate, javi mi gresku. "Program has encountered....". Znate li sta je problem?
Hvala!

[Ovu poruku je menjao X Files dana 14.04.2009. u 19:56 GMT+1]
[ potato @ 29.08.2006. 01:15 ] @
Ako mi ovo nije tacno, moze li neko ponuditi tacan kod? Hvala!
[ #Ninja# @ 29.08.2006. 08:31 ] @
Gdje ti je tu OOP?
[ potato @ 29.08.2006. 11:14 ] @
Znam da nije bas OOP, ali ako neko ima drugi nacin za ovo, neka postavi.
[ Mali Misha @ 29.08.2006. 11:14 ] @
Možda misli na podužu hierarhiju kojom se dolazi do i/ostream..

Preporučio bih ti da tačke malo drugačije organizuješ.

Code:
#include <iostream>
#include <vector>
// ...
using namespace std;

// ...

class point {

    int x,y;

    public:
        point(int x,int y):
            x(x),y(y)
        {}

        // ...
};

// ...

int main()
{
    vector<point> points;

    // ...
    
    return 0;
}

Potom možeš da napraviš klasu za četvrougao koja kao argumente konstruktora prima pokazivače na četri tačke (ovaj niz tačaka može biti i njena statička varijabla ili konstruktor umesto pokazivača može primati const reference pa praviti sopstvene kopije datih tačaka), i jednu bool metodu koja govori da li je reč o pravougaoniku ili ne. Ostatak su kombinatorika i geometrija/algebra..
[ djalfirevic @ 29.08.2006. 12:56 ] @
Citat:
potato: Zadatak glasi: Kooristeći principe objektnoorijentisanog programiranja rješiti zadatak:
Dato je n tacaka u ravni svojim koordinatama. Napisati program za ispitivanje da li medu zadatim tačkama postoje četiri koje predstavljaju koordinate tjemena pravougaonika.


Ja sam uradio ovako:

//#include <stdio.h>
#include <iostream>

using namespace std;

int main()
{
int tacke_x[100];
int tacke_y[100];
int duzine_kordinate_x[100][3];
int n,i,j,duzina,trenutna_duzina_x=2;
cout << "Unesi broj tacaka: ";
cin >> n;
for (i=1;i<=n;i++)
{
cout << i <<". tacka unesi x,y ";
cin >> tacke_x;
cin >> tacke_y;
}
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
if (tacke_y==tacke_y[j])
{
if (tacke_x!=tacke_x[j])
if (tacke_x<tacke_x[j])
{
duzina=tacke_x[j]-tacke_x;
duzine_kordinate_x[trenutna_duzina_x][0]=i;//pamti jednu tacku
duzine_kordinate_x[trenutna_duzina_x][1]=j;//pamti drugu tacku tj. indexe
duzine_kordinate_x[trenutna_duzina_x][2]=duzina;
}
else
{
duzina=tacke_x-tacke_x[j];
duzine_kordinate_x[trenutna_duzina_x][0]=j;// na nuli je bliza tacka
duzine_kordinate_x[trenutna_duzina_x][1]=i;
duzine_kordinate_x[trenutna_duzina_x][2]=duzina;
}
trenutna_duzina_x++;
}
}
trenutna_duzina_x--;
for (i=1;i<=trenutna_duzina_x;i++)
for (j=2;j<=trenutna_duzina_x;j++)
{

if (duzine_kordinate_x[2]==duzine_kordinate_x[j][2])
{
if (abs(tacke_y[duzine_kordinate_x[0]]-tacke_y[duzine_kordinate_x[j][0]])
==abs(tacke_y[duzine_kordinate_x[1]]-tacke_y[duzine_kordinate_x[j][1]]))
cout <<"Pravugaonik cine tacke :" <<duzine_kordinate_x[0]<<duzine_kordinate_x[1]<<duzine_kordinate_x[j][0]<< duzine_kordinate_x[j][1];
}
}
}



Kad kompajlira sve je uredu, ali kad unesem sve koordinate, javi mi gresku. "Program has encountered....". Znate li sta je problem?
Hvala!


Molim te postavi link ali sa [code] tagovima...
[ potato @ 29.08.2006. 13:07 ] @
Code:


#include <iostream>

using namespace std;

int main()
{
    int tacke_x[100];
    int tacke_y[100];
    int duzine_kordinate_x[100][3];
    int n,i,j,duzina,trenutna_duzina_x=2;
    cout << "Unesi broj tacaka: ";
    cin >> n;
    for (i=1;i<=n;i++)
    {
        cout << i <<". tacka unesi x,y ";
        cin >> tacke_x[i];
        cin >> tacke_y[i];
    }
    for (i=1;i<=n;i++)
    {
        
    for (j=1;j<=n;j++)
    {
        if (tacke_y[i]==tacke_y[j])
        {
            if (tacke_x[i]!=tacke_x[j])
            {
                                       if (tacke_x[i]<tacke_x[j]) 
                                       {
                                       duzina=tacke_x[j]-tacke_x[i];
                                       duzine_kordinate_x[trenutna_duzina_x][0]=i;//pamti jednu tacku
                                       duzine_kordinate_x[trenutna_duzina_x][1]=j;//pamti drugu tacku tj. indexe
                                       duzine_kordinate_x[trenutna_duzina_x][2]=duzina;
                                       } 
                                       else
                                       {
                                       duzina=tacke_x[i]-tacke_x[j];
                                       duzine_kordinate_x[trenutna_duzina_x][0]=j;// na nuli je bliza tacka
                                       duzine_kordinate_x[trenutna_duzina_x][1]=i;
                                       duzine_kordinate_x[trenutna_duzina_x][2]=duzina;
                                       }
            trenutna_duzina_x++;
        }
        }
    }
}
    trenutna_duzina_x--;
    for (i=1;i<=trenutna_duzina_x;i++)
    {
    for (j=2;j<=trenutna_duzina_x;j++)
    {
            
        if (duzine_kordinate_x[i][2]==duzine_kordinate_x[j][2])
        {
            if (abs(tacke_y[duzine_kordinate_x[i][0]]-tacke_y[duzine_kordinate_x[j][0]])
                ==abs(tacke_y[duzine_kordinate_x[i][1]]-tacke_y[duzine_kordinate_x[j][1]]))
            cout <<"Pravugaonik cine tacke :" <<duzine_kordinate_x[i][0]<<duzine_kordinate_x[i][1]<<duzine_kordinate_x[j][0]<< duzine_kordinate_x[j][1];
        }
      }
    }
}    


Al mi vrti u petlji ovaj cout. Ako ima ko kakvo drugo rjesenje, neka postavi. Jer sam blokiran skroz.
Hvala!
[ Filip_B @ 30.08.2006. 23:27 ] @
A kako se dokazuje da 4 tačke u ravni čine pravougaonik?
[ itf @ 31.08.2006. 09:49 ] @
Evo ti dobar dio zadatka. Sad ti samo nadopuni onaj dio gdje se provjerava da li koje tačke čine pravokutnik..

Code:
#include <iostream>
using namespace std;

class Tacka{
    private:  // po defaultu...
        float x, y;
    public:
        Tacka(){} // default konstruktor
        Tacka(float x, float y); // konstruktor koji prima koordinate
        friend istream& operator >>(istream &izlaz, Tacka &T);
};

Tacka::Tacka(float x, float y){
    this->x = x;
    this->y = y;
}

// preopterećenje operatora >> za učitavanje novog podatka Tacka
istream& operator >>(istream &izlaz, Tacka &T){
    izlaz >> T.x >> T.y;
    return izlaz;
}

int main(int argc, char* argv[])
{
    Tacka* T;
    int i, n;

    cout << "Unesi broj tačaka: ";
    cin >> n;

    T = new Tacka[n];
    if(T == NULL){
        cout << "Nema dovoljno memorije!";
        return -1;
    }

    for(i = 0; i < n; i++){
        cout << "Unesi koordinate točke T" << i << ": ";
        cin >> T[i];
    }

    // ovdje ubaci dio za provjeru pravokutnika...

    delete[] T;
    return 0;
}

[ potato @ 31.08.2006. 19:54 ] @
Hvala puno na pomoci!!Samo da razrijesim nejasnoce, sad trebam onaj dio programa sa for petljama koji ce ispitati koje tacke cine pravougaonik?
[ itf @ 01.09.2006. 07:46 ] @
Citat:
potato: Hvala puno na pomoci!!Samo da razrijesim nejasnoce, sad trebam onaj dio programa sa for petljama koji ce ispitati koje tacke cine pravougaonik?
Tako je
[ potato @ 05.09.2006. 14:51 ] @
Ovako, dosao sam na ideju da uradim slijedece: Naci dijagonale pravougaonika, odnosno naci sve prave, odnosno duzine tih pravih kroz 2 tacke formulom d=sqr((x1-x2)*(x1-x2)-(y1-y2)*(y1-y2)). I kad nadjem sve prave onda ih upoređujem. Ako postoje dvije prave iste duzine, onda ispitaj da li im je tacka koja je tacno na pola ista, ako jeste onda je nadjen pravougaonik. Kao sto mi je poznato dijagonale kod pravougaonika su iste duzine i slijeku se u istoj tacki, ma koji god da je ugao izmedju njih. Napisao sam slijedeci dio koda koji se nadovezuje na ovo gore : "// ovdje ubaci dio za provjeru pravokutnika... " :
Code:

    for(l=0;i<n;l++){
                     for(j=l+1;j<n;j++)
                     {
    duzina[k]=sqrt((abs(T[i].Uzmi_x-T[j].Uzmi_x)*abs(T[i].Uzmi_x-T[j].Uzmi_x))+(abs(T[i].Uzmi_y-T[j].Uzmi_y)*abs(T[i].Uzmi_y-T[j].Uzmi_y)));
    sredina_x[k]=abs((T[i].Uzmi_x-T[j].Uzmi_x)/2);
    sredina_x[y]=abs((T[i].Uzmi_y-T[j].Uzmi_y)/2);
    k++;
}
}
for(m=0;m<k;m++){
                 for(n=m+1;n<k;n++)
{
if(duzina[m]==duzina[n])
{
if((sredina_x[m]==sredina_x[n])&&(sredina_y[m]==sredina_y[n]))
{
cout<<"Nadjen je pravougaonik!";
break;
}
}
}
}   


Napravio sam ove funkcije float Uzmi_x( float x){return x;} i Uzmi_y( float y){return y;} u sklopu klase tacka. Međutim, kad hocu da racunam duzinu, kompajler mi kaze: "invalid use of member (did you forget the '&' ? )".
Pa me zanima kako da uzmem x i y koordinate i ovako ih izracunam.
I jos jedno pitanje, mogu li nekako doznati koordinate tacaka ako sam ovako uradio taj kod?

Hvala puno!
[ potato @ 06.09.2006. 14:04 ] @
Code:

#include <iostream>
#include <math.h>
using namespace std;

class Tacka{
      public:
        Tacka(){} // default konstruktor
        Tacka(float x, float y); // konstruktor koji prima koordinate
        friend istream& operator >>(istream &izlaz, Tacka &T);
        float x, y;
};

Tacka::Tacka(float x, float y){
    this->x = x;
    this->y = y;
}

// preopterećenje operatora >> za učitavanje novog podatka Tacka
istream& operator >>(istream &izlaz, Tacka &T){
    izlaz >> T.x >> T.y;
    return izlaz;
}

int main(int argc, char* argv[])
{
    Tacka* T;
    int i, n;
    int l,j,k=0,m,a=0;
    float duzina[500],sredina_x[100],sredina_y[100];

    cout << "Unesi broj tacaka: ";
    cin >> n;

    T = new Tacka[n];
    if(T == NULL){
        cout << "Nema dovoljno memorije!";
        return -1;
    }

    for(i = 0; i < n; i++){
        cout << "Unesi koordinate tacke T" << i << ": ";
        cin >> T[i];
    }
 
    for(l=0;l<n;l++){
                     for(j=l+1;j<n;j++)
                     {
    duzina[k]=sqrt(((T[l].x-T[j].x)*(T[l].x-T[j].x))+((T[l].y-T[j].y)*(T[l].y-T[j].y)));
    cout<<duzina[k]<<" ---- \n";//cout sam stavio da probam,ok za 5 tacaka 10 duzina
    sredina_x[k]=((T[l].x+T[j].x)/2);
    sredina_y[k]=((T[l].y+T[j].y)/2);
    k++;
    
}
}
cout<<"\n K je jednako: "<<k;

for(m=0;m<k;m++){
                 for(n=m+1;n<k;n++)
                 {
if(duzina[m]==duzina[n])
                        {
                  
if((sredina_x[m]==sredina_x[n])&&(sredina_y[m]==sredina_y[n]))
                                                              {
cout<<"Nadjen je pravougaonik!\n";
break;
                                                              }
                         }
                  }
}   

    delete[] T;
    return 0;
}


Ok! Ovo radi sada!Samo me zanima ako mi moze iko pomoci da probam iskopati koordinate tacaka! :)