Newsgroup: it.comp.lang.c++
Titolo: Problema!!!

Ciao a tutti!!!!!!
Ho un piccolo problema:
 vorrei dimensionare un array inserendo da tastiera la dimensione (cioe'
se io digito 5  mi si dovrebbe creare un array di 5 valori, se digito 20 di
20 valori ecc.)ma  purtroppo non riesco...
Esempio se io voglio fare la media di 5 numeri e un domani devo fare la
media di 40 numeri come faccio?
C'e' qualcuno che mi puo' aiutare? Grazieeee...

 media di 40 numeri come faccio?
Per fare la media non avresti neppure bisogno di salvare i tuoi
numeri in alcun modo, visto che ti basta il loro totale e il loro
conteggio, ad esempio (sempre supponendo che tu abbia i dovuti
#include e using all'inizio del tuo programma):
    double mediaditutti(istream& ist) {
        double totale = 0.0;
        int conteggio = 0;
        double attuale;
        while(ist >> attuale) {
            totale += attuale;
            ++conteggio;
        }
        if(conteggio == 0) throw "nessun numero???";
        return totale/conteggio;
    }
Comunque, supponiamo pure che tu debba invece raccogliere
tutti i numeri immessi, allo scopo poi di calcolarci su svariate
cose (media, minimo, massimo, momenti, ...).  Un vector e`
lo strumento ideale.  Precisamente:
    void leggitutti(istream& ist, vector<double>& tutti) {
        double attuale;
        while(ist >> attuale)
            tutti.push_back(attuale);
    }
Per leggere ad esempio tutti i double da standard input,
chiamerai:
    vector<double> letti;
    leggitutti(std::cin, letti);
Per il calcolo, ad esempio, della media, su di un tale vector:
    double lamedia(const vector<double>& tanti) {
        if(tanti.empty()) throw "nessun numero???";
        int conteggio=tanti.size();
        double totale=0.0;
        for(int i=0; i<conteggio; ++i)
            totale += tanti[i];
        return totale/conteggio; 
    }
(ci sono molti altri approcci equivalenti, basati su iteratori
e/o sull'uso delle funzioni pre-cotte che ottieni comodamente
con un #include <algorithm>, ma anche questo va bene!).
Alex

 media di 40 numeri come faccio?
Allora basta memorizzare solo la somma e contare di volta in volta il numero
di cifre che inserisci.
Ah, serve un modo per sapere se l'utente ha terminato di digitare numeri.
--
Alessandro Monti

  vorrei dimensionare un array inserendo da tastiera la dimensione
Devi utilizzare gli array dinamici:
int *mioArray = new int [ n ];
dove n č inserito da tastiera. Lo puoi utilizzare nel solito modo
mioArray[ i ] = valore;
e
std::cout << mioArray[ i ] << std::endl;
Non dimenticare, dopo l'utilizzo, di distruggerlo:
delete [] mioArray;
Ancora meglio potresti utilizzare il tipo std::vector:
#include <vector>
...
vector < int > mioVettore( 10 );
Puoi utilizzarlo come fosse un array oppure con i tanti altri metodi che
offre. E non ha neanche bisogno di distruzione esplicita.
EMG

C'e' qualcuno che mi puo' aiutare? Grazieeee...
Cioé,si,insomma, vorresti dimensionare un array dinamicamente.
Sfortunatamente non puoi fare cosi':
cin<<dims;
int array[dims];
Ma puoi utilizzare i puntatori:
cin<<dims;
int * array=new int[dims];
Ecco adesso lo puoi utilizzare senza problemi.Ad esempio:
array[3]= 40;
Ovviamente una volta finito di utilizzare il puntatore cancellalo
dalla memoria:
delete [] array;
Ciao!!!
Il Ghenio

    }
Tutto perfetto, tranne per il fatto che il compilatore da un errore
"Division by zero" quando la variabile 'conteggio' é uguale a 0. 
Forse é meglio fare cosi':
double lamedia(const vector<double>& tanti) 
{
    if(tanti.empty()) throw "nessun numero???";
    int conteggio=tanti.size();
    double totale=0.0;
    for(int i=0; i<conteggio; ++i)
    totale += tanti[i];
    if(conteggio==0)return 0;
    else return totale/conteggio; 
}
Ciao.
Il Ghenio

     if(conteggio==0)return 0;
Cosa credi che le abbiano introdotte a fare, le
exception, in C++...???
Alex

estremamente serio.
Si trattava di Borland C++ Builder 3.0, versione standard.
Il Ghenio

 wrote in message news:JVVZOOUOgBSs0v...@4ax.com...

Allora, a quanto sentii a suo tempo quando la versione 3.0
era quella corrente, e` probabile che il bug sia specificamente
nella versione, con esso distribuita, delle librerie standard
del linguaggio C++; scommetterei che e` nella empty()
piuttosto che non nella size().
Come workaround ti suggerirei di sostituire il codice:
    if(tutti.empty()) throw "qualcosa";
    int conteggio = tutti.size():
con quello, che in mancanza di bug sarebbe eguale:
    int conteggio = tutti.size():
    if(!conteggio) throw "qualcosa";
Naturalmente, il chiamante che chiedesse la media di
un vettore che potrebbe essere vuoto deve usare
try/catch se prevede questo caso eccezionale, o
altrimenti e` meglio terminarlo, se non lo prevede,
prima che combini chissa` che disastri.  E` questa
la filosofia delle exception in C++.
Alex

Grazie, era proprio quello che mi serviva!
Ciao.
--
Diego Pettenň
diego...@hotmail.com
May the Force be with you!

E per il C++ Builder 1.0? Posso creare i programmi con il BCB e poi
compilarli con lcc-win32?
Per i bug di BCB, basta cercare sui seguenti siti: 
www.borland.com
;
www.inprise.com
; 
www.inprise.it
 e si trova sembre quello che si cerca.
