Programme en C
Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

Programme en C



  1. #1
    invited5f6a90f

    Programme en C


    ------

    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

    -----
    Dernière modification par Coincoin ; 29/05/2009 à 15h53. Motif: Balises CODE pour la lisibilité

  2. #2
    invitedba13d1f

    Re : Programme en C

    Bonsoir, bonsoir

    Quelles fonctions te posent problèmes ?

    Le mieux quand tu récupères un bout de code comme ça, c'est de le suivre fonction par fonction.
    Dès que tu ne comprends pas une instruction, tu fais une petite recherche sur notre ami Google.
    En général je fais ensuite des petits essais avec pour être sûr de bien avoir compris comment elle marche.

    Si après toutes ces recherches tu as des questions précises alors on pourra t'aider
    Nous préciser alors à quoi sert ce fichier source et de quel programme il fait parti (pour qu'on puisse se situer).

    Bon courage

  3. #3
    whoami

    Re : Programme en C

    Bonjour,
    Citation Envoyé par gizmo2937 Voir le message
    Bonsoir, bonsoir

    Quelles fonctions te posent problèmes ?

    Le mieux quand tu récupères un bout de code comme ça, c'est de le suivre fonction par fonction.
    Dès que tu ne comprends pas une instruction, tu fais une petite recherche sur notre ami Google.
    En général je fais ensuite des petits essais avec pour être sûr de bien avoir compris comment elle marche.

    Si après toutes ces recherches tu as des questions précises alors on pourra t'aider
    Nous préciser alors à quoi sert ce fichier source et de quel programme il fait parti (pour qu'on puisse se situer).

    Bon courage
    En fait, c'est un exercice qu'il a à faire.

    Voir
    Code:
    1 // fichier nuees.h pour epreuve info
    a moins que ce soit pour s'entraîner, mais il serait bon de le préciser.

Discussions similaires

  1. programme en c
    Par invite3ca1c29c dans le forum Logiciel - Software - Open Source
    Réponses: 12
    Dernier message: 03/03/2009, 21h58
  2. programme C
    Par invitecda03984 dans le forum Électronique
    Réponses: 2
    Dernier message: 22/03/2008, 16h46
  3. programme
    Par invite57e51427 dans le forum Logiciel - Software - Open Source
    Réponses: 11
    Dernier message: 16/01/2008, 22h28
  4. Programme TI-89
    Par invite693d963c dans le forum Logiciel - Software - Open Source
    Réponses: 17
    Dernier message: 25/10/2007, 17h49
  5. programme
    Par invite7e1f35e9 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 26/04/2006, 13h13
Découvrez nos comparatifs produits sur l'informatique et les technologies.