PDA

Visualizza la versione completa : [C++] Ordinamento crescente di un array di struct e ricerca di elemento


TheBlackWolf
31-07-2018, 11:31
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:


#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:


#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:


#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:



#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:


#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:

29587

29588

29590

oregon
31-07-2018, 12:54
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

TheBlackWolf
31-07-2018, 16:32
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


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;

}


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;


}

oregon
31-07-2018, 19:59
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?

TheBlackWolf
01-08-2018, 11:07
Butta quel compilatore, che ti devo dire.



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?

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?

Loading