Media Mobile

di il
16 risposte

Media Mobile

Buona Domenica !
Vorrei un aiuto per risolvere il caso della media mobile in linguaggio C.
La media mobile a 5 valori prevede, che si sommino i numeri da 1 a 5, e si ottenga la media.
Poi si aggiunga il sesto numero e si tolga il primo numero, in modo da avere una media sempre di 5 numeri. E cosi via.
Ci sto provando da solo, per cui mi serve solo un'indicazione, non il codice pronto.

Saluti.

16 Risposte

  • Re: Media Mobile

    Mostra quello che hai fatto...
  • Re: Media Mobile

    OK
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main()
    {
       	int vet[10] = {0};
        int i, h, n;
        double somma = 0;
        double media = 0;
        i = 0;
        h = 0;
        n = 0;
       
       	printf("\n quanti numeri per la media mobile ?  ");
       	scanf("%d", &n);
       	
        for(i=0; i<10; i++)
    	{
        	printf("\n\n inserisci dieci numeri nel vettore:  ");
        	scanf("%d", &vet[i]);
    	}
       
        for(i=0; i<10; i++)
    	{
           	h++;
            printf("\n\n visualizza l'elemento %d del vettore, con valore %d",h-1,vet[i]);
    	}
     
     	printf("\n\n");
       		
       	for(i=0;i<10;i++)
       	{
       		somma+=vet[i];
       		media=somma/n;
       		printf("\n la media mobile e' %0.2lf", media);
    	}
    
    	return 0;
        system("pause");
    }
    
    Con questo codice riesco ad ottenere una media "crescente".
    Manca solo di capire come togliere il primo valore ed aggiungere quello nuovo.
  • Re: Media Mobile

    Se utilizzi sempre 10 come limite nei cicli per sommare gli elementi, che senso ha dividere per n?

    Dopo il return NON sono eseguite altre istruzioni (la system è inutile).
  • Re: Media Mobile

    Per il system, mi era sfuggito.

    Per quanto riguarda il numero 10 nei for, quello è il limite fin dove deve arrivare il calcolo della media.
    Il valore n riguarda di quanti valori dev'essere la media mobile, come detto all'inizio della discussione.
  • Re: Media Mobile

    Ma se n è 5 devi sommare i primi 5 e non i primi 10

    Capisci?
  • Re: Media Mobile

    
    for(i=0;i<n;i++)
          	{
    		somma+=vet[i];
             	media=somma/n;
             	printf("\n la media mobile e' %0.2lf", media);
       		}
    
    sistemando la condizione con i<n, ottengo una media che parte da 0, e fa la media per il primo numero diviso n=5; poi fa la somma dei primi due numeri e divide per n=5, e così via. Non proprio quello che cerco.

    La media mobile deve sommare i primi 5 numeri e farne la media dividendo con n=5.
    Poi aggiunge il sesto numero, toglie il primo numero e divide per n=5.
    Poi aggiunge il settimo numero, toglie il secondo numero, e divide per n=5.

    Vorrei solo un'indicazione... serve un doppio ciclo for ?
  • Re: Media Mobile

    La media si fa fuori dal ciclo. Il ciclo ti serve per sommare i dati. La divisione va fatta fuori.

    Il ciclo deve andare da 0 a n-1 e ottieni la somma. Fuori dal ciclo dividi per 5.
    Poi il ciclo deve andare da 1 a n e poi dividi sempre per 5.
    Poi il ciclo va da 2 a n+1 ... e dividi per 5 ...

    Così via fino al ciclo che va da 5 a 9 ... (dato che il vettore è di 10).
  • Re: Media Mobile

    Inserisco il codice della media mobile, un pò lunghino (credevo ci fosse una soluzione più corta, ma questo codice lungo funziona).
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define max 10
    int main()
    {
        int vet[10] = {0};
        int i, h, n,j;
        double somma = 0;
        double media = 0;
        i = 0;
        j = 0;
        h = 0;
        n = 0;
       
        printf("\n quanti numeri per la media mobile ?  ");
        scanf("%d", &n);
          
        for(i=0; i<max; i++)
        {
            printf("\n\n inserisci dieci numeri nel vettore:  ");
            scanf("%d", &vet[i]);
        }
       
        for(i=0; i<max; i++)
        {
            h++;
            printf("\n\n visualizza l'elemento %d del vettore, con valore %d",h-1,vet[i]);
        }
     	
        printf("\n\n");
             
        	for(i=0;i<max-5;i++){
        		somma+=vet[i];}
        	media=somma/n;
        	printf("\n la media mobile e' %0.2lf", media);
    	somma=0;
        	for(i=1;i<max-4;i++){
        		somma+=vet[i];}
        	media=somma/n;
       	printf("\n la media mobile e' %0.2lf", media);
    	somma=0;
        	for(i=2;i<max-3;i++){
        		somma+=vet[i];}
        	media=somma/n;
        	printf("\n la media mobile e' %0.2lf", media);
    	somma=0;
        	for(i=3;i<max-2;i++){
        		somma+=vet[i];}
        	media=somma/n;
        	printf("\n la media mobile e' %0.2lf", media);
    	somma=0;
        	for(i=4;i<max-1;i++){
        		somma+=vet[i];}
        	media=somma/n;
        	printf("\n la media mobile e' %0.2lf", media);
    	somma=0;
    	for(i=5;i<max;i++){
    		somma+=vet[i];}
    	media=somma/n;
        	printf("\n la media mobile e' %0.2lf", media);
       	
    	printf("\n\n");
    	system("pause");
       	return 0;
    }
    
  • Re: Media Mobile

    Sarebbe possibile risolvere la media mobile con un paio di array ?
    Cioè creare un array di numeri di cui fare la media vet[10]={1,2,3,4,5,6,7,8,9,10} e n[5]={5,5,5,5,5}
    e poi fare la media mobile ?
  • Re: Media Mobile

    L'array non c'entra nulla e tutto quel codice lo eviti con due for annidati
  • Re: Media Mobile

    Sul web ho trovato questo codice sulla media mobile:
    
    #include <iostream>
    using namespace std;
    const int N = 10;		// scrive un numero ogni 10
    int main ()
    {
      	double ultimi[N];
      	int conto = 1;
    
      	while (cin >> ultimi[N-1])
        {
        	if (conto < N)
    			conto += 1;
          	else
     	{
    		double somma = 0;
    		for (int i = 0; i < N; i++)
    		    somma += ultimi[i];
      			cout << somma/N << '\n';
    	}
        	for (int i = 0; i < N-1; i++)
    			ultimi[i] = ultimi[i+1];
        }
    	printf("\n\n");
    	system("pause");
      	return 0;
    }
    
    Si arriva al decimo valore, poi compare la media, e man mano che si aggiungono nuovi valori, tipo l'undicesimo, si toglie il primo e cosi via.

    E' interessante come ci si possa arrivare alla media mobile da più punti di vista.

    Questo codice è TUTTO DA STUDIARE !!!

    Saluti a tutti.
  • Re: Media Mobile

    Questo codice è banale, altro che "tutto da studiare".

    Il calcolo della somma nella prima for è quello che ti suggerivo di fare, con il calcolo della media subito dopo, FUORI dalla for.

    La seconda for serve a shiftare i dati nel vettore di un elemento a sinistra, per far posto al nuovo elemento posto alla fine.
    ( in realtà sarebbe meglio scrivere qualcosa come memmove (ultimi,ultimi+1,sizeof(int)*(N-1)); al posto della for)

    Ma il tuo codice, forse non l'avevi compreso neanche tu che l'avevi scritto, si fondava su un altro assunto.
    Ovvero che i nuovi dati NON arrivassero da tastiera (come in questo codice) ma che fossero già presenti nel vettore come parte ECCEDENTE quelli trattati nella media. Ovvero, tu fai la media di 5 elementi ma ne prevedi 10 presuppondendo che quelli in più siano quelli nuovi che entrano.

    Quando scrivi codice, devi capire quello che fai, non devi cercare qui e lì codice già fatto che si basa su altri presupposti o non segue quello che tu vuoi fare. E' un difetto che hai mostrato in tutti i tuoi thread. Ti fidi troppo del codice che trovi su internet senza capire quello che scrivi tu. Così non impari.
  • Re: Media Mobile

    Oltre il mio codice (che ho capito come funzionava) ne ho trovato un altro che parte da un altro assunto.
    Per questo mi piace.
    Più punti di vista aiutano a capire meglio.
  • Re: Media Mobile

    Un punto di vista è un modo di vedere uno stesso problema.

    Qui hai due soluzioni a due problemi diversi.

    Va beh ... come non detto.
Devi accedere o registrarti per scrivere nel forum
16 risposte