[C] struct per calcolare centro di massa

di il
4 risposte

[C] struct per calcolare centro di massa

Salve a tutti, sono alle prime armi con la programmazione e non riesco a risolvere questo problema. Devo calcolare il centro di massa di un sistema di punti e ho sviluppato questo programma.

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

// definisco la struttura 

typedef struct CentroMassa {
	double x,y;
	double massa;
	struct CentroMassa * prox;
} centro;

// funzione che crea nuovi nodi
centro * riempi_centro(double a, double b, double c) {
  	centro * nuovo_centro;
  	nuovo_centro = (centro *) malloc(sizeof(centro));
  	if (nuovo_centro == NULL) {
    		exit(EXIT_FAILURE);
  	}
  	nuovo_centro->x = a;
  	nuovo_centro->y = b;
	nuovo_centro->massa = c;
	return nuovo_centro;
}

	
		
int main() {

int K = 50;

printf("Inserire %d dati:\n", K);

centro * testa = NULL;
double valore_x = 1;
double valore_y = 1;
double valore_massa = 1;

int i=1;
while(i <= K) {
	i++;
	scanf("%lf", &valore_x);
	scanf("%lf", &valore_y);
	scanf("%lf", &valore_massa);
	
	centro * nuovo_centro = riempi_centro(valore_x, valore_y, valore_massa);
    	nuovo_centro->prox = testa;	
    testa = nuovo_centro;
  }


centro origine = {0, 0, 0};

int j;
for(j = 1; j <= K; j++) {	// l'errore è qui
	origine.x += centro.x * centro.massa;
	origine.y += centro.y * centro.massa;
	origine.massa += centro.massa;
}

origine.x /= origine.massa;
origine.y /= origine.massa;

printf("La coordinata x del CDM è %lf\n", origine.x);
printf("La coordinata y del CDM è %lf\n", origine.y);


return 0;
}
Il problema è che nel ciclo for mi dà errore "expected expression before 'centro' " .. non capisco cosa sbaglio. Grazie in anticipo per l'aiuto

4 Risposte

  • Re: [C] struct per calcolare centro di massa

    Quella che stai usando è una lista semplicemente concatenata, considerato quello che devi fare e considerato che sei alle prime armi, non sarebbe meglio utilizzare un array di struct?
    In ogni caso:
    - la struct la chiamerei punto dal momento che il centro di massa lo stai calcolando rispetto ad un sistema di punti materiali;
    - la funzione riempi_centro() la chiamerei aggiungi_centro() (o meglio aggiungi_punto() considerando quanto detto prima) e gli affiderei il compito di aggiungere un nuovo nodo in testa alla lista. In base ai suddetti consigli il codice diventerebbe qualcosa del genere:
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct punto_
    {
        double x;
        double y;
        double m;
        struct punto_ *next;
    }   punto;
    
    void aggiungi_punto(punto **testa, double X, double Y, double M)
    {
        punto* nuovo;
        nuovo = malloc(sizeof(punto));
        nuovo->x = X;
        nuovo->y = Y;
        nuovo->m = M;
        nuovo->next = *testa;
        *testa = nuovo;
    }
    
    int main()
    {
        punto* testa = NULL;
        double X;
        double Y;
        double M;
        unsigned int i;
        unsigned int n = 50;
        printf("INSERIRE %d DATI:\n", n);
        for(i = 0; i < n; ++i)
        {
            printf("x -->");
            scanf("%lf", &X);
            printf("y -->");
            scanf("%lf", &Y);
            printf("m -->");
            scanf("%lf", &M);
            aggiungi_punto(&testa, X, Y, M);
        }
        punto origine = {0, 0, 0, NULL};
        for(i = 0; i < n; ++i)
        {
            origine.x += punto.x * punto.m;
            origine.y += punto.y * punto.m;
            origine.m += punto.m;
        }
        origine.x /= origine.m;
        origine.y /= origine.m;
        printf("x(CDM) = %lf\n", origine.x);
        printf("y(CDM) = %lf\n", origine.y);
        return 0;
    }
    - per quanto riguarda il problema all'interno del for, cosa rappresenta "centro"? Prova a compilare il seguente codice e leggi l'errore che ti riporta:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int n;
        n = int + int;
        return 0;
    }
    Altra domanda... dove sono andati a finire i K centri che hai inserito da tastiera? Come fai se vuoi conoscere la massa relativa al ventesimo centro?
  • Re: [C] struct per calcolare centro di massa

    Grazie mille per la risposta, come avrei potuto definire un array di struct in questo caso?
    comunque ho capito l'errore... "centro" è un tipo, quindi avrei dovuto definire una variabile di tipo "centro" e usare quella per il for. sono riuscita a calcolare il centro di massa così:
    
    punto sum;
    sum.m = 0;
    sum.x = 0;
    sum.y = 0;
        for(i = 1; i <= n; ++i)
        {
            scanf("%lf", &X);
            scanf("%lf", &Y);
            scanf("%lf", &M);
            aggiungi_punto(&testa, X, Y, M);
    	sum.m += M;
    	sum.x += X*M;	
    	sum.y += Y*M;
        }
     
    printf("massa totale = %lf\n", sum.m);
    
    sum.x /= sum.m;
    sum.y /= sum.m;
    printf("x(CDM) = %lf\n", sum.x);
    printf("y(CDM) = %lf\n", sum.y);
    
    
  • Re: [C] struct per calcolare centro di massa

    Centro è un tipo no?
    Quindi come per creare un array di interi fai int array[n], così per creare un array di quelle strutture devi fare centro array[n]
  • Re: [C] struct per calcolare centro di massa

    ibisblu ha scritto:


    sono riuscita a calcolare il centro di massa così: ...
    Se lo scopo del programma è solo quello di calcolare il CDM allora non c'è bisogno di nessuna struttura dati (array o lista) per archiviare gli n punti inseriti da tastiera. Basta fare qualcosa del genere (che è più o meno quello che hai fatto tu nell'ultimo codice):
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        double x = 0;
        double y = 0;
        double m = 0;
        double X;
        double Y;
        double M;
        unsigned int n = 5;
        printf("INSERIRE %d DATI:\n", n);
        for(unsigned int i = 0; i < n; ++i)
        {
            printf("x -->");
            scanf("%lf", &X);
            printf("y -->");
            scanf("%lf", &Y);
            printf("m -->");
            scanf("%lf", &M);
            x += X * M;
            y += Y * M;
            m += M;
        }
        x /= m;
        y /= m;
        printf("x(CDM) = %lf\n", x);
        printf("y(CDM) = %lf\n", y);
        printf("m(CDM) = %lf\n", m);
        return 0;
    }
    Se invece il calcolo del CDM non è il fine, ma il mezzo per esercitarsi sulle liste, allora dovresti rivedere il codice e rispondere alle 2 questioni che ho sollevato nel precedente post:

    Nippolo ha scritto:


    dove sono andati a finire i K centri che hai inserito da tastiera? Come fai se vuoi conoscere la massa relativa al ventesimo centro?
Devi accedere o registrarti per scrivere nel forum
4 risposte