1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#define MAX 100000
//Structure de base : largeur,longueur,hauteur et dimension
//On garde la dimension car cela accelere le tri
typedef struct sBoites
{
int largeur;
int longueur;
int hauteur;
int dimension;
}SBoite;
//Lecture du fichier... Fonction basique...
SBoite *
lireFichier (FILE *f, int *nombre)
{
int cnt = 0;
//Pour cet exercice on va tricher et allouer directement MAX,
//normalement on ferait un système d'agrandissement du tableau...
SBoite *res = malloc (sizeof (*res) * MAX);
assert (res);
while (1)
{
int largeur, longueur, hauteur;
int r = fscanf (f, "%d,%d,%d;", &longueur, &largeur, &hauteur);
if (r != 3)
break;
res[cnt].largeur = largeur;
res[cnt].longueur = longueur;
res[cnt].hauteur = hauteur;
//Calcul de la dimension
res[cnt].dimension = largeur * longueur * hauteur;
cnt++;
//Paranoia
assert (cnt <= MAX);
}
*nombre = cnt;
return res;
}
//Ce tri mettra le plus grand en position 0
int
comparBoites (const void *pva, const void *pvb)
{
const SBoite *pba = pva;
const SBoite *pbb = pvb;
int dima = pba->dimension;
int dimb = pbb->dimension;
return dimb - dima;
}
//Tri utilisant qsort de la libc
void
triBoites (SBoite *boites, int nombre)
{
qsort (boites, nombre, sizeof (*boites), comparBoites);
}
//Affichage
void
afficheBoite (SBoite *b)
{
fprintf (stderr, "Boite plus grande %d,%d,%d\n", b->longueur,b->largeur,b->hauteur);
}
//Liberation du tableau
void
libereBoites (SBoite *boites)
{
free (boites), boites = NULL;
}
//Ecriture
void
ecrireFichier (FILE *f, SBoite *boites, int nombre)
{
int i;
if (nombre > 0)
{
for (i=0; i < nombre - 1; i++)
{
fprintf (f, "%d,%d,%d;", boites[i].longueur, boites[i].largeur, boites[i].hauteur);
}
//Last one
fprintf (f, "%d,%d,%d", boites[i].longueur, boites[i].largeur, boites[i].hauteur);
}
}
int
main (void)
{
const char *fname = "box.txt",
*foutname = "box_output.txt";
FILE *f = fopen (fname, "r");
SBoite *boites;
int nombre = 0;
if (f == NULL)
{
fprintf (stderr, "Fichier %s n'a pas ete ouvert", fname);
return EXIT_FAILURE;
}
boites = lireFichier (f, &nombre);
//On trie
triBoites (boites, nombre);
//On affiche le plus grand
afficheBoite (boites);
//On ferme
fclose (f), f = NULL;
//On ouvre pour ecrire
f = fopen (foutname, "w");
if (f == NULL)
{
fprintf (stderr, "Fichier %s n'a pas ete ouvert", foutname);
return EXIT_FAILURE;
}
//Ecrire fichier
ecrireFichier (f, boites, nombre);
//On ferme
fclose (f), f = NULL;
//On libere la memoire
libereBoites (boites), boites = NULL;
return EXIT_SUCCESS;
} |
Partager