Ordinare in ordine decrescente output codice?

di il
18 risposte

Ordinare in ordine decrescente output codice?

Salve a tutti,

innanzitutto buon anno .
Ho creato il seguente codice che mi genera per un certo numero di istanti di tempo e per un certo numero di prove la domanda casuale di un certo numero di clienti anch'esso casuale che varia per ogni prova, mentre la domanda di ogni cliente varia per ogni istante di tempo.
#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    ofstream f("C:\Domande programma tesi.txt",ios::out);
    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; 
                f<<"PROVA "<<p<<endl;
                f<<endl;
                f<<endl;                                   
                rack = rand() % (11) + 5;
                cout<<"Numero di rack = "<<rack<<endl;
                cout<<endl;
                f<<"Numero di rack = "<<rack<<endl;
                f<<endl;
                slot = rand ()%(11)+20;
                cout<<"Numero di slot per rack = "<<slot<<endl;
                cout<<endl;
                f<<"Numero di slot per rack = "<<slot<<endl;
                f<<endl;
                domanda_tot_sistema=slot*rack;
                cout<<"Domanda totale che  il sistema sopporta = "<<domanda_tot_sistema<<endl;
                cout<<endl;
                f<<"Domanda totale che  il sistema sopporta = "<<domanda_tot_sistema<<endl;
                f<<endl;
                int domanda_min;
                int clienti_max;
                int clienti_min;
                domanda_min=slot/3;
                clienti_max=(domanda_tot_sistema/(domanda_min));
                clienti_min=domanda_tot_sistema/slot;
                clienti= rand()%(clienti_max-clienti_min+1)+clienti_min;
                cout<<"Clienti MIN = "<<clienti_min<<endl;
                cout<<endl;
                cout<<"Clienti MAX = "<<clienti_max<<endl;
                cout<<endl;
                cout<<"Numero di clienti = "<<clienti<<endl;
                cout<<endl;
                cout<<"Domanda MIN = "<<domanda_min<<endl;
                cout<<endl;
                cout<<"Domanda MAX = "<<slot<<endl;
                cout<<endl;
                cout<<endl;
                cout<<endl;
                f<<"Clienti MIN = "<<clienti_min<<endl;
                f<<endl;
                f<<"Clienti MAX = "<<clienti_max<<endl;
                f<<endl;
                f<<"Numero di clienti = "<<clienti<<endl;
                f<<endl;
                f<<"Domanda MIN = "<<domanda_min<<endl;
                f<<endl;
                f<<"Domanda MAX = "<<slot<<endl;
                f<<endl;
                f<<endl;
                f<<endl;
                
                      for (t=1;t<=istanti_di_tempo;t++)
                        {
                           cout<<"Istante di tempo "<<t<<endl; 
                           cout<<endl;
                           cout<<endl;
                           cout<<endl;
                           f<<"Istante di tempo "<<t<<endl; 
                           f<<endl;
                           f<<endl;
                           f<<endl;
                           totale=0;
                           int new_slot;
                           int new_domanda_min;
                           int new_domanda_tot_sistema;
                           new_slot=slot;
                           new_domanda_min=domanda_min;
                           new_domanda_tot_sistema=domanda_tot_sistema;
                           for (i = 1; i<= clienti; i++) 
                               {  
                                  
                                cout<<"DOMANDA MINIMA = "<<new_domanda_min<<endl;
                                cout<<"DOMANDA MASSIMA = "<<new_slot<<endl;
                                cout<<"SLOT = "<<new_slot<<endl;
                                f<<"DOMANDA MINIMA = "<<new_domanda_min<<endl;
                                f<<"DOMANDA MASSIMA = "<<new_slot<<endl;
                                f<<"SLOT = "<<new_slot<<endl;
                                domanda_cliente = rand() % (new_slot-new_domanda_min+1)+(new_domanda_min);
                                new_domanda_tot_sistema=new_domanda_tot_sistema-domanda_cliente;
                                totale=totale+domanda_cliente;
                                new_slot=new_domanda_tot_sistema/rack;
                                new_domanda_min=new_slot/3;
                                cout <<"Domanda cliente " << i << " = " << domanda_cliente << endl;
                                cout<<endl;
                                cout<<endl;
                                f<<"Domanda cliente " << i << " = " << domanda_cliente << endl;
                                f<<endl;
                                f<<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;
                           f<<"La capacita' richiesta dal sistema e' = "<<totale<<endl;
                           f<<endl;
                           f<<endl;
                           f<<endl;
                           f<<endl;
                           f<<endl;
                           f<<endl;
                        }            
           }
if(!f)
{
cout<<"Errore nella scrittura del file";
return 1;//termina il programma in anticipo
}
cout<<"Scrittura avvenuta con successo!!!";
    cout<<endl;
    system("PAUSE");
    return 0;

}
Il problema è il seguente.
Siccome voglio ordinare in ordine decrescente la domanda per ogni cliente per ogni istante di tempo e per ogni prova, penso la cosa più logica da fare sia inserire la domanda dei clienti generata in un vettore.
Purtroppo non so dove mettere mano per inserire la domanda nel vettore; ho letto sul manuale ma non è che ci abbia capito molto.
Prima di tutto dovrei generare un vettore della dimensione dei clienti.
Comincerei in questo modo
int domanda_clienti [clienti]
poi come fare per inserire le domande create dal codice nel vettore?

Grazie a tutti

18 Risposte

  • Re: Ordinare in ordine decrescente output codice?

    Allora, innanzitutto dobbiamo parlare del tipo di vettore. Vuoi un array statico oppure dinamico? Generalmente si raccomanda l'utilizzo dei vector (dinamici) ma se già conosci la dimensione che il vettore dovrà avere e vuoi tenerti un po' sul semplice, allora puoi usare anche un array statico.

    Poi, se dichiari un array come hai fatto tu, significa che ci sono tante celle quanti sono i clienti. Se però ad ogni cliente vogliamo assegnare un certo numero di prove, allora le cose si complicano un po': dobbiamo ricorrere ad array multidimensionali (array di array, array di array di array, ...) oppure dobbiamo inventare una struttura dati che contenga in un unico oggetto tutte le prove fatte da ogni cliente.

    Prova a ragionarci un po' su...
  • Re: Ordinare in ordine decrescente output codice?

    Allora la dimensione del vettore varia ad ogni prova, poichè si che la dimensione è sempre il numero di clienti, ma quest ultimi variano in ogni prova.
    Io direi di utilizzare un solo array non uno multidimensionale dato che avrei intenzione di procedere in questo modo:
    Inserisco la domanda nel vector faccio l ordinamento eseguo le varie operazioni sul vettore e poi utilizzerei un ciclo for per ogni istante di tempo.
  • Re: Ordinare in ordine decrescente output codice?

    Ok, ti posto un semplice codice che ti mostra come ordinare un array oppure un vettore con l'algoritmo "Bubble Sort". Non si tratta di un algoritmo efficiente, ma è molto semplice e se non devi ordinare migliaia di elementi direi che va benissimo.
    
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    // Funzione che ordina un array
    void bubble_sort(int array[], int dim) {
    	bool rifare = true;
    	int tmp;
    
    	while (rifare) {
    		rifare = false;
    		for (int i = 0; i < dim - 1; ++i) {
    			if (array[i] < array[i + 1]) {
    				// scambio gli elementi
    				tmp = array[i];
    				array[i] = array[i + 1];
    				array[i + 1] = tmp;
    				rifare = true;
    			}
    		}
    	}
    }
    
    // Funzione che ordina un vettore
    void bubble_sort(vector<int>& vettore) {
    	bool rifare = true;
    	int tmp;
    
    	while (rifare) {
    		rifare = false;
    		for (unsigned int i = 0; i < vettore.size() - 1; ++i) {
    			if (vettore[i] < vettore[i + 1]) {
    				// scambio gli elementi
    				tmp = vettore[i];
    				vettore[i] = vettore[i + 1];
    				vettore[i + 1] = tmp;
    				rifare = true;
    			}
    		}
    	}
    }
    
    int main() {
    
    	// con un array
    	int array[10] = { 4, 5, 1, 2, 6, 7, 8, 9, 3, 10 };
    
    	// o con un vettore
    	vector<int> vettore;
    	vettore.push_back(4);
    	vettore.push_back(5);
    	vettore.push_back(1);
    	vettore.push_back(2);
    	vettore.push_back(6);
    	vettore.push_back(7);
    	vettore.push_back(8);
    	vettore.push_back(9);
    	vettore.push_back(3);
    	vettore.push_back(10);
    
    	// ordino l'array
    	bubble_sort(array, 10);
    
    	// stampo l'array. Attenzione: C++11
    	for (auto x : array) {
    		cout << x << endl;
    	}
    
    	cout << endl;
    
    	// ordino il vettore
    	bubble_sort(vettore);
    
    	// stampo il vettore. Attenzione: C++11
    	for (auto x : vettore) {
    		cout << x << endl;
    	}
    
    	return 0;
    }
    
    Nel codice trovi anche la funzione push_back, così vedi come si utilizza.
    Se hai qualche dubbio, scrivi pure.
  • Re: Ordinare in ordine decrescente output codice?

    Aggiungo un altro metodo che nasconde completamente l'algoritmo di ordinamento: puoi definire una funzione
    
    bool maggiore_di(int i, int j) {
    	return (i>j);
    }
    
    e poi nel codice fare semplicemente
    
    sort(vettore.begin(), vettore.end(), maggiore_di);
    
    In questo modo non devi nemmeno scrivere il codice per il bubble sort. Devi solo ricordarti di aggiungere
    
    #include <algorithm>
    
  • Re: Ordinare in ordine decrescente output codice?

    Perfetto ti ringrazio.
    Però non ho capito come inserire nel vettore la domanda creata dall codice creato in precedenza.
    Nel tuo caso ho visto che i valori erano conosciuti in precedenza, io invece vorrei che una volta creati vengano inseriti direttamente in un vettore o un array.
    e' possibile farlo?
  • Re: Ordinare in ordine decrescente output codice?

    Beh certo... io ho messo dei valori che già conoscevo. Tu avrai i tuoi risultati in una qualche variabile (domanda_tot_sistema o qualcosa del genere) e farai
    
    vettore.push_back(domanda_tot_sistema);
    
  • Re: Ordinare in ordine decrescente output codice?

    Perfetto ora ci provo Grazie
  • Re: Ordinare in ordine decrescente output codice?

    Prego, poi facci sapere.
  • Re: Ordinare in ordine decrescente output codice?

    Ma devo scrivere vettore o posso sostituirci un nome a piacere?
  • Re: Ordinare in ordine decrescente output codice?

    Puoi metterci il nome che vuoi...
  • Re: Ordinare in ordine decrescente output codice?

    Ragionandoci un pò, misà ho detto qualcosa di sbagliato.
    E' possibile creare un vettore delle domande create per ogni istante di tempo e per ogni prova?
  • Re: Ordinare in ordine decrescente output codice?

    Daniloo ha scritto:


    Ragionandoci un pò, misà ho detto qualcosa di sbagliato.
    E' possibile creare un vettore delle domande create per ogni istante di tempo e per ogni prova?
    Per quello ti avevo parlato degli array (o vettori) multidimensionali...
    Comunque la risposta è: certo!
    Esempi:
    
    int array_multi [dim1][dim2];
    vector<vector<int> > vettore_multi;
    
    Il primo è un array di array, mentre il secondo è un vettore di vettori, e io consiglio il secondo approccio. Se vuoi andare oltre le due dimensioni, puoi benissimo aggiungerne quante vuoi.
  • Re: Ordinare in ordine decrescente output codice?

    Potresti farmi vedere come implementarlo nel mio codice??
    Scusami ma non ci riesco proprio
    Me ne servirebbe uno per ogni prova di dimensioni

    clienti*istanti di tempo
  • Re: Ordinare in ordine decrescente output codice?

    Personalmente vorrei evitare di mettere mano al tuo codice, visto che ci capisco poco e rischierei di fare solo danni. Invece ho preparato un esempio che mostra come puoi utilizzare un vettore di vettori di vettori, quindi una sorta di vettore tridimensionale. Niente di complicato, solo un po' di "scatole cinesi".
    
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main()
    {
        vector<vector<vector<int> > > tridim;
        
        int clienti = 10;
        int istanti = 6;
        int prove = 4;
        int il_risultato = 1;
        
        // diciamo che il primo indice rappresenti i clienti, il
        // secondo gli istanti di tempo e il terzo le prove
        
        for(int i=0; i<clienti; ++i) {
            vector<vector<int> > v_istanti;
            for(int j=0; j<istanti; ++j) {
                vector<int> v_prove;
                for(int k=0; k<prove; ++k) {
                    // aggiungo il risultato al vettore delle prove
                    v_prove.push_back(il_risultato);
                }
                // aggiungo il vettore delle prove a quello degli istanti
                v_istanti.push_back(v_prove);
                
                il_risultato++; // tanto per cambiare il valore
            }
            // aggiungo il vettore degli istanti a quello "principale"
            tridim.push_back(v_istanti);
            
            il_risultato++; // tanto per cambiare il valore
        }    
        
        // Stampo tutto
        for(unsigned int i=0; i<tridim.size(); ++i) {
            cout << "Cliente " << i << endl;
            for(unsigned int j=0; j<tridim[i].size(); ++j) {
                cout << "Istante " << j << endl;
                for(auto x : tridim[i][j]) {
                    cout << x << endl;
                }
                cout << endl;
            }
            cout << endl;
        }
    
        return 0;
    }
    
Devi accedere o registrarti per scrivere nel forum
18 risposte