PDA

Visualizza la versione completa : Esercizio in C: allocazione dinamica di vettori


bad.alex
14-05-2013, 16:33
Si consideri un vettore a[ ] di n elementi allocato dinamicamente e con n inserito da
tastiera, riempito di numeri casuali generati secondo la formula (rand()%1500)+1.
Supporre che ogni coppia di elementi (a[i], a[i+1]) costituiscano le coordinate (x,y) di un
punto all'interno di uno spazio bidimensionale. Eseguire le seguenti funzionalita':
1. Scrivere una funzione che copia, in due vettori di interi x[ ] e y[ ] (allocati
dinamicamente) gli elementi di a[ ] a coppie;
2. Scrivere una funzione “distanza” che calcola la distanza tra due punti, note le loro
coordinate (x0, y0) e (x1, y1);
3. Creare il vettore di reali dist[ ] (allocato dinamicamente) in cui ogni elemento iesimo e' la distanza tra il punto iesimo e il punto (i+1)esimo, supposto pero' che
tale distanza sia minore di un valore di soglia inserito da tastiera.


Ragazzi, quello che ho scritto sopra è il testo di un esercizio che sto provando a svolgere(utilizzando il dev c++).
Ho provato a svolgere i tre punti, ma qualcosa non va ( non so dove siano gli errori...) durante la fase di compilazione.
VI riporto il codice:


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

void riempi_vettore (float *v, int size);
void copia_funzione (float *a, float *x, float *y, int size);

int main (void) {
int n, dist_size,i;
float *a, *x, *y, soglia, *dista;



printf ("Inserisce da tastiera la dimensione del vettore \n");
scanf("%d", &n);

a=(float*)malloc(n*sizeof(float));
riempi_vettore ( a, n);
copia_funzione ( a, x, y, n);

printf (" Inserire un valore di soglia \n");
scanf ("%f", &soglia);

dist_size = crea_vettore ( x, y, n, dista, soglia);
for (i = 0; i < dist_size;i++)
printf ("dista[%d] = %f\n", i, dista[i]);


system("pause");
}

void riempi_vettore (float *v, int size){
int i;

for (i=0; i<size; i++) {
v[i]=(rand()%1500)+1;
printf (" stampa vettore v[%d]=%f \n", i, v[i]);
}
}

void copia_funzione ( float *a, float *x, float *y, int size){
int i,j;
for (i=0, j=0;i<size;j++, i++) {
x[j]=a[i];
y[j]=a[i+1];
printf (" Gli elementi dei vettori sono x[%d]=%f, y[%d]=%f \n", j,x[j], j, y[j]);
}

}

double distanza ( int x0, int y0, int x1, int y1){

return (sqrt((x0-x*1)*(x0-x1)+(y0-y1)*(y0-y1)));
}
float crea_vettore ( float *x, float *y, int size, float *dist, float soglia) {
int i, j;
float distance;
j=0;
for (i=0; i<size; i++) {

distance = distanza (x[i], y[i], x[i+1], y[i+1]);

if (distance < soglia) {
dist[j]=distance;
j++;
}
return j;
}
}

Il riempimento del vettor a[]con valori casuali ( attraverso la funzione riempi) va bene, tutto funziona.
I problemi principali nascono ne momento in cui devo creare i due vettori x e y con i valori di a...
Potreste spiegarmi come si deve procedere, qual è il ragionamento per poterli riempire?

Vi ringrazio.

Marco1995
14-05-2013, 22:58
Nella funzione copia_funzione non allochi dinamicamente lo spazio per l'array e questo provoca il crash.All'interno del main dovresti prevedere una malloc di almeno n/2 elementi dato che,da quel che ho capito,gli elementi presenti nel primo vettore devono essere spartiti fra gli altri due vettori.

P.s. Potresti usare dei nomi un pò più significativi

P.p.s. Fossi in te inizierei col rivedermi la funzione copia_funzione che dal punto di vista logico non credo faccia quello che deve.

bad.alex
17-05-2013, 04:22
ok, lo farò. grazie marco :-)

Loading