Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    11

    [C] Ordinamento alfabetico di 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:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #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<n; i++){
        printf("Cliente %d: \n", i+1);
        printf("Cognome: \n");
        scanf("%s", ElencoClienti[i].cognome);
        printf("Nome: \n");
        scanf("%s", ElencoClienti[i].nome);
        printf("Via: \n");
        scanf("%s", ElencoClienti[i].via);
        tot++;
    }
    return tot;
    }
    void scambia(cliente ElencoClienti[],char c[], int n){
        int i,j;
        cliente copiaElencoClienti[MAX];
        for(i=0; i<n; i++){
            for(j=0; j<n; j++){
                if(strcmp(c,copiaElencoClienti[i].cognome)==0){
                char *temp;
                temp=(char*)malloc(n*sizeof(char));
                strcpy(temp,ElencoClienti[i].cognome);
                strcpy(copiaElencoClienti[i].cognome,copiaElencoClienti[j].cognome);
                strcpy(copiaElencoClienti[j].cognome,temp);
                }
                if(strcmp(c,copiaElencoClienti[i].nome)==0){
                char *temp;
                temp=(char*)malloc(n*sizeof(char));
                strcpy(temp,copiaElencoClienti[i].nome);
                strcpy(copiaElencoClienti[i].nome,copiaElencoClienti[j].nome);
                strcpy(copiaElencoClienti[j].nome,temp);
                }
    
    
                if(strcmp(c,copiaElencoClienti[i].via)==0){
                char *temp;
                temp=(char*)malloc(n*sizeof(char));
                strcpy(temp,ElencoClienti[i].via);
                strcpy(copiaElencoClienti[i].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<n; 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<alto; i++){
            if(strcmp(ElencoClienti[i].cognome,ElencoClienti[i+1].cognome)>0){
                scambia(ElencoClienti,cognomiordinati,n);
                scambia(ElencoClienti,nomiordinati,n);
                scambia(ElencoClienti,vieordinate,n);
        }
    }
    
    
    for(i=0; i<n; i++){
        printf("Cognome:%s Nome:%s Via:%s \n",
        ElencoClienti[i].cognome,ElencoClienti[i].nome,ElencoClienti[i].via);
    }
    }
    }
    Ultima modifica di LeleFT; 15-02-2016 a 13:46 Motivo: Aggiunti i tag CODE

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    Utilizza i tag CODE e l'indentazione altrimenti il codice non si capisce.

    Che algoritmo di ordinamento hai inteso usare?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    23
    anch'io ho avuto lo stesso problema

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    Quote Originariamente inviata da hezter Visualizza il messaggio
    anch'io ho avuto lo stesso problema
    Stesso problema (malfunzionamento) o esercizio?

    In ogni caso, rivolgendomi a edc96, cosa vuol dire esattamente "non funziona"? Errori? Crash? Si blocca?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    11
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Stesso problema (malfunzionamento) o esercizio?

    In ogni caso, rivolgendomi a edc96, cosa vuol dire esattamente "non funziona"? Errori? Crash? Si blocca?
    Nel senso che non mi dava errori ma la funzione non svolgeva il suo compito. Poi ho risolto semplicemente creando una funzione che scambiasse strutture, invocandola opportunamente nella funzione che mi doveva ordinare il tutto alfabeticamente seguendo come chiave d'ordinamento il cognome e ora funziona!

  6. #6
    Allora per quanto riguarda le linee di questo tipo (cognomiordinati[k]=copiaElencoClienti[k].cognome)nelle funzione scambia, le devi mettere in questo modo: cognomiordinati[k]=copiaElencoClienti[k].cognome[k].
    Poi alla fine del ciclo for dove usi gli scanf nella funzione "caricaDati" devi pulire il buffer.

  7. #7
    Però vabbè se hai risolto buon per te

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.