Newsgroup: it.comp.lang.c++
Titolo: Riusciro' a ottenere un programma funzionante?

Questo e' il codice di un programma ideato per fare la media di una serie
di numeri definita dall'utente e dmostrarne i tre valori piu' alti. Lo so
che e' molto lungo e tutto si puo' sintetizzare in un partial_sort_copy, ma
dato che questa cosa me l'hanno detta e che io per adesso conosco solo if e
for, vi prego di correggermelo senza aggiungere funzioni strane e spiegando
in commenti ogni correzione (sbagliando si impara....). Fornisco il codice
e un esempio di input con corrispondente output sotto:
#include <iostream.h>
#include "vector.h"
int main ()
{ 
 short variabile;
 short Somma;
 short Media;  
 short AltoN;
 short AltoI;
 short k;
 short i;
 short N;
 cout<< "Quanti numeri vuoi inserire ? ";
 cin>> N;
 vector <short> Numeri(N);  
 vector <short> Selezione(3);
 for (i=0;i<N;)
 { 
  cout<< "Inserire il valore numero "<<i+1<<":";
  cin>> Numeri[i];
  if (Numeri[i]<=0)
  { 
   cout<< "Mi dispiace ma "<<Numeri[i]<<" non e' un peso valido";
   cout<<endl;
  }
  else
  i++;
  Somma=0;
 }
 for (i=0;i<3;i++)
 {
  AltoN=0;
  AltoI=0;
  for (k=0;k<N;k++)
  {
   if (Numeri[k]>AltoN)
   {
    AltoN=Numeri[k];
    AltoI=k;
   }
  }
  for (variabile=0;variabile<N;variabile++)
  {
   Somma=Somma+Numeri[variabile];
  }
  Media=Somma /(2*N);
  Selezione[i]=AltoN;                          
  Numeri[AltoI]=0;
 }
 cout<<"Il numero piu' alto era...  "<<Selezione[0]<<endl;
 cout<<"Il secondo numero piu' alto era...  "<<Selezione[1]<<endl;
 cout<<"Il terzo numero piu' alto era...  "<<Selezione[2]<<endl;
 cout<<"La media tra i valori era... "<<Media<<endl;
 return(0);
};   
-----------------------------------------------------------
esempio:
Quanti numeri vuoi inserire? 5
Inserisci il valore numero 1:5
Inserisci il valore numero 2:5
Inserisci il valore numero 3:5
Inserisci il valore numero 4:5
Inserisci il valore numero 5:5
Il numero piu' alto era.... 5
Il secondo numero piu' alto era.... 5
Il terzo numero piu' alto era.... 5
La media tra i valori era.... 6          /*Qualcosa di strano ci deve
essere ! */

La media tra i valori era.... 6          /*Qualcosa di strano ci deve
Allora, segui un po' -- le righe cruciali del tuo programma,
che scorporo qui da tutte le altre, sono...:
  Somma=0;
    // snippo
for (i=0;i<3;i++) {
    // snippo
  for (variabile=0;variabile<N;variabile++)
   Somma=Somma+Numeri[variabile];
  Numeri[AltoI]=0;
}
  Media=Somma /(2*N);
Quindi, riassumendo: tu esegui per tre volte la
seguente operazione: aggiungi a Somma la
somma di tutti i numeri del vettore, poi azzeri
il piu` alto dei numeri del vettore (AltoI e`
l'indice, che hai trovato nella parte snippata,
appunto del numero piu` alto).  E` complicato,
in generale, decidere cosa finira` in Somma a
causa di queste complesse operazioni, comunque
nel caso d'esempio che tu dai:
    25 (5*5, prima passata) piu`
    20 (5*4+0, la seconda) piu`
    15 (5*3+2*0, la terza)
totale 60.  Il che, diviso per 2*5=10, da` appunto
6, come empiricamente osservi.
Se in Somma vuoi calcolare appunto la
somma del tuo vettore, fallo UNA volta, NON
tre, quindi con un ciclo separato da quello
che compi tre volte per trovare i tre numeri
piu` grandi.  Dopo di che, per avere la media,
dividi la somma per N, *non* per 2N che non
c'entra nulla.
Alex