Version imprimable
Salut,
Le fichier que tu nous proposes est très grand... ça ne va pas être facile pour nous qui ne connaissons pas ton code de voir où se situe le problème. Peux-tu plutôt présenter la partie du code qui pose problème et t'arranger pour qu'on puisse le compiler ?
Salut ,
Alors ben je me suis simplement basée que sur un seul choix (le calcul de la moyenne)
A juste pour info , comme tu t'appelles kromartien, c'est une etude sur le champ magnétique de Mars!
fichier c (raccourcis)
Pièce jointe 12782
(En fait j'utilise kwrite ou xemacs comme editeur )
La partie qui me pose probleme c'est la partie finale
je pense que je devrai faire des modifs dans les boucles lat et lon pour avoir filled_bin = data_in or ??? je sais pas comme faire(c'est à dire avoir le meme nombre de lignes que mon fichier x) et une autre modif dans l'ecriture du fichier final pour avoir en colonnes : le jour, la position lat et lon (mais la meme que dans le fichier x) , br , bt, bp (toujours du fichier x) puis la moyenne et l'ecart entre les valeurs br,bt,bp et les valeurs moyennesCode:
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 for (l = 0; l < npt_lat; l++) { for (L = 0 ; L < npt_lon ; L++) { index = l * npt_lon + L; if (NPT[index] > 0) { filled_bin ++; if (NPT[index] > 2) { filled_bin2 ++; } if (NPT[index] > 1) { filled_bin1 ++; } } } } for (l = 0; l < npt_lat; l++) { for (L = 0 ; L < npt_lon ; L++) { index = l * npt_lon + L; if (NPT[index] > 1) { lat = lat_min + (double)l*inc_lat + inc_lat/2.; lon = lon_min + (double)L*inc_lon + inc_lon/2.; if (lon >= 360.) lon -= 360.; fprintf(fout, "%7.3lf %7.3lf", lon, lat); for (i=0;i<NPT[index]; i++) { fprintf(fout, " %7.3lf", alt_var[index][i]); } fprintf(fout, "\n"); } } } } fclose(fout); fprintf(stdout, "\tNombre de donnees lues : %10d\n", data_in); fprintf(stdout, "\tNombre de donnees utilisees : %10d\n", data_out); fprintf(stdout, "\tNombre de bin remplis : %10d\n", filled_bin); fprintf(stdout, "\tNombre de bin remplis (N>1) : %10d\n", filled_bin1); fprintf(stdout, "\tNombre de bin remplis (N>2) : %10d\n", filled_bin2); }
Mon fichier x:
Pièce jointe 12781
Voila merci
Ce qui manque vraiment à un programme comme celui là, ce sont les commentaires.
Sauf que ce n'est pas son code. Faut suivre ....Citation:
Envoyé par kromartien
C'est bien le problème. Si c'était son code, elle n'aurait pas à se plaindre mais ici c'est pas sympa pour la personne qui récupère. Je ne met en cause que la personne qui a écrit le code.
Je suis assez ébahi. Pour moi c'est du grand art en tout cas. Dans le genre cathédrale de verre, :ave:
[Mauvais esprit]C'est une épreuve initiatique de devoir maintenir des sources qui ressemblent à ça ? Le seul moyen de devenir programmeur C digne de ce nom ?[/Mauvais esprit]
Une chose est certaine en tout cas, je n'ai pas compris à quoi de vait servir ce programme. La personne qui en a une idée devrait être plus à même de décoder.
Mars est une planète tellurique, elle a un noyau en fer tout comme la terre, c'est pour ça qu'elle possède un champ magnétique. La magnétosphère terrestre est une caractéristique essentielle de l'environnement dans lequel nous vivons, car elle nous protège des rayonnements et particules énergétiques cosmiques.
Ce fichier sert à calculer la moyenne , la mediane .... suivant le nombre de données par case de 0.25*0.25 pour avoir ainsi la répartition des données et voir si il n'y a pas des données éronnées.
Voila
ok mais quel est ton problème exactement ??
il faudrait que je retrouve dans mon fichier de sortie le jour et la position de mon fichier X , reprendre les valeurs de moyenne que j'ai obtenu dans le 1er exemple et donc par conséquent retrouver le meme nombre de lignes que mon fichier X (data_in doit etre egale à filled_bin (cf fichier de mon fichier en c)) et de calculer les écarts entre les composantes de mon fichier X et les données moyennes
[Suggestion HS]
En fait, je ne voudrai pas vous dire comment faire (car je ne sais pas :aie: ce que vous faites exactement et pourquoi ), mais je sais que le logiciel excel, ou un tableur équivalent permettent de manipuler les données beaucoup plus facilement qu'avec un programme C. Ca devrait être une bonne base pour déceler les erreurs du programme
[/Suggestion HS]
OUi je sais , c'est sur que avec Excel ou autre la ça serait un jeu d'enfant et je perderai moins de temps mais je ne suis pas sure qu'il sait gérér plus de 500 000 données! et comme je travaille sous linux et que j'ai plusieurs fichiers de données , on m'a conseillé le programme en c (à mon grand désespoir)
Il vaut mieux toujours écrire des fonctions qui réalisent des tâches spécifiques. Plus il y a de fonctions documentées qui sont utilisées dans un programme, et plus c'est facile de comprendre le programme.
Le C est bien pour faire du calcul numérique, mais pas trop pour lire dans des fichiers complexes comme ceux que tu nous montre. Lire une ligne avec desc'est bien, mais je ne crois pas que ce soit une bonne méthode. Il vaut mieux créer une fonction "lire_ligne_float" qui reçoit un pointeur sur un fichier ouvert en lecture, un numéro de ligne dans le fichier, et qui renvoie un tableau sur des flottants.Code:
1
2
3 #define READd "%lf\t%lf\t%lf\t%lf" fscanf(file_flux,READd,&a,&b,&c,&d,&e);
Bien documenter la fonction, l'écrire dans un fichier séparé, permet une lecture beaucoup plus agréable du programme.
OpenOffice a un excellent tableur et fonctionne aussi sous Linux si tu as un environnement graphique (Gnome, KDE etc.)Citation:
Envoyé par laroche1
Je ne pense pas que 500 000 données lui fasse peur, tant qu'il y a de la mémoire...
Bonjour.
J'ai bien réussi à mettre le résultat de ce code :
dans une feuille de calcul openoffice.org-calc. Le chargement du fichier est assez long, mais n'importe quelle fonction de calcul statistique donne un réultat immédiat. Il est possible d'exporter de même les données au format texte après avoir modifier les données.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #include <stdlib.h> #include <stdio.h> int main(void) { FILE * text; long i; text = fopen("textedata.txt","w"); fprintf(text,"\n"); for (i=0;i<500000;i++) { fprintf(text,"%lf\t",rand()/1000.0); if(!(i%10)) fprintf(text,"\n"); } fprintf(text,"\n"); return 0; }