Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1937 connectés 

  FORUM HardWare.fr
  Programmation
  C

   Novice en langage C ! HELP!

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Novice en langage C ! HELP!

n°2210195
lnkjv
Posté le 13-11-2013 à 17:50:42  profilanswer
 

bonjour, excusez moi de vous déranger mais j'ai un gros soucis ! je suis actuellement en master et mon master comporte de l'informatique or je n'en ai jamais fait et me retrouve avec des étudiants en ayant fait depuis 3 ans. Le prof ne prend donc pas le temps de m'expliquer le fonctionnement de ce langage et j'avoue que je galère pas mal...
j'essaye de lire des livres ou d'aller sur des sites comme celui ci pour essayer d'apprendre un tel langage mais ce n'est pas facile...
j'en viens au but. voici un programme que mon professeur nous a donné qui est pour calculer l'intégrale exp x entre 2 bornes a et b en prenant un pas h (méthode des rectangles si je ne m'abuse) bref voila ce qu'il nous a donné comme code
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #define MAXN 1000
  5. double rect(double * , double *, long);
  6. int main(){
  7. long i , N ;
  8. double a, b, h, A, Ath, Er;
  9. double X[MAXN], Y[MAXN];
  10. printf("\n entrer a ? " ) ; scanf("%lf",&a);
  11. printf("\n entrer b ? " ) ; scanf("%lf",&b);
  12. printf("\n entrer h ? " ) ; scanf("%lf",&h);
  13. Ath= exp (b)-exp(a);
  14. N=1L+(long)( (b-a)/h );
  15. if (N>=MAXN) {
  16. printf(" attention dépassement " );
  17. return (1);
  18. }
  19. for (i=0 ; i<=N-1 ; i++ ) {X [i] = a+i*h ; Y[i]=exp(X[i]) ; }
  20. A=rect (X , Y , N);
  21. Er=100.0*fabs( (A-Ath)/Ath ) ;
  22. printf ("\n aire théorique =%lf\n" , Ath) ;
  23. printf ("\n aire calculée =%lf\n" , A) ;
  24. printf ("\n erreur relative =%lf\n" , Er) ;
  25. return(0);
  26. }
  27. double rect ( double *X , double *Y, long N){
  28. long i;
  29. double h, aire, somme;
  30. h=X[1]-X[0];
  31. somme=0;
  32. for(i=0 ; i<=N-2 ; i++ ) somme+=Y[i];
  33. aire =h*somme;
  34. return(aire);
  35. }


 
mon problème est le suivant : je ne comprends pas grand chose a ce code ...
les 4 premières lignes sont les préprocesseurs puis la 5éme je ne la comprends pas ...Pourquoi des * ? pourquoi cette ligne n'est pas au début du main avec les autres déclarations ?
Je ne comprends pas cette ligne aussi :
N=1L+(long)( (b-a)/h )
 
et celle la :
Er=100.0*fabs( (A-Ath)/Ath
 
 
Pouvez vous m'aider ? D'avance merci
Cordialement

Message cité 2 fois
Message édité par gilou le 13-11-2013 à 21:42:22
mood
Publicité
Posté le 13-11-2013 à 17:50:42  profilanswer
 

n°2210208
Totoche17
Posté le 13-11-2013 à 19:35:50  profilanswer
 

lnkjv a écrit :


Pourquoi des * ?  
 
* désigne un pointeur en C

pourquoi cette ligne n'est pas au début du main avec les autres déclarations ?
 
C'est le prototype de la fonction rect, ça se déclare au début d'un .c (ou dans un .h)
 
Je ne comprends pas cette ligne aussi :
N=1L+(long)( (b-a)/h )
 
si c'est le long que tu comprends pas, c'est un cast (le résultat du calcul en double est transformé en long)

et celle la :
Er=100.0*fabs( (A-Ath)/Ath
 
fabs = valeur absolue
 
 
 
Pouvez vous m'aider ? D'avance merci
Cordialement


n°2210419
Sve@r
Posté le 15-11-2013 à 18:47:36  profilanswer
 

lnkjv a écrit :

les 4 premières lignes sont les préprocesseurs


Exact. Ce sont des lignes que le préprocesseur analyse. Le résultat produit un code C qui est rajouté au programme.
Les #include incluent le fichier cité et les #define permettent de remplacer une valeur ou une expression par une chaine mnémotechnique
 

lnkjv a écrit :

puis la 5éme je ne la comprends pas ...Pourquoi des * ?


Les étoiles ont 2 signification
1) quand elles sont mises dans la définition, cela signifie que la variable servira à stocker une adresse (on appelle cela un "pointeur" )
Exemple:

Code :
  1. double *toto


Ici "toto" est capable de stocker une adresse. Et à cette adresse, il y aura une valeur de type double. Ainsi le compilo saura que s'il doit récupérer la valeur située à cette adresse, il lui faudra alors récupérer aussi les 3 adresses suivantes (car une adresse ne concerne qu'un octet alors qu'un double est stocké sur 4 octets).
2) quand elles sont mises dans des instructions, elles signifient qu'il faut récupérer la valeur située à cette adresse
Exemple:

Code :
  1. printf("La valeur située à l'adresse toto est %f\n, *toto)


Ici le printf n'affichera pas la valeur située dans toto mais la valeur située à l'adresse contenue dans toto. Et comme il sait que "*toto" est de type "double", il sait qu'il faut utiliser non seulement cette adresse mais aussi les 3 suivantes.
 
On utilise les pointeurs en paramètres de fonction lorsque la fonction a besoin de modifier la variable originelle ou alors lorsque l'élément que doit recevoir la fonction est trop gros pour être recopié (comme un tableau ou une structure). Dans ce cas on préfère lui passer simplement l'adresse de l'élément en question.
 

lnkjv a écrit :

pourquoi cette ligne n'est pas au début du main avec les autres déclarations ?


Les déclarations du main ne concernent que les variables utilisées dans la fonction "main()". Ici il s'agit d'une déclaration d'une autre fonction qui sera utilisée plus tard.
Le problème avec le compilo, c'est qu'il lit le code source en séquentiel. Et s'il rencontre un appel de fonction qu'il ne connait pas, il la place alors automatiquement en type "int". Donc lorsque tu appelles "rect()" en ligne 27 qui est de type "double", il lui faut absolument qu'il la connaisse avant. Donc soit on la définit avant (on écrit son code) et dans ce cas la définition tient lieu de déclaration (tu remarqueras une différence entre ces deux termes); soit on la déclare avant (on indique son existence et ses paramètres) et on la code après.
 

lnkjv a écrit :

Je ne comprends pas cette ligne aussi :
N=1L+(long)( (b-a)/h )


Les variables "b", "a" et "h" sont de type double. Le calcul produira donc un résultat de type "double". Le (long) placé devant permet de transformer ce résultat en résultat de type "long". C'est ce qu'on appelle un "cast" (du verbe "caster" => jouer un rôle). Typiquement si le résultat vaut 3.1416, cela donne alors ensuite 3.
Le "L" placé après le "1" a le même rôle. Il permet de lever l'ambiguïté sur les constantes (1 pourrait aussi être vu comme un short).
On aurait pu aussi écrire (long)1 mais c'est dommage de passer par un cast alors qu'il y a plus simple.
Toutefois, mettre (long) est un peu inutile vu que "N" étant long, le résultat aurait été automatiquement casté.
 

lnkjv a écrit :

et celle la :
Er=100.0*fabs( (A-Ath)/Ath


fabs() est une autre fonction définie ailleurs (dans la librairie mathématique je crois). Cette librairie étant liée lors de la compilation, les fonctions qui s'y trouvent sont accessibles lors de l'exécution. Ca permet un travail collaboratif et ne pas réinventer la roue à chaque nouveau programme...


Message édité par Sve@r le 15-11-2013 à 18:51:11

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

   Novice en langage C ! HELP!

 

Sujets relatifs
[C] Tirage de lettre et probabilité[C] Calculer la Normale d'un vecteur en C
[C#]grand débutant restrictionReload automatique toute les 10sec - C#
C sous unix => synchronisation avec les signauxHelp [PHP/MySQL] et programmation de jeu
envoyer tout un vecteur comme un paramètre de Java en C + +Aide Programmation en C
Structure Polynome( probleme d'affichage) en C[C] Besoin d'aide pour le Jeux de la Vie
Plus de sujets relatifs à : Novice en langage C ! HELP!


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR