Programma sulle funzioni

di il
8 risposte

Programma sulle funzioni

Il testo è questo:
Cattura1.png
Cattura1.png

Ho 2 problemi:
nel punto 3 non ho capito come fare in modo che il valore di N sia solo intero
nel punto 6 non riesco a capire come debba essere fatta questa funzione fillDistribution(), sia per quanto riguarda la struttura ma anche a livello pratico (Cosa intende per distribuzione ?)

Mio svolgimento attuale:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
double z(int k);
double theta(int j);
int getNumber(char *strng, int arg1, int arg2);
int main(int argc, char **argv)
{
    srand(time(NULL));
    int N, k, i;
    double x[100000], y[100000];
    FILE *f;
    getNumber("Inserire la misura del raggio medio dell'ammasso in parsec ",1,25);
    N = getNumber("Inserire il numero di stelle da generare ",1000,100000);
    for (i=0; i<N; i++)
      {
        x[i] = z(i)*cos(theta(i));
        y[i] = z(i)*sin(theta(i));
      }   
    f = fopen("stelle.txt","w");
    for(i=0; i<N; i++)
      {
        fprintf(f,"%lf %lf\n",x[i], y[i]);   
      }   
    fclose(f);
	return 0;
}
int getNumber(char *strng, int arg1, int arg2)
{
    int number;
    do
      {
        printf("%s ",strng);
        scanf("%d",&number);
        if (number < arg1 || number > arg2)
          {
            printf("\nERRORE: inserire un numero tra %d e %d\n\n",arg1, arg2);  
          }   
      }
    while (number < arg1 || number > arg2);
    return number;
}

double z(int k)
{
  double a[2], z;
  for (k=0;k<2;k++)
    {
      a[k] = ((double)rand()/RAND_MAX);
    }
  z = sqrt(-2*log(a[0])) * cos(2*M_PI*a[1]);
  return z;
}

double theta(int j)
{
    double angolo;
    angolo = 2*M_PI* ((double)rand()/RAND_MAX);
    return angolo;
}

8 Risposte

  • Re: Programma sulle funzioni

    3) scanf lo fai su un double con %lf poi il double lo casti a int

    6) i = (int)(x+0.5+taglia/2); e ti crei l'istogramma con array[ i ]++ (tagliando le code)
  • Re: Programma sulle funzioni

    Ho un problema, nel file distribstelle.txt i valori dell'array d sembrano essere non inizializzati, come mai?
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <time.h>
    double z(int k);
    double theta(int j);
    double getNumber(char *strng, double arg1, double arg2);
    void fillDistribution(int d[], int n, float x);
    int main(int argc, char **argv)
    {
       srand(time(NULL));
       int N=0, k=0, i, d[100];
       double x, y, number=0, radius;
       FILE *f;
       radius = getNumber("Inserire la misura del raggio medio dell'ammasso in parsec ",1.,25.);
       do 
         {
           number = getNumber("Inserire il numero di stelle da generare ",1000.,100000.);
           if (number != floor(number)) 
             {
               printf("Errore: il numero dev'essere intero.\n");
               number = 0.;
             }
         } 
       while (number <= 0.);
       N = number;
       f = fopen("stelle.txt","w");
       for (i=0; i<N; i++)
         {
           x = radius*z(i)*cos(theta(i));
           y = radius*z(i)*sin(theta(i));
           fprintf(f,"%lf %lf\n",x, y);
           fillDistribution(d, 100, x); 
         }   
       fclose(f);
       f = fopen("distribstelle.txt","w");
       for (i=0; i < 100; i++)
         {
           fprintf(f, "%d %d\n", i-50, d[i]);   
         }   
       return 0;
    }
    double getNumber(char *strng, double arg1, double arg2)
    {
       double number;
       do
         {
           printf("%s ",strng);
           scanf("%lf",&number);
           if (number < arg1 || number > arg2)
             {
               printf("\nERRORE: inserire un numero tra %lf e %lf\n\n",arg1, arg2);  
             }   
         }
       while (number < arg1 || number > arg2);
       return number;
    }
    
    double z(int k)
    {
       double a[2], z;
       for (k=0;k<2;k++)
         {
           a[k] = ((double)rand()/RAND_MAX);
         }
       z = sqrt(-2*log(a[0])) * cos(2*M_PI*a[1]);
       return z;
    }
    
    double theta(int j)
    {
       double angolo;
       angolo = 2*M_PI* ((double)rand()/RAND_MAX);
       return angolo;
    }
    
    void fillDistribution(int d[], int number, float x) 
    {
      int index = x;
      if (x < 0.) 
        {
          index = number/2 + x;
        } 
      else 
        {
          index += number/2;
        }
      if ((index > 0) && (index < number)) 
        {
          d[index]++;
        }
    }
  • Re: Programma sulle funzioni

    Perché d non è inizializzato
  • Re: Programma sulle funzioni

    Ho riletto 5 volte il codice pensando di averlo fatto, simpatica sta cosa
  • Re: Programma sulle funzioni

    E' comunque sbagliata la tua funzione

    1) perché float quando hai sempre usato i double?
    2) perché index > 0 ? 0 non fa parte del tuo array?
    3) Dove va a finire x = -0.001 ? e x = +0.001? Seconde te perché c'era + 0.5 nel suggerimento?
  • Re: Programma sulle funzioni

    Sui float hai ragione, però a me la funzione sembra andare
  • Re: Programma sulle funzioni

    Nexus99 ha scritto:


    Ho riletto 5 volte il codice pensando di averlo fatto, simpatica sta cosa
    E ogni volta che lo leggevi, in quale riga ritenevi che fosse stata fatta l'inizializzazione?
  • Re: Programma sulle funzioni

    Non ne ho idea nemmeno io
Devi accedere o registrarti per scrivere nel forum
8 risposte