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!
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

OnyOscuro

Nuovo Utente
21 Gen 2011
8
0
0
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
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

OnyOscuro

Nuovo Utente
21 Gen 2011
8
0
0
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
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

OnyOscuro

Nuovo Utente
21 Gen 2011
8
0
0
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
Autore Titolo Forum Risposte Data
E Il punto di riferimento italiano per Trailers cavalli Discussioni Varie 0
F punto interrogativo Javascript 1
A nome file che contiene punto passato come parametro a query PHP 31
L un punto ogni tot. speso PHP 0
C [PHP] Punto su mappa PHP 0
F [Javascript] chiusura popup e refresh pagina madre su punto preciso Javascript 0
G A che punto è della pagina jQuery 0
U div fisso che ad un certo punto dello scroll scompare jQuery 3
C Trovare coordinate del quadrato intorno ad un punto centrale conoscendo la distanza PHP 1
V uft-8 e punto interrogativo HTML e CSS 2
K visualizzare risultato di ajax in un punto ben preciso.... Ajax 2
N CSV doppi apici e punto e virgola da Excel tramite PHP PHP 2
N Aggiungere codice in preciso punto PHP 2
V Assegnazione punto giornaliero PHP 3
C Sostituire virgola con punto form PHP 2
G Usare il timbro clone da un punto ben preciso senza uscire Photoshop 2
R Ricerca risultati ner raggio di 'n' km da un punto PHP 3
M Puntare DNS: come devo configurare l'hosting dove punto i dns Hosting 1
8 Link su un punto della pagina HTML e CSS 22
S Reindirezionare l'utente in un punto della pagina Javascript 3
S [jQuery] punto tra le virgolette jQuery 2
A Aprire una index in un punto preciso PHP 5
A aprire pagina html in un punto preciso HTML e CSS 4
M Css come?: riga che si espande ma e si restringe fino a un certo punto HTML e CSS 15
A Generare un punto "nelle vicinanze " di un altro. PHP 0
max1850 Inserimento del punto e dei decimali Classic ASP 2
G Lavoro e offerta online ......il punto di incontro Presenta il tuo Sito 0
B punto o virgola nei decimali e nelle migliaia Classic ASP 1
S estrarre file da un punto iso Windows e Software 0
M invertire virgola e punto in una stringa di calcolo Javascript 1
G Tornare in un punto preciso dell'animazione! Flash 3
G Pagerank e Backlink: qual è il punto d'incontro? SEO e Posizionamento 1
B Apertura filmato swf in un punto preciso Flash 1
L Write in un determinato punto da un link senza refresh Javascript 0
C A.C.S. - Un punto di riferimento per la protezione del tuo lavoro. Presenta il tuo Sito 2
C Inserire i dati in un vettore senza ammettere duplicati C/C++ 0
StarFish Ordinamento vettore C++ C/C++ 2
V risultato di un vettore in una finestra Java 5
neo996sps [PHP + JS] vettore generato con PHP PHP 12
F stampare 3 elementi maggiori di un vettore in input Java 5
E stampa vettore e altro PHP 0
K 7 e mezzo cn vettore Programmazione 8
W Passare un vettore con querystring PHP 6
M Come sommare elementi di un vettore in Visual basic Visual Basic 1

Discussioni simili