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

  FORUM HardWare.fr
  Programmation
  C

  procédure ou fonction

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

procédure ou fonction

n°2311704
bonux7
Posté le 27-02-2018 à 23:25:29  profilanswer
 

Bonjour,
 
Pouvez vous m'aider à comprendre la solution de cet exercice?  
''Ecrire une fonction C appelée Q2 qui réalise la modification de la valeur d’une variable x de type int en la multipliant par une valeur y. C’est-à-dire une fonction ou une procédure (à vous d’en juger) qui prend en entrées deux arguments a1 et a2, où a1 correspond à x, et a2 correspond à y, et de telle sorte qu’après l’exécution, la variable x extérieure à la fonction C ait sa valeur d’origine multipliée par la valeur de y. Vous donnerez la forme d’un appel de cette fonction C.''
la réponse donnée est :
 ''Puisque le traitement demandé ne correspond pas à une évaluation mais à la modification de la valeur d’une variable externe à la fonction C en question,  il s’agit ici de concevoir une « procédure » et non une « fonction »''
Le corigé de cet exercice déclare la fonction écrite comme une procédure comme étant la seule réponse, avec pointeur en paramètre, mais moi je ne vois pas en quoi une fonction ne pourrait pas modifier la valeur du premier argument passé, comme dans cette fonction :
 
int Q2(int a1, int a2)
 
/* specif. : multiplie par a2 la valeur de la variable  a1. */
 
{ a1 = a1 * a2;
 
return a1;}
 
 
avec une initialisation et un appel de fonction tel que celui-ci par exemple :
 
int a1 = 5, a2 = 2;
 
a1 = Q2(a1, a2);

mood
Publicité
Posté le 27-02-2018 à 23:25:29  profilanswer
 

n°2311705
pluj
Posté le 27-02-2018 à 23:34:30  profilanswer
 

Lu,
 

Citation :

qui réalise la modification de la valeur d’une variable x


Personnellement, j'en comprends qu'il s'agit de passer un pointeur de façon à directement altérer la variable x de départ. Donc il s'agirait plutôt d'une procédure.
 

Code :
  1. void Q2(int *a1, int a2) {
  2.    *a1 *= a2;
  3. }
  4.  
  5. int x, y;
  6. x = ...
  7. y = ...
  8. Q2(&x, y);


 
Après, effectivement, ta solution, au final, donnera strictement le même résultat. M'est d'avis qu'en tant qu'exercice ça aurait mérité d'être plus clair/explicite et moins ambigu (type lui faire retourner autre chose en plus ou vous dire carrément qu'elle est void ou modifier plus d'un paramètre)
 

Citation :

je ne vois pas en quoi une fonction ne pourrait pas modifier la valeur du premier argument passé


C'est inexact/faux (ou tu t'exprimes mal) : avec ta fonction, la valeur du paramètre ne sera jamais directement modifiée (je veux dire que si tu faisais simplement dans la fonction a1 *= a2 sans tenir compte d'une quelconque valeur retournée, x aurait toujours sa valeur de départ, copie des arguments oblige). Cette variable x n'est modifiée que parce que tu lui réaffectes la valeur retournée par la fonction Q2, ce qui est bien différent. Est-ce que tu comprends l'idée ? (pour le coup je ne sais pas si je suis moi-même compréhensible)


Message édité par pluj le 28-02-2018 à 00:01:21
n°2311711
bonux7
Posté le 27-02-2018 à 23:57:24  profilanswer
 

oui bien sur que la fonction ne modifie les variables qu'en elle-meme, sans répercution à l'extérieur. Je me suis mal exprimée en effet. Et tu as raison, je trouve aussi que la question n'est pas assez compréhensible. Merci pour tes confirmations/reprises.

n°2311743
rufo
Pas me confondre avec Lycos!
Posté le 28-02-2018 à 14:12:26  profilanswer
 

En fait, si, la fonction va bien modifier une variable extérieure à elle-même via son return.
x = fonc(a1, a2);
 
x sera bien modifié par fonc().
 
Edit : au passage, un développeur choisira clairement, pour ce type de traitement (un traitement mathématique), de passer par une fonction plutôt que de s'emmerder avec une procédure à base de pointeurs, bien plus risquée et moins intuitive à comprendre :o

Message cité 1 fois
Message édité par rufo le 28-02-2018 à 14:13:57

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2311779
bonux7
Posté le 28-02-2018 à 21:02:48  profilanswer
 

Je pense que le prof joue un peu sur les mots dans un but pédagogique : un pointeur modifie la variable dans une procédure, une variable non pointée peut etre retournée par une fonction. Mais oui en pratique après je pense qu'on fait bien comme on veut.


Message édité par bonux7 le 28-02-2018 à 21:03:22
n°2311784
gilou
Modérateur
Modzilla
Posté le 28-02-2018 à 23:45:57  profilanswer
 

Moi, ce genre d'exo, ça me fait un peu halluciner vu le hors sujet de certaines parties de la question: A la base, la différence entre procédure et fonction, c'est que, dans les bons cas, une fonction permet de faire de la composition de fonctions (et en particulier de la récursivité optimisable en renvoyant une valeur de retour qui est un appel a elle même), et pas une procédure.
En l’occurrence, comme on n'a qu'un seul truc a faire, que ce soit une procédure ou une fonction, on s'en cogne un peu beaucoup...
 

Citation :

''Puisque le traitement demandé ne correspond pas à une évaluation mais à la modification de la valeur d’une variable externe à la fonction C en question,  il s’agit ici de concevoir une « procédure » et non une « fonction »''

Ben non, j'ai parfaitement le droit de faire une fonction et ne rien faire de la valeur retournée. C'est pas optimal certes, mais pas faux du tout.
 
on peut même s'amuser à faire:
int f(int *x, int y) {
  *x *= y;
  return *x;
}
 
...
 
int a, b;
...
a =  f(&a, b); :D  
 
A+,


Message édité par gilou le 28-02-2018 à 23:59:13

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2311785
gilou
Modérateur
Modzilla
Posté le 28-02-2018 à 23:50:08  profilanswer
 

rufo a écrit :

En fait, si, la fonction va bien modifier une variable extérieure à elle-même via son return.
x = fonc(a1, a2);
 
x sera bien modifié par fonc().
 
Edit : au passage, un développeur choisira clairement, pour ce type de traitement (un traitement mathématique), de passer par une fonction plutôt que de s'emmerder avec une procédure à base de pointeurs, bien plus risquée et moins intuitive à comprendre :o

Mais pour reprendre les termes de l'énoncé, après l’exécution, la variable x extérieure à la fonction C n'aura pas sa valeur d’origine multipliée par la valeur de y. La variable x extérieure à la fonction C aura sa valeur d’origine multipliée par la valeur de y après l'exécution et l'assignation...
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2311791
rufo
Pas me confondre avec Lycos!
Posté le 01-03-2018 à 10:17:42  profilanswer
 

Je suis désolé, l'étape *x *= y; dans la procédure est bien une multiplication suivie d'une affectation :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2311868
gilou
Modérateur
Modzilla
Posté le 01-03-2018 à 18:12:11  profilanswer
 

Ah je pensais que tu parlais de ceci ou on a une vraie fonction sans effets de bord (donc bien préférable):
int f(int x, int y) {  
  return (x*y);  
}  
...  
int a, b;  
...  
a =  f(a, b);
 
Mille Zexcuses si je n'avais pas bien interprété tes propos.
 
A+,


Message édité par gilou le 01-03-2018 à 18:13:41

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2311892
rufo
Pas me confondre avec Lycos!
Posté le 01-03-2018 à 23:05:23  profilanswer
 

Pas de soucis ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta

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

  procédure ou fonction

 

Sujets relatifs
Probleme fonctionFonction et procedure
appel d'une fonction hors procédure principale dans visual basicAppeler une procédure depuis une fonction !
Procédure Sub OK mais pas Fonctionada différence fonction, procédure
[pascal] difference entre une procedure et une fonction ??Paramètres optionnels dans une fonction/procédure
SQLServer : procedure stockée ou fonctionDifference entre une procedure et une fonction ??
Plus de sujets relatifs à : procédure ou fonction


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