PDA

Visualizza la versione completa : [C] Vettore filtro e dimensione


bad.alex
21-05-2013, 00:49
Buona sera. Sto svolgendo il seguente esercizio

Si considerino due array vx[ ] e vy[ ] di n elementi di tipo double, allocati dinamicamente e con n inserito da tastiera, riempito di numeri casuali generati secondo la formula:
(rand()%1500 + 1)/1500.0
Si supponga che tali array siano relativi alle componenti di velocita'; supporre che i valori siano campionati ogni ogni 10 millisecondi (T=10^-2).
1. Scrivere una funzione che restituisce i valori delle posizioni nei vettori x[ ] e y[ ], calcolate utilizzando l'integrazione approssimata.
2. Scrivere una funzione che “filtra” i vettori x[] e y[], copiando, in due nuovi vettori fx[] e fy[],
solo gli elementi che soddisfano la seguente condizione:
dist ( (x[i],y[i]) , (x[i+1], y[i+1]) ) > 0.001


Ho scritto il seguente codice:







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


void riempi_vettori (double *v, int size);
void stampa_vettori (double *v, int size);
void posizione ( double *v1, int size, double *xx, double T);
int filter_vector_size (double *xx, int size);
double filter_vector (double *xx, int k, double *fxx);

int main (void) {
int i, n, dimx, dimy,j;
double *vx, *vy, T =0.01, *x, *y, *fx, *fy;

printf ("Inserisci da tastiera la dimensione dei vettori \n");
scanf ("%d", &n);

/* Alloco dinamicamente i vettori */
vx= (double*)malloc(n*sizeof(double));
vy= (double*)malloc(n*sizeof(double));

/* Riempio i vettori */
riempi_vettori (vx,n);
stampa_vettori (vx,n);

riempi_vettori (vy, n);
stampa_vettori (vy, n);

/* Alloco dinamicamente i vettori x e y */

x = (double*)malloc(n*sizeof(double));
y = (double*)malloc(n*sizeof(double));

/* Riempio i vettori con l'integrazione approssimata */

posizione (vx,n,x,T);
posizione (vy,n,y,T);
for (i=0;i<n;i++){
printf ("il valore di x e' x[%d]=%f\n",i,x[i]);
printf ("il valore di y e' y[%d]=%f\n",i,y[i]);

}
dimx = filter_vector_size(x,n);
dimy = filter_vector_size(y,n);
fx=(double*)malloc(dimx*sizeof(double));
fy=(double*)malloc(dimy*sizeof(double));
filter_vector (x,dimx,fx);
filter_vector (y,dimy,fy);
for (i=0;i<dimx;i++){
printf ("la funzione fx e' fx[%d]=%f\n",i,fx[i]);
}
for (j=0;j<dimx;j++){
printf ("la funzione fy e' fy[%d]=%f\n",j,fy[j]);
}


system("pause");
}


void riempi_vettori (double *v, int size) {
int i;

srand(time(NULL));
for(i=0; i<size; i++) {
v[i]=(rand()%1500+1)/1500.0;
}
}

void stampa_vettori (double *v, int size) {
int i;
for(i=0; i<size; i++){

printf (" Stampo vettore v[%d]=%lf \n", i, v[i]);
}
}

void posizione ( double *v1, int size, double *xx, double T ) {
int i;
xx[0]=v1[0]*T;
for (i=1; i<size-1; i++) {
xx[i]=xx[i-1]+v1[i-1]*T;
}
}

int filter_vector_size (double *xx, int size) {
int i, k;

k=0;
for(i=0; i<size; i++) {
if (sqrt((xx[i+1]-xx[i])*(xx[i+1]-xx[i]))>0.001){
k++;
}
}
return k;
}

double filter_vector (double *xx, int k, double *fxx) {
int i;
for (i=0;i<k;i++){
if (sqrt((xx[i+1]-xx[i])*(xx[i+1]-xx[i]))>0.001){
fxx[i]= sqrt((xx[i+1]-xx[i])*(xx[i+1]-xx[i]));
}
}

}






Non vengono segnalati errori di compilazione e al momento dell'esecuzione vengono stampati soltanto i vettori velocità.
Ho provato a rivederlo ma a me sembra essere "corretto". Eppure qualcosa non va :confused:

Volevo inoltre chiedervi se potreste dirmi come fare a "compattare" in un'unica funzione la funzione filter_vector_size e la funzione filter_vector ( che in questo codice ho scritto per comodità separatamente, ma il prof richiede sia fatto tutto in un'unica funzione).

V i ringrazio!

oregon
21-05-2013, 01:25
Compila ?

Veramente manca l'include di

math.h

per la sqrt e il valore restituito dalla funzione

double filter_vector

(dato che è una funzione double, quale valore restituisce? Non c'è return ...)

bad.alex
21-05-2013, 02:29
grazie mille, oregon! Ora si che va :)

per quanto riguarda la funzione filtro e la sua dimensione, come faccio a compattare il tutto in un'unica funzione?

Loading