[C] Ordinare alfabeticamente stringhe

edc96
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);
}
}
}

Risposte
vict85
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.

#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("");
}

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.