Domanda Risolto Problema CICLO FOR/WHILE/ DO WHILE

iSxND

Utente Bronze
3 Luglio 2018
30
11
4
30
LA RICHIESTA DELL'ESERCIZIO ERA LA SEGUENTE:
L'ESERCIZIO è NELLA SEZIONE (WHILE, DO WHILE, FOR) quindi deduco che il metodo di risoluzione sia attraverso questi meccanismi.



Scrivere un programma che legge un certo numero di valori reali e ne stampa la media (notare che lo schema seguente fissa una serie di dettagli ulteriori non specificati nel “testo” dell’esercizio):
// stampare la stringa "Di quanti numeri vuoi fare la media?"
// dichiarare una variabile how_many di tipo int
// leggere how_many
// se how_many non è strettamente positivo
// - stampare "Errore: il numero doveva essere positivo"
// - uscire dal main ritornando il codice di errore 42
// dichiarare una variabile sum di tipo float inizializzata a 0
/* iterare how_many volte le seguenti istruzioni
- stampare un a capo seguito dalla stringa "Inserisci un numero "
- dichiarare una variabile x di tipo float
- leggere x
- assegnare a sum la somma di sum e x */
// stampare un a capo seguito dalla stringa "La media è "
// stampare la divisione di sum per how_many





C++:
#include <iostream>
using namespace std;

// Scrivere un programma che legge un certo numero di valori reali e ne stampa la media

int main()
{
int how_many;
cout << "Di quanti numeri vuoi fare la media?  ";// stampare la stringa "Di quanti numeri vuoi fare la media?"
cin >> how_many; // dichiarare una variabile how_many di tipo int
cout << "Voglio fare la media di: " << how_many << " numeri."; // leggere how_many
if (how_many <= 0){ // se how_many non è strettamente positivo
    cout << "\nErrore: il numero doveva essere positivo"; // - stampare "Errore: il numero doveva essere positivo"
    cout << "Errore 42"; // - uscire dal main ritornando il codice di errore 42
}
 // dichiarare una variabile sum di tipo float inizializzata a 0
float sum;
sum=0;

//iterare how_many volte le seguenti istruzioni --> QUA MI SONO BLOCCATO
// IL COMMENTO SAREBBE COME AVREI VOLUTO PROCEDERE,DOPO AVER RISOLTO IL PUNTO DOVE MI SONO BLOCCATO
/* 
 cout << "/nInserisci un numero: "; - // Stampare un a capo seguito dalla stringa "Inserisci un numero "
    //dichiarare una variabile x di tipo float
    cin >> X;
    cout << X;//Leggere x
    sum = x+sum;
    cout << sum;  //assegnare a sum la somma di sum e x
    cout << "/nLa media e': "; // stampare un a capo seguito dalla stringa "La media è "
    cout << sum / how_many;
*/
}
 
Ultima modifica:
Ciao.

Noto subito un errore nella prima parte del testo per quanto riguarda i commenti.
Attento che quando scrivi
cin >> how_many; // dichiarare una variabile how_many di tipo int
cout << "Voglio fare la media di: " << how_many << " numeri."; // leggere how_many
nella prima riga non stai dichiarando una variabile ma la stai leggendo, mentre nella seconda non la stai leggendo (perchè l'hai letta prima) ma la stai stampando per dire di quanti numeri vuoi fare la media.

Riguardati la prima parte di codice:
C++:
#include <iostream>
using namespace std;
int main(){
    int how_many;     //Inizializzo la variabile
    cout << "Di quanti numer vuoi fare la media?";
    cin >> how_many;    //Leggo how_mahy
    cout << "Voglio fare la media di " << how_many <<" numeri." << endl; //Stampo di quanti numeri volgio fare la media
    if (how_many<=0)    //Se how_many non strettamente positivo stampo messaggio di errore
        cout << "Errore: il numero doveva essere positivo." << endl << "Errore 42";
    else{
         ...     //continua tu
   }
}

Nell'esle devi continuare tu. Dal momento in cui devi chiedere "how_many" numeri di cui fare la media puoi scegliere arbitrariamente quale dei tre cicli seguire (while, do while o for).
Io personalmente ho utilizzato il for, ma è indefferente. Ragiona su come impostarli. Ricorda che devi iterare il ciclo how_many volte.

Prova a completare e a ripostare il codice.

EDIT:
Noto che anche nella seconda parte sbegli nell'inizializzare le variabili e nel leggerle...
Per inizializzare una variabile utilizzi una riga di codice come la seguente: Tipo Variabile = num; (esempio: int x = 0; float y = 123; )
Per leggere una variabile utilizzi una riga di codice come la seguente: cin >> variabile; (esempio: cin >> x; cin >> y; )
 
Non riesco proprio a capire come iterare howmany, so che posso creare loop con for ma non riesco a capire il metodo di utilizzo come in questo caso

C++:
#include <iostream>
using namespace std;

#include <iostream>
using namespace std;
int main(){
    int how_many;     //Inizializzo la variabile
    cout << "Di quanti numer vuoi fare la media?";
    cin >> how_many;    //Leggo how_mahy
    cout << "Voglio fare la media di " << how_many <<" numeri." << endl; //Stampo di quanti numeri volgio fare la media
    if (how_many<=0)    //Se how_many non strettamente positivo stampo messaggio di errore
        cout << "Errore: il numero doveva essere positivo." << endl << "Errore 42";
    else{
         float sum=0;
        cout << "\nInserisci un numero ";
        float x;
        cin >> x;
    }
        for (how_many; 
            cout << sum+x;
   }
}
 
Un for lo iteri così

for(<condizione iniziale>; <condizione finale>; <incremento>)

le condizioni sono le seguenti:
inziale: i = how_many
finale: i > 0
incremento: i--

OPPURE

iniziale: i = 0
finale: i < how_many
incremento: i++

Così ti è più chiaro?
 
  • Mi piace
Reazioni: iSxND
Il problema è che io non conosco in anticipo il numero di volte per il quale il ciclo si dovrà ripetere

C++:
#include <iostream>
using namespace std;
const float CM2FOOT = 0.324;

int main(){
char A;
cout << "Di quanti numeri vuoi fare la media? ";
int how_many;
cin >> how_many;
if (how_many<0)
    cout << "Errore: il numero doveva essere positivo: " << how_many << "Errore 42" << endl;
else
    float sum;
    sum = 0;
while(how_many!=x){
    float x;
    cin >> x;
    cout << "\nInserisci un numero ";
}

    sum = sum+x;
    cout << "/nLa media è: "; << sum/how_many;
}
 
IL CODICE COSI FUNZIONA, a livello di sintassi va bene?

C++:
#include <iostream>
using namespace std;

int main(){
    cout << "Di quanti numeri vuoi fare la media?";
    int how_many;
    cin >> how_many;
        if(how_many<0){
            cout << "\nErrore: il numero doveva essere positivo: " << how_many << " Errore 42";
        }

        float sum=0;
        float i;
        for(i = 0; i < how_many; i++){
            cout << "\nInserisci un numero: ";
            int x;
            cin >> x;
            sum += x;
            }
        cout << "\nLa media e': " << sum/how_many;
}

il += cosa va a definire?
 
Ultima modifica:
C++:
int main()
{
    cout << "Di quanti numeri vuoi fare la media?" << flush; // se non metti endl, metti flush; o il messaggio potrebbe rimanere nel buffer e non venir stampato
    int how_many;
    cin >> how_many;
    if (how_many <= 0) { // "non _strettamente_ positivo"
        cout << "\nErrore: il numero doveva essere positivo: " << how_many << " Errore 42" << flush;
        return 0;
    }

    int sum = 0;
    for (int i = 0; i < how_many; i++) {
        int x;
        cout << "\nInserisci un numero: " << flush;
        cin >> x;
        sum += x;
    }
    cout << "\nLa media e': " << sum/(float)how_many << endl;
    return 0;
}
In software grossi, mantenere il codice pulito e ben ordinato è importante. Qui trovi delle buone regole di stile: https://www.kernel.org/doc/html/latest/process/coding-style.html
Sono per il C, ma le adatti facilmente al C++.
Quando apri un blocco di codice (parentesi graffe), e anche se il blocco è implicito (if/ciclo con singola istruzione dentro), il corpo dovrebbe essere indentato di un livello rispetto al codice fuori dal blocco. La parentesi di chiusura deve essere allo stesso livello del codice esterno.
Corretto:
C++:
if (condizione)
        fai_questo();

fai_qualcosa();

while (condizione) {
        if (condizione)
                fai_qualcosaltro();
        fai_quello();
        fai_altro();
}
Sbagliato:
C++:
if (condizione)
fai_questo(); // non è chiaro che fa parte del blocco dell'if

        fai_qualcosa(); // indentazione inutile

while (condizione) {
                if (condizione) // due livelli di indentazione, ne basta uno
        fai_qualcosaltro(); // dovrebbe essere indentato di due livelli perché sia chiaro che fa parte dell'if e non solo del while
                fai_quello(); // due livelli di indentazione, ne basta uno
                fai_altro();
        } // non dovrebbe essere indentato: dovrebbe stare allo stesso livello del while