Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    37

    Allocazione dinamica in C e funzione istogramma

    Ragazzi, chiedo il vostro aiuto perchè ho difficoltà a svolgere alcuni esercizi.
    Ho un vettore "v" di reali, allocato dinamicamente, di dimensioni n inserite da tastiera, contenente elementi generati casualmente nell'intervallo continuo [0,20].
    Mi si chiede di scrivere una funzione "istogramma" che riceve il vettore v, la sua dimensione , un numero di intervalli t in cui suddividere l'intervallo [0,20] e che restituisce un vettore di interi di t elementi, le cui componenti sono così calcolate:


    elemento 0 = numero di valori del vettore in ingresso compresi tra [0,h]
    elemento 1 = numero di valori del vettore in ingresso compresi tra ]2h,3h]
    elemento 2 = numero di valori del vettore in ingresso compresi tra ]3h,4h]

    e così via,
    dove h è la dimensione del singolo sottointervallo.
    Il prototipo della mia funzione è:
    int * istograma (double *in_vector, int in_vector_size, int t


    Vi riporto quello che ho svolto al momento ( con Dev C++ non parte... ):
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    void riempi_vettore (double *v, int size);
    
    int main (void) {
        double *serie;
        int i,n;
        
        printf ("Immetti da tastiera le dimensioni del vettore:\n");
        scanf ("%d", &n);
        
        serie=(double *) malloc(n*sizeof(int));
        
        srand(time(NULL));
        /* Riempio vettore */
             
        riempi_vettore (serie, n);
        /* Lo stampo a video */
        
        for (i=0; i<n; i++) {
        
        printf (" I valori del vettore sono serie[%d]=%f \n", i, serie[i]);
        
    }
        
        
        system("pause"); 
    }
    /* Funzione riempi vettore */
    
    void riempi_vettore (double *v, int size) {
         int i;
         
         for (i=0; i<size; i++) {
             v[i]= rand()/(RAND_MAX)*10.0;
            
             }
         }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    Che vuol dire "non parte" ? Che problemi/errori hai?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    37
    Praticamente, ciò che ho svolto finora è: scrivere la funzione riempi vettore e allocarla dinamicamente. ( come da codice riportato nel topic)
    Non mi dà errori, infatti manda in esecuzione ma improvvisamente, dopo aver inserito da tastiera il valore della dimensione del vettore, la finestra si chiude.
    Nessun warning, nulla.
    Deve esserci qualche errore nella prima parte ( premetto che ho chiesto il vostro aiuto perchè non so svolgere, ma vorrei capire bene come procedere, il punto in cui si chiede di utilizzare la funzione istogramma), ma non riesco a capire dove.
    Ho seguito anche dei tutorial e degli esercizi svolti trovati su internet, ma qualcosa non va...

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    Nella malloc prevedi la sizeof di un int ma quelli sono double ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    37
    Per oregon: hai ragione!
    Mia svista.
    Per quanto riguarda la funzione istogramma, sapreste dirmi come fare a scriverla ( eventuali cicli, inizializzazioni variabili...)?

    vi ringrazio

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    Comincia a scrivere ...

    Tipo_di_dato_restituito Nome_Funzione(Parametri)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    37
    Sinora ho svolto soltanto il primo punto ( però il programma non viene eseguito correttamente...).
    il testo del problema completo è:
    "Si consideri un vettore “serie” di reali (double), allocato dinamicamente, di dimensioni “n” fornite da
    tastiera, contenente elementi generati casualmente nell'intervallo continuo [0, 10] (usare la funzione
    “rand()”, scalando opportunamente ad un reale il valore restituito).
    1. Scrivere una funzione “filter_vector” che riceve il vettore “serie”, la sua dimensione, e
    restituisce un nuovo vettore contenente solo le componenti del vettore in ingresso che
    soddisfanno alla relazione:
    (in_vector[i] + in_vector[i+1] + in_vector[i+3]) / 3 < 0.5
    il prototipo della funzione filter_vector e' il seguente:
    double * filter_vector (double * in_vector, int in_vector_size,
    int * out_vector_size);
    2. scrivere una funzione “istogramma” che riceve il vettore “serie”, la sua dimensione, un numero
    di intervalli “k” in cui suddividere l'intervallo [0, 10], e restituisce un vettore di interi di “k”
    elementi, le cui componenti sono cosi' calcolate:
    elemento 0 = numero di valori del vettore in ingresso compresi tra [0, h]
    elemento 1 = numero di valori del vettore in ingresso compresi tra ]2h, 3h]
    elemento 2 = numero di valori del vettore in ingresso compresi tra ]3h, 4h]
    ……
    dove “h” e' la dimensione del singolo sottointervallo (da calcolare opportunamente). Il prototipo
    della funzione da e' il seguente:
    int * istogramma (double * in_vector, int in_vector_size, int k) ".

    Ho provato a svolgere, quantomeno, il primo punto ma qualcosa riesco comunque a sbagliarla
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <time.h>
    
    /* Dichiarazioni funzioni */
    void riempi_vettore (double *v, int size, double a, double b);
    double * filter_vector( double *, int , int *);
    
    
    int main (void) {
        double *serie;
        double *out;
        int i,n, out_size;
        
        printf ("Immetti da tastiera le dimensioni del vettore:\n");
        scanf ("%d", &n);
        
         serie=(double *) malloc(n*sizeof(double));
        
        riempi_vettore (serie,n,0,10);
        
        out= *filter_vector(serie, 100, out_size);
        printf("la dim del vettor in uscita e %d\n" , out_size);
        
        
        for(i=0; i<out_size; i++){
        printf("out[%d]=%f\n" , i , out[i]);
                                  }
    
        system("pause"); 
    }
    
    
    
    /* Funzione riempi vettore */
    
    void riempi_vettore (double *v, int size,double a, double b) {
         int i;
         
         srand(time(NULL));
         for (i=0; i<size; i++) {
             v[i]= (rand()*(b-a))/size;
            
             }
         }
    
    
    
    double * filter_vector( double *in_vector , int in_vector_size, int *out_vector_size){
          
          int i, j;
          double *out_vector;
          
          *out_vector_size=0;
          
          for(j=0; j<in_vector_size; j++){
                   if(((in_vector[j]+in_vector[j+1]+in_vector[j+3])/3)<0.5){
                             *out_vector_size=*out_vector_size+1;
                                                                                       }
                                                                                       }
          out_vector=(double*)malloc(*out_vector_size*sizeof(double));
          
          i=0;                                                                             
          for(j=0; j<in_vector_size; j++){
                   if(((in_vector[j]+in_vector[j+1]+in_vector[j+3])/3)<0.5){  
                           out_vector[i]=in_vector[j];
                                       i++;
                                                                                       }
                                                                                       }
                                                                                       
            return out_vector;
                                                                                       }
    Non risultano errori nel momento della compilazione. Potreste aiutarmi? ( ancora non ho svolto il secono punto perchè non so come procedere con la funzione istogramma... un passo alla volta :-)
    Grazie

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    Utilizza i tag CODE o non si capisce nulla
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9

    Moderazione

    Il codice va specificato tra tag [CODE] ... [/CODE], altrimenti perde l'indentazione.

    Correggo io; nel frattempo ti consiglio di dare un'occhiata al regolamento.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    Ho provato a svolgere, quantomeno, il primo punto ma qualcosa riesco comunque a sbagliarla
    Cioè ? Cosa non va ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.