#include #include int saisit(int **, FILE *); void affiche (int *, int, FILE *); int chercheIndice(int *, int, int); void insere(int *, int, int, int); int main(int argc, char ** argv) { int * table; /* pour ranger les entiers saisis */ int nbEntiers; /* nombre d'entiers saisis */ FILE * fichier; if (argc < 3) { printf("Vous devez indiquer un nom de fichier de lecture" " et un nom de fichier d'ecriture\n"); exit(0); } fichier = fopen(argv[1], "r"); if (fichier == NULL) { printf("Le fichier de lecture n'a pas pu être ouvert\n"); exit(0); } nbEntiers = saisit(&table, fichier); fclose(fichier); fichier = fopen(argv[2], "w"); affiche(table, nbEntiers, fichier); fclose(fichier); return 0; } int saisit(int ** adrTableau, FILE * fichier) { int nbEntiers = 0; int cle, indice; while (fscanf(fichier, "%d", &cle) != EOF) nbEntiers++; *adrTableau = (int *) malloc(nbEntiers * sizeof(int)); rewind(fichier); nbEntiers = 0; while (fscanf(fichier, "%d", &cle) != EOF) { indice = chercheIndice(*adrTableau, nbEntiers, cle); if (indice == -1) printf("%d figure deja\n", cle); else { insere(*adrTableau, nbEntiers, cle, indice); nbEntiers++; } } *adrTableau = (int *) realloc(*adrTableau, nbEntiers * sizeof(int)); return nbEntiers; } int chercheIndice(int * tableau, int nbEntiers, int cle) { int gauche = 0, droite = nbEntiers - 1; int milieu; while (gauche <= droite) { milieu = (gauche + droite) / 2; if (cle < tableau[milieu]) droite = milieu - 1; else if (cle > tableau[milieu]) gauche = milieu + 1; else return -1; } return gauche; } void insere(int * tableau, int nbEntiers, int cle, int place) { int i; for(i = nbEntiers; i > place; i--) tableau[i] = tableau[i - 1]; tableau[place] = cle; } void affiche (int * tableau, int nbEntiers, FILE * fichier) { int i; for(i = 0; i < nbEntiers; i++) fprintf(fichier, "%4d",tableau[i]); }