Se connecter avec
S'enregistrer | Connectez-vous

language c : exercice. HELP

Dernière réponse : dans Programmation

Je suis tout nouveau dans le language c. J'ai un exercice à faire, mais je comprend rien :

Marche aleatoire
Ici on cherche a trouver la distribution des fins de trajets d'un ivrogne marchant sur les entiers dans une dimension.
On s'interesse a la distribution des fins de parcours puisque les mathematiciens nous racontent que ces marches
aleatoires sont intimement lies aux distributions gaussiennes
Vous devez alors completer le programme marche_etudiants.c, compiler, debogger et tracer la distribution
des fins de parcours a l'aide de xmgrace. Une comparaison avec une gaussienne serait tres bien, egalement.
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. /* il faut experimenter avec les valeurs de nombre_pas, nombre_essais */
  6. #define nombre_pas 100
  7. #define nombre_essais 1000000
  8.  
  9. /* on cherche a trouver la distributions des distances de marches aleatoires dans une dimension
  10.  
  11. on repete une marche aleatoire d'un nombre_de_pas predetermine
  12. et on cherche la distribution des distances parcourues.
  13. La repition est absolument necessaire - autrement il n'y aurait pas de statistique.*
  14.  
  15. La methode choisie est assez simple.
  16. */
  17.  
  18.  
  19. int seed; /* variable globale pour la communication entre main et random01 */
  20.  
  21.  
  22. /* un generateur aleatoire qui donne une site de nombre pseudo aleatoires entre 0 et 1 */
  23. double random01() {
  24. seed=abs((16807*seed)%((long int) pow(2,31)));
  25. return (1.0*seed)/(pow(2,31)-1);
  26. };
  27.  
  28.  
  29. int main() {
  30. int i,e,deplacement; /* bien sur, il faut definir d'autre variables */
  31.  
  32. int occurences[2*nombre_pas+1];
  33.  
  34. FILE *fichier; /* pour ecrire les donnes a la fin */
  35.  
  36. seed=30; /* pour une valeur de 'seed' il y aura toujours la meme suite 'aleatoire' */
  37.  
  38. /* initialiser occurences=0 */
  39. for (i = -nombre_pas; i < nombre_pas ; i++) occurences[i+nombre_pas]=0;
  40.  
  41. for (e=0;e < nombre_essais;e++) {
  42.  
  43.  
  44.  
  45. /* une fois la marche aleatoire terminee il faut inscrire la position attente dans le vecteur
  46. occurences: */
  47. occurences[nombre_pas+deplacement]= occurences[nombre_pas+deplacement]+1;
  48.  
  49. /* fin essais */};
  50.  
  51. /* ecrire les resultats dans un fichier */
  52. fichier = fopen("resultat","w");
  53. for (i = -nombre_pas; i < nombre_pas ; i++)
  54. fprintf(fichier,"%d %d \n",i,occurences[i+nombre_pas]);
  55. fclose(fichier);
  56.  
  57. return 0;};


éclairez moi svp merci

Autres pages sur : language exercice help

Lassé par la pub ? Créez un compte

Merci!
j'ai un autre broblème avec Dev-c++, quand je débug j'ai un message d'erreur : "Une violation d'accès (erreur de segmentation) est apparue..."
de l'aide serait la bienvenue
merci

"Une violation d'accès (erreur de segmentation) est apparue..."
Typically Win32 :) 
En fait le probleme est que probablement tu as essayer d'acceder a une adresse a l'exeterieur d'un de tes tableaux.
occurences[nombre_pas+deplacement] est offset ?

En regardant ton code je suis vraiment pas certaint que tout test access a occurences se font a l'interieur de int occurences[2*nombre_pas(100)+1];

Habituellement une bonne seance en mode debug avec le debugger vas pouvoir detecter cette erreur.

Aussi ca simplifirais beaucoup simplifier ton code si tu utilise :
  1. /* initialiser occurences=0 */
  2. for (i =0; i < nombre_pas ; i++) occurences[i]=0;

au lieu de
  1. /* initialiser occurences=0 */
  2. for (i = -nombre_pas; i < nombre_pas ; i++) occurences[i+nombre_pas]=0;


Mais la vrai ligne qui fait planter ton code est:
  1. for (e=0;e < nombre_essais;e++)
  2. occurences[nombre_pas+deplacement]= occurences[nombre_pas+deplacement]+1;

Puisque deplacement n'est jamais initialiser.
En mode debug par default deplacement vas probablement etre egale a 0 mais pas en mode release. Il garde une valeur radom de la memoire ( possiblement beaucoup plus grande que 1).

Pourquoi ne pas remplacer:
  1. for (e=0;e < nombre_essais;e++)
  2. occurences[nombre_pas+deplacement]= occurences[nombre_pas+deplacement]+1;

par
  1. occurences[nombre_pas+deplacement]+= nombre_essais;

? ( et ne pas oublier d'initialiser depacement )


Lassé par la pub ? Créez un compte