Media Mobile

di Anonimizzato18375 il
16 risposte
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

  • Mostra quello che hai fatto...
  • 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.
  • 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).
  • 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.
  • Ma se n è 5 devi sommare i primi 5 e non i primi 10

    Capisci?
  • 
    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 ?
  • 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).
  • 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;
    }
    
  • 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 ?
  • L'array non c'entra nulla e tutto quel codice lo eviti con due for annidati
  • 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.
  • 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.
  • 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.
  • 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