handdator

Visa fullständig version : c++ hjälp


Windstalker
2006-08-25, 19:33
Hejsan

Skalla skriva ett program som matar fram en lottorad, där numren inte får komma upp två gånger på samma rad.

Har gjort programmet med fastnat vid just det där med samma nummer två gånger. Vet att jag borde spara varje enskilt nummer i en ny variabel och sen loopa dem och kontrollera eller något sådant, men kommer inte på hur jag enklast kan göra.

Någon som har något tips/förslag?

OBS - Är inte så väldigt duktig i c++ då vi endast har haft det i ca 1 vecka, dock så har jag programmerat i c i 1 år så har lite kunskaper i alla fall.

Koden:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
int nr;

srand(time(0));

for(int i=0; i<5; i++) //ordinarie nummer
{
cout<<rand()%99+1<<endl;
}



cout<<endl<<endl;

for(int j=0; j<2; j++) //extranummer
{
cout<<rand()%99+1<<endl;
}
cout<<endl<<endl;
system("pause");
return EXIT_SUCCESS;
}

Windstalker
2006-08-25, 21:22
bumpar ^^

Papi
2006-08-25, 21:34
Finns massor av sätt att lösa det på. Ett par förslag:

Du kan lägga varje siffra som slumpas fram i en array. I loopen där du tar fram de fem siffrorna kan du lägga ytterligare en loop som kollar genom arrayen om siffran finns där.

En annan lösning är att skapa en sträng med siffrorna i, separerade med t ex ett @-tecken. I loopen där du tar fram siffrorna gör du då en koll om siffran finns i strängen eller inte. Fast det blir ju lite struligare om du först plockar fram 32 och sedan 3. Då måste du också kolla längden (antal tecken) på talet.

Eller skapa fem variabler som du tilldelar siffrorna som slumpas fram. Gör sedan if-satser som kollar om den nya siffran finns i någon av variablerna.

Orkar inte skriva kod, testa dig fram! ;)
Lycka till!

Dumleman
2006-08-25, 21:42
Var längesen jag höll på med c++ men här är en lösning ivf.
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int tmpnr=0;
int nr[7];
int i=0;

bool in_array(int x, int n, int a[])
{
if (n == 0)
return false;
else
return (x == a[n-1]) || in_array(x, n-1, a);
}

int nytt_nr(int ti)
{
tmpnr=rand()%99+1;
if(in_array(tmpnr,ti,nr))
nytt_nr(ti);

return tmpnr;
}


int main() {
srand(time(0));

for(i; i<7; i++)
nr[i]=nytt_nr(i);

cout<<"Och den rätta lottoraden aer!!!: ";
for(int i=0; i<7; i++)
cout<<nr[i]<<"|";

return EXIT_SUCCESS;
}

Windstalker
2006-08-30, 08:54
Någom som har lust att, från rad till rad, förklara detta:

bool in_array(int x, int n, int a[])
{
if (n == 0)
return false;
else
return (x == a[n-1]) || in_array(x, n-1, a);
}

int nytt_nr(int ti)
{
tmpnr=rand()%34+1;
if(in_array(tmpnr,ti,nr))
nytt_nr(ti);

return tmpnr;
}


/Wind

j_p
2006-08-30, 11:35
bool in_array(int x, int n, int a[]) // metod som returnerar huruvida x finns med i array a, där n är antal inlagda element i a
{
if (n == 0) // antal element inlagda i arrayen är 0? x kan inte finnas där i så fall
return false;
else
return (x == a[n-1]) || in_array(x, n-1, a); // kolla om x är lika med talet på plats n-1 i arrayen, annars kör vi in_array igen rekursivt med n-1 (vi kollar den förra positionen i arrayen osv tills vi avklarat den första)
}

int nytt_nr(int ti) // metod som returnerar ett nytt garanterat unikt nummer. ti är vilket nummer i ordningen vi skapar, dvs hur många nummer som genererats tidigare.
{
tmpnr=rand()%34+1; // slumpar fram ett tal mellan 1-34. % betyder modulus, dvs resten vid division med 34 i det här fallet. Låt oss säga att rand() returnerar slumptalet 100. 100/34 = 2.xxx, heltalsresten är 32 (100-2*34) och vi får 32+1 dvs 33.
if(in_array(tmpnr,ti,nr)) // kollar om numret vi fick redan skaptas, genom att använda metoden in_array
nytt_nr(ti); // finns det redan så kör vi om denna metod rekursivt för att få ett nytt.

return tmpnr; // returnerar det unika numret
}