Précédent   Forum du club des développeurs et IT Pro > Autres langages > Pascal > Langage
Langage Vos questions sur langage Pascal en général, ses évolutions, les technologies, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 09/05/2012, 01h51   #1
Roland Chastain
Membre Expert
 
Homme Roland Chastain
Inscription : décembre 2011
Messages : 690
Détails du profil
Informations personnelles :
Nom : Homme Roland Chastain
Âge : 39
Localisation : Mali

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : décembre 2011
Messages : 690
Points : 1 005
Points : 1 005
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
Citation:
If ceci=vrai then n=A else n=B
par
Citation:
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.
Roland Chastain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2012, 06h59   #2
Paul TOTH
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 4 432
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 43
Localisation : Réunion

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

Informations forums :
Inscription : novembre 2002
Messages : 4 432
Points : 10 853
Points : 10 853
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%
Paul TOTH est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/05/2012, 08h20   #3
Roland Chastain
Membre Expert
 
Homme Roland Chastain
Inscription : décembre 2011
Messages : 690
Détails du profil
Informations personnelles :
Nom : Homme Roland Chastain
Âge : 39
Localisation : Mali

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : décembre 2011
Messages : 690
Points : 1 005
Points : 1 005
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.
Roland Chastain est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 13h09.


 
 
 
 
Partenaires

Hébergement Web