Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 13/04/2007, à 13:25

laroche1

aide pour programmer un programme en c

Bonjour, voila j'ai un petit problème, je voudrais realiser un programme en c pour faire des statistiques( en fait la moyenne de mesures ) or je suis perdu dans mes boucles. C'est pourquoi j'aimerai que quelqu'un puisse me donner un petit coup de main .

dOnc voila un peu ce que je dois realiser , un ami m'a un peu expliquer mais j'ai du mal à comprendre la logique

Pour faire des moyennes de mesures (par exemple, par carre de 1, 0.5 ou 0.25 degres)
par ex:
on a une grille de 30 a 40 (lat) et de 50 a 60 (lon), avec taille = 0.5
donc 10/0.5 * 10/0.5 cases, 400 cases

il faut definir br[20][20], tout egal a 0. et definir aussi nbr_de_points[20][20]
puis lire le fichier (dans lequel j'ai une colonne time lat lon alt br bt bp ==> données orginales), calcule la lat et lon de la case correcte,
i = (lat - lat_min) / 0.5 [lat_min = 30]
j = (lon - lon_min) / 0.5 [lon_min = 50]

et br[i][j] += br [lu dans le fichier]
et nbre_de_point[i][j] += 1

a la fin, br[i][j]/nbr_de_points[i][j] = valeur moyenne


Voila j'espere que vous etes pas trop perdus!! (pas comme moi...lol)
Merci a ceux qui  pourront peut etre m'aider

Hors ligne

#2 Le 13/04/2007, à 16:44

laroche1

Re : aide pour programmer un programme en c

voila j'ai essayé de faire ce programme, si quelq'un pouvait m'aider vis vis de ce qui est indiqué en haut ça serait sympa! merci

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <malloc.h>

#define M_PI            3.14159265358979323846
#define PI_180          ( M_PI / 180. )

int main(argc, argv)
int argc;
char *argv[];
      {
	FILE *fin, *fout;
	double *lat, *lon, lat_min, lon_min,lat_max,lon_max, time,alt,taille,total;
	double **br, *bt , *bp, **nbr_de_points;
	int N_OBS;
	double valeur_moyenne,Di,Dj;
	int i1,i2,ii1,jj1, j1,j2,i,j,k,k1,k2,h,w;
	

	if (argc != 3)
	  {
	    printf("type moyenne.exe ,fin. <fout>\n");
	    exit -1;
	  }

	fin = fopen(argv[1], "r");
	if (fin == NULL)
	  {
	    printf("Reading error on file %s. Exit\n", argv[1]);
	    exit -1;
	  }
	fout = fopen(argv[2], "w");    
	if (fout == NULL)
	  {
	    printf("Writing error on file %s. Exit\n", argv[2]);
	    fclose(fin);
	    exit -1;
	  }
lat_max = 40;
lon_max = 50;
lat_min = 30;
lon_min = 50;
 taille = 0.5;


fseek(fin,0,0);
	N_OBS = i;
	lat = (double  *)malloc(N_OBS*sizeof(double ));
	lon = (double  *)malloc(N_OBS*sizeof(double ));
	
	br = (double **)malloc(N_OBS*sizeof(double*));
	nbr_de_points = (double **)malloc(N_OBS*sizeof(double*));
	

i = 0;
	while (!feof(fin))
	  {
	     fscanf(fin, "%lf %lf %lf %lf %lf %lf %lf\n", &time, &lat, &lon, &alt, &br, &bt, &bp);
	     
	     i++;
	  }
	
	for (i=0;i<N_OBS;i++)
	  {
	    i1 = lat_min;
	    j1 = lon_min;
	    for (j=0;j<N_OBS;j++)
	      {
		if (i!=j)
		  {
		    i2 = lat_max;
		    j2 = lon_max;
		    Di = (i2-i1)/(0.5);
		    Dj = (j2-j1)/(0.5);
	
		    for (k=0;k<N_OBS;k++)
		      {
			
			
			    br[i][k] = 0;
			    nbr_de_points[i][k] = 0;
		   
			    k = N_OBS;
			  
		      }
		  }
	      }
	  }


for (i=0;i<N_OBS;i++)
	  {
ii1=(lat[i]-lat_min)/taille;

for (k=0;k<N_OBS;k++)
		      {
	jj1=(lon[i]-lon_min)/taille;
		br += br[ii1][jj1];
		nbr_de_points[ii1][jj1] += 1;
		br[ii1][jj1]/nbr_de_points[ii1][jj1] = valeur_moyenne;
fprintf(fout, "%8.4lf %8.4lf  %7.4lf\n", lat, lon, valeur_moyenne);
}
}

Hors ligne

#3 Le 13/04/2007, à 22:27

sma-simou

Re : aide pour programmer un programme en c

je veux un programme exemplaire en langage c du calculatrice de grand nombre

Hors ligne

#4 Le 14/04/2007, à 00:04

Zapan

Re : aide pour programmer un programme en c

Bonsoir,
J'ai pas regardé le code en lui même, juste la structure de ce dernier. Je pense qu'il fonctionnera mieu comme ça ( j'ai pas dit qu'il ferait ce que tu veux attention )
Tu faisais un truc bisare avec les arguments du main :s
Je ne saurais que trop te conseiller d'utiliser fgets à la place de fscanf.
Voilà pour ces bribes d'info, désolé mais j'ai pas le temps de faire plus pour ce soir.

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <malloc.h>

#define M_PI            3.14159265358979323846
#define PI_180          ( M_PI / 180. )

int main(int argc,  char *argv[])
{
	FILE *fin, *fout;
	double *lat, *lon, lat_min, lon_min,lat_max,lon_max, time,alt,taille,total;
	double **br, *bt , *bp, **nbr_de_points;
	int N_OBS;
	double valeur_moyenne,Di,Dj;
	int i1,i2,ii1,jj1, j1,j2,i,j,k,k1,k2,h,w;
	

	if (argc != 3)
	  {
	    printf("type moyenne.exe ,fin. <fout>\n");
	    exit -1;quote=laroche1]voila j'ai essayé de faire ce programme, si quelq'un pouvait m'aider vis vis de ce qui est indiqué en haut ça serait sympa! merci 
	  }

	fin = fopen(argv[1], "r");
	if (fin == NULL)
	  {
	    printf("Reading error on file %s. Exit\n", argv[1]);
	    exit -1;
	  }
	fout = fopen(argv[2], "w");    
	if (fout == NULL)
	  {
	    printf("Writing error on file %s. Exit\n", argv[2]);
	    fclose(fin);
	    exit -1;
	  }
          lat_max = 40;
          lon_max = 50;
          lat_min = 30;
          lon_min = 50;
 taille = 0.5;


fseek(fin,0,0);
	N_OBS = i;
	lat = (double  *)malloc(N_OBS*sizeof(double ));
	lon = (double  *)malloc(N_OBS*sizeof(double ));
	
	br = (double **)malloc(N_OBS*sizeof(double*));
	nbr_de_points = (double **)malloc(N_OBS*sizeof(double*));
	

i = 0;
	while (!feof(fin))
	  {
	     fscanf(fin, "%lf %lf %lf %lf %lf %lf %lf\n", &time, &lat, &lon, &alt, &br, &bt, &bp);
	     
	     i++;
	  }
	
	for (i=0;i<N_OBS;i++)
	  {
	    i1 = lat_min;
	    j1 = lon_min;
	    for (j=0;j<N_OBS;j++)
	      {
		if (i!=j)
		  {
		    i2 = lat_max;
		    j2 = lon_max;
		    Di = (i2-i1)/(0.5);
		    Dj = (j2-j1)/(0.5);
	
		    for (k=0;k<N_OBS;k++)
		      {
			
			
			    br[i][k] = 0;
			    nbr_de_points[i][k] = 0;
		   
			    k = N_OBS;
			  
		      }
		  }
	      }
	  }


for (i=0;i<N_OBS;i++)
	  {
ii1=(lat[i]-lat_min)/taille;

for (k=0;k<N_OBS;k++)
		      {
	jj1=(lon[i]-lon_min)/taille;
		br += br[ii1][jj1];
		nbr_de_points[ii1][jj1] += 1;
		br[ii1][jj1]/nbr_de_points[ii1][jj1] = valeur_moyenne;
fprintf(fout, "%8.4lf %8.4lf  %7.4lf\n", lat, lon, valeur_moyenne);
}
}

Hors ligne

#5 Le 14/04/2007, à 00:07

Zapan

Re : aide pour programmer un programme en c

sma-simou a écrit :

je veux un programme exemplaire en langage c du calculatrice de grand nombre

Et moi je veux gagner au loto, une piscine, un jacuzzi, et que Microsoft ne soit plus en position de monopole.
Sinon ben bonsoir ...

Hors ligne

#6 Le 14/04/2007, à 00:35

Link31

Re : aide pour programmer un programme en c

laroche1 a écrit :
int i1,i2,ii1,jj1, j1,j2,i,j,k,k1,k2,h,w;

lol

Hors ligne

#7 Le 14/04/2007, à 12:35

RBC

Re : aide pour programmer un programme en c

Link31 a écrit :
laroche1 a écrit :
int i1,i2,ii1,jj1, j1,j2,i,j,k,k1,k2,h,w;

lol

C'est vrai qu'il serai mieux d'avoir des noms de variables plus parlantes, et puis un peu de commentaire dans le code ne serai pas plus mal non plus.

@laroche1
Si tu veux avoir un programme beaucoup plus agréble à lire pour toi et pour les autres:
-Hésite pas mettre des noms de variables parlant (même si ils sont un peu long, la complétion automatique est ton amie).
-Des commentaires pour indiquer ce que tu fait (pas sur chaque ligne mais sur les étapes importantes, genre Chargement du fichier, traitemant de chaque ligne...)

Ça peut paraître un peu chiant à faire mais je t'assure que ça te fait gagner vachement de temps, d'abord parceque si c'est un bout de code que tu as pas touché depuis longtemps, en un coup d'oeil tu peux facilement reprendre ou débuger sans tout reprendre. Et puis c'est toujours mieux de se dire j'ai fait un programme qui marche, clair et avec suffisement de commentaires pour que n'importe qui fasse la maintenance ou l'évolution sans se prendre la tête.

Hors ligne

#8 Le 14/04/2007, à 13:35

laroche1

Re : aide pour programmer un programme en c

Merci pour les infos, en fait j'ai fait ça vite fait d'ou le nom de variables un peu court ..mais de toute façon ça ne marche....lol

Hors ligne

#9 Le 14/04/2007, à 19:14

best_friend_fr

Re : aide pour programmer un programme en c

Et c'est quoi le message d'erreur?


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#10 Le 16/04/2007, à 09:58

laroche1

Re : aide pour programmer un programme en c

Ben il le compile pas, disons qu'il apprecie pas les boucles et qu'il ne fait pas les calculs..voila

Hors ligne

#11 Le 16/04/2007, à 11:29

Zapan

Re : aide pour programmer un programme en c

for (k=0;k<N_OBS;k++)
              {
            
            
                br[i][k] = 0;
                nbr_de_points[i][k] = 0;
           
                k = N_OBS;

Elle sert à quoi cette "boucle" ? Parceque pour moi là c'est une boucle qui ne se répète pas ^^

Hors ligne

#12 Le 16/04/2007, à 15:24

qqun

Re : aide pour programmer un programme en c

bon en regardant superficiellement , deja plusieurs erreurs me choques !


   int i1,i2,ii1,jj1, j1,j2,i,j,k,k1,k2,h,w;
   ....
   N_OBS = i;
 
   mais que vaut i ?

   br = (double **)malloc(N_OBS*sizeof(double*));

  que vaut N_OBS ? ok il vaut i mais que vaut i ?

  sinon ok un tableau dynamique a 2 dimensions , mais ou est defini la 2em dimension ?

double **tab;

/* Allocation de la 1er dimension */
tab = malloc ( sizeof(*tab)  *  taille);
/* Allocation des tableaux */
for (i=0; i<taille; i++)
{
   tab[i] = malloc ( sizeof(**tab) * taille2);
}

while (!feof(fin))
      {
         fscanf(fin, "%lf %lf %lf %lf %lf %lf %lf\n", &time, &lat, &lon, &alt, &br, &bt, &bp);
         
         i++;
      }

bon vaut mieux s'arreter la et tout reprendre depuis le debut , relire tes cours de C et d'algo
bien decrire ce que tu veut faire et etre plus methodique  .

http://c.developpez.com/faq/c/?page=sommaire