Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Ordinare array di stringhe
Forum - C/C++ - Ordinare array di stringhe

Avatar
Andre89 (Normal User)
Newbie


Messaggi: 2
Iscritto: 15/05/2009

Segnala al moderatore
Postato alle 18:26
Venerdì, 15/05/2009
Ciao a tutti,
vi posto il codice che sto scrivendo per un programma: date in input (da file txt) una serie di "persone" (caratterizzate da una stringa per il nome, una per il cognome, ...),devo ordinare tali persone in ordine crescente in base al cognome; infine stampo il tutto.
Il compilatore mi da problemi circa nell'insertion sort e al passaggio dei parameti alla funzione.
Sono ancora principiante, sto studiando all'università...ringrazio molto chi mi può dare una mano!



#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define NUM 3



typedef struct el { /*animatore*/

        char nome[12];

        char cognome[15];

        char numero[11];

        char mail[28];

        char data[9];

}el;



typedef el animatore[NUM];

animatore a;

FILE *fin, *fout;



void insertionsort (animatore v[], int dim){ /*ordino l'array in base al cognome*/

    int i_sist, i_contr;
    animatore val_sist;

    for(i_sist = 0; i_sist < dim -1; i_sist ++){

        val_sist = v[i_sist +1];

        i_contr = i_sist;

        while(i_contr >= 0 && (strcmp(v[i_contr].cognome , v[i_sist +1].cognome) >0)){

            v[i_contr + 1] = v[i_contr];

            i_contr --;

        }

        v[i_contr+1] = val_sist;

    }

}



int main() {
    animatore a;

    int i,l=0;
    char x;
    fin = fopen("grest.txt", "r"); /* copio carattere per carattere le diverse stringhe*/
    x = fgetc(fin);

        for(i=0;i<NUM; i++){
        if(x==EOF) break;
        while(x!=(char)(32)){
            a.nome[l] = x;
            l++;
            x = fgetc(fin);
        }
        l=0;
        while(x!=(char)(32)){    /*quando trovo uno spazio tra una stringa all'altra, passo al cognome*/
            a.cognome[l] = x;
            l++;
            x = fgetc(fin);
        }
        l=0;
        while(x!=(char)(32)){
            a.numero[l] = x;
            l++;
            x = fgetc(fin);
        }
        l=0;        
        while(x!=(char)(32)){
            a.data[l] = x;
            l++;
            x = fgetc(fin);
        }
        l=0;
        while(x!=EOF || x!='/'){ /*al termine di ogni riga, ho questo carattere,  così so quando cambiare persona*/
            a.mail[l] = x;
            l++;
            x = fgetc(fin);
        }
        l=0;
    }
    fclose(fin);

    insertionsort(&a,NUM);

    for(i=0;i<NUM; i++)

                   printf("%s\t%s\t%d\t%s\t%s\n", a.nome, a.cognome, atoi(a.numero), a.mail, a.data);
    

    system("PAUSE");
    return 0;

}

PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 1:11
Sabato, 16/05/2009
Ti consiglio di studiare bene le strutture e anche le letture da file (esempio: perchè non usare la fscanf? è più comoda e poi a prima vista hai fatto:

----> typedef el animatore[NUM];
----> animatore v[]  vettore di vettori??? O_O'
animatore val_sist;

è normale che poi sono incompatibili val_sist con v[]

quindi ti consiglierei di cominciare così:

typedef struct { /*animatore*/
        char nome[12];
        char cognome[15];
        char numero[11];
        char mail[28];
        char data[9];
}animatore;

animatore (variabile che vuoi)[DIM];



"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
cit. theprogrammer
PM Quote
Avatar
eddiewrc (Member)
Expert


Messaggi: 560
Iscritto: 30/04/2006

Segnala al moderatore
Postato alle 17:05
Sabato, 16/05/2009
per confrontare stringhe usa strcmp(string1, string2).. che restituisce 1 se string1 è maggiore, 0 se sono uguali e 2 se string2 è maggiore.


La conoscenza non ha mai fatto del male a nessuno. Caso mai hanno fatto del male quelli che hanno impiegato MALE la loro conoscenza. La conoscenza deve essere libera e quando dico libera intendo "free as freedom" e non "free as a free beer".
PM Quote
Avatar
Xaratroom (Ex-Member)
Expert


Messaggi: 526
Iscritto: 03/04/2008

Segnala al moderatore
Postato alle 17:22
Sabato, 16/05/2009
Testo quotato

Postato originariamente da Lawliet:
quindi ti consiglierei di cominciare così:

typedef struct { /*animatore*/
        char nome[12];
        char cognome[15];
        char numero[11];
        char mail[28];
        char data[9];
}animatore;

animatore (variabile che vuoi)[DIM];


Io ti consiglio di fare così:
Codice sorgente - presumibilmente Plain Text

  1. animatore *<identificatore>[DIM];


Quindi allocare dinamicamente la memoria e spostare solo i riferimenti durante l'ordinamento.


bool Woman::makeYourselfBetter() {
       goto bathroom;

bathroom:
       while (1);

       return this->_isGoodResult();
}
PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 19:35
Sabato, 16/05/2009
Sicuramente il tuo consiglio è più efficiente del mio in quanto non copi tutta la struttura, ci può stare benissimo :)
Ma prima deve capire meglio le strutture e il resto per arrivare a quello che hai consigliato tu :)


"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
cit. theprogrammer
PM Quote
Avatar
Andre89 (Normal User)
Newbie


Messaggi: 2
Iscritto: 15/05/2009

Segnala al moderatore
Postato alle 1:30
Domenica, 17/05/2009
Grazie a tutti, in particolare a Lawliet.
L'errore del "vettore di vettori" è stato davvero grossolano.
Il problema secondo me non è rappresentato tanto dalla struct, quanto dall'uso di un file come input (è il primo programma in cui utilizzo "fin"), e tutte le procedure che dipendono da quest'ultimo. Ho provato con la fscanf, e ha quasi funzionato (devo verificare meglio come passare i dati di input nei vettori), comunque il più è fatto.

Per eddiewrc: già usato strcmp, ma necessito dell'insertion sort per l'ordinamento

:k:

PM Quote
Avatar
eddiewrc (Member)
Expert


Messaggi: 560
Iscritto: 30/04/2006

Segnala al moderatore
Postato alle 15:46
Domenica, 17/05/2009
beh adto che nn sono grandi quantità di dati e che l'efficienza nn è un must, direi che un ordinamento vale l'altro.. cmq lo pseudo codice dell'insertion sort è:

for (j = 2; j <= lenght(A); j++)
{
   key = A[ j ];
   i = j - 1;
   while (i > 0 and A [ i ] > key)
   {
       A[ i + 1 ] = A [ i ];
       i = i - 1;
   }
A[ i + 1 ] = key;
}

questo per un vettore A i cui indici vanno da 1 a lenght(A).. ovviamente nella realtà vanno da 0 a lenght -1



La conoscenza non ha mai fatto del male a nessuno. Caso mai hanno fatto del male quelli che hanno impiegato MALE la loro conoscenza. La conoscenza deve essere libera e quando dico libera intendo "free as freedom" e non "free as a free beer".
PM Quote