/* Ohjelma muuttaa kartalta mitattuja matkoja lunotoon. Vesa Lappalainen 8.4.1997 Muutokset 10.4.1997 + vertaa-metodi + Kerroin - saantimetodi + muutamia rivinvaihtoja ja mittakaavan lasku oikeaksi 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 */ #include #include #include using namespace std; //---------------------------------------------------------------------------- class cMuunnos { string yks; double ker; public: cMuunnos(const char *aYks,double aKerroin) : yks(aYks), ker(aKerroin) {;} double Kerroin() { return ker; } int vertaa(const char *vyks) { return strcmp(yks.c_str(),vyks); } }; //---------------------------------------------------------------------------- class cMuunnokset { int maxkoko; int lkm; cMuunnos **alkiot; public: cMuunnokset(int aKoko) { lkm = 0; maxkoko = 0; if ( aKoko < 0 ) return; alkiot = new cMuunnos*[aKoko]; if ( alkiot == NULL ) return; maxkoko = aKoko; } int lisaa(const cMuunnos &uusi) { if ( lkm >= maxkoko ) return 1; alkiot[lkm] = new cMuunnos(uusi); if ( alkiot[lkm] == NULL ) return 1; lkm++; return 0; } double kerroin(const char *yks); }; double cMuunnokset::kerroin(const char *yks) { int i; for (i=0; ivertaa(yks) == 0 ) return alkiot[i]->Kerroin(); return 0; // Makuasia! } //---------------------------------------------------------------------------- class cNaytto { cMuunnokset *muunnokset; public: cNaytto(cMuunnokset *aMuun) { muunnokset = aMuun; } int kysele(); }; int cNaytto::kysele() { string jono; double mittakaava,matka,matka_km,matka_mm; char yksikko[80]; // Huono kohta!!! while ( 1 ) { cout << "Mittakaava ja matka>"; getline(cin,jono,'\n'); if ( jono == "loppu" ) return 0; if ( jono == "" ) return 0; sscanf(jono.c_str(),"1:%lf %lf %s",&mittakaava,&matka,yksikko); matka_mm = matka * muunnokset->kerroin(yksikko); matka_km = matka_mm * mittakaava / (1000.0*1000.0); cout << "Matka maastossa on " << matka_km << " km" << endl; } } //---------------------------------------------------------------------------- int main(void) { cMuunnokset muunnokset(10); muunnokset.lisaa(cMuunnos("mm",1.0)); muunnokset.lisaa(cMuunnos("cm",10.0)); muunnokset.lisaa(cMuunnos("m",1000.0)); cNaytto naytto(&muunnokset); naytto.kysele(); return 0; }