Punto di equilibrio di un vettore [C]

OnyOscuro

Nuovo Utente
21 Gen 2011
8
0
0
Salve a tutti sto cercando di realizzare un programmino in c che mi consenta di calcolare in un vettore di interi il suo punto di equilibrio, ovvero quando la somma della parte sinistra e quella di destra, sottratte mi diano come risultato un intero il più vicino possibile a zero. Io ho fatto questo codice ma non funge come dovrebbe, qualcuno sa dirmi perché o lo sa direttamente correggere?
Codice:
#include <stdlib.h>
#include <stdio.h>
#define DIM 10;
int main()

{
   int a[10];
   int i, n;
   int somma;
   int sinistra=0;
   int destra=0;
   int differenza_minima;
   int pos_minimo;
   int differenza;

/* leggi n - numero di elementi del vettore */

   printf("Numero di elementi del vettore = ");
   scanf("%d",&n);
   if(n > 10)
    {
        printf("errore nei dati\n");
    }
    else

/* leggi   vettore */  
   {  
      for (i=0;i<n;i++)
      {
       printf("a[%d] = ",i);
       scanf("%d",&a[i]);
       }


/*somma la parte sinistra del vettore*/
/*si somma fino alla posizione n-2, visto che il vettore ha da 0 a n-1, e la posizione n-1 inizialmente deve essere assegnata a destra*/
      for (i=0;i<n-2;i++)
      {
       sinistra+=a[i];
       }

/* dopo che ha tutto in sinistra comincia da destra verso sinistra, quindi il contrario da come avevamo visto da me, e' lo stesso */
/*in sinistra abbiamo la somma di tutti gli elementi;*/
     destra=a[i];
     if(sinistra>destra) {
          differenza_minima=sinistra-destra;
     } else {
          differenza_minima=destra-sinistra;
     }
     printf("sinistra:%d destra:%d diff minima:%d pos:%d \n",sinistra,
destra, differenza_minima, pos_minimo);
     pos_minimo=n-1;
     for(i=n-2;i>=0;i--) {
          if(sinistra>destra) {
              differenza=sinistra-destra;
           } else {
              differenza=destra-sinistra;
          }
          if(differenza<differenza_minima) {
                 differenza_minima=differenza;
                 pos_minimo=i;
          }
          printf("sinistra:%d destra:%d diff minima:%d pos:%d)\n",sinistra, destra, differenza_minima, pos_minimo);
          sinistra-=a[i];
          destra+=a[i];
     }
}


   printf("Il minimo e': %d alla posizione: %d\n", a[pos_minimo],pos_minimo);

    system("pause");
    return 0;
}
Grazie in anticipo per le risposte!
 
ciao
non conosco C, ma se non ho capito male tu hai un vettore con dei dati numerici, il punto di equilibrio di qualsiasi serie numerica è la media artimetica

media = somma_dei_valori/numero_dei_valori

se fai la somma di tutti i valori <= della media e di tutti quelli => della media (sempre che i valori siano ordinati decrescenti o ascendenti) e fai la differenza tra le due somme il numero che ottieni e quello più vicino allo zero possibile
guarda che o messo maggiore o uguale a e minore o uguale perchè se la media coincide con uno dei valori numerici questo viene incluso sia a sx che a dx e quindi si annulla.

in pratica calcolata la media aritmetica del vettore ordinato, in pseudocodice
se dato_n <= media
somma_dx = somma_dx+dato_n
altrimenti
somma_sx = somma_sx+dato_n

differenza=somma_dx-somma_sx

qualsiasi altra suddivisione (calcolate le rispettive somme a dx e sx) porta ad una differenza sempre maggiore (o al max uguale) a quella calcolata sopra

se non ho capito bene butta via tutto
 
cerco di spiegarlo meglio con un esempio e con il risultato che dovrebbe uscire
dato un vettore di 5 interi che sono: 7,1,4,5,9 il codice dovrebbe lavorare cosi:
somma sx - somma dx - punto equi.
0 26 26
7 19 12
8 18 10
12 14 2
17 9 8
il punto di equilibrio in questo vettore è l'elemento nell'indice 3 del vettore (5). Notare anche che nella somma destra viene calcolato anche l'elemento che viene preso in considerazione... se non sono stato chiaro proverò ulteriormente a spiegarmi
 
ciao
stai sbagliando
1. data una serie numerica (interi o float, ordinata o meno, positivi e/o negativi) il punto di equilibrio è la media artimetica dei valori della serie
2. uno script deve avere un un valore generale , non solo per la serie che hai scritto tu (tu hai adattao la serie allo script, non lo script ad una qualsiasi serie)
secondo il tuo ragionamento quale è il punto di equilibrio della serie 15, 5, 9, 8, 12, 2 ? non è ne 8 ne 9
non mi sembra qui il posto per darti la dimostrazione matematica (semplice), dovrebbe bastarti sapere (e provare) che data una serie numerica di n valori
l'unico numero per cui

(valore_1 - numero)+(valore_2 - numero)+....+(valore_n - numero) = 0
(equivalente a quello che hai detto somma dei numeri a dx - somma di quelli a sx o che dir si voglia minori o maggiori della media)
è la media aritmetica cioe numero=(valore_1+valore_2+....+valore_n)/n
 
ok allora prendendo il tuo esempio in considerazione
la media aritmetica è 10.2 perché 15+5+9+8+12+2=51/5=10.2
secondo il mio ragionamento è l'intero che si trova in posizione 3 e quindi 8 dato che la somma dei numeri alla sua sinistra 29(15+5+9) e la somma dei numeri alla sua destra 22(8+12+2) come differenza danno 7 che è il numero più vicino allo zero
Forse questo ragionamento che voglio eseguire tramite algoritmo non si chiama punto di equilibrio e quindi è sbagliato il nome dell'argomento ma non credo che quello che voglio ottenere io sia la media aritmetica
 
ciao
anche se non ne capisco lo scopo potresti provare a fare così (sempre in pseudo codice)

dif= inizializzo la variabile inserendo la somma di tutti gli elementi del vettore
n= numero elementi del vettore
somma_sx=0
somma_dx=elemento[n-1]
#ciclo il vettore
for k=0 to n-1
#devi mettere un controlllo per k=0 poi per l'ultimo
if k > 0
for j=0 to k-1 #calcolo la somma degli elementi a sx di k-1, k escluso
somma_sx=somma_sx+elemento[j]
end for j
end if
if k < n-1
for z=k to n-1 #calcolo la somma degli elementi a dx di k, k compreso
somma_dx=somma_dx+elemento[z]
indice_k=k
end for z
end if
diff_cal=somma_sx-somma_dx
#cerco il valore minimo
if abs(diff_cal) < abs(dif) #esisterà sempre un valore di diff_cal minore di diff somma di tutti
# non so se in c esista la funzione abs = valore assoluto di un numero
dif =diff_cal
indice=indice_k
end if
end for k
e stampi la differenza diff_cal e l'indice

ripetendo lo stesso codice modificando i valori di ciclatura e attribuzione di somma_ds e sx puoi comprendere l'elemento kesimo alla somma di sx
calcolando un'altra dif e vedere se il kesimo elemento ti conviene attribuirlo alla somma di dx o di sx
prova a vedere se il ragionamento fila
 
ok grazie mille per il vostro aiuto.... seguendo un pò il tuo ragionamento e adattandolo un pò al codice è uscito questo che funziona... non lo testato completamente ma lo posto qui anche se credo che ha nessuno interessi :)
Codice:
#include <stdlib.h>
#include <stdio.h>
#define DIM 10;

int main()

{
   int a[10];
   int i, n;
   int somma;
   int sinistra=0;
   int destra=0;
   int differenza_minima;
   int pos_minimo;
   int differenza;

   /* leggi n - numero di elementi del vettore */

   printf("Numero di elementi del vettore = ");
   scanf("%d",&n);
   if(n > 10)
    {
        printf("errore nei dati\n");
    }
    else

   {  /* leggi   vettore */
      for (i=0;i<n;i++)
      {
       printf("a[%d] = ",i);
       scanf("%d",&a[i]);
       }
       
       
int total=0;
int j=0;
differenza_minima=99999999;
//CALCOLO TOTALE
for(i=0;i<n;i++){ total+=a[i];}
printf("total: %d \n",total);

//for(i=0;i<n;i++) printf("POS %d  --> VAL: %d \n",i,a[i]);

       
//INIZIO SCANSIONE VETTORE
for(i=0;i<n;i++){
//CALCOLO CODA DESTRA
destra=0;
for(j=i;j<n;j++) destra+=a[j];
//CALCOLO CODA SINISTRA
sinistra=total-destra;           

//CALCOLO DIFFERENZA
differenza=abs(sinistra-destra);  

//CONTROLLO MINIMO DIFFERENZA
if (differenza<differenza_minima){ differenza_minima=differenza; 
pos_minimo=i;}
                 
printf("POSIZIONE: %d DESTRA: %d  SINISTRA: %d  DIFFERENZA: %d \n  ",i,destra,
sinistra,differenza);
                   

}
//FINE SCANSIONE VETTORE



}


   printf("Il punto di equilibrio e': %d alla posizione: %d\n", a[pos_minimo],
pos_minimo);
   system("pause");
    return 0;
}
 

Discussioni simili