// xytaso.cpp // Lukee xy-tason pisteit„ ja tulostaa ne x:n mukaan suuruusj„rjestyksess„. // // Tekij„: Vesa Lappalainen // Pvm: 4.3.1997, klo 12-14 // Muutettu: 4.3.1997, klo 14.30-15.00 // Mit„ muutettu: Lis„ys suoraan oikealle paikalleen // - etsi_paikka ja tee_reika // Lis„tty kommentteja // // Luokat: cPiste - x,y // - lue, tulosta, vertaa // cPisteet - lue, tulosta, lis„„, k„ytt„„ cPiste:tt„ // Tietorakenne: // // cPisteet cPiste // ------ ------ // | 4 | maxlkm |---->|3,4 | // | 3 | lkm pisteet | | | ------ // | o--+------>|-----| | ------ |9,0 | // ------ | o--+-----| | | // |-----| |----->| | // | o--+------------| ------ ------ // |-----| |12,3| // | o--+--------------------------->| | // |-----| | | // | o--+--? ------ // |-----| // // Toiminta: // Luen tason pisteit„ ja tulostan ne j„rjestyksess„ // Tietoja luetaan kunnes sy”tet„„n tyhj„ rivi // Pisteit„ 0. Anna piste>9,0[ret] // Pisteit„ 1. Anna piste>12,3[ret] // Pisteit„ 2. Anna piste>3,5[ret] // Pisteit„ 3. Anna piste>[ret] // Pisteet j„rjestyksess„: // (3,5) (9,0) (12,3) // #include #include #include //----------------------------------------------------------------------- // xy-tason piste: //----------------------------------------------------------------------- class cPiste { double x,y; public: cPiste() { x=0.0; y=0.0; } cPiste(double ix, double iy) { x=ix; y=iy; } int kysy_lue(); void tulosta(ostream &os=cout) const { os << "(" << x << "," << y << ")"; } int vertaa(const cPiste &p2) const { // pal -1 jos <, 0 jos ==, 1 jos > if ( x < p2.x ) return -1; if ( x > p2.x ) return 1; if ( y < p2.y ) return -1; if ( y > p2.y ) return 1; return 0; } }; ostream &operator<<(ostream &os,const cPiste &p) { p.tulosta(os); return os; } int cPiste::kysy_lue() // Palauttaa 0 jos onnistuu 1 jos ei onnistu // Sy”t”ksi kelpaa: "4,5" "4" "4 5" "4 5" "4,,,5" { int ok; char sd[80],s[80]; cout << "Anna piste>"; cin.getline(s,sizeof(s)); x = 0; y = 0; ok = sscanf(s,"%lf%[ ,;:]%lf",&x,sd,&y); if ( ok <= 0 ) return 1; return 0; } //----------------------------------------------------------------------- // Tietorakenneolio joka tallettaa pisteit„ //----------------------------------------------------------------------- class cPisteet { int maxlkm; int lkm; cPiste **pisteet; public: cPisteet(int imax=5); int lisaa(const cPiste &p); void tulosta(ostream &os=cout) const; int kysy_lue(); int etsi_paikka(const cPiste &p) const; void tee_reika(int n); }; ostream &operator<<(ostream &os,const cPisteet &p) { p.tulosta(os); return os;} cPisteet::cPisteet(int imax) { lkm = 0; maxlkm = imax; pisteet = new cPiste *[maxlkm]; // pisteet = (cPiste **)calloc(maxlkm,sizeof(cPiste *)); if ( pisteet == NULL ) maxlkm = 0; } int cPisteet::etsi_paikka(const cPiste &p) const // Luottaa siihen ett„ taulukko on j„rjestyksess„ ja etsii sen kohdan // josta l”ytyy p:t„ suurempi tai yht„suuri alkio, eli sen kohdan johon // p pit„sisi lis„t„ jos se halutaan lis„t„ j„rjestyksess„ // Jos yksik„„n alkio ei t„yt„ ehtoa, palautetaan lkm { int i; for (i=0; in; i--) pisteet[i] = pisteet[i-1]; pisteet[n] = NULL; lkm++; } #if 0 int cPisteet::lisaa(const cPiste &p) // Lis„„ loppuun // 0. jos ei mahu pois // 1. luodaan kopio // 2. laitetaan osoitin uuteen alkioon // 3. lis„t„„n lkm { cPiste *uusi; if ( maxlkm <= lkm ) return 1; uusi = new cPiste(p); // 1. if ( !uusi ) return 2; // Jollei saatu muistia uutta varten! pisteet[lkm] = uusi; // 2. lkm++; // 3. return 0; } #else int cPisteet::lisaa(const cPiste &p) // Lis„t„„n oikealle paikalleen // 0. jos ei mahu pois // 0.5 etsit„„n paikka // 0.6 jos paikassa sama alkio, niin pois (ei dublikaatteja) // 1. luodaan kopio (jos pystyt„„n) // 1.5 tehd„„n reik„ uutta varten taulukkoon (loppuosa eteenp„in) // 2. laitetaan osoitin uuteen alkioon { cPiste *uusi; if ( maxlkm <= lkm ) return 1; int i = etsi_paikka(p); // 0.5 if ( i != lkm && p.vertaa(*pisteet[i]) == 0 ) return 3; // 0.6 uusi = new cPiste(p); // 1. if ( !uusi ) return 2; tee_reika(i); // 1.5 - lis„„ samalla lukum„„r„„! pisteet[i] = uusi; // 2. return 0; } #endif void cPisteet::tulosta(ostream &os) const { int i; for (i=0; i