Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: int, kirjiamien estäminen?

Sivun loppuun

vehkis91 [03.07.2008 13:43:32]

#

En keksinyt kunnon aihetta eli Antti saa vaihtaa jos keksii osuvamman nimen.

Eli ongelmaan, ole tehnyt numeronarvauspelin ja haluaisin tietää onko mahdollista estää toisia laittamasta kirjaimia syotteeksi, koska syöte pitäisi olla numero?
Jos siihen laittaa kirjaimen se heittää ohjelman loputtomaan silmukkaan...

Taas oli vähän epäselvää...

Newb [03.07.2008 13:51:41]

#

Syötteen jälkeen tarkistat, oliko se numero vai ei. Jos ei ollut, niin ohjelma kysyy sitä uudestaan, eh?

vehkis91 [03.07.2008 14:01:13]

#

no miten se onnistuu? jos käytän whileä niin minun pitäisi luetella kaikki luvut tai kirjaimet...

Newb [03.07.2008 14:12:07]

#

if ((numero>max) || (numero<0))
{
    return 0;
}

Päärynämies [03.07.2008 14:17:46]

#

Ainakin C:n standardikirjastosta löytyy valmiit funktiot testailuun. Ne saat käyttöösi sisällyttämällä mukaan otsikkotiedoston ctype.h. http://www.cplusplus.com/reference/clibrary/cctype/ tuolta voit vaikka niitä funktioita ihastella.

Metabolix [03.07.2008 14:47:39]

#

C: Onko varmasti luku?
C:n scanf-funktio palauttaa luettujen kenttien määrän, siis esimerkiksi 1, jos saatiin luettua yksi luku.

while (scanf("%d", &i) != 1) {
    printf("Viallinen syöte!\n");
    scanf("%*s"); /* Hypätään sanan yli */
}

C++:llakin tämä onnistuu, nimittäin cin-olio (istream-luokka) säilöö tiedon tapahtuneesta virheestä. Olion muuttaminen totuusarvoksi kertoo, onko kaikki kunnossa.

if (!(cin >> i)) {
    cout << "Viallinen syöte!" << endl;
    cin.clear(); /* Poistetaan virheilmoitus */
    cin >> *(auto_ptr<string>(new string())); /* Hypätään sanan yli */
}

Jos joku osaa kertoa, miten istreamista saa yhden sanan pois tallentamatta sitä minnekään mutta silti tutkimatta itse saatuja merkkejä, saa toki kertoa. Ainakaan ignore ei tähän pysty, koska rajoittimia saa asetettua vain yhden.

vehkis91 [03.07.2008 14:48:32]

#

Edit: en huommannut,että metabolix oli laittanut vinkin, tsekkaan sen vielä...

EDIT2: Sain toimiin metabolixin vinkillä. Kiitos taas avusta.

En kyllä tiedä miten tuo auttaa minun tapauksessani...
Itse ongelma on peli() funktiossa.

Tässä on "pelin" lähdekoodi: (Voi antaa neuvvoja mistä tahansa viasta)

#include <time.h>
#include <iostream>
#include <string>

using namespace std;

////PROTOTYYPIT
int satunaisLukuGeneraattori(int maxrand);
int peli();
int mainMenu();
void piirraViiva(char merkki);

////MAIN
int main(int argc, char *argv[])
{
    mainMenu();

    cin.get();
    return EXIT_SUCCESS;
}

////FUNKTIOT
int satunaisLukuGeneraattori(int maxrand)
{
    long int luku;

    srand(time(0));

    luku=rand() % maxrand;       //satunaisluku 0-100

    return luku;
}


int peli()
{
    unsigned int luku;
    unsigned int syote;    //pelaajan syöte
    char merkki;  //valikko...
    unsigned int maxrand;
    bool apu=true;

    int life=10;                    //10 elämää

    cout<<endl<<"e --> easy (0 - 25)"<<endl;
    cout<<"m --> medium (0 - 50)"<<endl;
    cout<<"h --> hard (0 - 100)"<<endl;
    cout<<endl<<"q --> quit"<<endl;
    cout<<endl;
    cout<<"--> ";
    cin>>merkki;

    piirraViiva('*');

    switch(merkki)
    {
     case 'e': maxrand=26;
     break;
     case 'm': maxrand=51;
     break;
     case 'h': maxrand=101;
     break;
     case 'q': return 0;
     break;

     default:
     {
             cout<<"Vaara syote: "<<merkki<<" !!!"<<endl;
             cin.get();
             return EXIT_SUCCESS;
     }
    }//Switch(merkki)


    luku=satunaisLukuGeneraattori(maxrand);

    bool pois=false;

    while(pois==false)
    {
     if(life<=0)
     {
      cout<<endl;
      cout<<"Yritykset loppuivat!"<<endl;
      pois=true;
      continue;
     }
     else
     if(life>0 && apu==true)
     {
      cout<<endl;
      cout<<"Anna luku : ";
      cin>>syote;

      cout<<endl;
     }
     apu=true;
     if(syote<0 || syote>maxrand-1)
     {

       cout<<endl<<"Luku on alle 0 tai yli "<<maxrand-1<<endl;
       cout<<"Anna uusi luku: ";
       cin>>syote;
       apu=false;
       piirraViiva('*');
       cout<<endl;
       continue;
      }
      else
      if(syote==luku)
      {
        cout<<syote<<" on oikein"<<endl;
        piirraViiva('*');
        cin.get();
        pois=true;
      }
      else
      if(syote<luku)
      {
        cout<<syote<<" On liian pieni luku!"<<endl<<endl;
        life--;
        cout<<life<<" yritysta jaljella!"<<endl;
        cout<<endl;
        piirraViiva('*');
        continue;
      }
      else
      if(syote>luku)
      {
        cout<<syote<<" On liian iso luku!"<<endl<<endl;
        life--;
        cout<<life<<" yritysta jaljella!"<<endl;
        cout<<endl;
        piirraViiva('*');
        continue;
       }
    }//loppu looppi
    cin.get();
    mainMenu();
    return EXIT_SUCCESS;
}


int mainMenu()
{
 char syote;

 piirraViiva('*');

 cout<<endl<<"MAIN MENU"<<endl<<endl;

 cout<<"s --> start game"<<endl;
 cout<<"q --> quit"<<endl;
 cout<<endl;

 cout<<"--> ";
 cin>>syote;

 piirraViiva('*');

 switch(syote)
 {
                   case 's': peli(); break;
                   case 'q': return EXIT_SUCCESS;break;
                   default:
                   {
                           cout<<"Vaara syote!!"<<endl;
                           cin.get();
                           return EXIT_SUCCESS;
                   }
 }
}

void piirraViiva(char merkki)
{
 cout<<endl;
 for(int i=0;i<80;i++)
     cout<<merkki;
}

vehkis91 [03.07.2008 16:51:49]

#

Nyt tuli taas ongelma. Jostain syystä pitää antaa aina arvo kahdesti...

pistän kommentit siihen kohtaan missä vika ilmenee..

int peli()
{

    string syote;
    unsigned short int numSyote=0;
    unsigned short int maxrand=0;
    unsigned short int luku=0;
    unsigned short int lifes=10;
    bool pois=false;
    bool apu=false;

    cout<<endl;
    cout<<"e --> easy   (0 - 25)"<<endl;
    cout<<"m --> medium (0 - 50)"<<endl;
    cout<<"h --> hard   (0 - 100)"<<endl;
    cout<<endl;
    cout<<"q --> quit"<<endl;
    cout<<endl;
    cout<<"--> ";
    cin>>syote;

    piirraViiva('*');

    switch(syote[0])
    {
     case 'e': maxrand=26;
     break;
     case 'm': maxrand=51;
     break;
     case 'h': maxrand=101;
     break;
     case 'q': return 0;
     break;

     default:
     {
             cout<<"Vaara syote !!"<<endl;
             cin.get();
             return EXIT_SUCCESS;
     }
    }//switch(syote[0])


    luku=satunaisLukuGeneraattori(maxrand);

    while(!pois)        //päälooppi
    {

        if(lifes<=0)
        {
          cout<<"You losed!"<<endl;
          pois=true;
          continue;
        }
        else
        {
           cout<<endl;
           cout<<"Type a number: ";
           cin>>numSyote;    ///TÄSSÄ ON VIKA!!!!!!!!!!!!!!!

           if (!(cin >> numSyote))
           {
              cout<<endl;
              cout<<"Vaara syote!!"<<endl;
              cin.clear(); //Poistetaan virheilmoitus
              cin >> *(auto_ptr<string>(new string())); //Hypätään sanan yli
              continue;
           }//if(!numSyote)

           if(numSyote>maxrand-1)
           {
             cout<<"Syotteesi pitaa olla valilta 0 - "<<maxrand-1<<endl;
             continue;
           }
           else
           if(numSyote==luku)
           {
               cout<<"You're Winner!"<<endl;
               pois=true;
               continue;
           }
           else
           if(numSyote>luku)
           {
               cout<<endl;
               cout<<"Too BIG!!"<<endl;
               lifes--;
               cout<<lifes<<" Tries left!"<<endl;
               continue;
           }
           else
           if(numSyote<luku)
           {
               cout<<endl;
               cout<<"Too SMALL!!"<<endl;
               lifes--;
               cout<<lifes<<" Tries left!"<<endl;
               continue;
           }
           else
           {
               cout<<"Unknown problem!!!"<<endl;
               pois=true;
           }


        }//else lifes<=0


    }//Looppi

    cin.get();
    mainMenu();
}

vidar [03.07.2008 17:12:06]

#

vehkis91 kirjoitti:

Nyt tuli taas ongelma. Jostain syystä pitää antaa aina arvo kahdesti...

cin>>numSyote;    ///TÄSSÄ ON VIKA!!!!!!!!!!!!!!!
if (!(cin >> numSyote)) { ... }

Luet syötteen kahteen kertaan, etkä tee välissä sillä mitään?

vehkis91 [03.07.2008 17:17:01]

#

oho. Olipas huolimatonta...


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta