Luokkapohjainen tietovisa

akx 21.01.05 18:41

Tässä tietovisa. Sisennykset hieman outoja. ( G++ -O3 -Wall ) Inspiraatio siis täältä: http://mureakuha.com/koodikirjasto/683 :)

 Tekstiversio  Arvo: 2 (6 ääntä)  Äänestä: +  -
#include <iostream>
#include <string>
#include <vector>
#include <stdarg.h>

using namespace std;

class Kysymys
{
      private:
              int oikeaVastaus;
              vector<string> vaihtoehdot;
              string kysymys;
             
      public:
             void asetaKysymys(string teksti);
             void lisaaVaihtoehto(string teksti,bool oikea=false);
             void tulosta();
             bool tarkistaVastaus(int vastaus);
             int vastausLkm();
             Kysymys();
};

Kysymys::Kysymys()
{
    oikeaVastaus=-1;
}

void Kysymys::lisaaVaihtoehto(string teksti,bool oikea)
{
 vaihtoehdot.push_back(teksti);
 if(oikea) oikeaVastaus=vaihtoehdot.size();
}

void Kysymys::asetaKysymys(string teksti)
{
     kysymys=teksti;
}

void Kysymys::tulosta()
{
 int i;
 cout << kysymys << endl << endl;
 for(i=0;i<(int)vaihtoehdot.size();i++)
 {
  cout << (1+i) << ": " << vaihtoehdot[i] << endl;                               
 }
 cout << endl;
}

bool Kysymys::tarkistaVastaus(int vastaus)
{
 if(vastaus==oikeaVastaus) return true;
 return false;     
}

int Kysymys::vastausLkm()
{
 return vaihtoehdot.size();   
}

class Tietovisa
{
      private:
              vector<Kysymys*> kysymys;
              int pisteet;
             
      public:
             void lisaaKysymys(Kysymys *uusi);
             int aja();
             int kysymysLkm();
             ~Tietovisa();
};

Tietovisa::~Tietovisa()
{
     int i;
     for(i=0;i<(int)kysymys.size();i++) delete kysymys[i];
}

void Tietovisa::lisaaKysymys(Kysymys *uusi)
{
 kysymys.push_back(uusi);     
}

int Tietovisa::kysymysLkm()
{
    return kysymys.size();
}

int Tietovisa::aja()
{
     int i,v,k;
     k=0;
     for(i=0;i<(int)kysymys.size();i++)
     {
        kysymys[i]->tulosta();
        v=0;
        while(v==0)
        {
         cin >> v;
         if(v<0||v>kysymys[i]->vastausLkm()) v=0;
        }
        if(kysymys[i]->tarkistaVastaus(v))
        {
         k++;
         cout << "Oikea vastaus.";
        }
        else
        {
         cout << "Väärä vastaus.";           
        }
        cout << endl << "Sinulla on nyt " << k << " pistettä.";
        cout << endl << endl;                         
     }
     return k;
}

Kysymys *luoKysymys(string kysymys,int oikea,int n,...)
{
 Kysymys *uusi;
 va_list va;
 va_start(va,n);
 uusi=new Kysymys;
 uusi->asetaKysymys(kysymys);
 for(int i=0;i<n;i++) uusi->lisaaVaihtoehto((string)va_arg(va,char *),oikea==i);
 va_end(va);       
 return uusi;
}

int main(int argc, char *argv[])
{
  int oikein;
  Tietovisa t;

  t.lisaaKysymys(luoKysymys("Mikä lie hauki?",1,3,"Kala","Kissa","Koira"));
  t.lisaaKysymys(luoKysymys("Mikä lie kissa?",1,2,"Lemmikkieläin","Omena"))
  oikein=t.aja();

  cout << "Oikeita vastauksia: " << oikein << endl;
  cout << "Paina näppäintä.";
  cin.get();
  cin.get();
  return 0;
}
 

editoitu: 15:28 24.1.05
Linkku 15:28 24.1.05 
editoitu: 15:43 26.1.05
stWasm1.0 18:16 25.1.05 
toimii hieman oudosti->

Mikä lie hauki?

1: Kala
2: Kissa
3: Koira

2
Oikea vastaus.
Sinulla on nyt 1 pistettä.

Mikä lie kissa?

1: Lemmikkieläin
2: Omena

2
Oikea vastaus.
Sinulla on nyt 2 pistettä.

Oikeita vastauksia: 2
Paina näppäintä.