IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Pascal Discussion :

Ma première fonction : table de conversion francs-euros


Sujet :

Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Par défaut Ma première fonction : table de conversion francs-euros
    Bonjour à tous , j'ai écrit mon 1er vrai programme seule comme une grande et j'ai fait comme vous m'aviez dit , j'ai attendu que mon programme compile bien avant de le poster . C'est un programme qui affiche une table de conversion francs - euros , regardez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    program euros;
     
    function euros(a: CARDINAL): CARDINAL;
     
    const n = 10;
     
    var
       m : CARDINAL;
       i : CARDINAL;
       y : CARDINAL;
     
    begin
       m := 0;
       for i := 1 to n do
       begin
          m := m + 1;
          y := m*6;
       writeln(m,' ',y);
    end;
    end;
     
    var
       x :  CARDINAL;
     
    begin
     
       x := 1;
    writeln(euros(x));
     
    end.
    IL marche très bien et là j'ai légitimement quelques questions car meme après avoir lu vos tutos , j'ai encore des lacunes sur certaines choses :

    En fait j'ai déclaré un seul paramètre dans ma fonction et 3 variables locales , une variable m qui définit les sommes en franc , une variable i pour incrémenter la boucle for , et une variable y qui donne le résultat de la convertion .
    EN fait j'aimerais savoir ce que signifie mon paramètre a , c'est juste pour dire que la fonction ne manipule qu'une seule variable de type cardinal ? c'est encore flou pour moi .

    Aurais pu simplifier le code source pour ce programme ?

    merci de votre aide .

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    a est le paramètre de la fonction, c'est la variable qu'elle prend en entrée. Donc dans ce cas, ta fonction prend 1 paramètre, de type cardinal.

    Concernant ton programme, il y a une variable locale inutile, qui est m. En effet, quand tu fais ton writeln(), la valeur de m est la même que celle de i. Donc tu peux remplacer m par i, et supprimer m.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,

    Bel effort.

    1) L'indentation + lignes vide est à revoir un peu, il faut toujours faire cet effort (en fait, si on le fait à mesure, ça devient une réflexe)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    program euros;
     
    function euros(a: CARDINAL): CARDINAL;
    const n = 10;
    var
       m : CARDINAL;
       i : CARDINAL;
       y : CARDINAL;
    begin
       m := 0;
       for i := 1 to n do
       begin
          m := m + 1;
          y := m*6;
          writeln(m,' ',y);
       end;
    end; { function euros }
     
    var
       x :  CARDINAL;
    begin
       x := 1;
       writeln(euros(x));
    end.
    2) La conversion francs/euros ne concerne pas un rapport = 6
    mais 6.55957, et dans le sens francs -> euros, il faut diviser par ce facteur.

    Je sais pourquoi tu as mis cette valeur 6, c'est parce que tu utilises des variables de type CARDINAL, qui sont des variables de type entier : pas de partie décimale, ce qui n'est manifestement pas adapté au problème, qui implique de pouvoir utiliser des valeurs non entières.
    Il va donc falloir utiliser des Real.

    3) Concernant le paramètre de ta fonction, il est inutile, puisque ta fonction ne l'utilise pas.

    On passe un paramètre à une fonction pour lui dire
    "Le travail à faire va utiliser la valeur de ce paramètre".

    4) Ta fonction n'es est pas une, elle ne renvoie rien

    5) Normalement, une fonction de conversion ne devrait pas afficher le résultat, mais se contenter de renvoyer la valeur convertie, ce que le programme appelant fait de la valeur renvoyée ne concerne que ce programme, la foncton fait son travaile de conversion, pas plus, mais pas moins.


    Par exemple, si on modifie ta fonction "euros" pour qu'elle se contente de convertir en euros la valeur du paramètre passé "a", exprimé en francs, avec la prise en charge de l'affichage par le programme appelant:

    au passage, on renomme la fonction "FrancsVersEuros", plus explicite, et on demande à l'utilisateur la valeur qu'il veut convertir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    program euros;
     
    { la fonction faisant la conversion }
    { j'ai supprimé la boucle i, qui n'a pas lieu d'être pour cette
      nouvelle version }
     
    function FrancsVersEuros(a: Real): Real;
    const
      facteurConversion = 6.55957;
    var
      resultat : Real;
    begin
      resultat = a / facteurConversion;
      FrancsVersEuros = resultat; { c'est ce renvoi de valeur qui manque dans ta version }
    end; { function euros }
     
    var
       valeurFrancs, valeurEuros :  Real; 
    begin
       { petit message expliquant ce qu'on va faire }
       Writeln('Ce programme convertit en Euros une somme entree en Francs');
     
       { lire la valeur à convertir }
       Write ('Entrez la valeur en francs : ');
       Readln (valeurFrancs);
     
       { convertir la valeur en euros }
       valeurEuros := FrancsVersEuros(valeurFrancs);
     
       { afficher la valeur en Euros.
         les :6:2 formattent l'affichage:
         6 chiffres, dont 2 décimales }
       writeln(valeurEuros:6:2);
     
    end.
    Voilà, j'espère que c'est clair.

    Comme tu peux le lire, il ne faut pas hésiter à donner des noms suffisamment explicites aux variable/constantes/fonctions, ça facilite la compréhension et la maintenance du programme.

    N'hésite pas à poser des questions.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Par défaut
    merci thetwo , en effet tu as raison il yavait une variable qui ne servait à rien dans mon programme , j'ai remplacé le m par le a , vu que le a était la variable que manipulait la fonction . MOn but n'était pas du tout de faire une conversion précise ( mais merci pour l'info sur le type REAL ) mais d'afficher une table simple de conversion , voici donc le code modifié légèrement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    program euros;
     
    function euros(a: CARDINAL): CARDINAL;
     
    const n = 10;
     
    var
       i : CARDINAL;
       y : CARDINAL;
     
    begin
       a := 0;
       for i := 1 to n do
       begin
          a := a + 1;
          y := a*6;
       writeln(a,' ',y);
    end;
    end;
     
    var
       x :  CARDINAL;
     
    begin
     
       x := 1;
    writeln(euros(x));
     
    end.
    ALors tu disais que ma fonction n'en était pas une , je ne suis pas d'accord vu que j'utilise parfaitement ma fonction dans le programme principal .
    Ceci dit je pense que tu as d'un coté raison car quand je compile j'ai ce message :

    fpc euros.pas
    Free Pascal Compiler version 2.0.4 [2006/08/20] for i386
    Copyright (c) 1993-2006 by Florian Klaempfl
    Target OS: Linux for i386
    Compiling euros.pas
    euros.pas(3,10) Warning: Function result does not seem to be set
    Linking euros
    28 Lines compiled, 0.0 sec
    en c'est parce que ma fonction ne renvoit pas de résultat que tu m'as dit que c'était pas une fonction c'est çà ?

    merci

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,
    Citation Envoyé par Maxence45
    merci thetwo , en effet tu as raison il yavait une variable qui ne servait à rien dans mon programme , j'ai remplacé le m par le a , vu que le a était la variable que manipulait la fonction . MOn but n'était pas du tout de faire une conversion précise ( mais merci pour l'info sur le type REAL ) mais d'afficher une table simple de conversion , voici donc le code modifié légèrement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    program euros;
     
    function euros(a: CARDINAL): CARDINAL;
     
    const n = 10;
     
    var
       i : CARDINAL;
       y : CARDINAL;
     
    begin
       a := 0;
       for i := 1 to n do
       begin
          a := a + 1;
          y := a*6;
       writeln(a,' ',y);
    end;
    end;
     
    var
       x :  CARDINAL;
     
    begin
     
       x := 1;
    writeln(euros(x));
     
    end.
    Ton paramètre a ne sert à rien, puisque ta fonction n'utilise pas sa valeur. Tu t'en sert comme d'une variable locale, ce qui n'est pas le but d'un paramètre passé à une fonction.

    Regarde bien ton programme, et vois ce que ta fonction fait de a : rien concernant la valeur passée lors de l'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       x := 1;
    writeln(euros(x));
    Citation Envoyé par Maxence45
    ALors tu disais que ma fonction n'en était pas une , je ne suis pas d'accord vu que j'utilise parfaitement ma fonction dans le programme principal .
    Ceci dit je pense que tu as d'un coté raison car quand je compile j'ai ce message :

    ...

    en c'est parce que ma fonction ne renvoit pas de résultat que tu m'as dit que c'était pas une fonction c'est çà ?

    merci
    Oui, tu t'en sers comme d'une procedure, et qui plus est, sans utiliser la valeur du paramètre passé, qui est donc inutile.

    Et quand tu écris
    ça ne sert à rien, d'autant moins que ta fonction sensée renvoer un CARDINAL ne renvoie rien.


    En tenant compte de ça, ton programme devrait être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    program euros;
     
    { pas besoin de paramètre, puisque tu ne t'en sers pas
      et procedure au lieu de function, puisque tu
      n'a pas de résultat à renvoyer}
     
    procedure TableConversionEuros;
    const n = 10;
    var
       i,a,y : integer; { ou Cardinal, si tu y tiens }
    begin
       a := 0;
       for i := 1 to n do
       begin
          a := a + 1;
          y := a*6;
          writeln(a,' ',y);
       end;
    end;
     
    { pas besoin de variable pour le programme,
      puisque la procedure n'en a pas besoin
     
    var
       x :  CARDINAL;
    }
     
    begin
       TableConversionEuros;
    end.
    Bien.

    Et j'y reviens : soigne l'indentation, et les lignes vides pas n'importe où.

    ET revois des docs/cours/didacticiels, car tu n'as manifestement pas compris ce qu'est une fonction, et encore moins à quoi sert un paramètre passé à une fonction (ce que je t'avais précisé dans mon précédent message).

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/10/2014, 12h35
  2. Réponses: 0
    Dernier message: 27/11/2007, 13h42
  3. Première fonction MySQL
    Par RaphAstronome dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 03/09/2007, 18h48
  4. Réponses: 3
    Dernier message: 26/03/2007, 10h34
  5. Réponses: 1
    Dernier message: 12/01/2007, 09h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo