Ragazzi aiutatemi, C++ (Algoritmo di ordinamento)

di il
16 risposte

Ragazzi aiutatemi, C++ (Algoritmo di ordinamento)

Colgo l'occasione per presentarmi dato che sono nuovo.
Mi chiamo Dario e sono uno studente della facoltà di informatica.
Sto studiando per l'esame di Fondamenti di programmazione e ho creato questo semplice bubble sort, che però non so per quale motivo non funziona. Anzi. peggio. A volte funziona e a volte no. Tipo cambio qualcosa e funziona. Chiudo Dev C++ lo riapro e non funziona di nuovo xD
Non sono pazzo eh xD

L'algoritmo è questo:
#include <cstdlib>
#include <iostream>
#include <time.h>
#define DIM 10

using namespace std;

int main()
{   int A[DIM],i,j,N,temp;
    cout<<"Inserire dimensione array"<<endl;
    cin>>N;
    srand(time(NULL));
    for(i=0;i<N;i++){
        A[i]=rand()%10;
        }
    for(i=0;i<N;i++)
        cout<<A[i]<<" ";
    cout<<endl;
    for(i=0;i<N;i++){
                     for(j=N-2;j<i-1;j--){
                                          if(A[j]>A[j+1]){
                                                          temp=A[j];
                                                          A[j]=A[j+1];
                                                          A[j+1]=temp;
                                                          }
                                          }
                     }
   cout<<"Algoritmo ordinato"<<endl;
 for(i=0;i<N;i++){
                     cout<<A[i]<<" ";
                     }
    cout<<endl;
    
    system("PAUSE");
    return 0;
} 


*/

16 Risposte

  • Re: Ragazzi aiutatemi, C++ (Algoritmo di ordinamento)

    Ciao , sinceramente io utilizzo un altro modo per il bubble sort, cmq ti posso dire che il secondo ciclo
    
    for(j=N-2;j<i-1;j--)
    
    j<i-1 è sbagliata , dovrebbe essere j>i-1 penso. Cmq io il bubble sort lo faccio in questo modo:
    
    bool continuo = false;
    while ( !continuo )
     {
         continuo = true;
         for ( int i = 0; i<N-1 ; i++ )
                if ( a[i] > a[i+1] )
                    {
                           qui fai lo swap...
                          continuo = false;
                     }
    }
    
  • Re: Ragazzi aiutatemi, C++ (Algoritmo di ordinamento)

    Non ho capito come funziona il tuo metodo, scusa. Non sono molto pratico.
    Ora provo con j>i-1, comunque.

    Edit: Funziona, grazie!
  • Re: Ragazzi aiutatemi, C++ (Algoritmo di ordinamento)

    Funziona allo stesso modo , semplicemente mentre il tuo avrà un numero di cicli NxN ( sempre ) , il mio ne potrà avere anche di meno a seconda di come è ordinato l' array ^^

    Mi fa piacere che ora funzioni
    Distinti Saluti,
    Alessandro
  • Re: Ragazzi aiutatemi, C++ (Algoritmo di ordinamento)

    Funziona allo stesso modo , semplicemente mentre il tuo avrà un numero di cicli NxN ( sempre ) , il mio ne potrà avere anche di meno a seconda di come è ordinato l' array ^^

    Mi fa piacere che ora funzioni
    Distinti Saluti,
    Alessandro
  • Re: Ragazzi aiutatemi, C++ (Algoritmo di ordinamento)

    Sono inceppato in un altro problema, ho messo il bubblesort in una funzione apposita, e il programma dovrebbe fare anche un grafico di quantità di ogni valore.
    per esempio se il vettore è (1, 1, 1, 2, 2, 3)
    Dovrebbe stamparmi
    1 ***
    2 **
    3 *

    Ma non so per quale motivo ci sono due problemi, ma credo che il secondo dipenda dal primo:
    1) Quando ordina l'algoritmo, alla fine ci mette la dimensione. Per esempio se il vettore non ordinato è ( 3,9,6,1) ordinandolo diventa (1,3,6,9,4)
    2) Per calcolare la quantità degli indici con lo stesso valore non mi vede l'ultimo indice.

    Ecco a voi il codice, spero che qualcuno riuscirà ad aiutarmi ancora:
    
    #include <cstdlib>
    #include <iostream>
    #include <time.h>
    #define DIM 10
    
    using namespace std;
    
    int bubblesort(int A[DIM], int i, int j, int temp, int N);
    
    int main()
    {   int A[DIM],i,j=0,N,temp;
        cout<<"Inserire dimensione array"<<endl;
        cin>>N;
        srand(time(NULL));
        for(i=0;i<N;i++){
            A[i]=rand()%10;
            }
        for(i=0;i<N;i++)
            cout<<A[i]<<" ";
        cout<<endl;
    
       cout<<"Algoritmo ordinato"<<endl;
       cout<<bubblesort(A,i,j,temp,N);
       cout<<endl;
       
       /* cout<<"Grafico delle occorrenze:"<<endl;
       for(i=0;i<=N;i++){
                        j=0;
                        cout<<A[i];
                        while(A[i]==A[i+j]){
                                            cout<<" "<<"*";
                                            j++;}
                        if(A[i]!=A[i+j]){ 
                                          cout<<endl;
                                          i=i+j-1;
                                          system("PAUSE");
                                        
                                          }
                        }
                                                  
        */
        
        system("PAUSE");
        return 0;
    } 
    
    int bubblesort(int A[DIM], int i, int j, int temp, int N){
            for(i=0;i<N;i++){
                         for(j=N-2;j>i-1;j--){
                                              if(A[j]>A[j+1]){
                                                              temp=A[j];
                                                              A[j]=A[j+1];
                                                              A[j+1]=temp;
                                                              }
                                              }
                         }
    
    for(i=0;i<N;i++){
                     cout<<A[i]<<" ";
                         }
    
    }
    
    
  • Re: Ragazzi aiutatemi, C++ (Algoritmo di ordinamento)

    Scusa ma l'algoritmo che utilizzi per il BubbleSort non mi convince tanto, da quello che vedo tenti di ordinare dalla fine all'inizio, solo che alcuni parametri non sono corretti. Inoltre non mi spiego perchè la funzione BubbleSort ha dei parametri di ingresso i e j, se poi nella funzioni li inizializzi a zero, non ha senso.Inoltre, perché passare alla funzione un array di dimensioni già fissate quando poi puoi passarne uno generico e la dimensione dello stesso, così che puoi utilizzare il BubbleSort con altri vettori? Una possibile implementazionepotrebbe essere questa:
    
    void BubbleSort (int A[], int N){
        int temp;
        if (N<=1) return;
        for (int i=N-1; i>0;--i){
            for(int j=0;j<i;++j){
                if (A[j]>A[j+1]){
                    temp=a[j];
                    A[j]=A[j+1];
                    A[j+1]=temp;
                }
            }
        }
    }
    
    Per lo scambio dei valori avresti anche potuto utilizzare la funzione 'swap(A[j],A[j+1])' .
  • Re: Ragazzi aiutatemi, C++ (Algoritmo di ordinamento)

    Mi da altri errori usando l'algoritmo da te postato.
    So che probabilmente ho fatto anche qualche errore concettuale, ma ho cominciato a studiare la programmazione da poco.
    Per esempio mettere Void invece di Int come tipo di funziona mi da problemi quando voglio stampare il valore ritornato dalla funzione perché una procedura Void non dovrebbe ritornare alcun valore...
    Se potete aiutarmi partendo dal mio algoritmo mi sarebbe più semplice. Alla fine ordina, solo che inserisce un valore in più (Dimensione dell'array)
    PS: Per quanto riguarda la funzione "swap" è effettivamente comoda, non la conoscevo.
    Grazie

    Il problema rimane però
  • Re: Ragazzi aiutatemi, C++ (Algoritmo di ordinamento)

    Ciao ancora videogame ^^,

    L' algoritmo che hai usato non è corretto , ecco i motivi:
    
     for(i=0;i<=N;i++)
    
    Perchè hai utilizzato i<=N? l' unico motivo per cui tu possa aver fatto questo è che , poichè hai un i+1 allora hai voluto mettere <= , ma questo è sbagliato perchè nella posizione N tu non sai cosa c'è e guarda caso può esserci proprio il valore del riempimento dell' array ( ecco perchè 4 come hai scritto nell' esempio ) . Un array viene letto dalla posizione 0 fino ad N-1 . Quindi il for sarà così
    
     for(i=0;i<N-1;i++) // N-1 in modo tale che l' ultimo ciclo finisce quando i = N-2 e quindi i+1 = N-1
    
    Riassumendo il problema che da ( 9,3,6,9 ) ti da ( 3,6,9,9,4 ) è perchè vai a leggere anche la posizione N , mentre devi leggere fino ad N-1.

    Le funzione void non restituiscono un valore e non puoi utilizzare un cout . Le devi chiamare e basta quindi
    
    bubblesort(a,... ); // corretto per funzioni void
    cout << bubblesort(a...); // sbagliato per funzioni void
    
  • Re: Ragazzi aiutatemi, C++ (Algoritmo di ordinamento)

    Grazie Alessandro. Sei sempre molto chiaro e gentile nelle spiegazioni.
    Però hai sbagliato for!
    Quello che mi hai corretto è commentato, ed è per far stampare al programma gli asterischi elle quantità dei valori! E credo che quell'algoritmo funzioni (se metto <N-1 lì non considera gli ultimi due valori!)
    Mentre nell'algoritmo del bubble sort non c'è il <=, ed è quello che non funziona!
    Per favore dai un'occhiata e vedi se trovi l'errore nella funzione

    PS: La spiegazione su void ed int è molto chiara, ti ringrazio.
  • Re: Ragazzi aiutatemi, C++ (Algoritmo di ordinamento)

    Ah , scusami mi ero concentrato sull' algoritmo del calcolo delle occorrenze ( tieni presente che questo algoritmo che hai utilizzato lo puoi usare solo se l' array è ordinato ) .

    Allora per il bubble sort mmmm guarda quello che non capisco è questo :
    
    int bubblesort(int A[DIM], int i, int j, int temp, int N){
            for(i=0;i<N;i++){
                         for(j=N-2;j>i-1;j--){
                                              if(A[j]>A[j+1]){
                                                              temp=A[j];
                                                              A[j]=A[j+1];
                                                              A[j+1]=temp;
                                                              }
                                              }
                         }
    
    for(i=0;i<N;i++){
                     cout<<A[i]<<" ";
                         }
    
    }
    
    per la stampa utilizzi :
    
    for(i=0;i<N;i++){
                     cout<<A[i]<<" ";
                         }
    
    una piccola parentesi = l' algoritmo per la stampa è consigliato non metterlo nel bubble sort ma fare una funzione a parte , perchè ti potrebbe servi in altri contesti.

    Comunque hai un ciclo da 0 a N-1 quindi se il tuo array è 9,6,3,9 come fa a stampa N valori e non N-1? Oppure succede questo esempio: array ( 9,6,3,9 ) e stampa ( 3,6,9,5 ) cioè cambia improvvisamente l' ultimo valore?
  • Re: Ragazzi aiutatemi, C++ (Algoritmo di ordinamento)

    No, li stampa tutti correttamente, solo che alla fine ci AGGIUNGE la dimensione N immessa all'inizio. è proprio strano. o.o
    Per esempio
    Non ordinato
    7 5 8 0 2 0
    ordinato
    0 0 2 5 7 8 6<--Dimensione.

    Non capisco t.t Forse l'errore è da un'altra parte.. non so.

    Un'altra cosa credo molto stupida:
    Ho provato a fare una funzione per stampare a parte ma mi da un errore che non mi era ancora capitato:
    void StampaArray(int A[DIM], int i, int N){
         for(i=0;i<N;i++)
         cout<<A[i];
         }
    Errore: A function declaration is not allowed here before '{' token
  • Re: Ragazzi aiutatemi, C++ (Algoritmo di ordinamento)

    Mi hai incuriosito, l' ho compilato il tuo programma così come l' hai incollato e a me l' ordinamento funziona , mi stampa l' array perfettamente senza il valore in più ( fai conto chela dimensione non è 6 in quel caso ma dovrebbe essere 7 .. ) Puoi riincollare il programma che ora hai attualmente? è possibile che tu abbia modificato qualcosa?
  • Re: Ragazzi aiutatemi, C++ (Algoritmo di ordinamento)

    Subito
    #include <cstdlib>
    #include <iostream>
    #include <time.h>
    #define DIM 10
    
    using namespace std;
    
    int bubblesort(int A[DIM], int i, int j, int N);
    
    int main()
    {   int A[DIM],i,j=0,N;
        cout<<"Inserire dimensione array"<<endl;
        cin>>N;
        srand(time(NULL));
        for(i=0;i<N;i++){
            A[i]=rand()%10;
            }
        for(i=0;i<N;i++)
            cout<<A[i]<<" ";
        cout<<endl;
    
       cout<<"Algoritmo ordinato"<<endl;
       cout<<bubblesort(A,i,j,N);
       cout<<endl;
       cout<<"Grafico delle occorrenze:"<<endl;
       for(i=0;i<=N-1;i++){
                        j=0;                 
                        cout<<A[i];
                        while(A[i]==A[i+j]){
                                            cout<<" "<<"*";
                                            j++;}
                        if(A[i]!=A[i+j]){ 
                                          cout<<endl;
                                          i=i+j-1;
                                        
                                          }
                        }
                                                                   
        system("PAUSE");
        return 0;
    } 
    
    int bubblesort(int A[DIM], int i, int j, int N){
            for(i=0;i<N;i++){
                         for(j=N-2;j>i-1;j--){
                                              if(A[j]>A[j+1]){
                                                              swap(A[j],A[j+1]);
                                                              }
                                              }
                         }
    
    for(i=0;i<N;i++){
                     cout<<A[i]<<" ";
                         }
    
    }
    
    Se leggi il post più su l'ho editato con un altro problemino credo di semplice soluzione per voi .-.
  • Re: Ragazzi aiutatemi, C++ (Algoritmo di ordinamento)

    Ah ecco capito,

    Il problema è il concetto di funzione di tipo Int . Qualsiasi funzione , tranne di tipo int , deve restituire qualcosa. Poichè la tua funzione int non restituisce niente ( non hai un return valoreint ) allora restituisce direttamente un valore casuale , esempio il mio compilatore mi mette lo 0 ( per default ) . Quindi riassumendo , le funzioni di tipo ( tranne quelle void ) devono sempre restituire qualcosa. Quindi una funzione int la utilizzi se deve restituire in qualche modo un valore int , lo stesso vale per una funzione char e di qualsiasi altro tipo .... altrimenti utilizza una funzione void che restituisce il vuoto ( quindi non c'è bisogno di utilizzare un return ) .
    La soluzione è semplicemente che devi cambiare il tipo di funziona da int a void . ^^

    Qual'è l' altro problema? non ho trovato niente sul post sopra , se me lo puoi ridire è meglio
Devi accedere o registrarti per scrivere nel forum
16 risposte