|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Dec 2012
Messaggi: 15
|
[C] Selection sort su una struct
Salve
Ho una struct di questo tipo: Codice:
/*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}}; Ho sempre fatto selection sort su array di char ma mai su delle struct...potreste aiutarmi? Grazie ![]() Avevo provato una cosa del genere... Codice:
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); } } } } Ultima modifica di .phoenix : 06-02-2013 alle 10:25. |
![]() |
![]() |
![]() |
#2 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
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.
![]() |
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: Dec 2012
Messaggi: 15
|
quindi una cosa del genere?
temp=scorta[j].nome scorta[j].nome=scorta[i].nome scorta[i].nome=temp ? |
![]() |
![]() |
![]() |
#4 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Codice:
#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; } ![]() |
![]() |
![]() |
![]() |
#5 | |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
Codice:
prodotto prodTemp; ... ... ... prodTemp = scorta[j]; scorta[j] = scorta[i]; scorta[i] = prodTemp; |
|
![]() |
![]() |
![]() |
#6 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
![]() ![]() |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
In realta' non sarebbe possibile, in C, effettuare l'assegnamento di una struttura in questo modo. E' possibile in C++, non in C
__________________
In God we trust; all others bring data |
![]() |
![]() |
![]() |
#8 |
Junior Member
Iscritto dal: Dec 2012
Messaggi: 15
|
grazie mille vincenzo
![]() e come mai funziona? Ultima modifica di .phoenix : 06-02-2013 alle 12:09. |
![]() |
![]() |
![]() |
#9 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Stai dicendo che sono vecchio? E poi, mi dai del tu?
![]() 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?
__________________
In God we trust; all others bring data |
![]() |
![]() |
![]() |
#11 | |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
![]() 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? ![]() |
|
![]() |
![]() |
![]() |
#12 |
Junior Member
Iscritto dal: Dec 2012
Messaggi: 15
|
ora avrei un altro problemino però...
ho quest'altra funzione che permette di stampare a video i prodotti in base al campo "utilizzo" Codice:
/*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"); } ho gia provato a mettere la funzione della selezione ma non funziona... |
![]() |
![]() |
![]() |
#13 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Non basta sostituire i confronti utilizzando il campo utilizzo anziché nome?
Codice:
if(strcmp(scorta[i].utilizzo, scorta[j].utilizzo) < 0) |
![]() |
![]() |
![]() |
#14 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
si, basta:
Codice:
printf("\n"); for(i = 0; i < 20; i++) { printf("Nome: %s\nUtilizzo: %s\n\n", scorta[i].nome, scorta[i].utilizzo); } printf("\n"); Codice:
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 ![]() |
![]() |
![]() |
![]() |
#15 | |
Junior Member
Iscritto dal: Dec 2012
Messaggi: 15
|
Quote:
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... |
|
![]() |
![]() |
![]() |
#16 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Nientedimeno puoi ordinare in base a utlizzo e nome:
Codice:
#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: Codice:
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 ![]() |
![]() |
![]() |
![]() |
#17 |
Junior Member
Iscritto dal: Dec 2012
Messaggi: 15
|
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 |
![]() |
![]() |
![]() |
#18 | |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
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. ![]() |
|
![]() |
![]() |
![]() |
#19 | |
Junior Member
Iscritto dal: Dec 2012
Messaggi: 15
|
Quote:
cioè...sarebbe così in pratica... Codice:
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; } |
|
![]() |
![]() |
![]() |
#20 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
![]() Codice:
#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; } ![]() Ultima modifica di Vincenzo1968 : 06-02-2013 alle 15:02. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:41.