Newsgroup: it.comp.lang.c
Titolo: Re: creazione funzione

 grazie mille a colui che mi risponderà
Si capisse la domanda :)

 [CUT]
Cioè quì il problema (traducendo quanto da te scritto) è che devi
dividere il codice
in 3 funzioni.
Beh se non sai fare una cosa del genere significa che non sai per nulla
programmare.

se chiedo aiuto è perchè sono newbie e non so farlo tutto qui...
Salvatore Di Fazio ha scritto:


 se chiedo aiuto è perchè sono newbie e non so farlo tutto qui...
Si chiede aiuto dopo averci provato e non esserci riusciti da soli. 
Altrimenti si copia il compito.
-- 
Costantino Grana 

 il programma l'ho fatto...non puoi dire che voglio copiare....
Hai fatto qualche tentativo per separarlo in 3 funzioni? Che problemi 
hai incontrato? Prova ad essere piu' specifico, posta del codice e dicci 
dove non sei riuscito a farlo funzionare e cosa non ti e' chiaro del 
problema.
Vedrai che a quel punto ti aiuteranno tutti piu' che volentieri!
E' la differenza tra "aiutarti rispondendo alle tue domande" e "fare i 
compiti al posto tuo" :)
ciao
Giacomo

      }
Questa operazione non fa quello che vorresti: non restituisce tutti i 
valori nella lista ma solo l'ultimo.
Per fare in modo che una funzione restituisca dei valori devi utilizzare 
un trucco: devi fare in modo che il main passi alla tua funzione gli 
indirizzi di memoria delle variabili in cui la funzione deve andare a 
mettere i risultati (ie dei puntatori). Quindi devi aggiungere dei 
puntatori a float ai oparametri della tua funzione e alla fine invece 
del return assegni i valori dereferenziando i puntatori stessi.
ciao
Giacomo

 float cx, float cy, float cz);
Controlla meglio: hai messo i puntatori nella funzione di scrittura (che 
non deve restituire niente) invece che in quella di calcolo.
ciao
Giacomo

 cx, float cy, float cz);
Hai dimenticato di usare parametri di tipo puntatore per poter 
restituire i parametri al main!
Andava meglio la prima versione che avevi scritto:
 > float center_grav (int n, int mat[][DIM_LOC], int vett_masse[], float
 > *cx, float *cy, float*cz)
ciao
Giacomo

 cosa dovrei fare??? grazie mille
Se non avete fatto i puntatori, voglio ben sperare che il prof non
voglia che tu li usi.
In + non esiste che il libro che stai studiando non spiega come fare
una funzione.
Neanche se è in giappofilandese!!!!

 ... se mi aiutate vi regalo un prosciutto!!!
...e vabbe'! visto che ci hai promesso un prosciutto... (o no?) :-)
~~~~~~~~~~~~~~~~~
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#define DIM_LOC 3
#define N_MIN 3
#define N_MAX 10
#define INPUT_BF_SIZE	256
int fget_point_mass(char *pFilename, int mat[][DIM_LOC], int 
vett_masse[], int *pn)
{
	char bf[INPUT_BF_SIZE];
	FILE *fp;
	int i, n, nTotMasse;
	*pn = 0;
	if(!(fp = fopen (pFilename, "r")))
	{	printf ("** Errore: file dati '%s' non trovato.\n", pFilename);
		return 0;
	}
	/* Leggi la prima riga (n = numero di elementi) */
	n = 0; /* importante: inizializzare 'n' */
	if(fgets(bf, sizeof(bf), fp))
		sscanf (bf, "%d", &n);
	if(n < N_MIN || n > N_MAX)
	{	printf("** Errore: numero di elementi %d non valido (%d...%d).\n", n, 
N_MIN, N_MAX);
		fclose(fp);
		return 0;
	}
	/* Leggi la matrice della locazione + la massa */
	nTotMasse = 0;
	for (i = 0; i < n; i++)
	{	if(!fgets (bf, sizeof(bf), fp))
			break;  /* errore di lett. oppure eof */
		if(4 != sscanf (bf, "%d %d %d %d\r\n", &mat[i][0], &mat[i][1], 
&mat[i][2], &vett_masse[i]))
			break;	/* ogni linea succ. deve avere (almeno) 4 num interi */
		nTotMasse += vett_masse[i];
	}
	if(i < n) /* non tutte le linee sono state lette (correttamente) */
	{	printf("** Errore di lettura o di formato del file dei dati.\n");
		fclose(fp);
		return 0;
	}
	if(nTotMasse == 0) /* evita una succ. div per zero */
	{	printf("** Errore: il totale delle masse e' pari a 0.\n");
		fclose(fp);
		return 0;
	}
	fclose(fp);
	*pn = n;
	return 1;
}
void center_grav(int n, int mat[][DIM_LOC], int vett_masse[], double 
*pcx, double *pcy, double *pcz)
{
	double totmasse = 0.0;
	double c1 = 0.0, c2 = 0.0, c3 = 0.0;
	int i;
	for (i = 0; i < n; i++)
	{
		totmasse += (double)vett_masse[i];
		c1 += (double)vett_masse[i] * mat[i][0];
		c2 += (double)vett_masse[i] * mat[i][1];
		c3 += (double)vett_masse[i] * mat[i][2];
	}
	assert(totmasse != 0.0);
	*pcx = c1 / totmasse;
	*pcy = c2 / totmasse;
	*pcz = c3 / totmasse;
}
void fwrite_point_mass (int n, int mat[][DIM_LOC], int vett_masse[], 
double cx, double cy, double cz)
{
	int i;
	printf("Locazioni:\n");
	for (i = 0; i < n; i++)
		printf("\t%d %d %d\n", mat[i][0], mat[i][1], mat[i][2]);
	printf("Masse:\n");
	for (i = 0; i < n; i++)
		printf("\t%d\n", vett_masse[i]);
	printf("n:\n\t%d\n\n", n);
	printf("Il centro di gravita' C e': (%.3f, %.3f, %.3f)\n\n", cx, cy, cz);
}
int main (void)
{
	int n = 0;
	double cx = 0.0, cy = 0.0, cz = 0.0;
	int vett_masse[N_MAX];
	int mat[N_MAX][DIM_LOC];
	/* inizializza i due array a 0 */
	memset(vett_masse, 0, sizeof(vett_masse));
	memset(mat, 0, sizeof(mat));
	if(!fget_point_mass("points.dat", mat, vett_masse, &n))
		return EXIT_FAILURE;
	center_grav(n, mat, vett_masse, &cx, &cy, &cz);
	fwrite_point_mass(n, mat, vett_masse, cx, cy, cz);
	/* system("pause"); */
	return(EXIT_SUCCESS);
}
~~~~~~~~~~~~~~
PS: ho seguito la tua traccia senza farmi troppe domande (per esempio: 
perche' nel file points.dat i dati sono tutti degli interi...?)
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com