Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Rédacteur/Modérateur
    Avatar de Roland Chastain
    Homme Profil pro Roland Chastain
    Inscrit en
    décembre 2011
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Nom : Homme Roland Chastain
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 391
    Points : 3 822
    Points
    3 822

    Par défaut Adaptation de la fonction freeBasic IIf

    Bonjour !

    J'ai voulu écrire en Pascal l'équivalent d'une fonction très commode du langage FreeBASIC, à savoir la Fonction IIf. Cette fonction permet de remplacer
    If ceci=vrai then n=A else n=B
    par
    n=IIf(ceci, A, B)
    Rien de bien difficile à première vue.
    Cependant, la fonction originale admet plusieurs types d'argument : nombre entier, nombre réel, pointeur. Elle peut servir à composer une chaîne de caractères.
    Deuxième chose, les expressions A et B ne sont évaluées que si la condition est vraie.

    Cette fonction existe-t-elle dans le langage Pascal sous un autre nom ?
    Si elle n'existe pas, comment pourrait-on l'écrire ?

    En attendant voici mon essai, qui se limite à un argument de type Integer :

    Code :
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    { Extrait du manuel FreeBASIC:
      ----------------------------
     
      IIf
     
      Fonction conditionnelle qui retourne une des deux valeurs.
     
      Syntaxe
     
        IIf ( condition, expr_if_true, expr_if_false )
     
      Paramètres
     
        condition
          La condition à tester.
     
        expr_if_true
          Une expression à évaluer et à retourner si la condition est vraie.
          Elle doit retourner une valeur numérique, qui peut être un nombre entier,
          un nombre à virgule flottante ou un pointeur.
     
        expr_if_false
          Une expression à évaluer et à retourner si la condition est fausse.
          Elle doit avoir le même type de nombre que expr_if_true.
    }
     
    Program FonctionIIf;
     
    Function IIf(condition: boolean; a,b: Integer): Integer;
    Begin
      If condition Then IIf:=a Else IIf:=b;
    End;
     
    Var
      i: Byte;
      s: Integer;
     
    Begin
      s:=0;
     
      For i:=0 To 99 Do
        Begin
     
          s := s + IIf ( Odd(i), i, 0 );
     
        End;
     
      Write('La somme des nombres impairs compris entre 0 et 99 est ‚gale … ');
      WriteLn(s,'.');
    End.
    L'Art est long et le Temps est court.

  2. #2
    Expert Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro Paul TOTH
    Freelance
    Inscrit en
    novembre 2002
    Messages
    5 567
    Détails du profil
    Informations personnelles :
    Nom : Homme Paul TOTH
    Âge : 45
    Localisation : Réunion

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2002
    Messages : 5 567
    Points : 15 897
    Points
    15 897

    Par défaut

    Bonjour,

    non cette fonction n'existe pas en Pascal, tout comme la syntaxe suivante (C, PHP, JavaScript...) n'est pas disponible

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
     Var
      i: Byte;
      s: Integer;
     
    Begin
      s:=0;
     
      For i:=0 To 99 Do
        Begin
     
          s := s + ( Odd(i) ? i : 0 );
     
        End;
     
      Write('La somme des nombres impairs compris entre 0 et 99 est ‚gale … ');
      WriteLn(s,'.');
    End.
    on lui substituera soit une expression mathématique Ord(Odd(i)) * i, soit un appel de fonction OddOrZero(i).

    Avec un compilateur Pascal suffisamment récent tu peux déclarer des "overload" pour décliner la fonction
    Code :
    1
    2
    3
     
    function iif(cond: Boolean; A, B: Integer): Integer; overload;
    function iif(cond: Boolean; A, B: string): string; overload;
    mais ça risque de créer beaucoup de cas de figure.

    Note qu'avec ce genre d'idées ont été créés dans Préprocesseurs Pascal, une sorte de compilateur qui prend un code Pascal "amélioré" pour le traduire en Pascal standard, tu tapes iff() et le préprocesseur le remplace par un if/then/else qui sera compilé de façon classique.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Produits : UPnP, RemoteOffice, FlashPascal
    Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%

  3. #3
    Rédacteur/Modérateur
    Avatar de Roland Chastain
    Homme Profil pro Roland Chastain
    Inscrit en
    décembre 2011
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Nom : Homme Roland Chastain
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 391
    Points : 3 822
    Points
    3 822

    Par défaut

    Citation Envoyé par Paul TOTH Voir le message
    on lui substituera soit une expression mathématique Ord(Odd(i)) * i, soit un appel de fonction OddOrZero(i).
    Je cherchais ce petit morceau de code sans le trouver. Merci !


    Citation Envoyé par Paul TOTH Voir le message
    Avec un compilateur Pascal suffisamment récent tu peux déclarer des "overload" pour décliner la fonction
    Code :
    1
    2
    3
     
    function iif(cond: Boolean; A, B: Integer): Integer; overload;
    function iif(cond: Boolean; A, B: string): string; overload;
    Ça aussi, c'est noté ! Tiens, je vais essayer de le faire.


    Citation Envoyé par Paul TOTH Voir le message
    tu tapes iff() et le préprocesseur le remplace par un if/then/else qui sera compilé de façon classique.
    Le compilateur FreeBasic a cette fonction. Je me demandais si Turbo Pascal l'avait. Donc c'est un outil à part. Ou alors il faut écrire la procédure qui modifie le fichier... Intéressant !
    L'Art est long et le Temps est court.

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •