Newsgroup: it.comp.lang.c++
Titolo: Dov'è l'errore????

Salve sono un ragazzo di quindici anni e mi sono recentemente avvicinato al
mondo della programmazione. Con le poche conoscenze che possiedo ho cercato
di scrivere un programma che selezionasse i tre valori piu' alti di una
serie definita dall'utente e ne facesse la media. Credevo di saperlo fare,
nonostante l'esercizio relativo chiedeva un programma che trovasse i tre
numeri piu' alti su cinque....
Ecco il codice in questione:                                               
                      Ringrazio anticipatamente
 
                             Luca Cittadini
 
 
pcitt...@getnet.it
 
--------------------------------------------
#include <iostream.h>
#include "vector.h"
int main ()
{
 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++;
 }                    
 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;
   }
  }
  Somma=0;
  for (i=0;i<N;i++)
  {
   Somma=Somma+Numeri[i];
  }
  Media=Somma / 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 è "<<Media<<endl;
 return(0);
};   
------------------------------------------------------------------
Dopo aver immesso tutti i valori Numeri[N], mi dice che ho tentato di usare
l'elemento N (il valore che do a N) di un vettore che ha soli tre
elementi..... perché?????????????????

elementi..... perché?????????????????
Perche`, come ho evidenziato in queste righe che cito, all'interno
del loop dove porti i da 0 a 3 escluso hai un altro loop dove i va
da 0 a N... usa per il loop interno un indice diverso da i!
Naturalmente, per trovare i K numeri piu` grandi del vettore, e`
meglio usare la funzione della libreria standard (dall'header
<algorithm>, con Selezione gia` dimensionato a K elementi):
    partial_sort_copy(
        Numeri.begin(), Numeri.end(),
        Selezione.begin(),Selezione.end(),
        greater<int>());
(per il template greater<>, ti serve anche l'header <functional>),
pero` capisco che, a livello didattico, sia importante anche che
uno impari a implementarsi da solo le funzionalita` che la libreria
C++ standard gli offre "precotte"...!-)
Alex

Non ci ho capito un'acca, io non conosco quasi nulla del C++, non potresti
tradurre in italiano??

tradurre in italiano??
Sai, l'errore che tu hai fatto e` di C++, mica di italiano...!  Avevi
scritto,
e ripeto a memoria le righe importanti, grosso modo:
    for(i=0; i<3; i++) {
        // A: qualcosa
        for(i=0; i<9; i++) {
        // B: qualcosa d'altro
        }
        // C: qualcos'altro ancora
    }
Ora, nella zona segnata dal commento "C", la variabile i vale ovviamente
nove, perche` cosi` l'hai appena piazzata nel ciclo (interno) che subito
precede la zona "C".  Non puoi usare la stessa variabile per due cicli
*annidati* l'uno nell'altro; usa due variabili differenti!
Inoltre, e questa e` la seconda osservazione che ti facevo: la libreria
standard del C++ offre gia` la funzionalita` che stai cercando di
realizzare (l'algoritmo si chiama partial_sort_copy).  E` giusto sapere
rifare quello che la libreria ci offre di gia` fatto, ma e` anche di una
certa importanza rendersi conto che questo ha un puro valore
didattico... a parte l'imparare, non *SERVE* a nulla duplicare "a
mano" le funzioni gia` presenti in libreria.
Alex