Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C++] Ordinamento crescente di un array di struct e ricerca di elemento

    Salve a tutti ho un problema con il mio programma non mi da errori di nessun tipo e non capisco cosa sbaglio nel mio algoritmo.
    L'obiettivo del mio programma come da nome è ordinare il mio array di struct.
    Quest'ultimo composto da un elemento chiave (numerico) e uno descrizione (una stringa allocata dinamicamente).
    Per portare a termine il mio obiettivo devo creare due funzioni che possono prendere solo determinati elementi prestabiliti:
    -La funzione in_listche prende valori: la lista, la dimensione della lista, l'elemento da cercare e la posizione in cui deve stare.
    - la funzione sort_list che prende valori: la lista e la dimensione.

    Solo cheil mio in_list che non capisco perchè se mi mi trova o meno l'elemento e mi stampa posizioni senza senso.

    Invece il mio sort_list non mi parte proprio sembra che non riconosca il richiamo della funzione write_list nella funzione sort_list ho provato ad inserirlo anche nel main dopo sort_list ma il risultato è lo stesso

    Main:

    codice:
    #include "VettStruct_lib.h"
    
    int main(){
        
        List Mylist;
        Element Search_E;
        int size, Search_P;
        
        read_list(Mylist, &size);
        write_list(Mylist, size);
        in_list(Mylist, size, Search_E, Search_P);
        sort_list(Mylist, size);
        
        
    }


    Funzioni gestione Array di Struct:

    codice:
    #include "VettStruct_lib.h"
    
    void read_list(List &L, int *size){
        
        int dim;
        cout<<" Inserisci il numero degli elementi della lista: ";
        cin>>dim;
        cin.ignore();
        for(int i=0; i<dim; i++){
            read_element(L[i]);
            create_element(L[i]);
        }    
        
    *size=dim;
    
    
    }
    
    
    void write_list(List &L,const int size){
            
        cout<<"\n Stampo gli elementi della lista : \n";
        for(int i=0; i<size; i++){
            cout<<(i+1)<<") ";
            write_element(L[i]);
            
        }
        
    }
    
    
    void in_list(List &L,const int size,Element S_E,int position){
        
        int cont;
        bool Eq=false;
        
        read_element(S_E);
        create_element(S_E);
        for(int i=0; i<size; i++){
            
            Eq=equal_element(L[i], S_E);
            if(!Eq){
                cout<<"\n L'elemento  "<<S_E.info<<"   "<<S_E.key;
                cout<<"\n E' presente all'interno della lista nella posizione:  "<<(i+1);
                cont++;
    
    
            }
        }
        
        if(cont==0)cout<<"\n L'elemento non esiste";
    
    
    }
    
    
    
    
    void sort_list(List &L, const int size){
        
        Element E;
        bool Eq=false;
        bool Low=false;
        
        cout<<"\n Ordino la lista in ordine crescente :";
        for(int i=0; i<size; i++){
    
    
            Low=greater_than(L[i],L[i+1]);
            if(!Low){
                swap_list(L[i], L[i+1]);
            }
         
        }
    write_list(L, size);
    }
    
    
    
    
    void swap_list(Element &L1, Element &L2){
        
        Element Temp;
        read_element(Temp);
        
        copy_element(Temp, L1);
        copy_element(L1, L2);
        copy_element(L2, Temp);
    }


    Libreria gestione elementi Array di Struct:

    codice:
    #include "Struct_lib.h"
    
    #define L_DIM 100
    
    
    typedef Element E;
    typedef E List[L_DIM];
    
    
    void read_list(List &, int *);
    void write_list(List &,const int );
    void in_list(List &,const int ,Element ,int );
    void sort_list(List &, const int );
    void swap_list(Element &, Element &);


    Funzioni gestione elementi Struct:


    codice:
    #include "Struct_lib.h"
    
    void read_element(Element &E){
        
        E.info=0;
        E.key=0;
        
    }
    
    
    void create_element(Element &E){
    
    
            String name;
            
            cout<<"\n Iserisci la chiave dell'elemento :";
            cin>>E.key;
            cin.ignore();
            cout<<"\n Iserisci la descrizione dell'elemento :";
            cin.getline(name, N-1, '\n');
            if(E.info) delete[] E.info;
            E.info=new char [strlen(name)+1];
            strcpy(E.info, name);
            
    }
    
    
    void write_element(Element &E){
        
        cout<<E.info<<"  "<<E.key<<endl;
        
    }
    
    
    
    
    bool equal_element(Element &E, Element &Search){
        
        int comparasion;
        
        comparasion=strcmp(E.info, Search.info);
        if((E.key==Search.key)&&(comparasion==0)){
            return true;
        }
        
    }
    
    
    
    
    bool greater_than(Element &E1, Element &E2){
        
        int comparasion;
        
        comparasion=strcmp(E1.info, E2.info);
        if(E1.key>E2.key||comparasion>0)return true;
    
    
    }
    
    
    
    
    void copy_element(Element &E1, Element &E2){
        
        if(strlen(E1.info)!=strlen(E2.info)){
            delete [] E1.info;
            E1.info=new char [strlen(E2.info)+1];
    }
        strcpy(E1.info, E2.info);
        E1.key=E2.key;
    }


    Libreria gestione elementi Struct:

    codice:
    #include <iostream>#include <cstring>
    #include <cstdlib>
    
    
    using namespace std;
    
    
    #define N 100
    
    
    struct Element{
        
        char *info;
        int key;
        
    };
    
    
    typedef char String [N];
    
    
    void read_element(Element &);
    void create_element(Element &);
    void write_element(Element &);
    bool equal_element(Element &, Element &);
    bool greater_than(Element &, Element &);
    void copy_element(Element &, Element &);


    Questo è quello che mi stampa:

    1.png

    2.png

    4.png
    Ultima modifica di TheBlackWolf; 31-07-2018 a 11:33

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ecco l'elenco degli errori in compilazione che DEVONO essere corretti prima di capire cosa non va

    utilizzata variabile locale 'cont' non inizializzata
    utilizzata variabile locale 'Search_E' non inizializzata
    error C4700: utilizzata variabile locale 'Search_P' non inizializzata

    'E': variabile locale senza riferimenti
    'equal_element': non tutti i percorsi di controllo restituiscono un valore
    'greater_than': non tutti i percorsi di controllo restituiscono un valore
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    A me non dava nessun errore comunque sia Search_E che Search_P sono state dichiarate nel main, e poi inizializzate tramite la funzione all'interno di in_list tramite la funzione read_element a zero, e poi gli ho fornito un valore write_element. Solo percorso deve restituire un valore solo se E1.key e E2.key e le sue stringhe sono uguali negli altri casi non cambia il valore, comunque ho inserito un else return true stessa cosa nel greater_than ma stesso risultato

    codice:
    bool equal_element(Element &E, Element &Search){    
        int comparasion;
        
        comparasion=strcmp(E.info, Search.info);
        if((E.key==Search.key)&&(comparasion==0)){
            return true;
        }else return false;
        
    }
    codice:
    bool greater_than(Element &E1, Element &E2){
        
        int comparasion;
        
        comparasion=strcmp(E1.info, E2.info);
        if(E1.key>E2.key||comparasion>0){
        return true;
        }else return false;
    
    
    }
    Ultima modifica di TheBlackWolf; 31-07-2018 a 16:48

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Quote Originariamente inviata da TheBlackWolf Visualizza il messaggio
    A me non dava nessun errore
    Butta quel compilatore, che ti devo dire.

    Search_E
    Non viene inizializzata affatto perché non è passata per puntatore.

    [quote]Search_P [/code]

    Sarebbe l'argomento position, mai usato nella funzione in_list. Perché la passi? A che serve l'argomento se non lo usi?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    [QUOTE=oregon;25524415]Butta quel compilatore, che ti devo dire.



    Non viene inizializzata affatto perché non è passata per puntatore.

    Search_P [/code]

    Sarebbe l'argomento position, mai usato nella funzione in_list. Perché la passi? A che serve l'argomento se non lo usi?
    Vabbè ora sto usando questo perchè è il compilatore che si usa all'esame, ma in un futuro prossimo vorrei cambiarlo che cosa mi consigli? Hai perfettamente ragione su Search_P devo trovare il modo di usarlo perchè la funzione vuole 4 operandi. Scusa l'ignoranza non sono sicuro di aver capito tu mi stai dicendo che Search_E con la funzione read_element passando per riferimento gli sto passando l'indirizzo di memoria degli elementi della struct e quindi sto inizializzando a zero solo i loro registri di memoria?

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.