Ordinare in ordine decrescente output codice?

di Anonimizzato15736 il
88 risposte
Salve a tutti,

sto creando un programma per la tesi e siccome non sono molto pratico di programmazione mi sono bloccato.

Vi spiego il problema in sintesi.

Il numero di clienti è un valore casuale e anche la domanda di tot pezzi che essi richiedono.
Sono riuscito a far tutto fin qui ma una volta che attraverso il ciclo for per i che va da 1 al numero di clienti il programma mi stampa a schermo tutte le domande dei clienti, come faccio a sommare tutte le domande che vengono fuori per controllare che la loro somma sia inferiore ad un certo valore?

vi posto anche il programma scritto fin ora.

#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
int rack;
int slot;
int domanda_tot;
int domanda_cliente;
int i;
int clienti;//ho definito clienti come intero almeno c++ mi prende direttamente la parte intera inferiore
srand((unsigned)time(NULL));//per inizializzare la funzione rand()
rack = rand() % (11) + 5;
cout<<"Numero di rack = "<<rack<<endl;
cout<<endl;
slot = rand ()%(11)+20;
cout<<"Numero di slot per rack = "<<slot<<endl;
cout<<endl;
domanda_tot=slot*rack;
cout<<"Domanda totale che il sistema sopporta = "<<domanda_tot<<endl;
cout<<endl;
clienti= rand()%((2*(domanda_tot/slot)-(domanda_tot/slot))+1)+(domanda_tot/slot);
cout<<"Numero di clienti = "<<clienti<<endl;
cout<<endl;

for (i=1;i<=clienti;i++)
{
domanda_cliente=rand()%(slot-(slot/2)+1)+(slot/2);
cout<<"Domanda cliente "<<i<<" = "<<domanda_cliente<<endl;

}

cout<<endl;
system("PAUSE");
return 0;

}



Spero in una vostra risposta.

Saluti e buona serata

88 Risposte

  • Cioè vuoi sommare le variabili domanda_cliente?
    Se è così ti dichiari una variabile
    int somma_domande = 0;
    prima del ciclo for e poi dentro la incrementi in questo modo
    
    ...
    domanda_cliente=rand()%(slot-(slot/2)+1)+(slot/2);
    somma_domande += domanda_cliente;
    
    Al termine del ciclo for, la variabile contiene la somma che volevi.
  • Perfetto grazie mille .
  • Scusatemi ancora ma perchè il programma mi si è impazzito??non si ferma più...dove ho sbagliato??


    #include <cstdlib>
    #include <iostream>

    using namespace std;

    int main()
    {
    int istanti_di_tempo;
    int numero_di_prove;
    int rack;
    int slot;
    int domanda_tot_sistema;
    int domanda_cliente;
    int i;
    int t;
    int totale;
    int clienti;//ho definito clienti come intero almeno c++ mi prende direttamente la parte intera inferiore
    cout<<"Quanti istanti di tempo vuoi considerare? ";
    cin>>istanti_di_tempo;
    cout<<endl;
    cout<<"Quante prove vuoi fare? ";
    cin>>numero_di_prove;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    for(t=1;t<=istanti_di_tempo;t++)
    {
    cout<<"Prova "<<t<<endl;
    cout<<endl;
    cout<<endl;
    srand((unsigned)time(NULL));//per inizializzare la funzione rand()
    rack = rand() % (11) + 5;
    cout<<"Numero di rack = "<<rack<<endl;
    cout<<endl;
    slot = rand ()%(11)+20;
    cout<<"Numero di slot per rack = "<<slot<<endl;
    cout<<endl;
    domanda_tot_sistema=slot*rack;
    cout<<"Domanda totale che il sistema sopporta = "<<domanda_tot_sistema<<endl;
    cout<<endl;
    clienti= rand()%((2*(domanda_tot_sistema/slot)-(domanda_tot_sistema/slot))+1)+(domanda_tot_sistema/slot);
    cout<<"Numero di clienti = "<<clienti<<endl;
    cout<<endl;
    totale=0;
    etichetta:
    for (i=1;i<=clienti;i++)
    {
    domanda_cliente=rand()%(slot-(slot/2)+1)+(slot/2);
    cout<<"Domanda cliente "<<i<<" = "<<domanda_cliente<<endl;
    totale+=domanda_cliente;
    if(totale>=domanda_tot_sistema)
    goto etichetta;
    }

    cout<<endl;

    cout<<"La capacita' richiesta dal sistema e' = "<<totale<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    }


    cout<<endl;
    system("PAUSE");
    return 0;

    }
  • La colpa è di quel goto (che tra l'altro non dovresti utilizzare perché è veramente old style).
    Se la domanda del primo cliente è superiore alla capacità il programma torna indietro e riparte con il ciclo, ma se la domanda è ancora superiore alla capacità il programma torna indietro, eccetera. Ecco il tuo ciclo infinito.

    Dovresti rivedere un po' la logica del codice...
  • Cosa mi suggerisci di utilizzare al posto del goto??
  • Daniloo ha scritto:


    cosa mi suggerisci di utilizzare al posto del goto??
    Ad esempio un do-while
    
    do {
        qualcosa;
    } while (devo_ripetere);
    
    Ma il problema secondo me è un altro. Nel senso che anche con il while "torni indietro" (cioè esegui nuovamente una parte di codice): devi però stare attento a non finire in un ciclo infinito. L'osservazione sul goto era più che altro di tipo stilistico, ma qui secondo me c'è qualcosa che non va a livello di logica.
  • Forse ho capito il problema.
    Probabile che totale non si resettava e quindi il suo valore non partiva da zero quando tornava all etichetta??
  • Sì, quello è sicuramente vero! Adesso almeno il programma sembra terminare normalmente. Poi sarai tu a valutare se i risultati sono corretti oppure no...
  • Grazie mille per la disponibilità
  • Figurati! Se hai ancora bisogno siamo qui.
  • Scusami se ti disturbo.
    Non capisco perchè ogni volta che mi esegue una nuova prova, i valori random sono sempre gli stessi e non cambiano, come mai?? invece in ogni istante di tempo variano e va bene così.
    Ti inserisco il codice, un po modificato


    #include <cstdlib>
    #include <iostream>

    using namespace std;

    int main()
    {
    int istanti_di_tempo;
    int numero_di_prove;
    int rack;
    int slot;
    int domanda_tot_sistema;
    int domanda_cliente;
    int i;
    int p;
    int t;
    int totale;
    int clienti;//ho definito clienti come intero almeno c++ mi prende direttamente la parte intera inferiore
    cout<<"Quanti istanti di tempo vuoi considerare? ";
    cin>>istanti_di_tempo;
    cout<<endl;
    cout<<"Quante prove vuoi fare? ";
    cin>>numero_di_prove;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    for(p=1;p<=numero_di_prove;p++)
    {
    cout<<"PROVA "<<p<<endl;
    cout<<endl;
    cout<<endl;
    srand((unsigned)time(NULL));//per inizializzare la funzione rand()
    rack = rand() % (11) + 5;
    cout<<"Numero di rack = "<<rack<<endl;
    cout<<endl;
    slot = rand ()%(11)+20;
    cout<<"Numero di slot per rack = "<<slot<<endl;
    cout<<endl;
    domanda_tot_sistema=slot*rack;
    cout<<"Domanda totale che il sistema sopporta = "<<domanda_tot_sistema<<endl;
    cout<<endl;
    clienti= rand()%((2*(domanda_tot_sistema/slot)-(domanda_tot_sistema/slot))+1)+(domanda_tot_sistema/slot);
    cout<<"Numero di clienti = "<<clienti<<endl;
    cout<<endl;

    for (t=1;t<=istanti_di_tempo;t++)
    {
    cout<<"Istante di tempo "<<t<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    etichetta:
    totale=0;
    for (i=1;i<=clienti;i++)
    {

    domanda_cliente=rand()%(slot-(slot/2)+1)+(slot/2);
    totale+=domanda_cliente;
    if(totale>=domanda_tot_sistema)
    {
    goto etichetta;
    }
    cout<<"Domanda cliente "<<i<<" = "<<domanda_cliente<<endl;
    }

    cout<<endl;

    cout<<"La capacita' richiesta dal sistema e' = "<<totale<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    }
    }


    cout<<endl;
    system("PAUSE");
    return 0;


    }
  • La srand la devi fare una sola volta all'inizio del main.

    P.S. Per favore usa i tag CODE altrimenti il codice è difficile da leggere.
  • Non lo sapevo scusami.
    Comunque funziona grazie

    Unico problema??
    delle volte fa il ciclo infinito, dopo aver fatto piu tentativi funziona.

    Non saprei come risolvere
    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int istanti_di_tempo;
        int numero_di_prove;
        int rack;
        int slot;
        int domanda_tot_sistema;
        int domanda_cliente;
        int i;
        int p;
        int t;
        int totale;
        int clienti;//ho definito clienti come intero almeno c++ mi prende direttamente la parte intera inferiore
        srand((unsigned)time(NULL));//per inizializzare la funzione rand()
        cout<<"Quanti istanti di tempo vuoi considerare? ";
        cin>>istanti_di_tempo;
        cout<<endl;
        cout<<"Quante prove vuoi fare? ";
        cin>>numero_di_prove;
        cout<<endl;
        cout<<endl;
        cout<<endl;
        cout<<endl;
             for(p=1;p<=numero_di_prove;p++)
             {
                    cout<<"PROVA "<<p<<endl;
                    cout<<endl;
                    cout<<endl;                               
                    rack = rand() % (11) + 5;
                    cout<<"Numero di rack = "<<rack<<endl;
                    cout<<endl;
                    slot = rand ()%(11)+20;
                    cout<<"Numero di slot per rack = "<<slot<<endl;
                    cout<<endl;
                    domanda_tot_sistema=slot*rack;
                    cout<<"Domanda totale che  il sistema sopporta = "<<domanda_tot_sistema<<endl;
                    cout<<endl;
                    clienti= rand()%((2*(domanda_tot_sistema/slot)-(domanda_tot_sistema/slot))+1)+(domanda_tot_sistema/slot);
                    cout<<"Numero di clienti = "<<clienti<<endl;
                    cout<<endl;
                    cout<<endl;
                    cout<<endl;
                    
                          for (t=1;t<=istanti_di_tempo;t++)
                          {
                               cout<<"Istante di tempo "<<t<<endl; 
                               cout<<endl;
                               cout<<endl;
                               cout<<endl;
                               etichetta:
                               totale=0;        
                                   for (i=1;i<=clienti;i++)
                                   {
                               
                                        domanda_cliente=rand()%(slot-(slot/2)+1)+(slot/2);
                                        totale+=domanda_cliente;
                                        if(totale>=domanda_tot_sistema)
                                        {
                                        goto etichetta;
                                        }
                                        cout<<"Domanda cliente "<<i<<" = "<<domanda_cliente<<endl;
                                    }
            
                               cout<<endl;
           
                               cout<<"La capacita' richiesta dal sistema e' = "<<totale<<endl;
                               cout<<endl;
                               cout<<endl;
                               cout<<endl;
                               cout<<endl;
                               cout<<endl;
                               cout<<endl;
                           }
        }
    
                             
        cout<<endl;
        system("PAUSE");
        return 0;
        
    
    }
    
  • Visto che il problema si presenta saltuariamente, direi che è colpa della randomizzazione. Sei sicuro che tutti i parametri che imposti siano corretti?
    Ad esempio
    clienti = rand() % ((2 * (domanda_tot_sistema / slot) - (domanda_tot_sistema / slot)) + 1)
    				+ (domanda_tot_sistema / slot);
    e
    domanda_cliente = rand() % (slot - (slot / 2) + 1) + (slot / 2);
    Queste cose le devi guardare tu perché non hanno a che fare con la sintassi del linguaggio, ma proprio con la logica di quello che vuoi fare.
Devi accedere o registrarti per scrivere nel forum
88 risposte