[C] Ordinare alfabeticamente stringhe
Salve, sto lavorando ad un programma che, una volta inseriti i dati di tot. clienti(cognome,nome,via), stampi a video i dati dei clienti caricati ma in ordine alfabetico. Ho svolto l'esercizio nel seguente modo, ma non funziona:
#include
#include
#include
#define MAX 100
#define M 50
typedef struct{
char cognome[M];
char nome[M];
char via[M];
}cliente;
int caricaDati(cliente[]);
void scambia(cliente[],char[],int);
void ordinaClienti(cliente[],int);
int main () {
cliente ElencoClienti[MAX];
int n_clienti=caricaDati(ElencoClienti);
printf("Totale clienti caricati:%d \n", n_clienti);
ordinaClienti(ElencoClienti,n_clienti);
}
int caricaDati(cliente ElencoClienti[]){
int i,n,tot=0;
printf("Quanti clienti vuoi caricare? \n");
scanf("%d", &n);
for(i=0; i
printf("Cliente %d: \n", i+1);
printf("Cognome: \n");
scanf("%s", ElencoClienti.cognome);
printf("Nome: \n");
scanf("%s", ElencoClienti.nome);
printf("Via: \n");
scanf("%s", ElencoClienti.via);
tot++;
}
return tot;
}
void scambia(cliente ElencoClienti[],char c[], int n){
int i,j;
cliente copiaElencoClienti[MAX];
for(i=0; i
for(j=0; j
if(strcmp(c,copiaElencoClienti.cognome)==0){
char *temp;
temp=(char*)malloc(n*sizeof(char));
strcpy(temp,ElencoClienti.cognome);
strcpy(copiaElencoClienti.cognome,copiaElencoClienti[j].cognome);
strcpy(copiaElencoClienti[j].cognome,temp);
}
if(strcmp(c,copiaElencoClienti.nome)==0){
char *temp;
temp=(char*)malloc(n*sizeof(char));
strcpy(temp,copiaElencoClienti.nome);
strcpy(copiaElencoClienti.nome,copiaElencoClienti[j].nome);
strcpy(copiaElencoClienti[j].nome,temp);
}
if(strcmp(c,copiaElencoClienti.via)==0){
char *temp;
temp=(char*)malloc(n*sizeof(char));
strcpy(temp,ElencoClienti.via);
strcpy(copiaElencoClienti.via,copiaElencoClienti[j].via);
strcpy(copiaElencoClienti[j].via,temp);
}
}
}
}
void ordinaClienti(cliente ElencoClienti[], int n){
cliente copiaElencoClienti[MAX];
char cognomiordinati[M], nomiordinati[M], vieordinate[M];
int k;
for(k=0; k
strcpy(copiaElencoClienti[k].cognome,ElencoClienti[k].cognome);
cognomiordinati[k]=copiaElencoClienti[k].cognome;
strcpy(copiaElencoClienti[k].nome,ElencoClienti[k].nome);
nomiordinati[k]=copiaElencoClienti[k].nome;
strcpy(copiaElencoClienti[k].via,ElencoClienti[k].via);
vieordinate[k]=copiaElencoClienti[k].via;
}
int alto;
int i;
for(alto=n-1; alto>0; alto--){
for(i=0; i
if(strcmp(ElencoClienti.cognome,ElencoClienti[i+1].cognome)>0){
scambia(ElencoClienti,cognomiordinati,n);
scambia(ElencoClienti,nomiordinati,n);
scambia(ElencoClienti,vieordinate,n);
}
}
for(i=0; i
printf("Cognome:%s Nome:%s Via:%s \n",
ElencoClienti.cognome,ElencoClienti.nome,ElencoClienti.via);
}
}
}
#include
#include
#include
#define MAX 100
#define M 50
typedef struct{
char cognome[M];
char nome[M];
char via[M];
}cliente;
int caricaDati(cliente[]);
void scambia(cliente[],char[],int);
void ordinaClienti(cliente[],int);
int main () {
cliente ElencoClienti[MAX];
int n_clienti=caricaDati(ElencoClienti);
printf("Totale clienti caricati:%d \n", n_clienti);
ordinaClienti(ElencoClienti,n_clienti);
}
int caricaDati(cliente ElencoClienti[]){
int i,n,tot=0;
printf("Quanti clienti vuoi caricare? \n");
scanf("%d", &n);
for(i=0; i
printf("Cognome: \n");
scanf("%s", ElencoClienti.cognome);
printf("Nome: \n");
scanf("%s", ElencoClienti.nome);
printf("Via: \n");
scanf("%s", ElencoClienti.via);
tot++;
}
return tot;
}
void scambia(cliente ElencoClienti[],char c[], int n){
int i,j;
cliente copiaElencoClienti[MAX];
for(i=0; i
char *temp;
temp=(char*)malloc(n*sizeof(char));
strcpy(temp,ElencoClienti.cognome);
strcpy(copiaElencoClienti.cognome,copiaElencoClienti[j].cognome);
strcpy(copiaElencoClienti[j].cognome,temp);
}
if(strcmp(c,copiaElencoClienti.nome)==0){
char *temp;
temp=(char*)malloc(n*sizeof(char));
strcpy(temp,copiaElencoClienti.nome);
strcpy(copiaElencoClienti.nome,copiaElencoClienti[j].nome);
strcpy(copiaElencoClienti[j].nome,temp);
}
if(strcmp(c,copiaElencoClienti.via)==0){
char *temp;
temp=(char*)malloc(n*sizeof(char));
strcpy(temp,ElencoClienti.via);
strcpy(copiaElencoClienti.via,copiaElencoClienti[j].via);
strcpy(copiaElencoClienti[j].via,temp);
}
}
}
}
void ordinaClienti(cliente ElencoClienti[], int n){
cliente copiaElencoClienti[MAX];
char cognomiordinati[M], nomiordinati[M], vieordinate[M];
int k;
for(k=0; k
cognomiordinati[k]=copiaElencoClienti[k].cognome;
strcpy(copiaElencoClienti[k].nome,ElencoClienti[k].nome);
nomiordinati[k]=copiaElencoClienti[k].nome;
strcpy(copiaElencoClienti[k].via,ElencoClienti[k].via);
vieordinate[k]=copiaElencoClienti[k].via;
}
int alto;
int i;
for(alto=n-1; alto>0; alto--){
for(i=0; i
scambia(ElencoClienti,cognomiordinati,n);
scambia(ElencoClienti,nomiordinati,n);
scambia(ElencoClienti,vieordinate,n);
}
}
for(i=0; i
ElencoClienti.cognome,ElencoClienti.nome,ElencoClienti.via);
}
}
}
Risposte
Dovresti indentare il codice e usare il tag code. Scritto così è davvero difficile da leggere. In ogni caso il codice che hai usato per scambiare due clienti non ha alcun senso (a partire dai parametri che carichi nella funzione).
Il main e la funzione che carica i dati mi sembra siano ok ma manca una funzione per stampare la rubrica (a parte qualche piccola questione di stile qua e là che modificherei). La funzione che ordina andrebbe penso anche lei rivista. Per queste due funzioni ti consiglio sinceramente di cancellare tutto il codice che hai scritto finora e rifarle da 0, soprattutto lo scambio.
EDIT: Il seguente codice mostra come puoi scambiare tue strutture di questo tipo.
Il main e la funzione che carica i dati mi sembra siano ok ma manca una funzione per stampare la rubrica (a parte qualche piccola questione di stile qua e là che modificherei). La funzione che ordina andrebbe penso anche lei rivista. Per queste due funzioni ti consiglio sinceramente di cancellare tutto il codice che hai scritto finora e rifarle da 0, soprattutto lo scambio.
EDIT: Il seguente codice mostra come puoi scambiare tue strutture di questo tipo.
#include <stdio.h> struct cliente { char nome[16]; char cognome[16]; char via[16]; }; void scambia(struct cliente *, struct cliente *); void stampa(struct cliente); int main(void) { struct cliente a, b; a = (struct cliente) { "AAAA", "BBBB", "CCCC"}; b = (struct cliente) { "DDDD", "EEEE", "FFFF"}; stampa(a); stampa(b); puts("Scambio..."); scambia(&a, &b); stampa(a); stampa(b); } void scambia(struct cliente *A_s, struct cliente *B_s) { struct cliente const Cl_s = *A_s; *A_s = *B_s; *B_s = Cl_s; } void stampa(struct cliente Cl_s) { puts("____CLIENTE____"); fputs("Nome:\t\t", stdout); puts(Cl_s.nome); fputs("Cognome:\t", stdout); puts(Cl_s.cognome); fputs("Indirizzo:\t", stdout); puts(Cl_s.via); puts(""); }