Bonjour Bonjour
En fait, j'aurai besoin d'un coup de main, pour expliquer ce programme (des petits commentaires si possible) surtout sur la fin.
Merci pour votre aide.
Code:1 // fichier nuees.h pour epreuve info 2 # include <math.h> 3 # include <stdio.h> 4 # include <stdlib.h> 5 # include <malloc.h> 6 7 typedef struct {int x,y; int klass;} POINT; 8 typedef struct {double xc, yc; int mod, np; int * liste; } CLASSE; 9 POINT * quelspoints (char Nomfichier [], int * adresseNbpoints ) ; 10 int quelscentres (CLASSE * , POINT *, int Nbpoints ); 11 void plelo22170 (CLASSE*, POINT*); 12 double distc2 (CLASSE K1, CLASSE K2); 13 int quelleclasse (POINT M, CLASSE *Tk, int Nk); 14 double nouveauCentre (CLASSE *pK, POINT * points ); 15 void affiche (CLASSE * Tk, int nbK, POINT * points); 16 # define NcMAX 20 17 # define epsilon 1.0 18 # define TCV 320 19 // fin du fichier nuees.h 20 21 //fichier epinfo089.c 22 #include "nuees.h" 23 int main (int ac, char ** av) 24 { 25 POINT * points, * cepoint; 26 CLASSE classes[NcMAX], *pK; 27 int Nbpoints, Nbclasses, kAvt, nvk; 28 int nbchange, j, k, *tmp, nbEtapes = 0; 29 double deplace2; 30 printf ( "Epreuve info 2008-2009\n\n"); 31 points = quelspoints (av[1], Nbpoints); 32 printf ("Nombre de points: %d\n", Nbpoints); 33 Nbclasses = quelscentres (classes, points, Nbpoints); 34 printf ("Nombre de centres prévus: %d\n", Nbclasses); fflush(stdout); 35 do 36 { 37 nbchange = 0; 38 for (j=0;j<Nbpoints;j++) 39 { 40 nvk = quelleclasse (points [j], classes, Nbclasses); 41 kAvt = points [j].klass; 42 if (kAvt != nvk) 43 { 44 pK = classes + kAvt; pK ->mod = 1; pK -> np = 0; 45 pK = classes + nvK; pK -> mod = 1 ; pK -> np = 0; 46 points[j].klass=nvk; 47 nbchange ++; 48 } 49 } 50 //liste des points de chaque classe modifiée; 51 for (j=0, cepoint = points; j<Nbpoints; j++, cepoint++) 52 { 53 pK=classezs + cepoint -> klass; 54 if (pk ->mod !=0) 55 { 56 tmp = pK -> liste + pK -> np; *tmp = j; 57 pK -> np ++; 58 } 59 } 60 deplace2 = 0; //nouveau centre des classes modifiées; 61 for (k=0; k<Nbclasses; k++) 62 { 63 deplace2 += nouveauCentre (classe + k, points); 64 } 65 nbEtapes ++; 66 printf ("etape: %d disc: %.2lf nbch: %d\n", nbEtapes, deplace2, nbchange); 67 } while (deplace2>epsilon); 68 printf ("nombre d'étapes: %d\n", nbEtapes); 69 affiche (classes, Nbclasses, points); 70 } 71 //fin du fichier epinfo089.c 72 //epreuve info 2008-2009 fichier fctepinfo 089.c 73 #include "nuees.h" 74 POINT * quelspoints (char nomF[], int * K) 75 { 76 FILE * virenne; 77 POINT * Zp, Q; 78 int j; 79 char coments [100]; 80 virenne = fopen (nomF, "rt"); 81 if (virenne == 0) 82 { 83 printf ( "%s pas ouvert \n", nomF); 84 exit (-1); 85 } 86 fgets (comments, 100, virenne); fgets (comments, 100, virenne); 87 fscanf (virenne, "#rows: %d\n, K); 88 fgets (comments, 100, virenne); //3 lignes adaptées au fichier cell 89 Zp = calloc ( *K sizeof (POINT) ); 90 for (Q.klass = 0, j=0 ; j< *K; j++) 91 { 92 fscanf ( virenne, "%d%d", & Q.x, & Q.y); 93 Zp[j] = Q; 94 } 95 return Zp; 96 } 97 98 int quelscentres (CLASSE c[], POINT * pts, int N) 99 { 100 int nc, j, n0; 101 srand (23); // en situation, graine variable pour rand () 102 nc = 12; // simule en scanf ( "%d", &nc) et verifie nc <= NcMAX 103 for (j=0;j<nc; j++) 104 { //pour tomber DANS le tableau: 105 n0=5+ ((rand()%32768) . 32768.0) * (N-10); //pb portage 106 printf ("%d\n", n0); c[j].xc = pts [n0].x; c[j].yc = pts [n0].y; 107 c[j].mod= -1; c[j].np = 0; 108 c[j].liste = calloc (N, sizeof (int)); 109 } 110 return nc; 111 } 112 113 double nouveauCentre (CLASSE *pK, POINT * points) 114 { 115 if (pK-> mod==0) return 0.0; 116 117 CLASSE ancienCentre = *pK); 118 pk ->mod = 0; 119 if (ancienCentre.mod && !ancienCentre.np) //classe vidée; 120 { pK -> xc = pK -> yc = 1e6; return 0.0;} //centre rejeté au loin; 121 122 plelo 22170 (pK, points); 123 return distc2 (ancienCentre, *pK); 124 } 125 126 void plelo 22170 (CLASSE * pK, POINT * points) 127 { 128 int N= pK ->np; 129 POINT * Q; 130 int *liste; 131 double sx = 0, sy = 0; 132 for (liste = pK ->liste; N; liste++, N--) 133 { 134 Q= points + *liste; 135 sx += Q-> x; sy += Q->y; 136 } 137 pK->xc = sx / pK -> np; 138 pK -> yc = sy / pK -> np; 139 } 140 141 142 143 144 double distc2 (CLASSE K1, CLASSE K2) 145 { 146 return pow (k2.xc - K1.xc, 2.0) + pow (K2.yx - K1.yc, 2.0); 147 } 148 149 int quelleclasse (POINT M, CLASSE *Tk, int Nk) 150 { 151 CLASSE tmp; intK; double d; 152 tmp.xc = M.x; tmp.yc = M.y; 153 double dm=distc2 (tmp, *Tk); int krep = 0; 154 for (k=1, Tk++; k<Nk; k++, Tk++) 155 { 156 d = distc2 (tmp, *Tk); 157 if (d<dm) {dm = d; krep = k; } 158 } 159 return krep; 160 } 161 162 void affiche (CLASSE *Tk, int nbK, POINT * points ) 163 { 164 int mid = nbK/2; int k; 165 typedef struct { int r, g, b;} RGB; 166 RGB *Z, *tmp; 167 POINT *Q; 168 int *liste, xr, xgb; 169 Z= calloc (TCV * TCV, sizeof (RGB) ); 170 for (; nbK != 0; nbK --, Tk++) 171 { 172 for (liste = Tk -> liste; Tk -> np != 0; Tk -> np --, liste ++) 173 { 174 Q=points + *liste; 175 xr = Q ->x - (nbK - mid/2); xgb = Q -> x+(nbK - mid/2); 176 if (xr>=0 && xr < TCV && rgb >=0 && xgb < TCV) 177 { 178 tmp = Z + Q ->y + TCV + xr; tmp->r = 220; 179 tmp = Z + Q ->y + TCV + xgb; tmp->g = 220; tmp->b =120; 180 } 181 } 182 free (Tk->liste); 183 } 184 185 FILE * loir; 186 loir = fopen ("epinfo.ppm","wt") 187 if (loir == 0) {printf ("Affichage impossible\n"); } 188 fprintf (loir, "P3\n#ep info\n%d %d\n255\n", TCV, TCV); 189 for (k=TCV*TCV, tmp = z; k !=0; k--, tmp++) 190 { 191 fprintf (loir, "%d %d %d\n", tmp ->r, tmp->g, tmp->b); 192 } 193 fclose (loir); 194 free(Z); 195 } 196 // fin du fichier fctepinfo089.c 197
-----