Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    37

    [C] Dimensione vettore da allocare dinamicamente

    Sono alle prese con un esercizio:
    "Si consideri un sistema di acquisizione dati che campiona, ogni 20 millisecondi, i segnali provenienti da un accelerometro triassiale (X, Y e Z). I dati campionati sono i seguenti:
    • accelerazione X (double)
    • accelerazione Y (double)
    • accelerazione Z (double)
    1. Allocare tre vettori di double acc_x, acc_y e acc_z, di dimensioni “n” fornite da tastiera (i tre vettori devono avere la stessa dimensione) e riempirli di valori casuali utilizzando la formula:
    (rand()/(float)RAND_MAX) * 2.0 – 1.0.
    2. Calcolare i valori di velocita' X, Y e Z, per ogni istante di campionamento utilizzando la
    formula di integrazione approssimata:
    v=v−1+aT
    Dove T e' il periodo di integrazione. L'integrazione va eseguita solo se l'accelerazione di almeno un asse e' superiore, in valore assoluto, a 0.05 m/s^2.
    I valori di velocita' vanno inseriti in tre vettori vel_x, vel_y e vel_z, la cui dimensione va opportunamente determinata."


    Il mio codice e':
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <time.h>
    
    
    
    void riempi_vettore (double *v, int size);
    void stampa_vettore (double *a, int size);
    int dimensione_vel (double *ax, double *ay, double *az, int size, double T);
    void calcola_vel (double *ax, double *ay, double *az, int size, double *vx, double *vy, double *vz, double T);
    
    
    int main(void) {
        
        double *acc_x, *acc_y, *acc_z, T;
        double *vel_x, *vel_y, *vel_z;
        int  n, dim;
        
        T = 0.01;
        
        printf ("Inserisci n da tastiera \n");
        scanf ("%d",&n);
        
        /* Alloco dinamicamente i vettori */
        
        acc_x=(double*)malloc(n*sizeof(double));
        acc_y=(double*)malloc(n*sizeof(double));
        acc_z=(double*)malloc(n*sizeof(double));
        
        /* Riempi vettori */
        riempi_vettore (acc_x, n);
        stampa_vettore (acc_x, n);
        riempi_vettore (acc_y, n);
        stampa_vettore (acc_y, n);
        riempi_vettore (acc_z, n);
        stampa_vettore (acc_z, n);
        
        /* Calcolo dimensione dei vettori velocità */
        dim = dimensione_vel ( acc_x, acc_y, acc_z, n, T);
        
        /* Alloco dinamicamente i vettori */
        vel_x = (double*)malloc(dim*sizeof(double));
        vel_y = (double*)malloc(dim*sizeof(double));
        vel_z = (double*)malloc(dim*sizeof(double));
        
        /* Calcolo velocità */
        calcola_vel ( acc_x, acc_y, acc_z, n,  vel_x,  vel_y, vel_z, T);
    
        system("pause");
    }
    
    
    void riempi_vettore (double *v, int size) {
         int i;
         
         srand(time(NULL));
         
         for(i=0;i<size;i++) {
         v[i]=(rand()/(float)RAND_MAX)*2.0-1.0;
           }
          }
    void stampa_vettore (double *a, int size) {
         int i;
         for(i=0; i<size; i++) {
                  printf ("a[%d]=%lf \n", i, a[i]);
                  }
              }
              
    int dimensione_vel (double *ax, double *ay, double *az, int size, double T) {
        int i, j;
        
        j=0;
        for (i=0; i<size; i++) {
            if((fabs(ax[i])>T )||fabs(ay[i]>T)||fabs(az[i]>T)){
                             j++; }
                             }
            return j;
           }
                      
    void calcola_vel (double *ax, double *ay, double *az, int size, double *vx, double *vy, double *vz, double T) {
           int i, j;
           
           for(i=0; i<size; i++){
                 
                 if((fabs(ax[i])>T )||fabs(ay[i]>T)||fabs(az[i]>T)){
                             vx[i+1]=vx[i]+ax[i]*T;   
                             vy[i+1]=vy[i]+ay[i]*T;  
                             vz[i+1]=vz[i]+az[i]*T; 
                                                                            }
                             
                        printf("vel_x[%d]=%lf\n" , i+1, vx[i+1]); 
                        printf("vel_y[%d]=%lf\n" , i+1, vy[i+1]);
                        printf("vel_z[%d]=%lf\n" , i+1, vz[i+1]);
                                
                                }
            
    }
    ma qualcosa non va nel momento dell'allocazione dinamica dei tre vettori velocità. Potreste spiegarmi come posso fare a calcolarmi prima la dimensione ( attraverso una funzione che mi restituisca soltanto la dimensione) dei tre vettori al fine di allocare nel main i tre vettori?

    Vi ringrazio

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462

    Re: [C] Dimensione vettore da allocare dinamicamente

    Originariamente inviato da bad.alex
    ma qualcosa non va nel momento dell'allocazione dinamica dei tre vettori velocità. Potreste spiegarmi come posso fare a calcolarmi prima la dimensione ( attraverso una funzione che mi restituisca soltanto la dimensione) dei tre vettori al fine di allocare nel main i tre vettori?
    "Qualcosa non va" è un po' generico ... cosa non va esattamente?

    "Calcolare la dimensione prima" che vuol dire? Prima di cosa? E con quali regole?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    37
    Praticamente sto svolgendo molti esercizi per farmi entrare in testa la funzione filter_vector.
    Quando il testo dell'esercizio chiedere di creare nuovi vettori, sotto particolari condizioni, partendo dai vettori iniziali, e di allocarli dinamicamente, ho difficoltà a crearli in quanto per allocarli dinamicamente mi occorre sapere la dimensione di questi nuovi vettori. Quindi mi occorrerebbe determinare la dimensione dei nuovi vettori per poterli allocare dinamicamente. Ma non riesco a scrivere una funzione che mi calcoli e restituisca il valore della dimensione di questi vettori sotto delle condizioni ( per esempio se in_vector[i]> soglia allora posso contare un elemento nel nuovo vettore...).
    Il programma sembra partire correttamente modificando il ciclo for:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <time.h>
    
    
    
    void riempi_vettore (double *v, int size);
    void stampa_vettore (double *a, int size);
    int dimensione_vel (double *ax, double *ay, double *az, int size, double T);
    void calcola_vel (double *ax, double *ay, double *az, int size, double *vx, double *vy, double *vz, double T);
    int conteggio ( double *vx , double *vy, double *vz, int size, double s);
    
    int main(void) {
        
        double *acc_x, *acc_y, *acc_z, T;
        double *vel_x, *vel_y, *vel_z, s;
        int  n, dim, cont;
        
        T = 0.01;
        
        printf ("Inserisci n da tastiera \n");
        scanf ("%d",&n);
        
        /* Alloco dinamicamente i vettori */
        
        acc_x=(double*)malloc(n*sizeof(double));
        acc_y=(double*)malloc(n*sizeof(double));
        acc_z=(double*)malloc(n*sizeof(double));
        
        /* Riempi vettori */
        riempi_vettore (acc_x, n);
        stampa_vettore (acc_x, n);
        riempi_vettore (acc_y, n);
        stampa_vettore (acc_y, n);
        riempi_vettore (acc_z, n);
        stampa_vettore (acc_z, n);
        
        /* Calcolo dimensione dei vettori velocità */
        dim = dimensione_vel ( acc_x, acc_y, acc_z, n, T);
        
        /* Alloco dinamicamente i vettori */
        vel_x = (double*)malloc(dim*sizeof(double));
        vel_y = (double*)malloc(dim*sizeof(double));
        vel_z = (double*)malloc(dim*sizeof(double));
        
        /* Calcolo velocità */
        calcola_vel ( acc_x, acc_y, acc_z, n,  vel_x,  vel_y, vel_z, T);
        
        
        printf("Inserisci un valore s di soglia\n");
        scanf("%lf" , &s);
        cont=conteggio(vel_x, vel_y, vel_z, dim, s);                                                                  
        printf("La velocita' supera il valore di soglia %d volte\n" , cont);
                
    
        system("pause");
    }
    
    
    void riempi_vettore (double *v, int size) {
         int i;
         
         srand(time(NULL));
         
         for(i=0;i<size;i++) {
         v[i]=(rand()/(float)RAND_MAX)*2.0-1.0;
           }
          }
    void stampa_vettore (double *a, int size) {
         int i;
         for(i=0; i<size; i++) {
                  printf ("a[%d]=%lf \n", i, a[i]);
                  }
              }
              
    int dimensione_vel (double *ax, double *ay, double *az, int size, double T) {
        int i, j;
        
        j=0;
        for (i=0; i<size; i++) {
            if((fabs(ax[i])>T )||fabs(ay[i]>T)||fabs(az[i]>T)){
                             j++; }
                             }
            return j;
           }
                      
    void calcola_vel (double *ax, double *ay, double *az, int size, double *vx, double *vy, double *vz, double T) {
           int i, j;
           
           for(i=1; i<size; i++){
                 
                 if((fabs(ax[i])>T )||fabs(ay[i]>T)||fabs(az[i]>T)){
                             vx[i]=vx[i-1]+ax[i-1]*T;   
                             vy[i]=vy[i-1]+ay[i-1]*T;  
                             vz[i]=vz[i-1]+az[i-1]*T; 
                                                                            }
                             
                        printf("vel_x[%d]=%lf\n" , i, vx[i]); 
                        printf("vel_y[%d]=%lf\n" , i, vy[i]);
                        printf("vel_z[%d]=%lf\n" , i, vz[i]);
                                
                                }
            
    }
    
    int conteggio ( double *vx , double *vy, double *vz, int size, double s){
        
        int i, cont;
        
          cont=0;
          for(i=0; i<size; i++){
                   if((vx[i]*vx[i]+vy[i]*vy[i]+vz[i]*vz[i])>=s*s){
                                                                      cont++;
                                                                      } 
                                                                }
                                                                      
                                            return (cont);
                                                    }

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.