Gå til innhold

trenger hjelp til en obligatorisk oppgave


Anbefalte innlegg

Hei.

 

Sitter å sliter litt med en oppgave jeg har blitt gitt. Oppgaven går ut på å trekke ut , sortere og skrive ut x antall lottorekker..

 

Har fått 90 % av programmet til å fungere. Dvs den Spør etter hvor mange rekker den skal skrive ut , trekker tallene , og skriver de ut i stigende rekkefølge..

 

MEN! :( Tallene går igjen i samme rekke, dvs at tallet 23 kan komme mer en en gang..

 

Hvordan ungår jeg dette ? trekk-funksjonen går som følger:

 

void trekk() /*trekker 7 tall og legger inn i tabell*/

{

int i;

for(i=0;i<7;i++)

{

tall=random(34)+1;

x=tall;

}

}

 

Håper på noen gode tips - Aleksander

Endret av a-beck
Lenke til kommentar
Videoannonse
Annonse
Hei.

 

Sitter å sliter litt med en oppgave jeg har blitt gitt. Oppgaven går ut på å trekke ut , sortere og skrive ut x antall lottorekker..

 

Har fått 90 % av programmet til å fungere.  Dvs den Spør etter hvor mange rekker den skal skrive ut , trekker tallene , og skriver de ut i stigende rekkefølge..

 

MEN!  :(  Tallene går igjen i samme rekke, dvs at tallet 23 kan komme mer en en gang.. 

 

Hvordan ungår jeg dette ?  trekk-funksjonen går som følger:

 

void trekk()                        /*trekker 7 tall og legger inn i tabell*/

    {

    int i;

      for(i=0;i<7;i++)

        {

        tall=random(34)+1;

        x=tall;

        }

    }

 

Håper på noen gode tips - Aleksander

7203527[/snapback]

 

gjør det enkelt; iterer igjennom arrayet `x' og sjekk om `tall' er der fra før - før du eventuelt legger det til eller forsøker å generere et nytt tilfeldig tall (som er mer unikt)

 

poster gjerne et ex. om du vil, men det er kanskje greit om du forsøker selv? :}

Endret av handsape
Lenke til kommentar
hadde vært veldig fint om du postet et eksempel så jeg forstod litt mere hva du mente..  hehe. Har kun drevet med dette i 2 mnd tid.

7209054[/snapback]

 

Mulige handsape forklarte det med litt vanskelige ord.

Det du skal er å se om du har tallet fra før av.

Så du må loopet gjennom alle tallene du har generert fra før av.

 

Før du ser på koden vil jeg ambefalle deg å prøve selv. Etter det jeg ser fra koden din så har du alle den kunnskapen du trenger, det er bare en loop og en sammenligning og en metode for å starte på nytt.

 

Klikk for å se/fjerne innholdet nedenfor
void trekk()                        /*trekker 7 tall og legger inn i tabell*/
{
int i;
for(i=0;i<7;i++)
   {
 randomtall:
 tall=random(34)+1;

 for(int gi=0;gi<7;gi++)
    {
 	if (tall == x[gi]) //Hmmm har vi dette tallet fra før av?
 	{
   //ja det hadde vi... vi må laget da et nytt random tall og prøve igjen
   goto randomtall;
 	}
 }
 x[i] = tall;
}
}

 

lykke til med oppgaven :thumbup:

Offtopic.

He hey jeg fant et sted der jeg syntes det passet med bruk av goto, skal jeg ta det som bra eller dårlig mon tro :hmm:

Lenke til kommentar
Hei.

 

Sitter å sliter litt med en oppgave jeg har blitt gitt. Oppgaven går ut på å trekke ut , sortere og skrive ut x antall lottorekker..

 

Har fått 90 % av programmet til å fungere.  Dvs den Spør etter hvor mange rekker den skal skrive ut , trekker tallene , og skriver de ut i stigende rekkefølge..

 

MEN!  :(  Tallene går igjen i samme rekke, dvs at tallet 23 kan komme mer en en gang.. 

 

Hvordan ungår jeg dette ?   trekk-funksjonen går som følger:

 

void trekk()                        /*trekker 7 tall og legger inn i tabell*/

    {

    int i;

      for(i=0;i<7;i++)

        {

        tall=random(34)+1;

        x=tall;

        }

    }

 

Håper på noen gode tips - Aleksander

7203527[/snapback]

 

Det er mange måter å gjere dette på. Ein måte er vist under:

 

void trekk()                        /*trekker 7 tall og legger inn i tabell*/
   {
   int i,j;
   int antallTall = 0;
   int tallFunnet = 0;

     for(i=0;i<7;i++)
       {
       tall=random(34)+1;
       for( j = 0; j < i; j++ ) {
          if( x[j] == tall ) {
            tallFunnet = 1;
          }
        }
       if( tallFunnet == 1 ) {
          tallFunnet = 0;
          i--;
       } else {
          x[i]=tall;
       }
       }
   } 

Problemet er at den teoretisk kan gå uendeleg, då den kan trekke det same tallet evig. Ein bør derfor lage ein tabell med tal frå 1-34 (om det er det høgaste lotto-talet) og etterkvart som ein trekker eit tall, vert det fjerna frå tabellen.

Endret av rec0n
Lenke til kommentar

tja, noen ganger _er_ `goto' det klareste..

 

når kontroll-konseptene som er tilgjengelige i C ikke er gode nok (og det hender altså noen ganger!) er `goto' - som i grunn kan regnes som en byggekloss bak andre kontroll-konsepter, det eneste alternativet i et språk som ikke kan "programmeres om" v.h.a. ting som makroer der en på det viset ville kunne lagt til nye kontroll-konsepter i en "sikker" forpakning

 

når konstruksjoner som funksjoner og prosedyrer ble vanlige erstattet disse `goto' som brukt til å dele opp koden i "klosser" og navigere i mellom disse; men det betyr ikke at `goto' kun ble brukt i disse sammenhengene

 

ta C og C++ -- der eksisterer det ingen mulighet til å hoppe ut av loop-konstruksjoner dypere enn 1 uten å måtte sjekke flere ganger "på vei ut"; dermed er `goto' et fullstendig gyldig alternativ der

 

ta også en titt på grep -R "goto" * i /usr/src/linux ; der ser man `goto' brukt i en annen sammenheng som også er fullstendig gyldig; unntakshåndtering

Endret av handsape
Lenke til kommentar

du har sikkert fått det til nå, men til alle andre, så kommer koden slik jeg gjorde det her, for hele programmet:

 


#pragma hdrstop
#include <stdio.h>
#include <stdlib.h>
//---------------------------------------------------------------------------

#pragma argsused

int LesInn(void)                                             //spør hvor mange rader som skal skrives ut
{
  int tall;
  printf("Hvor mange rekker skal du ha? ");
  scanf(" %d", &tall);
  printf("\n");
  return tall;
}

void Trekk(int x[])                                     //trekker tilfelidge tall, og ser om noen er like
{
  int i,j;
  for(i=0;i<=6;i++)
  {
       x[i] = 1 + rand() % 34;
       for(j=0;j<=i-1;j++)
       {
          if(x[i]==x[j])
          {
             i--;
             break;
          }
       }
  }

}

void Sorter(int x[])                                      //sorterer tallene, lavest først (bubble-sort)
{
  int pass,i,temp;
       for (pass=1;pass<=6;pass++)
          for (i=0;i<=5;i++)
              if (x[i]>x[i+1])
                 {
                    temp  =x[i];
                    x[i]  =x[i+1];
                    x[i+1]=temp;
                 }
}

void SkrivUt(int x[], int nr)                                    //skriver ut alle rekkene
{
  int i;
  printf("Rekke nr. %5d: ", nr);
  for(i=0;i<=6;i++)
     printf(" %3d",x[i]);
     printf("\n");
}

int main(int argc, char* argv[])                     //hovedprogram
{

int rader,i,x[7];

       srand(time(NULL));
       rader=LesInn();
               for(i=1;i<=rader;i++)
               {
               Trekk(x);
               Sorter(x);
               SkrivUt(x,i);
               }



       getchar();
       getchar();
       return 0;
}

Lenke til kommentar

Annen måte å sjekke om tallet er trukket før.

void trekk( int *tall ) {
int i;
bool numTaken[35];

memset( &numTaken[1], 0, sizeof(bool)*34 );

i = 7;
while ( i-- > 0 ) {
 while ( numTaken[tall[i] = rand()%34+1] );
 numTaken[tall[i]] = true;
}

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...