ordinamento e ricerca in un array

« Older   Newer »
 
  Share  
.
  1.  
    .
    Avatar

    Member

    Group
    Member
    Posts
    206

    Status
    Offline
    cercando tra le tracce d'esame ho trovato questa:
    definire un array,ordinarlo e poi vedere se un valore appartiene o meno a tale array..per la prima parte(array e ordinamento) il prof ci ha dato questo programma(bubble sort)

    #include <iostream>
    #include <iomanip>
    using namespace std;

    void InsertionSort(float[], int); /*Propotipo della funzione di ordinamento InsertionSort*/
    void StampaArray (float[], int); /*Prototipo della funzione che stampa un array*/

    int main ()
    {
    int n; /*Dimensione dell'array*/

    cout <<"Immetti la dimensione dell'array"<<endl;
    cin >>n;

    float elemento, /*elemento generico dell'array*/
    array[n]; /*dichiarazione dell'array*/

    if (n<=0) /*Avverte nel caso la dimensione sia un numero negativo*/
    cout <<"La dimensione immessa non è valida!"<<endl;
    else /*Inserimento degli elementi dell'array*/
    {
    for (int i = 0; i<n; i++)
    {
    cout <<"Immetti l'elemento di posto "<<(i + 1)<<endl;
    cin >> elemento;
    array[i] = elemento;
    }
    /*Stampa dell'array immesso*/
    cout <<"L'array immesso è:"<<endl;
    StampaArray(array,n);
    /*Chiamata alla funzione InsertionSort*/
    cout <<endl
    <<endl;
    InsertionSort(array,n);
    }
    return 0;
    }

    void InsertionSort (float a[], int n)
    {
    int i, /*Posizione generica dell'array*/
    k; /*Posizione del valore minimo ad ogni ciclo*/
    float minimo; /*Il valore minimo ad ogni ciclo*/

    i = 0; /*Inizializzazione del contatore delle posizioni a 0*/

    while (i<n) /*Il ciclo while esamina tutti i valori dell'array, partendo dal numero successivo ad ogni ciclo*/
    {
    minimo = a[i];
    for (int j = i; j<n; j++) /*Il ciclo esamina tutti i numeri partendo dall'i-esimo*/
    {
    if (a[j]<=minimo)
    {
    minimo = a[j]; /*Esaminando tutti i valori, se un valore è minore del successivo assegna a questo valore il minimo*/
    k = j; /*Segna la posizione del valore minimo*/
    }
    }
    a[k] = a[i]; /*Al posto del valore minimo immette il valore del posto i*/
    a[i] = minimo; /*Al posto i-esimo assegna il valore del minimo trovato tra tutti i numeri successivi*/
    i++; /*Incrementa il contatore*/
    }
    /*Stampa dell'array ordinato*/
    cout <<"L'array ordinato è:"<<endl;
    StampaArray (a,n);
    }

    /*Funzione che stampa l'array*/
    void StampaArray (float a[], int n)
    {
    for (int i = 0; i<n; i++)
    {
    cout<<a[i]<<setw(6);
    }
    }


    per la ricerca,invece,non ho la minima idea di come si faccia..qualcuno di buona volontà(tanto già so che sto qualcuno sara root,il mio salvatore su questo forum :D ) mi aiuta?mi dite o meglio mi scrivete il resto del programma?e magari fatemi capire come e perchè si fa,ok?grazie a tutti
     
    Top
    .
  2.  
    .
    Avatar

    0x80

    Group
    Best Users
    Posts
    1,346
    Location
    Dunno

    Status
    Anonymous
    Se devi verificare la presenza di un determinato valore all'interno di un array gia' ordinato vi sono una serie di algoritmi piu' o meno efficienti, senza complicarsi troppo la vita(ricerca dicotomica) credo che una ricerca sequenziale possa andar bene:


    CODE
    // Ritorna -1 se l'elemento non e' presente, altrimenti ritorna la posizione in cui e' presente tale elemento
    int
    ricerca_sequenziale(int* array, int size, int value)
    {
    for(int i = 0; i < size; i++)
       {
       if(a[i] == value)
           return i;
       else if(a[i] > value)   // l'array e' ordinato, quindi se il valore a[i] e' > del valore da cercare, non ha piu' senso continuare
           return -1;
       }    
    return -1;
    }
     
    Top
    .
  3.  
    .
    Avatar

    Member

    Group
    Member
    Posts
    206

    Status
    Offline
    non è questo che devo fare..se l'elemento è presente deve dire che c'è altrimenti che non c'è(senza restituire 1 oppure 0)..se poi è presente deve dire se coincide con uno degli elementi dell array oppure si trova in un intervallo(es. array 4 8 16 22 il numero 5 appartiene all intervallo 48) spero di essermi spiegato..e poi il codice dove lo devo scrivere???non ci capisco niente di sta traccia...se me la scrivi tutta mi fai un favore,grazie

    P.S. per tutti il mio prof è un idiota,e vuole l e cose scritte in italiano quindi,x favore,quando scrivete fatelo in italiano(non size,value,etc.)ok?grazie...
     
    Top
    .
  4.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    L'ho scritto ora al volo, il codice non è il massimo però funziona. ;)

    CODICE
    #include<iostream>

    using namespace std;

    void cercaValore(int *array, int valore, int lunghezza);
    void ordinaArray(int *array, int lunghezza);
    void posizione(int i);
    void intervallo(int,int);


    void cercaValore(int *array, int valore, int lunghezza) {
     ordinaArray(array,lunghezza);

     for(int i=0; i<lunghezza; i++) {
       if(array[i] == valore) {
         posizione(i);
         return;
       }
       if(array[i] > valore) {
         intervallo(array[i-1], array[i]);
         return;
       }
     }
    }

    void ordinaArray(int *array, int lunghezza) {
     for(int i=0; i<lunghezza; i++) {
       for(int j=i; j<lunghezza; j++) {
         if(array[i] > array[j]) {
           int t = array[i];
           array[i] = array[j];
           array[j] = t;
         }
       }
     }
    }

    void posizione(int i) {
    cout << "L'elemento e' alla posizione: " << i;
    }

    void intervallo(int x, int y) {
     cout << "Si trova tra " << x;
     cout << " e " << y;
    }
       
       
    int main() {
     int n;
     
     cout << "Dimensione array: ";
     cin >> n;
     int array[n];
     
     cout << "Inserisci i valori nell'array (separati da Invio): ";
     for(int i=0; i<n; i++) {
       cin >> array[i];
     }
     
     int valore;
     cout << "Inserisci il valore da cercare: ";
     cin >> valore;
     
     cercaValore(array, valore,n);
     
     return 0;
    }



    PS: quando posti del codice ricorda i tag CODE.
     
    Top
    .
  5.  
    .
    Avatar

    Member

    Group
    Member
    Posts
    206

    Status
    Offline
    grazie root,grandissimo come sempre ;)....
    i tag code cosa sono?

    poi,una cosa,il programma va una bellezza ma per fare quello che mi serve,cioè ordinare prima larray e POI fare la ricerca(cioè prima quello scritto da me poi quello fatto da te) come faccio??


    e,giusto per curiosità,perchè quando scrivi :

    void cercaValore(int *array, int valore, int lunghezza); oppure
    void ordinaArray(int *array, int lunghezza); metti il simbolo *?????
    grazie
     
    Top
    .
  6.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    Il tag code è il tag CODE del BBcode. Lo trovi eppena sopra al campo di testo della risposta rapida o di quella "avanzata".
    Puoi guardare qui per sapere come si usa: www.bbcode.org/reference.php

    Io in pratica faccio così, ordino e poi cerco. La differenza è che chiamo la funzione per ordinare all'interno dell'altra. Se vuoi comunque chiamarlo dal main devi solo togliere la chiamata di ordinamento dalla funzione cercaValore() ed inserirla nel main, prima di cercaValore().

    Il simbolo "asterisco" indica che quella variabile è un puntatore, quindi riceve un indirizzo ad una locazione di memoria e non un numero. In quel caso riceve l'indirizzo della prima cella dell'array (elemento 0) così le celle contigue contengono gli altri valori dell'array (posizione 1, 2, 3...). Il discorso dietro ai puntatori è interessante ed anche molto importante, quindi se non li conosci ti consiglio di guardarti qualcosa. La spiegazione dal lato teorico è appunto quella appena data: al posto di memorizzare un numero memorizza un indirizzo in cui poi ci sarà un valore.
    Nel caso di una normale variabile per ottenere l'indirizzo è necessario usare l'operatore AND, ovvero &. Questo applicato ad una variabile ti da il suo inidirizzo.
    CODICE
    int a = 10;
    int *p = &a;

    inserisce in *p l'indirizzo di a. A questo punto ti chiederai perchè nelle chiamate non passo mai l'array usando la &. Questo ti porta ad una differenza nei modi in cui una variabile viene passata ad una funzione; quando passi una variabile ad una funzione avviene una chiamata per valore, quando passi un array avviene una chiamata per riferimento.
    La chiamata per valore indica semplicemente che viene passato il valore di quella variabile e non il riferimento (indirizzo).
    CODICE
    int a = 10;
    funzione(a);

    void funzione(int n) {
    // codice...
    }


    In pratica è come se al posto della 'a' nella funzione ci fosse il suo valore. Questo viene quindi inserito in n. Questo cosa ti fa pensare? Che se io nella funzione modifico il valore di n, il valore di a rimane inalterato.

    Una chiamata per riferimento (come un array o il passaggio di un indirizzo, usando &) avviene passando appunto l'indirizzo della variabile.
    CODICE
    int a = 10;
    funzione(&a);


    void funzione(int *n) {
     
    }


    Che significa all'atto pratico quindi? Che se io all'interno della funzione modifico il valore di n, cambio anche il valore di a. Questo avviene perchè passo ad n l'indirizzo di a e non il suo valore (10). Ergo, ho due variabili (a ed n) che di fatto mi permettono di modificare la memoria allo stesso indirizzo.

    CODICE
    #include<iostream>

    using namespace std;

    void funzione(int *p) {
     *p = *p * 2;
    }

    void funzione1(int p) {
     p = p*2;
    }

    int main() {
     int a = 10;
     cout << "Valore di a: " << a;
     funzione1(a);
     cout << "\nChiamata a funzione1 (senza passaggio di indirizzo): " << a << endl;
     
     a = 10;
     funzione(&a);
     cout << "Chiamata a funzione (passaggio indirizzo): " << a;
     
     return 0;
    }


    Output:
    CODICE
    Valore di a: 10
    Chiamata a funzione1 (senza passaggio di indirizzo): 10
    Chiamata a funzione (passaggio indirizzo): 20


    Non confondere quel "* 2" dopo a "*p", quella è una moltiplicazione.



    Di nulla. ;)
     
    Top
    .
  7.  
    .
    Avatar

    Member

    Group
    Member
    Posts
    206

    Status
    Offline
    grazie..comunque per i puntatori,non li ho fatti e non fanno parte del programma d'esame..c'è un modo per farlo senza puntatori?
     
    Top
    .
  8.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    Certo, ti lascio dei link interessanti: www.cplusplus.com/forum/articles/20881/ e qui www.cplusplus.com/doc/tutorial/arrays/ (verso la fine).
     
    Top
    .
  9.  
    .
    Avatar

    Member

    Group
    Member
    Posts
    206

    Status
    Offline
    ti ringrazio root,ma,essendo onesti:
    1) l inglese lo mastico poco(mi autoimpongo di farmi qualche mese in inghilterra appena finisco gli studi,perchè l inglese oggi come oggi è importantissimo,e io non l'ho mai studiato come si deve..anche ai tempi della scuola ho avuto insegnanti pessimi...)
    2) dopo mercoledì(incrociamo le dita) io e l informatica abbiamo chiuso per sempre..hai visto più o meno il livello degli esercizi che questo mette come esame,questo che ho scritto ora è il più difficile,ma un esercizio sui vettori(array) è uscito 2 mesi fa e difficilmente lo rimette(appello per fuoricorso quindi poche persone,difficilmente lo mette) ma mai dire mai(uno sulle matrici lo ha messo,da quanto mi hanno detto alcuni amici,a luglio)...ho già imparato(a memoria) la prima parte(inserimento e ordinamento) oltre ad averlo ricopiato su un foglio che uso per copiare casomai non sapessi farlo,ma la 2 parte(la ricerca),ti ripeto,non so come farla...capisco che è un forum di informatica e tu(come quasi tutti qua dentro) ci vivete(o vi divertite solo) con 'ste cose,ma io finito l esame MAI più ci avrò a che fare(scusa la franchezza,ma avendoci a che fare ultimamente ho rafforzato il mio credo sull informatica:mi fa schifo!!!)

    quindi,per un ultima(o una delle ultime,fino a mercoledì :P ) volta,per favore,root aiutami tu ;)..grazie


    P.S. ora però sono curioso,ma tu(immagino di si visto che sei bravo) con l'informatica ci mangi,giusto?nel senso che ci lavori???
     
    Top
    .
  10.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    Le modifiche sono veramente minime. :P
    CODICE
    #include<iostream>

    using namespace std;

    void cercaValore(int array[], int valore, int lunghezza);
    void ordinaArray(int array[], int lunghezza);
    void posizione(int i);
    void intervallo(int,int);


    void cercaValore(int array[], int valore, int lunghezza) {
     for(int i=0; i<lunghezza; i++) {
       if(array[i] == valore) {
         posizione(i);
         return;
       }
       if(array[i] > valore) {
         intervallo(array[i-1], array[i]);
         return;
       }
     }
    }

    void ordinaArray(int array[], int lunghezza) {
     for(int i=0; i<lunghezza; i++) {
       for(int j=i; j<lunghezza; j++) {
         if(array[i] > array[j]) {
           int t = array[i];
           array[i] = array[j];
           array[j] = t;
         }
       }
     }
    }

    void posizione(int i) {
    cout << "L'elemento e' alla posizione: " << i;
    }

    void intervallo(int x, int y) {
     cout << "Si trova tra " << x;
     cout << " e " << y;
    }
       
       
    int main() {
     int n;
     
     cout << "Dimensione array: ";
     cin >> n;
     int array[n];
     
     cout << "Inserisci i valori nell'array (separati da Invio): ";
     for(int i=0; i<n; i++) {
       cin >> array[i];
     }
     
     int valore;
     cout << "Inserisci il valore da cercare: ";
     cin >> valore;
     
     ordinaArray(array, n);
     cercaValore(array, valore,n);
     
     return 0;
    }



    No, non mangio con l'informatica (solo assistenze e qualche programma). Ho studiato da autodidatta l'informatica (e la studio ancora ovviamente) e la programmazione; ho una terza media al momento, ma 2 anni fa sono tornato a scuola (per tagliare corto diciamo una sorta di serale) così da diplomarmi.
     
    Top
    .
9 replies since 16/11/2013, 12:27   93 views
  Share  
.