/* vali2.cpp */ // V„li-luokka // Vesa Lappalainen 19.3.1999 #include #include class cVali { double x1; // V„lin alkupiste double x2; // v„lin loppupiste public: cVali() { x1 = 0.0; x2 = 1.0; } cVali(double ix1,double ix2) { if ( ix1 <= ix2 ) { x1 = ix1; x2 = ix2; } else { x1 = ix2; x2 = ix1; } } void tulosta(ostream &os=cout) const; // Teht„v„st„ puuttui const!!! int osuuko(double x) const { return x1 <= x && x <= x2; } int miten_osuu(const cVali &v2) const { // v2.x1 v2.x2 x1 x2 if ( v2.x2 < x1 ) return +1; // |-----| |-------| if ( x2 < v2.x1 ) return -1; // |--------| |-----| return 0; // x1 x2 v2.x1 v2.x2 } int osuuko(const cVali &v2) const { return miten_osuu(v2) == 0; } int yhdista(const cVali &v1, const cVali &v2) { x1 = v1.x1; x2 = v1.x2; if ( !v1.osuuko(v2) ) return 0; // Jos yhdist„minen ei onnistu => v1 if ( v2.x1 < x1 ) x1 = v2.x1; if ( x2 < v2.x2 ) x2 = v2.x2; return 1; } }; void cVali::tulosta(ostream &os) const { long oldf = os.setf(ios::showpoint | ios::fixed); int oldp = os.precision(1); // Asettaa tul.tark. 1 des. os << "[" << x1 << "," << x2 << "]"; // mit„ pit„isi muistaa laittaa t„h„n? os.precision(oldp); os.setf(oldf); } ostream &operator<<(ostream &os, const cVali &vali) { vali.tulosta(os); return os; } int main(void) { cVali perus(0.0,1.0); if ( perus.osuuko(0.5) ) cout << "0.5 on v„lill„ " << perus << endl; // Tulostaa 0.5 on v„lill„ [0.0,1.0] cVali toinen(0.6,2.0); cVali kolmas; kolmas.yhdista(perus,toinen); cout << kolmas << endl; // [0.0,2.0] cVali kaukana(100.0,101.0); if ( perus.osuuko(kaukana) ) cout << perus << " osuu v„liin " << kaukana << endl; // Tulostaisi [0.0,1.0] osuu v„liin [100.0,101.0] // jos olisi totta, mutta nyt ei tietystik„„n tulosta. if ( kolmas.yhdista(perus,kaukana) == 0 ) cout << "V„lit eiv„t osu toisiinsa" << endl; cout << kolmas << endl; // [0.0,1.0] return 0; }