Program losujący zwycięzców

0

Mam takie zadanie:
zadanie.png

Oto moje rozwiązanie:


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct data
{
    char imie[50];
    int nr_telefonu[9];
    int wygrywa;    
};  

int losuj(int tab_losuj[2])
{
    tab_losuj[0]=rand()%10;
    tab_losuj[1]=rand()%10;

    return tab_losuj[2];
}

void wprowadz_dane(struct data *tab, int n)
{
    int i,j;
    int numer=0;
    char nazwa[50];

    for(i=0;i<n;i++)
    {
    printf("Wprowadz imie:");   
    scanf("%49s",tab[i].imie);

    printf("Wprowadz nr_telefonu:\n");
        for(j=0;j<9;j++)
        {
            scanf("%d",&numer);
            tab[i].nr_telefonu[j] = numer;
        }
    }

}

int wygrywajace(struct data *tab, int n,int tab_losowe[2])
{
    int ilosc,i,j;  

    for(i=0;i<n;i++)
    {
        if(tab[i].nr_telefonu[7]==tab_losowe[0]&&tab[i].nr_telefonu[8]==tab_losowe[1])
        {
            ilosc++;
            tab[i].wygrywa=1;
        }
    }

    return ilosc;
}

void wyswietl_wygranych(struct data *tab,int liczba_wygranych,int n)
{
    int i;

    printf("Wygrala/y %d osoba/osob \n",liczba_wygranych);
    printf("Oto zwyciezcy:\n");

    for(i=0;i<n;i++)
    {
        if(tab[i].wygrywa==1)
        {
        printf("Pan/i:%s\n",tab[i].imie);
        }
    }

}

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

    srand(time(NULL));
    struct data tab[100];
    int n;
    int liczba_wygranych=0;
    int tab_losowe[2];
    int temp=0;

    printf("Wprowadz ilosc osob telefonujacych:");
    scanf("%d",&n);

    wprowadz_dane(tab,n);

        do
        {
        losuj(tab_losowe);
        liczba_wygranych=wygrywajace(tab,n,tab_losowe);

        temp++;
        }while(liczba_wygranych==0);

    //printf("%d",temp);    
    wyswietl_wygranych(tab,liczba_wygranych,n);

    return 0;
}

http://codepaste.net/si4d8g

Tutaj screen z konsoli:
Bez tytułu1.png

Wszystko mi działa, tylko mam wątpliwości co do poprawności tego programu. Mógłby ktoś stestować/przeanalizować, czy jest wszystko ok? Ewentualnie jakieś sugestie etc.
Z góry dzięki!

2
  1. int nr_telefonu;
  2. int losuj() { return rand()%100; }
  3. scanf("%d",&tab[i].nr_telefonu);
  4. if(tab[i].nr_telefonu%100==losowe)
  5. int losowe;
  6. losowe=losuj();
0

Dostosowałem się do twoich wskazówek, ale coś mi teraz nie działa:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct data
{
    char imie[50];
    int nr_telefonu;
    int wygrywa;    
};  

int losuj() 
{ 
    return rand()%100;
}

void wprowadz_dane(struct data *tab, int n)
{
    int i,j;

    for(i=0;i<n;i++)
    {
    printf("Wprowadz imie:");   
    scanf("%49s",tab[i].imie);

    printf("Wprowadz nr_telefonu:\n");
    scanf("%d",&tab[i].nr_telefonu);
    }

}

int wygrywajace(struct data *tab, int n,int losowe)
{
    int ilosc,i,j;  

    for(i=0;i<n;i++)
    {
        if(tab[i].nr_telefonu%100==losowe)
        {
            ilosc++;
            tab[i].wygrywa=1;
        }
    }

    return ilosc;
}

void wyswietl_wygranych(struct data *tab,int liczba_wygranych,int n)
{
    int i;

    printf("Wygrala/y %d osoba/osob \n",liczba_wygranych);
    printf("Oto zwyciezcy:\n");

    for(i=0;i<n;i++)
    {
        if(tab[i].wygrywa==1)
        {
        printf("Pan/i:%s\n",tab[i].imie);
        }
    }

}

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

    srand(time(NULL));
    struct data tab[100];
    int n;
    int liczba_wygranych=0;
    int losowe;
    int temp=0;

    printf("Wprowadz ilosc osob telefonujacych:");
    scanf("%d",&n);

    wprowadz_dane(tab,n);

        do
        {
        losowe=losuj();
        liczba_wygranych=wygrywajace(tab,n,losowe);

        }while(liczba_wygranych==0);

    wyswietl_wygranych(tab,liczba_wygranych,n);

    return 0;
}
1
  1. Nie rozumiesz inkrementacji: http://4programmers.net/Forum/1101404
  2. scanf(" %49s",tab[i].imie); - spacja
  3. if(tab[i].wygrywa) - liczba może być traktowana jako wartość logiczna 0-> false; reszta->true;
  4. while(!(liczba_wygranych=wygrywajace(tab,n,losuj())) {} - zamiast całego brzydkiego do/while
0

Mogę jeszcze poprosić o jakieś koło ratunkowe? Wydaje mi się, że zrobiłem wedle Twoich wskazówek i dalej to samo. Poprawnie wyświetla ilość wygrywających np.3, ale przy wypisaniu wypisuje tylko 1 imię, a powinno jeszcze wypisać 2 pozostałe.

0
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct data
{
    char imie[50];
    int nr_telefonu;
    int wygrywa;    
};    

int losuj() 
{ 
    return rand()%100;
}

void wprowadz_dane(struct data *tab, int n)
{
    int i,j;

    for(i=0;i<n;++i)
    {
    printf("Wprowadz imie:");    
    scanf(" %49s",tab[i].imie);

    printf("Wprowadz nr_telefonu:\n");
    scanf("%d",&tab[i].nr_telefonu);
    }

}

int wygrywajace(struct data *tab, int n,int losowe)
{
    int ilosc,i;    

    for(i=0;i<n;++i)
    {
        if(tab[i].nr_telefonu%100==losowe)
        {
            ++ilosc;
            tab[i].wygrywa=1;
        }
    }

    return ilosc;
}

void wyswietl_wygranych(struct data *tab,int liczba_wygranych,int n)
{
    int i;

    printf("Wygrala/y %d osoba/osob \n",liczba_wygranych);
    printf("Oto zwyciezcy:\n");

    for(i=0;i<n;++i)
    {
        if(tab[i].wygrywa)
        {
        printf("Pan/i:%s\n",tab[i].imie);
        }
    }

}

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

    srand(time(NULL));
    struct data tab[100];
    int n;
    int liczba_wygranych=0;
    int losowe;
    int temp=0;

    printf("Wprowadz ilosc osob telefonujacych:");
    scanf("%d",&n);

    wprowadz_dane(tab,n);

    while(!(liczba_wygranych=wygrywajace(tab,n,losuj()))) {}

    wyswietl_wygranych(tab,liczba_wygranych,n);

    return 0;
}
1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct data
  {
   char imie[50];
   int nr_telefonu;
   int wygrywa;    
  }; 

int losuj() 
  { 
   return rand()%100;
  } 

void wprowadz_dane(struct data *tab,int n)
  {
   int i; 
   for(i=0;i<n;++i)
     {
      printf("Wprowadz imie:");    
      scanf(" %49s",tab[i].imie); 
      printf("Wprowadz nr_telefonu:\n");
      scanf("%d",&tab[i].nr_telefonu);
      tab[i].wygrywa=0; /* trzeba zainicjalizować */
     }
  }

int wygrywajace(struct data *tab, int n,int losowe)
  {
   int ilosc=0,i; /* ilosc - trzeba wqyzerować */
   for(i=0;i<n;++i)
     {
      if(tab[i].nr_telefonu%100==losowe)
         {
          ++ilosc;
          tab[i].wygrywa=1;
         }
     }
   return ilosc;
  }

void wyswietl_wygranych(struct data *tab,int liczba_wygranych,int n)
  {
   int i; 
   printf("Wygrala/y %d osoba/osob \n",liczba_wygranych);
   printf("Oto zwyciezcy:\n"); 
   for(i=0;i<n;++i)
     {
      if(tab[i].wygrywa) printf("Pan/i:%s\n",tab[i].imie);
     }
  }

int main() 
  {
   struct data tab[100];
   int n=101; /* dla kontroli */
   int liczba_wygranych=0;
   srand(time(NULL)); /* najpierw deklaracje póxniej kod */
   while(n>100)
     {
      printf("Wprowadz ilosc osob telefonujacych (<=100):");
      scanf("%d",&n);
      while(getchar()!='\n') {} /* oprózniamy bufor klawiatury */
     }
   wprowadz_dane(tab,n); 
   while(!(liczba_wygranych=wygrywajace(tab,n,losuj()))) {}
   wyswietl_wygranych(tab,liczba_wygranych,n);
   return 0;
  }
0

Wszystko jasne! Wielkie dzięki

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0