View Full Version : [C] Selection sort su una struct
.phoenix
06-02-2013, 10:00
Salve
Ho una struct di questo tipo:
/*DICHIARAZIONE GLOBALE DELLA STRUCT*/
struct prodotto
{
int codice;
char nome[20];
char utilizzo[20];
int quantita;
float costo;
};
/*DICHIARAZIONE CAMPI DELLA STRUCT*/;
struct prodotto scorta[20]={
{1, "cacciavite", "Edilizia", 15, 5.99},
{2, "fontana", "Idraulica", 10, 19.50},
{3, "avvolgicavo", "Elettrico", 2, 4.99},
{4, "chiodi", "Utensileria", 50, 0.99},
{5, "colori", "Pitturazione", 45, 10.00},
{6, "lavabile", "Pitturazione", 4, 5.49},
{7, "pennello", "Pitturazione", 2, 1.99},
{8, "guarnizione", "Idraulica", 100, 0.90},
{9, "martello", "Edilizia", 20, 2.50},
{10, "lampada", "Elettrico", 5, 10.00},
{11, "scalpello", "Utensileria", 3, 2.50},
{12, "lavabo", "Idraulica", 15, 15.99},
{13, "presa", "Elettrico", 1, 0.50},
{14, "tenaglia", "Utensileria", 5, 2.50},
{15, "sparachiodi", "Edilizia", 6, 20.99},
{16, "spine", "Elettrico", 25, 0.50},
{17, "vernice", "Pitturazione", 1, 10.50},
{18, "spatola", "Edilizia", 8, 2.99},
{19, "sifone", "Idraulica", 4, 9.50},
{20, "tubo", "Idraulica", 10, 9.90}};
e dovrei ordinare in ordine alfabetico per il nome usando l'ordinamento per selezione.
Ho sempre fatto selection sort su array di char ma mai su delle struct...potreste aiutarmi?
Grazie :D
Avevo provato una cosa del genere...
int i,j;
char *temp;
for(i=0;i<20;i++){
for(j=0;j<20;j++){
if(strcmp(scorta[i].nome,scorta[j].nome)<0)
{
strcpy(temp,scorta[j].nome);
strcpy(scorta[j].nome,scorta[i].nome);
strcpy(scorta[i].nome,temp);
}
}
}
}
ma ovviamente non va
Vincenzo1968
06-02-2013, 10:42
Perché copi con strcpy? Ti basta scambiare gli elementi dell'array, anche se si tratta di struct, come faresti su un array con tipi di dati semplici. ;)
.phoenix
06-02-2013, 10:48
quindi una cosa del genere?
temp=scorta[j].nome
scorta[j].nome=scorta[i].nome
scorta[i].nome=temp
?
Vincenzo1968
06-02-2013, 10:56
#include <stdio.h>
typedef struct _prodotto
{
int codice;
char nome[20];
char utilizzo[20];
int quantita;
float costo;
} prodotto ;
int main()
{
int i, j, k;
char *temp;
prodotto prodTemp;
prodotto scorta[20] =
{
{1, "cacciavite", "Edilizia", 15, 5.99},
{2, "fontana", "Idraulica", 10, 19.50},
{3, "avvolgicavo", "Elettrico", 2, 4.99},
{4, "chiodi", "Utensileria", 50, 0.99},
{5, "colori", "Pitturazione", 45, 10.00},
{6, "lavabile", "Pitturazione", 4, 5.49},
{7, "pennello", "Pitturazione", 2, 1.99},
{8, "guarnizione", "Idraulica", 100, 0.90},
{9, "martello", "Edilizia", 20, 2.50},
{10, "lampada", "Elettrico", 5, 10.00},
{11, "scalpello", "Utensileria", 3, 2.50},
{12, "lavabo", "Idraulica", 15, 15.99},
{13, "presa", "Elettrico", 1, 0.50},
{14, "tenaglia", "Utensileria", 5, 2.50},
{15, "sparachiodi", "Edilizia", 6, 20.99},
{16, "spine", "Elettrico", 25, 0.50},
{17, "vernice", "Pitturazione", 1, 10.50},
{18, "spatola", "Edilizia", 8, 2.99},
{19, "sifone", "Idraulica", 4, 9.50},
{20, "tubo", "Idraulica", 10, 9.90}
};
for(i = 0; i < 20; i++)
{
for(j = 0; j < 20; j++)
{
if(strcmp(scorta[i].nome, scorta[j].nome) < 0)
{
prodTemp = scorta[j];
scorta[j] = scorta[i];
scorta[i] = prodTemp;
}
}
}
printf("\n");
for(i = 0; i < 20; i++)
{
printf("Nome: %s\n", scorta[i].nome);
}
printf("\n");
return 0;
}
;)
Vincenzo1968
06-02-2013, 10:58
quindi una cosa del genere?
temp=scorta[j].nome
scorta[j].nome=scorta[i].nome
scorta[i].nome=temp
?
No, vedi codice postato sopra. Puoi scambiare direttamente gli elementi dell'array(anche se sono struct):
prodotto prodTemp;
...
...
...
prodTemp = scorta[j];
scorta[j] = scorta[i];
scorta[i] = prodTemp;
Vincenzo1968
06-02-2013, 11:02
http://img171.imageshack.us/img171/4146/sortstruct.jpg
;)
sottovento
06-02-2013, 11:13
In realta' non sarebbe possibile, in C, effettuare l'assegnamento di una struttura in questo modo. E' possibile in C++, non in C
.phoenix
06-02-2013, 11:37
grazie mille vincenzo :D
In realta' non sarebbe possibile, in C, effettuare l'assegnamento di una struttura in questo modo. E' possibile in C++, non in C
e come mai funziona?
Vincenzo1968
06-02-2013, 11:39
In realta' non sarebbe possibile, in C, effettuare l'assegnamento di una struttura in questo modo. E' possibile in C++, non in C
Adesso si. All'inizio no ma da C99(credo) in poi si. ;)
sottovento
06-02-2013, 11:48
Adesso si. All'inizio no ma da C99(credo) in poi si. ;)
Stai dicendo che sono vecchio? E poi, mi dai del tu? :D
No, non lo sapevo. Quindi se var1 e var2 sono due variabili dello stesso tipo strutturato
var1 = var2
copia tutti i campi, vettori inclusi. E' corretto?
Vincenzo1968
06-02-2013, 11:59
Stai dicendo che sono vecchio? E poi, mi dai del tu? :D
No, non lo sapevo. Quindi se var1 e var2 sono due variabili dello stesso tipo strutturato
var1 = var2
copia tutti i campi, vettori inclusi. E' corretto?
:asd:
Non ricordo più dove l'ho letto. Come al solito quando ti serve una cosa non la trovi mai. Ma il codice funziona(ho compilato con gcc non con g++) dunque i miei ricordi dovrebbere essere esatti. Compila e funziona anche con Visual Studio(con l'opzione "compile as C code"). ;)
Se copia anche i vettori onestamente non lo so, bisognerebbe provare. Ma credo di si. In fondo nome[20] è un vettore di char, no?
;)
.phoenix
06-02-2013, 12:08
ora avrei un altro problemino però...
ho quest'altra funzione che permette di stampare a video i prodotti in base al campo "utilizzo"
/*FUNCTION PER LA RICERCA DEI PRODOTTI DIVISI PER UTILIZZO*/
void cerca_utilizzo()
{
int z, c;
scanf("%d",&z);
if(z==1)
{
for (c=0;c<20;c++)
{
if(strcmp(scorta[c].utilizzo,"Edilizia")==0)/*CONFRONTA TUTTI GLI ELEMENTI DEL CAMPO utilizzo CON LA STRINGA*/
{
printf("\n\n\t%s",scorta[c].nome);/*VISUALIZZA TUTTI I PRODOTTI DELLO STESSO CAMPO utilizzo*/
}
else if(z==2)
{
for (c=0;c<20;c++)
{
if(strcmp(scorta[c].utilizzo,"Idraulica")==0)
{
printf("\n\n\t%s", scorta[c].nome);
}
}
printf("\n");
}
..........................
}
else if (z==6)
return 0;/*TERMINA LA FUNCTION*/
system("PAUSE");
}
ora vorrei implementare la funzione dell'ordinamento per ogni campo "utilizzo"
ho gia provato a mettere la funzione della selezione ma non funziona...
Vincenzo1968
06-02-2013, 13:01
Non basta sostituire i confronti utilizzando il campo utilizzo anziché nome?
if(strcmp(scorta[i].utilizzo, scorta[j].utilizzo) < 0)
Vincenzo1968
06-02-2013, 13:08
si, basta:
printf("\n");
for(i = 0; i < 20; i++)
{
printf("Nome: %s\nUtilizzo: %s\n\n", scorta[i].nome, scorta[i].utilizzo);
}
printf("\n");
Output:
vincenzo@Ubuntu12-10-AMD64:~/Contest19/Prova$ ./sortstruct
Nome: cacciavite
Utilizzo: Edilizia
Nome: martello
Utilizzo: Edilizia
Nome: sparachiodi
Utilizzo: Edilizia
Nome: spatola
Utilizzo: Edilizia
Nome: presa
Utilizzo: Elettrico
Nome: avvolgicavo
Utilizzo: Elettrico
Nome: spine
Utilizzo: Elettrico
Nome: lampada
Utilizzo: Elettrico
Nome: guarnizione
Utilizzo: Idraulica
Nome: lavabo
Utilizzo: Idraulica
Nome: fontana
Utilizzo: Idraulica
Nome: sifone
Utilizzo: Idraulica
Nome: tubo
Utilizzo: Idraulica
Nome: vernice
Utilizzo: Pitturazione
Nome: lavabile
Utilizzo: Pitturazione
Nome: pennello
Utilizzo: Pitturazione
Nome: colori
Utilizzo: Pitturazione
Nome: chiodi
Utilizzo: Utensileria
Nome: scalpello
Utilizzo: Utensileria
Nome: tenaglia
Utilizzo: Utensileria
;)
.phoenix
06-02-2013, 13:13
Non basta sostituire i confronti utilizzando il campo utilizzo anziché nome?
if(strcmp(scorta[i].utilizzo, scorta[j].utilizzo) < 0)
Così mi mette in ordine alfabetico il campo utilizzo...e non voglio questo
Praticamente nel programma dopo aver selezionato l'utilizzo (per esempio Edilizia) devo ordinare in ordine alfabetico i prodotti presente nel campo utilizzo
Ora lascia stare che nella struct sono gia in ordine alfabetico (sono una testa di cavolo, me lo volevo scansare il sort)...dovrei implementare la selection sort nella funzione che ricerca i prodotti per settore...
Vincenzo1968
06-02-2013, 13:17
Nientedimeno puoi ordinare in base a utlizzo e nome:
#include <stdio.h>
typedef struct _prodotto
{
int codice;
char nome[20];
char utilizzo[20];
int quantita;
float costo;
} prodotto ;
int main()
{
int i, j;
int bEqual;
prodotto prodTemp;
prodotto scorta[20] =
{
{1, "cacciavite", "Edilizia", 15, 5.99},
{2, "fontana", "Idraulica", 10, 19.50},
{3, "avvolgicavo", "Elettrico", 2, 4.99},
{4, "chiodi", "Utensileria", 50, 0.99},
{5, "colori", "Pitturazione", 45, 10.00},
{6, "lavabile", "Pitturazione", 4, 5.49},
{7, "pennello", "Pitturazione", 2, 1.99},
{8, "guarnizione", "Idraulica", 100, 0.90},
{9, "martello", "Edilizia", 20, 2.50},
{10, "lampada", "Elettrico", 5, 10.00},
{11, "scalpello", "Utensileria", 3, 2.50},
{12, "lavabo", "Idraulica", 15, 15.99},
{13, "presa", "Elettrico", 1, 0.50},
{14, "tenaglia", "Utensileria", 5, 2.50},
{15, "sparachiodi", "Edilizia", 6, 20.99},
{16, "spine", "Elettrico", 25, 0.50},
{17, "vernice", "Pitturazione", 1, 10.50},
{18, "spatola", "Edilizia", 8, 2.99},
{19, "sifone", "Idraulica", 4, 9.50},
{20, "tubo", "Idraulica", 10, 9.90}
};
for(i = 0; i < 20; i++)
{
for(j = 0; j < 20; j++)
{
bEqual = strcmp(scorta[i].utilizzo, scorta[j].utilizzo);
if( bEqual < 0 )
{
prodTemp = scorta[j];
scorta[j] = scorta[i];
scorta[i] = prodTemp;
}
else if ( bEqual == 0 )
{
if(strcmp(scorta[i].nome, scorta[j].nome) < 0)
{
prodTemp = scorta[j];
scorta[j] = scorta[i];
scorta[i] = prodTemp;
}
}
}
}
printf("\n");
for(i = 0; i < 20; i++)
{
printf("Nome: %s\nUtilizzo: %s\n\n", scorta[i].nome, scorta[i].utilizzo);
}
printf("\n");
return 0;
}
Output:
vincenzo@Ubuntu12-10-AMD64:~/Contest19/Prova$ gcc -O3 sortstruct.c -o sortstruct
vincenzo@Ubuntu12-10-AMD64:~/Contest19/Prova$ ./sortstruct
Nome: cacciavite
Utilizzo: Edilizia
Nome: martello
Utilizzo: Edilizia
Nome: sparachiodi
Utilizzo: Edilizia
Nome: spatola
Utilizzo: Edilizia
Nome: avvolgicavo
Utilizzo: Elettrico
Nome: lampada
Utilizzo: Elettrico
Nome: presa
Utilizzo: Elettrico
Nome: spine
Utilizzo: Elettrico
Nome: fontana
Utilizzo: Idraulica
Nome: guarnizione
Utilizzo: Idraulica
Nome: lavabo
Utilizzo: Idraulica
Nome: sifone
Utilizzo: Idraulica
Nome: tubo
Utilizzo: Idraulica
Nome: colori
Utilizzo: Pitturazione
Nome: lavabile
Utilizzo: Pitturazione
Nome: pennello
Utilizzo: Pitturazione
Nome: vernice
Utilizzo: Pitturazione
Nome: chiodi
Utilizzo: Utensileria
Nome: scalpello
Utilizzo: Utensileria
Nome: tenaglia
Utilizzo: Utensileria
;)
.phoenix
06-02-2013, 13:21
Vincenzo1968 grazie del tempo che mi stai dedicando
ma penso che questi ulteriori post non potranno servirmi
Ora provo a spiegare meglio
Nel programma ho questo menu:
Premi 1 per visualizzare i prodotti per l'EDILIZIA
Premi 2 per visualizzare i prodotti per l'IDRAULICA
...............
ecc....
Ora io premo 1
Devo visualizzare i prodotti dell'edilizia in ordine alfabetico, ma solo del campo Edilizia, non di tutti gli altri
Spero di essermi spiegato bene ora
Grazie ancora
Vincenzo1968
06-02-2013, 14:02
Vincenzo1968 grazie del tempo che mi stai dedicando
ma penso che questi ulteriori post non potranno servirmi
Ora provo a spiegare meglio
Nel programma ho questo menu:
Premi 1 per visualizzare i prodotti per l'EDILIZIA
Premi 2 per visualizzare i prodotti per l'IDRAULICA
...............
ecc....
Ora io premo 1
Devo visualizzare i prodotti dell'edilizia in ordine alfabetico, ma solo del campo Edilizia, non di tutti gli altri
Spero di essermi spiegato bene ora
Grazie ancora
Allora prendi la seconda versione che ho postato. L'array viene ordinato in base a quello che ti serve: i nomi di "edilizia", per esempio, li mette in ordine alfabetico.
Per fargli stampare solo quelli relativi a "edilizia" basta che fai un ciclo for dove, prima della printf, controlli con strcmp se il campo "utilizzo" corrisponde a "edilizia"; se corrisponde(strcmp restituisce zero) lo stampi altrimenti no.
;)
.phoenix
06-02-2013, 14:15
Allora prendi la seconda versione che ho postato. L'array viene ordinato in base a quello che ti serve: i nomi di "edilizia", per esempio, li mette in ordine alfabetico.
Per fargli stampare solo quelli relativi a "edilizia" basta che fai un ciclo for dove, prima della printf, controlli con strcmp se il campo "utilizzo" corrisponde a "edilizia"; se corrisponde(strcmp restituisce zero) lo stampi altrimenti no.
;)
cioè...sarebbe così in pratica...
if(z==1)
{
for (c=0;c<20;c++)
{
if(strcmp(scorta[c].utilizzo,"Edilizia")==0)
{
for(i=0;i<20;i++)
{
for(j = 0; j < 20; j++)
{
bEqual = strcmp(scorta[i].utilizzo, scorta[j].utilizzo);
if( bEqual < 0 )
{
prodTemp = scorta[j];
scorta[j] = scorta[i];
scorta[i] = prodTemp;
}
else if ( bEqual == 0 )
{
if(strcmp(scorta[i].nome, scorta[j].nome) < 0)
{
prodTemp = scorta[j];
scorta[j] = scorta[i];
scorta[i] = prodTemp;
}
}
}
}
printf("\n");
for(i = 0; i < 20; i++)
{
printf("%s", scorta[i].nome);
}
printf("\n");
return 0;
}
Vincenzo1968
06-02-2013, 14:28
http://img716.imageshack.us/img716/9306/prodottiz.jpg
#include <stdio.h>
typedef struct _prodotto
{
int codice;
char nome[20];
char utilizzo[20];
int quantita;
float costo;
} prodotto ;
void printUtilizzo(prodotto pArrayProdotti[], int sizeArray, const char *szUtilizzo)
{
int x;
for (x = 0; x < sizeArray; x++ )
{
if ( strcmp(szUtilizzo, pArrayProdotti[x].utilizzo) == 0 )
printf("Prodotto: %s\n", pArrayProdotti[x].nome);
}
}
int main()
{
int i, j;
int bEqual;
prodotto prodTemp;
prodotto scorta[20] =
{
{1, "cacciavite", "Edilizia", 15, 5.99},
{2, "fontana", "Idraulica", 10, 19.50},
{3, "avvolgicavo", "Elettrico", 2, 4.99},
{4, "chiodi", "Utensileria", 50, 0.99},
{5, "colori", "Pitturazione", 45, 10.00},
{6, "lavabile", "Pitturazione", 4, 5.49},
{7, "pennello", "Pitturazione", 2, 1.99},
{8, "guarnizione", "Idraulica", 100, 0.90},
{9, "martello", "Edilizia", 20, 2.50},
{10, "lampada", "Elettrico", 5, 10.00},
{11, "scalpello", "Utensileria", 3, 2.50},
{12, "lavabo", "Idraulica", 15, 15.99},
{13, "presa", "Elettrico", 1, 0.50},
{14, "tenaglia", "Utensileria", 5, 2.50},
{15, "sparachiodi", "Edilizia", 6, 20.99},
{16, "spine", "Elettrico", 25, 0.50},
{17, "vernice", "Pitturazione", 1, 10.50},
{18, "spatola", "Edilizia", 8, 2.99},
{19, "sifone", "Idraulica", 4, 9.50},
{20, "tubo", "Idraulica", 10, 9.90}
};
for(i = 0; i < 20; i++)
{
for(j = 0; j < 20; j++)
{
bEqual = strcmp(scorta[i].utilizzo, scorta[j].utilizzo);
if( bEqual < 0 )
{
prodTemp = scorta[j];
scorta[j] = scorta[i];
scorta[i] = prodTemp;
}
else if ( bEqual == 0 )
{
if(strcmp(scorta[i].nome, scorta[j].nome) < 0)
{
prodTemp = scorta[j];
scorta[j] = scorta[i];
scorta[i] = prodTemp;
}
}
}
}
printf("\n");
printf("Stampo i prodotti della categoria \"Edilizia\":\n");
printUtilizzo(scorta, 20, "Edilizia");
/*
for(i = 0; i < 20; i++)
{
printf("Nome: %s\nUtilizzo: %s\n\n", scorta[i].nome, scorta[i].utilizzo);
}
*/
printf("\n");
return 0;
}
;)
.phoenix
06-02-2013, 14:33
Grazie mille vincenzo :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.