|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : décembre 2010 Messages : 5 ![]() |
Bonjour,
Je suis débutante en programmation. et je viens d'avoir affaire au cours concernant la priorité relative aux opérateurs. Bref en mathématiques c'est simple: n°1/ () n°2/ ** alias ^ n°3/ *, / n°4) +,- Mais en informatique il y a quelques nouveaux intrus: par exemple \ et mod qui viennent s'insérer respectivement entre le n° 3 et le 4. Aussi, le problème qui se pose encore pour moi, et que je n'arrive pas à saisir l'ordre que prennent les fonctions[abs(), sqrt(), sin(), tan()...], est-ce qu'elles sont exécutées au même temps que les parenthèses ou après celles-ci. D'autant plus que les avis divergent (sur un polycopier dédié au Visual Basic, on les classe avec le (), et sur un autre traitant du matlab on les classe priorité n°2, il faut dire que je m'emmêle les pinceaux avec tout ça... Je vous serai reconnaissante si vous pouviez m'offrir un peu de votre attention et m'éclairer sur ce point. |
|
|
00
|
|
|
#2 |
![]() ![]() |
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : décembre 2010 Messages : 5 ![]() |
Merci beaucoup pour votre réponse. mais je ne vois pas le classement des fonctions dans tout cela.
Par exemple si on a l'expression suivante: A= abs(x)+(v+z)/(x+y) Le compilateur considère t-il que la priorité est aux parenthèses et commece alors par calculer: R1: v+z .... puis: R2: x+y R3: abs(x) R4: R1/R2 R5: R3+R4 ou bien considère t-il que les fonctions ont la même priorité que les parenthèses et effectue donc le calcul de la façon suivante: R1: abs(x) R2: v+z R3: x+y R4:R2/R3 R5: R1+R4 ... Veuillez tolérer mes jeunes connaissances en cette captivante discipline qui est l'informatique. Et encore MERCI de bien vouloir m'accepter dans votre communauté de professionnels |
|
|
10
|
|
|
#4 | |
![]() ![]() |
Bien vu ! Je pensais qu'il aurait quelque part sur la page wiki un mot sur l'évaluation des fonctions (function evaluation), apparemment ce n'est pas le cas. Mais avoir la page wiki en tête est bien pour pouvoir s'attaquer ensuite aux problèmes de l'ordre de l'évaluation des fonctions, laquelle varie selon les différents langages de programmation (et parfois, selon les compilateurs !), e.g. http://stackoverflow.com/questions/1...valuation-vs-c :
Citation:
Donc comme tu le vois, ce n'est pas du tout un problème aussi trivial qu'il n'y paraît :-) |
|
|
00
|
|
|
#5 | |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 8 740 ![]() |
Citation:
Ce pourquoi je recommande systématiquement de :
Ainsi, dans l'exemple donné : Pour obtenir de manière répétive et sûre le résultat attendu, il faut écrire : A = ((v+z)/(x+y)) + abs(x) Dans tous les cas de figure, n'obtenir que des opérations à 2 opérandes. Autre exemple : x = x + z + b*(x - y) Dans ce cas, je conseille d'écrire : x = x + (z + (b*(x-y))) Bien que l'écriture soit plus lourde, on est certain de l'évaluation, quelle que soit les priorités des opérations et/ou fonctions. L'ordre d'écriture/d'évaluation n'a pas d'importance à partir du moment où les opérations sont décomposées en opérations à 2 opérandes par les parenthèses.
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() Inscription : décembre 2010 Messages : 5 ![]() |
Bonsoir,
Merci à vous, Franck Dernoncourt ainsi que Souviron34, pour vos réponses. Bien que j'avoue que vos arguments me dépassent un peu pour l'instant. Ce que je dois comprendre d'après vos réposes et que pour: Franck: L'ordre d'évaluation dépend des langages, où libre cours est donné au copmilateur. Souviron34: Essayez d'obtenir des opérations à deux opérandes pour éviter toute confusion. Deux astuces de "chercheurs praticiens" qu'on a omis de notifier sur mes manuels rigides et bien disciplinés . Le problème qui se pose donc pour moi et comment puis-je répondre à l'exercice sus-cité de manière parfaitement scolaire. Doit-je citer que le compilateur a carte blanche?? ou effectuer des modifications sur l'expression à calculer qu'on me soumet de manière à obtenir le nombre désiré d'opérandes????!!!! J'avoue me perdre un peu dans tout cela ...ou bien suis-je allée un peu trop loin dans ma volonté de tout comprendre au point où je m'emmêle parfaitement les pinceaux à présent.... |
|
|
00
|
|
|
#7 |
![]() ![]() |
Si l'énoncé ne précise pas le langage, la réponse correcte version courte concernant l'évaluation des fonctions est "Cela dépend du langage, et dans certains langages, tels le C et le C++, cela dépend du compilateur".
|
|
00
|
|
|
#8 |
|
Invité de passage
![]() Inscription : décembre 2010 Messages : 5 ![]() |
Re
OK. Mais le comble du problème est que je ne pense pas que la réponse courte soit de mise, vu les énoncés très scolaires des exercices auxquels je suis confrontée. Genre: Soit: x=4; y=5; v=z=2 . Donnez le résultat de la formule suivante en précisant au préalable l'ordre dans lequel elle est exécutée: A= abs(x)+(v+z)/(x+y) Il faut dire qu'on s'attend là à une réponse des plus précices. Donc, on me basant sur tout ce que j'ai pu apprendre de cette discussion, je vais me permettre de considérer que la fonction est traitée au moment même de son apparition dans la formule, ce qui implique la solution suivante: R1: abs(x) R2: v+z R3: x+y R4:R2/R3 R5: R1+R4 D'autant plus que l'ordre ci-dessus ne nuit pas à l'exactitude du résultat du clacul au fianal. Encore Merci pour avoir supporté mes idées confuses et pour avoir tenté de mettre un peu d'ordre dedans. Veuillez croire en ma reconnaissance et mon éstime, les plus sincères. |
|
|
00
|
|
|
#9 |
![]() ![]() |
Dans ton exercice, le moment où se passe l'évaluation de abs(x) n'a pas d'importance. Cela tombe bien car, encore une fois, nonobstant le caractère académique de ta tâche, ce moment dépend du langage et potentiellement du compilateur.
|
|
00
|
|
|
#10 |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 416 ![]() |
Tu peux aussi présenter ta réponse sous forme d'arbre, et laisser le prof choisir l'ordre qu'il veut.
___ + ___
| |
abs __ / __
| | |
x _+_ _+_
| | | |
v z x y
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|
10
|
|
|
#11 |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 8 740 ![]() |
Il me semble (ce qui est la raison du point sur le découpage en 2 opérandes), que , quel que soit le langage et le compilateur, les compilateurs décomposent toujours en opérations à 2 opérandes, classées par ordre de parenthèses..
La réponse courte serait donc, à mon avis : A= abs(x)+(v+z)/(x+y) Analyse : opération + (R) : 2 opérandes R1 et R2 R1 = abs(x) = opération à 1 opérande R2 = opération à 2 opérandes R3 et R4 R3 = v+z = opération à 2 opérandes R5 et R6 R4 = x+y = opération à 2 opérandes R7 et R8 R5 = v R6 = z R7 = x R8 = y donc, l'ordre du calcul de abs(x) n'a pas d'importance Par contre, ensuite, le calcul est fait par odre de parenthèse décroissant calculer R4 calculer R3 puis calculer R2 Finalement calculer R Et c'est d'ailleurs assez facile à modéliser mathématiquement (et informatiquement). Il y a de base 2 types d'opérations :
Si donc on analyse une expression quelquonque, on peut , comme l'a montré pseudocode, faire un arbre. Les compilateurs, ce me semble, analysent toujours cet arbre du bas vers le haut (comme indiqué plus haut, pour calculer R il faut avoir calculé R3 et R4). Si donc on a écrit correctement avec les parenthèses bien placées, on a "mâché" le travail pour le compilateur, et on a un résultat reproductible. Alors, ou bien j'ai raté quelque chose, ou bien il n'y a qu'un ensemble (fini) de permutations poissibles dans l'ordre :
On devrait pouvoir trouver une formailisation du nombre de permutations possibles en fontion du nombre d'opérations à 2 opérandes et de la prodondeur..
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
00
|
|
|
#12 | |
![]() ![]() |
http://blogs.msdn.com/b/oldnewthing/...4/4374222.aspx :
Citation:
|
|
|
00
|
|
|
#13 |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 8 740 ![]() |
![]() C'est aussi la raison pour laquelle je déconseille très très très fortement d'utiliser des "shortcuts" telles que celle-ci :
Je ne sais pas en C#, mais en C, le nombre de soi-disants "gurus" qui programment des trucs soi-disant "super-efficaces" qui d'une part ressemblent plus à de l'obfuscation qu'autre chose,mais d'autre part qui amènent à ce genre de problèmes, en pariculier avec les incréments de pointeurs, sont légions (les tab[ptr++] pour éviter de faire tab[ptr] et ptr++ au bon endroit...) Note: le problème posé était général, non ?
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
00
|
|
|
#14 | |
![]() ![]() |
Citation:
|
|
|
00
|
|
|
#15 | |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 416 ![]() |
Citation:
L'avantage en l'assembleur c'est que l'écriture n'était pas ambigüe de part la simplicité des combinaisons opérations/opérandes possibles.
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|
|
00
|
|
|
#16 | |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 8 740 ![]() |
Citation:
*ptr1[ptr2++] += .... ça devient vite..... le b.rdel...
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
|
00
|
|
|
#17 | ||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 416 ![]() |
mais non... pas du tout. Suffit de voir le code de strcpy
![]() Code C :
Je me souviens que la première fois que j'ai vu ce code, je me suis dit que les codeurs C étaient soit des dieux, soit des fous.
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
||
|
00
|
|
|
#18 |
|
Invité de passage
![]() Inscription : décembre 2010 Messages : 5 ![]() |
Vous me voyez fascinée par la tournure que prend cette discussion
![]() Moi qui croyais avoir posé une question complètement anodine, je constate qu'elle est plus complexe qu'elle n'y paraît. Comme j'aimerais assimiler toutes vos réponses et participer efficacement à la discussion!!!!! mais bon, je n'ai pas encore le bagage nécessaire Donc pour l'instant, je me contenterai de bien intégrer la réponse de Souviron34: Tous les cas de figure sont corrects 1er cas: abs(x) v+z x+y (v+z)/(x+y) somme Second cas : abs(x) x+y v+z (v+z)/(x+y) somme Troisème cas : v+z x+y (v+z)/(x+y) abs(x) somme Quatrième cas : x+y v+z (v+z)/(x+y) abs(x) somme Ce que je retiens aussi de cette discussion, est que le C est un langage de programmation vraiment enrichissant, vu que vous y faîtes à chaque fois référence. Je m'y mets alors Encore Merci à Franck, Souviron34, pseudocode, pour votre amitié. |
|
|
00
|
|
|
#19 |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 8 740 ![]() |
De rien
ça fait du bien un peu de faire remuer ces neurones .. c'était la bonne réponse Je me souviens avoir eu un stagiaire qui m'avait programmé une convolution d'image par un laplacien sur une lgine.. et dont il était très fier.. Je lui ai fait remarquer que le gars du SAV ou de la maintenance (sans parler de lui-même 6 mois plus tard) mettrait environ 3h à décoder cette ligne... et le maudirait pendant quelques mois après...
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com