Just nu i M3-nätverket
Gå till innehåll

Vektorer och funktionsanrop i c++


*Chris*

Rekommendera Poster

Det är inget fel på den raden.

 

Däremot stämmer inte nästa rad med get_answer överens med så som den ser ut längre ner.

 

Om du flyttar upp funktionen get_answer till positionen _innan_ funktionen hemligt_tal_funktion så kan du helt stryka fördeklarationen av funktionerna.

 

[inlägget ändrat 2006-12-01 19:17:49 av lizardKng]

Länk till kommentar
Dela på andra webbplatser

Nu är jag klar med mitt lilla geografiprogram :) Nu ska jag testa lite annat smått och gott.

 

Försöker få in ett datum och testade med:

 

asctime(localtime) men jag får det inte att fungera, hur ska man skriva det för att få tid och datum? Jag sparar det i en struct.

 

Länk till kommentar
Dela på andra webbplatser

Löste det, det var inte så svårt :)

 

Jag har ett annat problem, jag kan inte hitta felet i min kod.

 

Får felmeddelande"in function 'int uppdatera(high*, int)':

mm.cpp:167: error: expected primary-expression before ')' token"

 

Fattar inte vad det betyder och kan inte hitta nåt fel heller...

 

Kod där felet är: Rad 167 är i while-satsen.

 

int uppdatera(high spelare[], int counter)        // läser in tidigare sparat material från highscore.txt
{
 high n;
 ifstream kolla("highscore.txt", ios:: in);

               while((kolla>> n.namn>> n.points>> n.datum>>))
                        {
                                     spelare[counter] = n;
                                     counter++;
                        }
                return counter;
}

 

Länk till kommentar
Dela på andra webbplatser

Såhär blev tidsfunktionen

 

time_t rawtime;
          struct tm * timeinfo;
          time ( &rawtime );
          timeinfo = localtime ( &rawtime );
          p.datum = asctime(timeinfo);

 

Länk till kommentar
Dela på andra webbplatser

hehe, ja :)

 

Nu håller jag på och gör ett spel, mastermind, rätt kul faktiskt :)

 

Själva spelet fungerar bra, men det spökar till sig en del när jag sparar resultatet på en textfil. När man sedan startar om programmet så läser den automatiskt in de sparade resultaten i programmet. Men datumen blir helt "messed up" när de blir inlästa...vet inte varför? Kanske att datumet är fel inläst(fel funktion) eller att jag definerat datum konstigt när jag deklarerat variabeln?

 

Så här ser structen ut som ligger i mm.h

 

 

struct high
    {
           char namn[20];
           int points;
           char* datum;

    };

 

Så här ser hela spelet ut som det är nu, testa gärna, det är skoj ;)

 

 

 

#include "mm.h"




int skriv_meny(int val)
   {

                  cout<<"spela(1)";
                  cout<<endl;
                  cout<<"Se highscore(2)";
                  cout<<endl;
                  cout<<"Läsa spelregler(3)";
                  cout<<endl;
                  cout<<"Avsluta(4)";
                  cout<<endl;
                  cin>>val;
                  return val;
   }

void secret_number(int tal[])       // slumpa fram det hemliga numret
{
    int kast;
    int n = 0;
    int i = 0;

    srand(time(0));

    while(n < 4)
    {
           kast = rand() % 10;

           tal[n] = kast;
           n = n + 1;
    }

    while(i < 4)
    {
           i = i + 1;
    }
}

int gissa_nummer(int tal[], high spelare[], int &counter)
{
    int gissning = 0;
    int test[4] = {0};
    int i = 0;
    int j = 0;
    int n = 0;
    int svar[4]; // det tal som spelaren gissar på
    int tries = 0; // det som anger hur många försök spelaren behövde på sig, alltså poängen
    int nr = 0;  // plats i highscore-listan
    int check = 0;

    do {
       i=0;
       j=0;
       n=0;
    cout<< "Skriv in ett fyrsiffrigt tal: ";
    cin>> gissning;

    while(j < 4)
    {
            test[j] = gissning % 10;
            gissning = gissning / 10;
            j = j + 1;
    }

    while(n < 4)             // vänd på test
    {
            j = j - 1;
            svar[n] = test[j];
            n = n + 1;
    }  


    tries = tries + 1;


    // här börjar kontrollen

    while(i < 4)
    {
            if((tal[0] == svar[0]) && (tal[1] == svar[1]) && (tal[2] == svar[2]) && (tal[3] == svar[3]))  // Om alla är rätt
            {
              system("clear");
              nr = nr + 1;
              cout<< "Rätt!"<< endl;
              sleep(2);

              write_high(tries, spelare, counter);      // skriv in i highscore om platsar, annars visa highscore

              check = 1;
              return 0;
            }

            else if(tal[i] == svar[i])
            {
                cout<< "R";
            }
            else if((tal[0] == svar[i] && tal[i] != svar[i]) ||
                    (tal[1] == svar[i] && tal[i] != svar[i]) ||
                    (tal[2] == svar[i] && tal[i] != svar[i]) ||
                    (tal[3] == svar[i] && tal[i] != svar[i]))
            {
               cout<< "S";
            }
            else
            {
                cout<< "_";
            }

            i = i + 1;

    }
    cout<< endl<< endl;
    }while(check == 0);


    //gissa_nummer(tal, spelare, counter);

}

void spela (int tal[], int val, high spelare[], int &counter)
   {
     secret_number(tal);
     system("clear");
     gissa_nummer(tal, spelare, counter);
     //system("clear");
   }

void write_high (int tries, high spelare[], int &counter)
    {
          high p;
          cout<<"Skriv in ditt namn: ";
          cin>>p.namn;
          p.points = tries;


          //sätt rätt datum och tid
          time_t rawtime;
          struct tm * timeinfo;
          time ( &rawtime );     [color="#ff0000"]//Vet inte om det är fel på det här formatet...[/color]
          timeinfo = localtime ( &rawtime ); 
          p.datum = asctime(timeinfo);
          spelare[counter] = p;


          //spara till fil
          int k = 1;
          ofstream skriv_highscore("highscore.txt", ios::out);
          while(k <= counter)
          {
              skriv_highscore<< spelare[k].namn<< " "<< spelare[k].points<< " "<< spelare[k].datum<< endl;
              k = k + 1;
          }

          //

          sortera(spelare, counter);
          highscore(spelare, counter);
          counter = counter +1;
    }

//skriv ut highscore
void highscore (high spelare[], int counter)
   {
              int k = 1;
              while( k <= counter)
              {
                     cout<< spelare[k].namn<< "  ";
                     cout<< spelare[k].points<< "  ";
                     cout<< spelare[k].datum<< endl;

                     k = k + 1;
              }

   }

void sortera(high spelare[], int counter)    //sorterar efter points
{
high s;

for(int i = 0; i < counter - 1; i++)
{
	for(int j = 0; j < counter - 1; j++)
	{
		if (spelare[j].points > spelare[j+1].points)
		{
			s = spelare[j];
                       spelare[j] = spelare[j + 1];
                       spelare[j + 1] = s;

                }

	}


}


}

int uppdatera(high spelare[], int counter)        // läser in tidigare sparat material från highscore.txt
{
 high n;
 ifstream kolla("highscore.txt", ios:: in);

               while((kolla>> n.namn>> n.points>> n.datum))
                        {
                                     spelare[counter] = n;
                                     counter++;
                        }
                return counter;
}


void spelregler ()
   {

    system("clear");

    cout<< "                               SPELREGLER"<< endl<< endl;
    cout<< "Datorn kommer att slumpa fram ett fyrsiffrigt tal mellan 0000 och 9999."<<endl
    <<"Du ska gissa vilket det fyrsiffriga talet är."<<endl
    <<"Rätt siffra på rätt plats markeras med: R."<<endl
    <<"Om siffran finns med, men inte är på rätt plats kommer det att markeras med: S."<<endl
    <<"Om siffran är helt fel kommer det att markeras med: _."<<endl
    <<"Det gäller att gissa talet på så få försök som möjligt."<< endl<< endl<< endl
    << endl<< endl<< endl<< endl;

   }

void avsluta ()
   {

   }

int main()
{

   int val; //användares val i menyn
   int tal[4]; //det hemliga talet
   high spelare[100];
   int counter = 1;

   system("clear");
   counter = uppdatera(spelare, counter);

   do
   {

   val = skriv_meny(val);

         switch(val)
         {
                    case 1 : spela(tal, val, spelare, counter); break;
                    case 2 : highscore(spelare, counter); break;
                    case 3 : spelregler(); break;
                    case 4 : avsluta(); break;
                    default: cout<< "Felaktigt val!"<< endl; break;
         }
   }while(val!=4);

return 0;

}

 

Länk till kommentar
Dela på andra webbplatser

asctime har en egen buffert som den skriver konverterade värden till. Denna buffert skrivs över varje gång funktionen används.

 

Du måste ändra din datum från char* till char[så-många-som-behövs]

 

Dessutom ska du skriva strcpy(p.datum, asctime(...)) för att kopiera till din egen buffert.

 

Länk till kommentar
Dela på andra webbplatser

Den där datumfunktionen strular till det ordentligt, det problem jag har nu är att när spelaren spelat klart så sparas resultaten till en textfil(highscore.txt) och när programmet startas så läser den in de sparade värdena från textfilen. Här blir det något fel, gör han klarar inte att läsa in det ordentligt. Jag tror det kan ha att göra med att mellanrummet mellan Dec och 4 är större än mellan de andra...hur fixar man det? (om det är problemet)

 

Utdrag ur textfilen

 

Christian 3 Mon Dec 4 09:43:04 2006

Chris 4 Mon Dec 4 09:42:39 2006

 

Uppdatera och spara -funktionerna

 

int uppdatera(high spelare[], int counter)        // läser in tidigare sparat material från highscore.txt
{
 high n;

 ifstream kolla("highscore.txt", ios:: in);


               while((kolla>> n.namn>> n.points>> n.datum))
                        {
                                     counter++;
                                     spelare[counter] = n;
                        }
               kolla.close();
               return counter;
}

void spara_fil(int counter, high spelare[])          //spara till fil
    {

          int k = 1;
          ofstream skriv_highscore("highscore.txt", ios::out);
          while(k <= counter)
          {
              skriv_highscore<< spelare[k].namn<< " "<< spelare[k].points<< " "<< spelare[k].datum;
              k = k + 1;
          }
          skriv_highscore.close();
    }

 

Länk till kommentar
Dela på andra webbplatser

Hm...vid närmare eftertanke så läser den in saker till första mellanrummet. Den text som första gången sparades som:

 

Christian 3 Mon Dec 4 09:43:04 2006

Chris 4 Mon Dec 4 09:42:39 2006

 

Kommer att läsas in som:

 

n.namn=Christian, n.points=3, n.datum=Mon counter++

n.namn=Dec, n.points=09:42:39, n.datum=2006

 

Så frågan är då, hur gör jag för att han ska läsa av filen så att hela datumet hamnar i datum?

Eller, hur gör jag så att datumet sparas som ett sammansatt värde så att avläsningen blir rätt?

 

Länk till kommentar
Dela på andra webbplatser

Jag skulle läsa in filen radvis och parsa den efteråt. Ett sätt att undvika dessa problem är att införa en fältseparator, t ex skriva in ett ; mellan varje fält, då blir det enkelt att stycka upp ströngen efteråt.

 

Ett annat sätt är att skriva varje del på sin egen rad, det kanske är allra enklast?

 

Snoffsigare blir det om man använder ett strukturerat format som XML.

 

Länk till kommentar
Dela på andra webbplatser

Jag gjorde som så att jag delade upp datum i delar så att jag läste in dag för sig och år för sig osv, på så vis så fick jag mer kontroll över inläsning m.m. Kanske inte den snyggaste lösningen men det funkade :)

 

Såg du förresten mitt inlägg om en kod jag hittat på:

//eforum.idg.se/viewmsg.asp?EntriesId=893173

 

Tack för all hjälp med det här, det har varit guld värt :):thumbsup:

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...