Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2013
    Messaggi
    19

    [C++]Impostare la funzione merge() per l'unione di due file in un terzo

    Buongiorno a tutti,
    apro questa discussione per capire come posso impostare al meglio possibile la funzione merge() per l'unione di due file in un terzo.
    codice:
    fstream u;
    fstream d;
    fstream f;
    
    void merge(){
        scarpa_uomo su;
        scarpa_donna sd;
    
    
        u.open("uomo.dat",ios::in|ios::binary);
        d.open("donna.dat",ios::in|ios::binary);
        f.open("scarpa.dat",ios:: out|ios::binary);
        
        for(int i=0;i<U+D;i++){
    
    
            u.read((char*)&su,sizeof(scarpa_uomo));
            d.read((char*)&sd,sizeof(scarpa_donna));
    
    
            f.write((char*)&su,sizeof(scarpa_uomo));
            f.write((char*)&sd,sizeof(scarpa_donna));
    
    
        }
    
    
        u.close();
        d.close();
        f.close();
    Il mio codice è fatto con classi.
    Ora questa parte di programma dovrebbe unire i due file nel terzo.
    E' giusta questa implementazione?
    Aspetto dei vostri chiarimenti.
    Ultima modifica di MItaly; 27-11-2013 a 16:22 Motivo: Aggiunti tag CODE

  2. #2
    Il codice non è corretto, stai cercando di leggere U+D record da tutti e due i file, quando presumibilmente devi leggere U record da un file e D dall'altro.

    Inoltre, quali sono le specifiche di questo merge? C'è un ordine particolare che i record devono avere nel file di output?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2013
    Messaggi
    19
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    Inoltre, quali sono le specifiche di questo merge? C'è un ordine particolare che i record devono avere nel file di output?
    Devono essere ordinati in base al prezzo.Non ho ben capito.Lei dice che devo fare due procedimenti differenti per i due file?
    Nel senso che leggo e scrivo gli elementi del primo file e poi faccio la stessa cosa per l'altro file?
    Ho devo usare gli array?

  4. #4
    Quello che sto dicendo è che ora come ora in ciascuna iterazione del tuo ciclo vai a pescare entrambi i record e li scrivi nel file, e fai complessivamente U+D iterazioni; in pratica, stai cercando di leggere U+D record sia dal file delle scarpe da uomo, sia da quello delle scarpe da donna.

    Inoltre, ora come ora li stai buttando dentro a caso, ovvero, leggi un record da un file, uno dall'altro e li butti nello stesso file; in questa maniera ovviamente non otterrai un file ordinato.

    Se i file di input sono già ordinati e devi creare solo un output ordinato, l'algoritmo è semplice: hai lì le tue due strutture; alla prima iterazione leggi da entrambi i file; vedi quale dei due record ha il prezzo minore e lo scrivi su file; ora nella struttura che hai appena scritto su file carichi il record successivo, e ripeti il confronto/scrivo/carico il record successivo ad ogni iterazione, finché entrambi i file non sono terminati.

    P.S.: non c'è bisogno del lei, sul forum ci si dà del tu
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2013
    Messaggi
    19
    Grazie mille!

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2013
    Messaggi
    19
    Scusami ancora ma volevo chiederti un' altra cosa.Quando vado ad inserire gli elementi dei due file in un terzo tu mi hai consigliando di ordinarli e man mano inserirli nel file.Il mio esercizio mi chiede di ordinare il file con quicksort.Mi sembra un po' difficile con questo algoritmo confrontare due elementi di due file differenti e poi in base a quale dei due è maggiore inserirlo nel terzo file.Non è meglio inserire gli elementi nel terzo file e poi ordinarli?

  7. #7
    Quello che ti sta dicendo probabilmente è di ordinare ciascun file per i fatti suoi, e poi fare un merge come ti ho indicato, che consente di generare in maniera semplice un file di output ordinato a partire da due file di input già ordinati. Ma forse sarebbe meglio che tu scrivessi la consegna completa, così ci capiamo meglio...
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2013
    Messaggi
    19
    Il gestore di un negozio di scarpe vuole analizzare i dati relativi alle scarpe in vendita
    (scarpa_uomo e scarpa_donna). Implementare un applicativo gestionale che utilizza le
    seguenti classi:
    1. Scarpa (idScarpa, produttore, numero_taglia, prezzo)
    con i metodi : get( ) e set( ) degli attributi privati + costruttore/distruttore
    2. Scarpa_uomo derivata di Scarpa ma con l’aggiunta dell’attributo privato
    “presenza_lacci” con i metodi : get( ) e set( ) eventualmente in overloading +
    costruttore/distruttore
    3. Scarpa_donna derivata di Scarpa ma con l’aggiunta dell’attributo privato
    “altezza_tacco” con i metodi : get( ) e set( ) eventualmente in overloading +
    costruttore/distruttore
    I dati delle scarpe_uomo(500) e delle scarpe_donna(2000) sono salvati tramite due file :
    “uomo.dat” e “donna.dat”.
    Implementare in linguaggio C++ (gestione file stream C++) il programma con le seguenti
    funzioni:
    1) Caricamento e salvataggio dei dati nei due file “uomo.dat” (accesso diretto) e
    “donna.dat” (accesso sequenziale)
    2) Ri-assegnazione delle scarpe_uomo, mediante modifica dei dati relativi alle scarpe con
    idScarpa numero pari nel file “uomo.dat”, modificando il produttore a “Pods” (accesso
    sequenziale)
    3) Creare un unico file “scarpe.dat” che riunisce le scarpe_uomo e scarpe_donna,
    ordinando i record in ordine crescente di prezzo, depurando gli attributi “presenza_lacci”
    e “altezza_tacco” ed utilizzando l’ordinamento “quicksort”
    4) Cancellare fisicamente le scarpe con un prezzo inferiore a 30 euro dal file “scarpe.dat”
    senza utilizzare file ausiliari
    5) Creare infine un overloading dell’operatore + per la classe Scarpa_donna che permette
    di incrementare il prezzo di una percentuale “perc” passata come parametro al metodo di
    overloading, arrotondando il prezzo ad intero per eccesso
    N.B.: si implementino i vari punti dell’esercizio accedendo ai file senza utilizzare tabelle
    in memoria centrale, ad eccezione dei punti 3) e 4)

    Questa è la traccia completa e io mi sto occupando del terzo punto.

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2013
    Messaggi
    19
    Sono riuscito ad unire i due file.Questa è la funzione:
    codice:
    void merge(){
        scarpa_uomo su;
        scarpa_donna sd;
        scarpa s[U+D];
    
    
        u.open("uomo.dat",ios::in|ios::binary);
        d.open("donna.dat",ios::in|ios::binary);
        f.open("scarpa.dat",ios: out|ios::binary);
        
        while(u){
    
    
            u.read((char*)&su,sizeof(scarpa_uomo));
            f.write((char*)&su,sizeof(scarpa_uomo));
        }
    
    
        while(d){
    
    
            d.read((char*)&sd,sizeof(scarpa_donna));
            f.write((char*)&sd,sizeof(scarpa_donna));
    
    
        }
    
    
        u.close();
        d.close();
        f.close();
    
    
        f.open("uomo.dat",ios::in|ios::binary);
    
    
        f.read((char*)&su,sizeof(scarpa_uomo));
        for(int i=0;i<U;i++){
            s[i]=su;
            f.read((char*)&su,sizeof(scarpa_uomo));
        }
    
    
        f.read((char*)&sd,sizeof(scarpa_donna));
        for(int i=U;i<D+U;i++){
            s[i]=sd;
            f.read((char*)&sd,sizeof(scarpa_donna));
        }
        
        f.close();
    }

    Ora per il quicksort ho creato una funzione da richiamare in quella precedente.

    codice:
    void qsort(int a[U+D],int inf,int sup){
        int pivot=a[(inf+sup)/2];
        int i=inf;
        int j=sup;
        int temp;
    
    
        do{
            do{
                i++;
            }while(a[i]<pivot);
    
    
            do{
                j--;
            }while(a[j]>pivot);
            if(i<j){
                temp=a[i];
                a[i]=a[j];
                a[j]=temp;
            }
        }while(i<=j);
    
    
        if(inf<j){
            qsort(a,inf,j);
        }
        if(i<sup){
            qsort(a,i,sup);
        }
    
    
    }
    Ora non capisco come richiamare la funzione.Il primo valore in parentesi della funzione quicksort deve essere di tipo scarpa (scarpa s[U+D]) ?
    Ultima modifica di freezix; 29-11-2013 a 20:48

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.