+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 2 su 2

[C++] Ciclo do-while

  1. #1
    lsn88 non è in linea Novello
    Buongiorno a tutti, sono un novizio della programmazione in c++ (ho iniziato da qualche settimana) e così mi trovo di fronte a svariati problemi, che sicuramente saranno banali. Quello che voglio sottoporvi riguarda un programmino che devo fare, il quale deve risolvere una semplice equazione e stampare i valori delle ascisse e delle ordinate ad intervalli di 0.02. Fin qui tutto bene, però il problema nasce perchè in questa equazione ci sono ben 7 parametri (d1,d2,d3,d4,d5,d6,d7 tutti >0 e la cui somma deve obbligatoriamente risultare =1) che devono essere inseriti di volta in volta dall'utente. Se il parametro da inserire fosse unico non avrei problemi, ma in questo caso mi trovo di fronte a qualche inghippo:

    come fare se l'utente mi inserisce un valore dei parametri maggiore di 1, a farlo automaticamente tornare ad un nuovo tentativo quel per quel parametro?Perchè nel mio caso il compilatore li fa inserire tutti, e poi solo alla fine mi dice che ho sbagliato!e soprattutto alla fine, dopo avermi detto che ho sbagliato, non mi riporta ad un nuovo tentativo ma mi chiude il programma!!

    vi riporto il codice del programma

    #include<iostream> 
    #include<math.h> 
    #include<cmath> 
    usingnamespace std; 
    class equazione 
    { 
    public: 
    double calcola_y (double x) {return 0.5*x*d1*d2*d3*d4*d5*d6*d7;}; 
    double d1,d2,d3,d4,d5,d6,d7;
    }; 
    int _tmain(int argc, _TCHAR* argv[]) 
    {
    double d1,d2,d3,d4,d5,d6,d7;
    bool input_valido = false;
    cout << "Inserisci i valori di d1,d2,d3,d4,d5,d6,d7 (tutti >0) facendo in modo che la loro somma sia uguale a 1:" << endl;
    {
    do 
    {
    cout << "Inserisci il valore di d1" << endl;
    cin >> d1;
    if ( cin.good() == false) 
    { 
    cout << "Devi inserire un numero!" << endl;
    cin.clear(); 
    cin.ignore(256,'\n');
    } 
    else if (d1 <= 0)
    {
    cout << "Il valore di d1 deve essere > 0!" << endl;
    }
    else
    {
    input_valido = true; 
    } 
    } while ( input_valido == false);
    do
    {
    cout << "Inserisci il valore di d2" << endl;
    cin >> d2;
    if ( cin.good() == false) 
    { 
    cout << "Devi inserire un numero!" << endl;
    cin.clear(); 
    cin.ignore(256,'\n');
    }
    else if (d2 <= 0)
    {
    cout << "Il valore di d2 deve essere > 0" << endl;
    }
    else
    {
    input_valido = true;
    }
    } while ( input_valido == false);
    do
    {
    cout << "Inserisci il valore di d3" << endl;
    cin >> d3;
    if ( cin.good() == false) 
    { 
    cout << "Devi inserire un numero!" << endl;
    cin.clear(); 
    cin.ignore(256,'\n');
    } 
    else if (d3 <= 0)
    {
    cout << "Il valore di d3 deve essere > 0" << endl;
    }
    else
    {
    input_valido = true;
    }
    } while ( input_valido == false);
    do
    {
    cout << "Inserisci il valore di d4" << endl;
    cin >> d4;
    if ( cin.good() == false) 
    { 
    cout << "Devi inserire un numero!" << endl; 
    cin.clear(); 
    cin.ignore(256,'\n');
    } 
    else if (d4 <= 0)
    {
    cout << "Il valore di d4 deve essere > 0" << endl;
    }
    else
    {
    input_valido = true;
    }
    } while ( input_valido == false);
    do
    {
    cout << "Inserisci il valore di d5" << endl;
    cin >> d5;
    if ( cin.good() == false) 
    { 
    cout << "Devi inserire un numero!" << endl; 
    cin.clear(); 
    cin.ignore(256,'\n');
    }
    else if (d5 <= 0)
    {
    cout << "Il valore di d5 deve essere > 0" << endl;
    }
    else
    {
    input_valido = true;
    }
    } while ( input_valido == false);
    do
    {
    cout << "Inserisci il valore di d6" << endl;
    cin >> d6;
    if ( cin.good() == false) 
    { 
    cout << "Devi inserire un numero!" << endl; 
    cin.clear(); 
    cin.ignore(256,'\n');
    } 
    else if (d6 <= 0)
    {
    cout << "Il valore di d6 deve essere > 0" << endl;
    }
    else
    {
    input_valido = true;
    }
    } while ( input_valido == false);
    do
    {
    cout << "Inserisci il valore di d7" << endl;
    cin >> d7;
    if ( cin.good() == false) 
    { 
    cout << "Devi inserire un numero!" << endl; 
    cin.clear(); 
    cin.ignore(256,'\n');
    } 
    else if (d7 <= 0)
    {
    cout << "Il valore di d7 deve essere > 0" << endl;
    }
    else
    {
    input_valido = true;
    }
    } while ( input_valido == false);
    }
    if (d1+d2+d3+d4+d5+d6+d7 != 1)
    {
    cout << "I valori inseriti non rispettano le condizioni iniziali!" << endl;
    system("PAUSE");
    return 0;
    }
    else
    {
    input_valido = true;
    }
    cout << "prova"; 
    equazione miafunzione; 
    for (double xc = 0; xc <= 1; xc = xc + 0.02) 
    { 
    double y = miafunzione.calcola_y(xc); 
    cout << xc << " " << y; 
    cout << endl; 
    } 
    system("PAUSE"); 
    return 0; 
    }
    
    grazie a tutti in anticipo
    Ultima modifica di lsn88; 11-03-2011 14:35 

  2. #2
    L'avatar di bottomap
    bottomap non è in linea Amanuense
    Ciao,

    Ti invito a formattare ed indentare correttamente il codice e ad usare i tag appositi [code] e [/code]. Nelle ultime settimane questa sembra essere diventata una brutta moda da parte dei newbies ed è bene stabilire subito una linea di confine. Non prenderla come una cosa personale ma è il caso di fermare questo tipo di comportamento sul nascere.

    Puoi trovare indicazioni sulla questione qui: Indentazione - Wikipedia
    E anche nell'annuncio in evidenza in questa sezione: http://forum.masterdrive.it/c-c-21/c...r-forum-44216/
    Fatte salve tutte le altre voci del regolamento ufficiale: Netiquette - MasterDrive.it Wiki

    Detto questo il primo e più importante consiglio è quello di modularizzare il codice e scrivere delle funzioni di input piuttosto che tutto nella main. Se la main è più lunga di qualche decina di righe diventa difficile leggerla, gestirla e correggerla (se poi manca ogni forma di indentazione figurati quanti aiuti puoi ricevere). Una sequenza così lunga di if-else e do-while è di per sé mal congegnata.
    Struttura delle funzioni di input apposite, e visto che gli input d1-d7 sono tutti omogenei tra loro (saranno valori comunque in virgola mobile minori di 1 e - immagino ma non l'hai specificato - strettamente maggiori di zero) puoi cavartela con sette chiamate alla stessa funzione, risparmiando tempo e spazio. Queste chiamate poi le potrai inserire in una while/for/ciclo qualsiasi che le effettua a sette per volta e verifica la somma, reiterando l'inserimento delle otto coordinate in caso la somma dei coefficienti non sia uguale ad uno.

    Visto poi che i valori sono davvero omogenei e che le operazioni finali sono lineari potresti anche:
    - calcolare via via valori intermedi (invece che d1*d2*d3... quando hai tutti i valori, puoi moltiplicare ad ogni passo per il prodotto calcolato fin li)
    - utilizzare un vettore invece che sette variabili diverse

    Ciaociao
    ℹ️ Leggi di più su bottomap ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. ciclo for next
    Da sasy_80 nel forum Microsoft Access
    Risposte: 8
    Ultimo Post: 17-10-2013, 23:31
  2. Innescare un ciclo Do a seguito di un altro ciclo do... ?
    Da Dls369 nel forum Microsoft Excel
    Risposte: 3
    Ultimo Post: 16-03-2012, 20:18
  3. Ciclo DO dentro un altro ciclo DO
    Da Arcor nel forum Microsoft Word
    Risposte: 4
    Ultimo Post: 22-06-2011, 00:10
  4. interrompere ciclo for dentro un ciclo while
    Da pippok nel forum Visual Basic 6
    Risposte: 7
    Ultimo Post: 13-06-2011, 09:42
  5. ciclo for
    Da moro nel forum Altri linguaggi e strumenti
    Risposte: 1
    Ultimo Post: 08-03-2009, 10:12