Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    [C++] sort con strutture

    Salve ragazzi, sto studiando il sort con le strutture, in particolare non capisco questo esempio:

    codice:
    // ***
    
    bool compare_intervalli(const Intervallo &a, const Intervallo &b)
    {
    if (a.fine < b.fine)
        return true;
    else
        return false;
    }
    
    
    // ***
    
    Intervallo giri[1000];
    sort(giri,giri+N,compare_intervalli);
    
    // ***
    non riesco a capire perchè come secondo paramentro viene passato giri + N, giri + N identifica un'area di memoria che non corrisponde all'ultimo elemento dell'array, non sarebbe più sensato scrivere giri + N*sizeof(Intervallo) ?

    Grazie in anticipo!

  2. #2
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Forse voleva ordinare solo una porzione dell' array, posta tutto il codice che vediamo meglio.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    Ho provato

    Ho provato, in effetti il codice ordina correttamente tutti gli elementi, quindi non so se serve postarlo, eccolo cmq per curiosità, l'ho riscritto:

    codice:
    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int N;
    
    typedef struct struttura
        {
        int inizio;
        int fine;  
        };
        
    struttura giri [1000];
    
    bool cmp (const struttura & a, const struttura & b)
    {
    if (a.fine < b.fine)
        return true;
    else 
        return false;
    }
    
    int main(int argc, char *argv[])
    {
        ifstream in("input.txt");
        in >> N;
        for(int i = 0; i < N; i++)
            { 
            in >> giri[i].inizio >> giri[i].fine;
            }
        in.close();
        ///////////////////////////////
        
        sort(giri, giri + N, cmp);
        
        int fine_corr = giri[0].fine;
        int caramelle = 1;
        
        for(int i = 1; i < N; i++)
            {
            if(fine_corr < giri[i].inizio)
                {
                caramelle++;
                fine_corr = giri[i].fine;
                }    
            }
        ///////////////////////////////
        ofstream out("output.txt");
        
        out << caramelle;
        
        out.close();
        return EXIT_SUCCESS;
    }
    il codice serve per risolvere (correttamente) il problema:

    Olimpiadi di Informatica - Selezione Regionale 2007
    problema Giri sulla Scopa Nimbus3000 (NIMBUS)

    ma poco conta ai fini del mio problema

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381

    Re: Ho provato

    Originariamente inviato da kirakira93
    il codice serve per risolvere (correttamente) il problema:
    Mmm, ci sono 1001 bug
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    In ogni caso, N è il numero di elementi effettivamente impiegati nell'array, per cui è corretto limitare l'ordinamento ai soli primi N elementi.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    Grazie mItaly

    Grazie..solo che mi sembrava più logico inserire direttamente il numero degli elementi.

    @Shodan...perchè dici che il codice è pieno di bug?? è perfetto

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Non ho scritto che è pieno di bug, ma che ci sono 1001 bug.
    Il che si riferisce al fatto che dai per scontato che un ipotetico utente inserisca meno di 1000 in questa istruzione:
    codice:
    in >> N;
    per poi effettuare un ciclo e un ordinamento usando quel numero, su un array di massimo 1000 elementi.
    codice:
    struttura giri [1000];
    Se il tuo utente inserisce 1001 ( o al limite proprio 1000) il programma va in crash.
    Dovresti inserire un controllo sul numero massimo che si può inserire.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    Ahhh!

    Tutto controllato
    Nei testi dei giochi accertano che l'input è compreso tra determinati valori, questo perchè a seconda dei diversi possibili input è meglio adottare strategie diverse.

    Ad esempio se gli input fossero stati minori di 20, convenivaa usare la ricorsione che è più semplice da implementare.

    Bisogna stare solo attenti nei casi limite ma in questo caso se non sbaglio 1000 non era tra i possibili input e 999 funziona alla grande!

  9. #9
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Ma N lo legge dal file ...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.