Se connecter / S'enregistrer
Votre question

Programme en C

Tags :
  • Define
  • Programmation
Dernière réponse : dans Programmation
29 Mai 2009 16:43:13

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.


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

Autres pages sur : programme

a b L Programmation
29 Mai 2009 22:22:53

Pour chaque fonction, tu explique la signification de la fonction, des paramètre et du retour.
Dans le code, tu explique ce que ça fait (ex: "boucle sur tous les élément de toto").
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS