DOMANDA [C++] Tempo di esecuzione e stampa su carta

  • Autore discussione Autore discussione MPG
  • Data d'inizio Data d'inizio
Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.
Scusami poi utilizzare il mio codice per vedere se ti esce, perchè devo utilizzare quello perchè è stato cosi' insegnato il bubble sort per cui anche se ovviamente tu sei in un altro pianeta rispetto a me io devo seguire quello che ha fatto il prof, per cui riesci a fare quelle correzioni affinchè vada come il tuo? Ci ho provato sino ad ora , ma adesso sono stanco.
Fammi sapere e ti ringrazio veramente molto per il tuo aiuto.
p.s.
Ma "sort(array, array + n);" è un ordinamento tipo bubble sort?
 
Ultima modifica:
Scusami poi utilizzare il mio codice per vedere se ti esce, perchè devo utilizzare quello perchè è stato cosi' insegnato il bubble sort per cui anche se ovviamente tu sei in un altro pianeta rispetto a me io devo seguire quello che ha fatto il prof, per cui riesci a fare quelle correzioni affinchè vada come il tuo? Ci ho provato sino ad ora , ma adesso sono stanco.
Fammi sapere e ti ringrazio veramente molto per il tuo aiuto.
p.s.
Ma "sort(array, array + n);" è un ordinamento tipo bubble sort?
No è un QuickSort. Funziona comunque a prescindere dall’ordinamento o qualsiasi cosa ci sia in mezzo ai due punti. Inserisci tranquillamente il BubbleSort al posto del sort(). Se poi vuoi aggiungere stampa e inserimento puoi tranquillamente farlo ma non intaccare BubbleSort e i due punti con la stampa.

Ti ho messo il sort(...) perché volevo testarlo veramente (intendo con i tempi) e non avevo voglia di scrivermi manualmente l’algoritmo. Tieni presente che nella pratica userai sempre sort o stable_sort che sono già fatti, veloci e collaudati.
 
Guarda ho provato cosi' non mi va perchè????? Viene sempre 0 il time sort....Devo farlo andare non capisco ho solo sostituito la parte del bubble al tuo sort. Devo farlo andare con il bubble sort e il selection sort, non posso come detto usare il tuo quick sort...
Ti chiedo ultimo aiuto per capire come risolverlo, tra l'altro anche con la stampa a video dell'ordinamento.

Codice:
int main()
{
    const int n = 100;
    int vet[n];
    int tmp;
    srand(time(NULL));

    for (int i = 0; i < n; i++)
        vet[i] = rand() % 100;


    cout<<endl;
bool flag =  true;
int stop = n - 1;

auto inizio = high_resolution_clock::now();
while (flag)
{
    flag = false;
    for (int i = 0; i <= stop; i++)
        if (vet[i] > vet[i + 1])
        {

            tmp=vet[i];
            vet[i]=vet[i+1];
            vet[i+1]=tmp;
            flag = true;
        }

    stop = stop - 1;
}




    auto fine = high_resolution_clock::now();

    cout << duration_cast<duration<double>>(fine - inizio).count() << endl;

   system("pause");
}
 
Ultima modifica:
All''alba della mezzanotte dovrei essere riuscito......
Per stampare su carta quello che appare a video mi dicevi lascia stare perchè è un casino? C'è un modo semplice per farlo, penso sia creare un file.. buona notte intanto.

Codice:
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <chrono>

using namespace std;
using namespace chrono;

int main()
{
    const int n = 15;
    int vet[n];
    int tmp;
    srand(time(NULL));

    for (int i = 0; i < n; i++)
        vet[i] = rand() % 100;

   auto inizio = high_resolution_clock::now();

      cout<<endl;
bool flag =  true;
int stop = n - 1;


while (flag)
{
    flag = false;
    for (int i = 0; i <= stop; i++)
        if (vet[i] > vet[i + 1])
        {

            tmp=vet[i];
            vet[i]=vet[i+1];
            vet[i+1]=tmp;
            flag = true;
        }

    stop = stop - 1;
}
    auto fine = high_resolution_clock::now();

     cout <<duration_cast<duration<double>>(fine - inizio).count();
    cout<<endl<<endl;
    for (int i = 0; i < n; i++)
    cout<<vet[i]<<endl;

   return 0;


}
 
Ultima modifica:
All''alba della mezzanotte dovrei essere riuscito......
Per stampare su carta quello che appare a video mi dicevi lascia stare perchè è un casino? C'è un modo semplice per farlo, penso sia creare un file.. buona notte intanto.

Codice:
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <chrono>

using namespace std;
using namespace chrono;

int main()
{
    const int n = 15;
    int vet[n];
    int tmp;
    srand(time(NULL));

    for (int i = 0; i < n; i++)
        vet[i] = rand() % 100;

   auto inizio = high_resolution_clock::now();

      cout<<endl;
bool flag =  true;
int stop = n - 1;


while (flag)
{
    flag = false;
    for (int i = 0; i <= stop; i++)
        if (vet[i] > vet[i + 1])
        {

            tmp=vet[i];
            vet[i]=vet[i+1];
            vet[i+1]=tmp;
            flag = true;
        }

    stop = stop - 1;
}
    auto fine = high_resolution_clock::now();

     cout <<duration_cast<duration<double>>(fine - inizio).count();
    cout<<endl<<endl;
    for (int i = 0; i < n; i++)
    cout<<vet[i]<<endl;

   return 0;


}
Non deve starci stream dopo che dai inizio al tempo! E nemmeno allocazioni! VA SUBITO PRIMA E SUBITO DOPO
Nessuno ti ha detto di includere <algorithm>
Ma sai creare un file? Perché bisognerebbe utilizzare delle API e ti rifiuti pure di utilizzare swap, figurati impararsi delle API...
 
Non so cosa intendi per stream scusami..
NOn so se magari intendi che non dovevo mettere
auto inizio = high_resolution_clock::now();

Prima di questo
cout<<endl;
bool flag = true;
int stop = n - 1;

ma subito prima di while, ma se lo facessi (ho già provato ) non viene piu' il time sort , viene sempre 0.
Se anche tolgo solo il cout<<endl sempre 0 vien il time sort.
Io comunque questo
bool flag = true;
int stop = n - 1;

lo devo usare per indicazioni del prof dove lo metto???
Non capisco ora cosa non vada perchè funziona cosi'. A questo punto dimmi tu cosa fare , come detto devo mantenere cosa ha fatto il prof assolutamente, se riesci a farlo andare mantenendo il tutto facendo spostamenti benissimo, io non riesco piu' di cosi'...
Per il resto io non mi rifiuto di imparare, hai visto quanto sono stato dietro a questo ieri fino a tardi, è solo che non posso usare tante cose nuove non insegnate , ogni prof da' le sue indicazioni.....
Sarebbe meglio fossero prima insegnate e poi applicate...
 
Ultima modifica:
Mi intrometto un attimo, lasciando da parte i tecnicismi...

Il problema che è alla base @MPG è che molto probabilmente non hai capito ciò che avviene in nessuna di quelle righe di codice, né tantomeno nella logica del "perché" una cosa debba avvenire prima ed una dopo (e le tue domande, come "dimmi tu dove lo devo mettere" non lasciano spazio ad altri pensieri).
Secondo me dovresti metterti lì con calma, senza pressioni/ansie, e guardarti dall'inizio ciò che sino ad ora hai appreso. Magari cercando esercizi in rete, ed anche, se necessario, chiedere aiuto sul forum. In questo modo applichi ciò che stai studiando e cosa di maggior importanza sviluppi un altro modo di pensare che ti consentirà di entrare nell'ottica della programmazione.
Che poi il succo è tutto qui: puoi anche padroneggiare, per assurdo, tutta l'API di C++, ma non riuscire comunque a risolvere problemi. Il linguaggio è solo uno strumento. Ecco perché la mentalità ha la maggior importanza.

Entra poi nell'ottica che tutto ciò che userai in futuro avrà delle documentazioni e delle API (come tutte le funzioni che stai usando ora, che sono ben documentate sul reference ufficiale di C++).
Spesse volte saranno anche non proprio perfette (poi dipende anche dai linguaggi).

Inviato da ONEPLUS A5000 tramite App ufficiale di Tom\'s Hardware Italia Forum
 
Mi intrometto un attimo, lasciando da parte i tecnicismi...

Il problema che è alla base @MPG è che molto probabilmente non hai capito ciò che avviene in nessuna di quelle righe di codice, né tantomeno nella logica del "perché" una cosa debba avvenire prima ed una dopo (e le tue domande, come "dimmi tu dove lo devo mettere" non lasciano spazio ad altri pensieri).
Secondo me dovresti metterti lì con calma, senza pressioni/ansie, e guardarti dall'inizio ciò che sino ad ora hai appreso. Magari cercando esercizi in rete, ed anche, se necessario, chiedere aiuto sul forum. In questo modo applichi ciò che stai studiando e cosa di maggior importanza sviluppi un altro modo di pensare che ti consentirà di entrare nell'ottica della programmazione.
Che poi il succo è tutto qui: puoi anche padroneggiare, per assurdo, tutta l'API di C++, ma non riuscire comunque a risolvere problemi. Il linguaggio è solo uno strumento. Ecco perché la mentalità ha la maggior importanza.

Entra poi nell'ottica che tutto ciò che userai in futuro avrà delle documentazioni e delle API (come tutte le funzioni che stai usando ora, che sono ben documentate sul reference ufficiale di C++).
Spesse volte saranno anche non proprio perfette (poi dipende anche dai linguaggi).

Inviato da ONEPLUS A5000 tramite App ufficiale di Tom\'s Hardware Italia Forum


Io ho capito che auto inizio = high_resolution_clock::now(); lo devo mettere solo subito prima del while , il fatto è che cosi' non va da' il time sort 0 e non ne vengo fuori.... Il "dimmelo dove lo devo mettere" è un'esternazione perchè non so proprio cos'altro fare perchè vada tutto come deve andare cioè mantendo il codice del prof e inserendo le parti che ha indicato _Achille per il calcolo del tempo.
DispatchCode hai visto il mio code , sai sicuramente piu' di me, dimmi perchè a questo punto se metto auto inizio = high_resolution_clock::now() subito prima del while il time sort che risulta è sempre 0 a questo punto..
 
Ultima modifica:
Fatto cosi':

Codice:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <chrono>

using namespace std;
using namespace chrono;

int main()
{
    const int n = 15;
    int vet[n];
    int tmp;
    srand(time(NULL));

    for (int i = 0; i < n; i++)
        vet[i] = rand() % 100;



      cout<<endl;
bool flag =  true;
int stop = n - 1;

auto inizio = high_resolution_clock::now();
while (flag)
{
    flag = false;
    for (int i = 0; i <= stop; i++)
        if (vet[i] > vet[i + 1])
        {

            tmp=vet[i];
            vet[i]=vet[i+1];
            vet[i+1]=tmp;
            flag = true;
        }

    stop = stop - 1;
}
    auto fine = high_resolution_clock::now();
    duration diff = fine - inizio;
     cout << diff.count();

   return 0;

}

Da errore in queste due righe
duration diff = fine - inizio;
cout << diff.count();

questi motivi di errore in ordine:
44|error: missing template arguments before 'diff'|
45|error: request for member 'count' in 'diff', which is of non-class type 'int'|

A questo punto puoi inserirmi il tutto in modo che possa andare finalmente?
 
Ultima modifica:
Scoperto l'arcano!
Sia che usi il tuo metodo o quello di _Achille il time sort viene sempre 0 a meno di usare n=sopra 1700 altrimenti viene sempre 0 verosimilmente perchè il processo di sort è velocissimo.
Ecco cosa ho fatto vedendo che anche con la tua ultima istruzione (le prime due erano identiche a quella di _Achille) per valori di n tipo 100 o 200 il time sort era sempre 0, ho riprovato anche quella di _Achille utilizzando come n tipo 1700 e 1800 ed allora i tempi sono tipo 0.01455 etc.


Codice:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <chrono>

using namespace std;
using namespace chrono;

int main()
{
    const int n =1700;
    int vet[n];
    int tmp;
    srand(time(NULL));

    for (int i = 0; i < n; i++)
        vet[i] = rand() % 100;

         cout<<endl;
bool flag =  true;
int stop = n - 1;

auto inizio = high_resolution_clock::now();
while (flag)
{
    flag = false;
    for (int i = 0; i <= stop; i++)
        if (vet[i] > vet[i + 1])
        {

            tmp=vet[i];
            vet[i]=vet[i+1];
            vet[i+1]=tmp;
            flag = true;
        }

    stop = stop - 1;
}
    auto fine = high_resolution_clock::now();
    cout <<duration_cast<duration<double>>(fine - inizio).count();
 

   return 0;


}
 
Scoperto l'arcano!
Sia che usi il tuo metodo o quello di _Achille il time sort viene sempre 0 a meno di usare n=sopra 1700 altrimenti viene sempre 0 verosimilmente perchè il processo di sort è velocissimo.
Ecco cosa ho fatto vedendo che anche con la tua ultima istruzione (le prime due erano identiche a quella di _Achille) per valori di n tipo 100 o 200 il time sort era sempre 0, ho riprovato anche quella di _Achille utilizzando come n tipo 1700 e 1800 ed allora i tempi sono tipo 0.01455 etc.


Codice:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <chrono>

using namespace std;
using namespace chrono;

int main()
{
    const int n =1700;
    int vet[n];
    int tmp;
    srand(time(NULL));

    for (int i = 0; i < n; i++)
        vet[i] = rand() % 100;

         cout<<endl;
bool flag =  true;
int stop = n - 1;

auto inizio = high_resolution_clock::now();
while (flag)
{
    flag = false;
    for (int i = 0; i <= stop; i++)
        if (vet[i] > vet[i + 1])
        {

            tmp=vet[i];
            vet[i]=vet[i+1];
            vet[i+1]=tmp;
            flag = true;
        }

    stop = stop - 1;
}
    auto fine = high_resolution_clock::now();
    cout <<duration_cast<duration<double>>(fine - inizio).count();


   return 0;


}
Prova con nanoseconds. Vedi se ottieni qualcosa che non sia 0. Dovrebbe esserci abbastanza precisione per non darti 0 tondo.
EDIT
Comunque sappi che la precisione è la stessa. Non capisco cosa tu sbagli...
C++:
int main()
{
    const int n = 10000;
    int array[n];
    bool nonOrdinato;
    int stop = n - 1;
    srand(time(NULL));

    for (int i = 0; i < n; i++)
        array[i] = rand() % 100;

    auto inizio = high_resolution_clock::now();

    do
    {
        nonOrdinato = false;
        for (int i = 0; i < stop; i++)
            if (array[i] > array[i + 1])
            {
                swap(array[i], array[i + 1]);
                nonOrdinato = true;
            }

        stop -= 1;

    } while (nonOrdinato);

    auto fine = high_resolution_clock::now();

    for (int i = 0; i < n; i++)
    {
        if ((i + 1) % 10 == 0)
            cout << endl;
        cout << array[i] << " ";
    }

    cout << endl << duration_cast<duration<double>>(fine - inizio).count() << endl;

    system("pause");

}
 
Ultima modifica:
Se scrivo cosi:
cout <<duration_cast<nanoseconds>>(fine - inizio).count();

mi viene un errore..
 
Se scrivo cosi:
cout <<duration_cast<nanoseconds>>(fine - inizio).count();

mi viene un errore..
nanoseconds non è un template. Non devono starci parentesi.
Si scrive duration_cast<nanoseconds>... e comunque è uguale come detto da me sopra
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top