Problema con la parte finale di questo programma

di il
7 risposte

Problema con la parte finale di questo programma

Innanzitutto scusate eventuali violazioni di regola ma sono nuovo. Detto questo il programma è questo:
Scrivere un programma che:
- legga da tastiera un numero intero positivo 1000 <= N <= 3000, controllandone
la validità e richiedendolo di nuovo se non valido
- generi N numeri random interi compresi tra 1 e 100 usando la funzione
drand48( ) e li memorizzi in un array data
- conti quante volte ciascun numero intero compare in data (cioè la frequenza
dei 100 numeri )
(es.: il numero 17 compare 22 volte, il numero 18 compare 21 volte etc.)
- memorizzi le frequenze calcolate in un array freq e stampi l’array in modo chiaro e leggibile
- trovi il numero più frequente e il numero meno frequente e quindi calcoli il valor medio
degli scarti <S> =? i | Fi – N/100 | /100, stampandoli alla fine.


Mia risoluzione
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int N,i,data[102] = {0},freq[101],X,seed,Xmax=0, Xmin=0;


seed = time(NULL);
srand(seed);

do{
   printf("Inserisci un numero N, 1000<=N<=3000\n");
   scanf("%d",&N);
  }while(N < 1000 || N> 3000);
    for(i=0; i<=N;i++)
    {
      X = rand()%100 + 1;
      data[X-1]++;
      freq[X-1] = data[X-1];
        
    }
         int max = freq[1];
         int min = freq[1];
        for(X=1;X<=100;X++)
         {
          printf("freq[%d] = %d\n",X,freq[X-1]);
           if (freq[X] > max) 
            {
                 max = freq[X];
                 Xmax=X;
             }

           if (freq[X] < min) 
               {
                min = freq[X];
                Xmin=X;
               } 
         }

              printf("il numero con maggiore frequenza e' %d\n",Xmax);
              printf("il numero con minor frequenza e' %d\n",Xmin);
return 0;
}
Il problema sta nella parte finale. La parte iniziale sembra funzionare ma le ultime 2 richieste no. La penultima non riesco a capire perchè non funzioni correttamente, mentre l'ultima non so proprio come impostarla. Qualcuno può aiutarmi?

7 Risposte

  • Re: Problema con la parte finale di questo programma

    N numeri interi tra 1 e 100 con drand48 che sorteggia tra 0 e 1? Ma dai
  • Re: Problema con la parte finale di questo programma

    Io infatti ho usato rand()
    Comunque se si fa: drand48()*N + M , si ha un numero nell'intervallo [M,N+M]
  • Re: Problema con la parte finale di questo programma

    Comunque mi sono accorto ora di aver sbagliato a trascrivere: è da usare lrand48()
  • Re: Problema con la parte finale di questo programma

    Dracmaleontes ha scritto:


    Io infatti ho usato rand()
    Comunque se si fa: drand48()*N + M , si ha un numero nell'intervallo [M,N+M]
    Sarebbe una soluzione irragionevole, primo perché devi rimaneggiare i risultati da double a int, secondo perché drand48() usa al suo interno un sorteggio di interi. Comunque avevi sbagliato a trascrivere, era evidente.

    A me sembra anche sbagliato il punto 2. Dove li memorizzi questi numeri?

    Dovrebbe essere
    
    int data[N];
    int freq[101] = {0};
        for(i=0; i<N;i++)
        {
          X = rand()%100 + 1;
          data[i]=X;
          freq[X]++;
        }
    
  • Re: Problema con la parte finale di questo programma

    Il codice aggiornato è questo:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
    int main()
    {
    int N,seed,i,X,Xmax=0,Xmin=0;
    double S,frq;
    S = 0.;
    
    
    seed = time(NULL);
    srand(seed);
    
    do{
       printf("Inserisci un numero N, 1000<=N<=3000\n");
       scanf("%d",&N);
      }while(N < 1000 || N> 3000);
      int data[N];
      int freq[101] = {0};
        for(i=0; i<N;i++)
        {
          X = rand()%100 + 1;
          data[i]=X;
          freq[X]++;
        }
          int max = freq[1];
          int min = freq[1];
        for(X=1;X<=100;X++)
        {
            printf("freq[%d] = %d\n",X,freq[X]);
            if (freq[X] > max) 
                {
                     max = freq[X];
                     Xmax=X;
                 }
    
               if (freq[X] < min) 
                   {
                    min = freq[X];
                    Xmin=X;
                   } 
             frq = fabs(((double)freq[X] - ((double)N)/100.0))/100.0;
             S = S + frq;
                 
        }
       
        printf("Il numero con maggiore frequenza e' %d\n",Xmax);
        printf("il numero con minor frequenza e' %d\n",Xmin);
        printf("Il valor medio degli scarti e' %lf\n",S);
    }
    Sembra funzionare, voi che dite?
  • Re: Problema con la parte finale di questo programma

    Xmin e Xmax possono essere più di uno: devi fare un altro for dopo il calcolo di max e min e stampare tutti i valori che hanno frequenza max e tutti i valori che hanno frequenza min (quindi Xmin e Xmax non servono proprio)

    La divisione per 100.0 la devi fare un'unica volta alla fine del for. Farla su ogni elemento è la stessa cosa matematicamente, ma non informaticamente, perché i double non sono a precisione infinita.

    Sei sicuro che la formula degli scarti sia giusta? Cosa rappresenterebbe N/100? Non dovrebbe essere invece il valore medio?
  • Re: Problema con la parte finale di questo programma

    La formula data è quella, non ci sono errori di trascrizione, poi magari il prof ha sbagliato a scrivere.
    Comunque non capisci come devo fare questo ciclo, devo fare un ciclo for da X=1 fino a che X<=100 e farmi stampare i valori di max (ad esempio)?
Devi accedere o registrarti per scrivere nel forum
7 risposte