// mittakal.h /* Ohjelma muuttaa kartalta mitattuja matkoja luontoon. Vesa Lappalainen 8.4.1997 Muutokset 10.4.1997 + vertaa-metodi + Kerroin - saantimetodi + muutamia rivinvaihtoja ja mittakaavan lasku oikeaksi Muutokset 10.4.1997 luennolla + k„ytt„j„yst„v„llisyytt„ (ei tarvitse sy”tt„„ mittakaavaa aina) + lukee tiedostoa yksikot.dat, joka on suraavaa muotoa: mm 1.0 cm 10.0 dm 100.0 m 1000.0 km 1000000.0 inch 25.4 + tietorakenne linkityksi listaksi ilman yst„v„luokkaa Muutokset 11.4.1997 + cMuunnos::alusta muutettu int-typpiseksi + cMuunnokset::lue my”s int-tyyppiseksi 1:10000 10 cm => 1000*1000 * 10 1:20 200 kyyn„r„„ Luokat ja vastuut: cNaytto - kysella ja tulostaa cMuunnos - tietaa mika jono muuttuu miksi kertoimeksi - cMuunnokset - etsi„ oikea kerroin Piirr„ t„h„n tietorakenteen kuva */ #ifndef MITTAKAL_H #define MITTAKAL_H #include #include #include #include #include using namespace std; //---------------------------------------------------------------------------- class cMuunnos { string yks; double ker; cMuunnos *seur; public: cMuunnos(const char *aYks="",double aKerroin=0.0) : yks(aYks), ker(aKerroin) { seur = NULL; } int alusta(const char *s) { // palauttaa 1 jos onnistuu hyvin char cyks[80]; int lkm = sscanf(s,"%s %lf",cyks,&ker); if ( lkm > 0 ) yks = cyks; return lkm==2; } double Kerroin() const { return ker; } const string &Yks() const { return yks; } int vertaa(const char *vyks) const { return strcmp(yks.c_str(),vyks); } int operator==(const char *vyks) { return (vertaa(vyks) == 0); } void linkita(cMuunnos *uSeur) { seur = uSeur; } cMuunnos *Seuraava() { return seur; } }; /* int operator==(const cMuunnos &yks, const char *vyks) { return ( yks.vertaa(vyks) == 0 ); } */ //---------------------------------------------------------------------------- class cMuunnokset { int maxkoko; // pois... int lkm; cMuunnos *eka; cMuunnos *vika; cMuunnos *kohdalla; public: cMuunnokset(int aKoko) { lkm = 0; maxkoko = aKoko; eka = NULL; vika = NULL; } ~cMuunnokset(); int lisaa(const cMuunnos &uusi) { cMuunnos *muun; muun = new cMuunnos(uusi); // 1. luodaan kopio if ( muun == NULL ) return 1; lkm++; if ( eka == NULL ) // 2a. jos tyhj„ lista eka = muun; else vika->linkita(muun); // 2b. uusi vanhan viim. seur vika = muun; // 3. uudesta uusi viim. muun->linkita(NULL); // 4. viim. viimeiseksi return 0; } double kerroin(const char *yks); int lue(const char *nimi); const cMuunnos *Eka() { return kohdalla = eka; } const cMuunnos *Seuraava() { return kohdalla ? kohdalla = kohdalla->Seuraava() : NULL; } }; #endif