/* Yksinkertainen tulospalvelu yksinkertaisella C++:lla 08.01.1997 Jorma Sajaniemi - alkuperäinen versio */ #include #include // ---------- Suoritusten kirjaamisluokat --------------------------- void juoksulaji(char *jono, int metrit) {sprintf(jono,"%d m",metrit);} class Suoritus { private: char * kilpailija; // Kilpailijan nimi protected: char * laji; // Kilpailulaji // Suoritus(char *nimi) // Konstruktori {kilpailija = new char [strlen(nimi)+1]; strcpy(kilpailija,nimi);} // public: char * annaKilpailija() {return kilpailija;} // Palauta nimi char * annaLaji() {return laji;} // Palauta laji virtual float annaTulos() = 0; // Palauta tulos }; class Juoksu : public Suoritus { private: int matka; float aika; // Juoksun tiedot // public: Juoksu(char *nimi, int metrit, float sekunnit) // Konstruktori : Suoritus(nimi), // Ensin yläluokan konstruktori matka(metrit), aika(sekunnit) // Sitten alustuslista {laji = new char [20]; juoksulaji(laji,metrit);} // Muut toimet // float annaTulos() {return aika;} // Tulos on aika }; #define PITUUSHYPPY "Pituushyppy" #define HYPPYJA 6 class Pituushyppy : public Suoritus { private: float hyppy[HYPPYJA]; // public: Pituushyppy(char *nimi, float h1, float h2, float h3, float h4, float h5, float h6) : Suoritus(nimi) { hyppy[0]=h1; hyppy[1]=h2; hyppy[2]=h3; hyppy[3]=h4; hyppy[4]=h5; hyppy[5]=h6; laji = new char [strlen(PITUUSHYPPY)+1]; strcpy(laji,PITUUSHYPPY); } // float annaTulos() { // Tulos on pisin hyppy float tulos = hyppy[5]; int i=5; while (i--) if (hyppy[i] > tulos) tulos=hyppy[i]; return tulos; } }; void suoritusEsimerkki() { Suoritus * suor1, *suor2; suor1 = new Juoksu ("Matti",100,12.5); suor2 = new Pituushyppy("Jussi",4.62,7.53,0,5.89,5.66,6.2); printf("%s / %s: %.2f\n%s / %s: %.2f\n", suor1->annaKilpailija(),suor1->annaLaji(),suor1->annaTulos(), suor2->annaKilpailija(),suor2->annaLaji(),suor2->annaTulos()); } // ---------- Suorituslistojen ylläpitoluokat ----------------------- class ListaAlkio { public: Suoritus *suoritus; ListaAlkio *seuraava; // ListaAlkio(Suoritus *uusi, ListaAlkio *p) // Konstruktori : suoritus(uusi), seuraava(p) {} }; class Lista { private: ListaAlkio *alku; // Listan ensimmäinen ListaAlkio *kohta; // Listan käsittelykohta // public: Lista() : alku(NULL), kohta(NULL) {} // Konstruktori // lisaaListaan(Suoritus *uusi) // Uusi suoritus listaan {ListaAlkio *p = new ListaAlkio(uusi,alku); alku = p;} tyhjennaLista() { // Lista tyhjäksi ListaAlkio *p; while (alku) {p=alku; alku=alku->seuraava; delete p;} } tulostaLista() { // Listan tulosten tulostaminen ListaAlkio *p; for (p=alku; p; p=p->seuraava) printf("%s / %s: %.2f\n",p->suoritus->annaKilpailija(), p->suoritus->annaLaji(),p->suoritus->annaTulos()); } Suoritus * nykyinen() {return (kohta ? kohta->suoritus : (Suoritus *) NULL);} Suoritus * ensimmainen() {kohta = alku; return nykyinen();} Suoritus * seuraava() {if (kohta) kohta=kohta->seuraava; return nykyinen();} }; void listaEsimerkki() { Lista lis; Suoritus * suor; lis.lisaaListaan(new Juoksu ("Matti",100,12.5)); lis.lisaaListaan(new Pituushyppy("Jussi",4.62,7.53,0,5.89,5.66,6.2)); lis.tulostaLista(); for (suor=lis.ensimmainen(); suor; suor=lis.seuraava()) printf("%s\n",suor->annaKilpailija()); lis.tyhjennaLista(); } // ---------- Käyttöliittymä ---------------------------------------- #define MAXPUSKURI 200 // Puskurin koko #define KURJA 20000 // Kurjaakin kurjempi tulos void keskustele() { Lista kaikki, tulostettava; Suoritus *s; int i; float a1,a2,a3,a4,a5,a6; char puskuri[MAXPUSKURI]; int loppu = 0; while (! loppu) { printf("\nNiin? "); scanf("%s",puskuri); switch (puskuri[0]) { case 'l': case 'L': case 'q': case 'Q': loppu++; break; case 'j': printf("Anna matka, aika ja nimi: "); scanf("%d%f%[^\n]",&i,&a1,puskuri); kaikki.lisaaListaan(new Juoksu(puskuri,i,a1)); break; case 'J': printf("Anna matka: "); scanf("%d",&i); juoksulaji(puskuri,i); a1 = KURJA; tulostettava.tyhjennaLista(); for (s=kaikki.ensimmainen(); s; s=kaikki.seuraava()) if (! strcmp(s->annaLaji(),puskuri)) { a2 = s->annaTulos(); if (a2 < a1) tulostettava.tyhjennaLista(); if (a2 <= a1) {tulostettava.lisaaListaan(s); a1=a2;} } tulostettava.tulostaLista(); break; case 'p': printf("Anna hypyt (6 kpl) ja nimi: "); scanf("%f%f%f%f%f%f%[^\n]",&a1,&a2,&a3,&a4,&a5,&a6, puskuri); kaikki.lisaaListaan(new Pituushyppy(puskuri,a1,a2,a3,a4,a5,a6)); break; case 'P': a1 = -1 ; tulostettava.tyhjennaLista(); for (s=kaikki.ensimmainen(); s; s=kaikki.seuraava()) if (! strcmp(s->annaLaji(),PITUUSHYPPY)) { a2 = s->annaTulos(); if (a2 > a1) tulostettava.tyhjennaLista(); if (a2 >= a1) {tulostettava.lisaaListaan(s); a1=a2;} } tulostettava.tulostaLista(); break; case 'K': kaikki.tulostaLista(); break; default: printf("Komennot ovat:\n"); printf(" j: uusi juoksutulos\n J: tulosta paras juoksu\n"); printf(" p: uusi pituustulos\n P: tulosta paras pituus\n"); printf(" K: tulosta kaikki tulokset\n l: lopetus\n"); } } printf("Kiitos ja tervetuloa uudestaan.\n"); } // ---------- Pääohjelma -------------------------------------------- main () { // suoritusEsimerkki(); listaEsimerkki(); keskustele(); }