Auteur Auteur

LES FONCTIONS PRÉDÉFINIES

« Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche » - Anonyme

Certains traitements ne peuvent être effectués par un algorithme, aussi savant soit-il. D’autres ne peuvent l’être qu’au prix de souffrances indicibles.

C’est par exemple le cas du calcul du sinus d’un angle : pour en obtenir une valeur approchée, il faudrait appliquer une formule d’une complexité à vous glacer le sang. Aussi, que se passe-t-il sur les petites calculatrices que vous connaissez tous ? On vous fournit quelques touches spéciales, dites touches de fonctions, qui vous permettent par exemple de connaître immédiatement ce résultat. Sur votre calculatrice, si vous voulez connaître le sinus de 35°, vous taperez 35, puis la touche SIN, et vous aurez le résultat.

Tout langage de programmation propose ainsi un certain nombre de fonctions ; certaines sont indispensables, car elles permettent d’effectuer des traitements qui seraient sans elles impossibles. D’autres servent à soulager le programmeur, en lui épargnant de longs – et pénibles - algorithmes.

1. STRUCTURE GÉNÉRALE DES FONCTIONS

Reprenons l’exemple du sinus. Les langages informatiques, qui se doivent tout de même de savoir faire la même chose qu’une calculatrice à 19F90, proposent généralement une fonction SIN. Si nous voulons stocker le sinus de 35 dans la variable A, nous écrirons :
A ← Sin(35)

Une fonction est donc constituée de trois parties :

  • le nom proprement dit de la fonction. Ce nom ne s’invente pas ! Il doit impérativement correspondre à une fonction proposée par le langage. Dans notre exemple, ce nom est SIN.
  • deux parenthèses, une ouvrante, une fermante. Ces parenthèses sont toujours obligatoires, même lorsqu'on n'écrit rien à l'intérieur.
  • une liste de valeurs, indispensables à la bonne exécution de la fonction. Ces valeurs s’appellent des arguments, ou des paramètres. Certaines fonctions exigent un seul argument, d’autres deux, etc. et d’autres encore aucun. A noter que même dans le cas de ces fonctions n’exigeant aucun argument, les parenthèses restent obligatoires. Le nombre d’arguments nécessaire pour une fonction donnée ne s’invente pas : il est fixé par le langage.

Par exemple, la fonction sinus a besoin d’un argument (ce n’est pas surprenant, cet argument est la valeur de l’angle). Si vous essayez de l’exécuter en lui donnant deux arguments, ou aucun, cela déclenchera une erreur à l’exécution. Notez également que les arguments doivent être d’un certain type, et qu’il faut respecter ces types.

Toute écriture plaçant une fonction à gauche d'une instruction d'affectation est aberrante, pour deux raisons symétriques.

  • d'une part, parce que nous le savons depuis le premier chapitre de ce cours extraordinaire, on ne peut affecter qu'une variable, à l'exclusion de tout autre chose.
  • ensuite, parce qu'une fonction a pour rôle de produire, de renvoyer, de valoir (tout cela est synonyme), un résultat. Pas d'en recevoir un, donc. L'affectation d'une fonction sera donc considérée comme l'une des pires fautes algorithmiques, et punie comme telle.

2. LES FONCTIONS DE TEXTE

Une catégorie privilégiée de fonctions est celle qui nous permet de manipuler des chaînes de caractères. Nous avons déjà vu qu’on pouvait facilement « coller » deux chaînes l’une à l’autre avec l’opérateur de concaténation &. Mais ce que nous ne pouvions pas faire, et qui va être maintenant possible, c’est pratiquer des extractions de chaînes (moins douloureuses, il faut le noter, que les extractions dentaires).

Tous les langages, je dis bien tous, proposent peu ou prou les fonctions suivantes, même si le nom et la syntaxe peuvent varier d’un langage à l’autre :

  • Len(chaîne) : renvoie le nombre de caractères d’une chaîne
  • Mid(chaîne,n1,n2) : renvoie un extrait de la chaîne, commençant au caractère n1 et faisant n2 caractères de long.
  • Ce sont les deux seules fonctions de chaînes réellement indispensables.

    Cependant, pour nous épargner des algorithmes fastidieux, les langages proposent également :
  • Left(chaîne,n) : renvoie les n caractères les plus à gauche dans chaîne.
  • Right(chaîne,n) : renvoie les n caractères les plus à droite dans chaîne
  • Trouve(chaîne1,chaîne2) : renvoie un nombre correspondant à la position de chaîne2 dans chaîne1. Si chaîne2 n’est pas comprise dans chaîne1, la fonction renvoie zéro.

Exemples :


Len("Bonjour, ça va ?") vaut 16
Len("") vaut 0
Mid("Zorro is back", 4, 7) vaut "ro is b"
Mid("Zorro is back", 12, 1) vaut "c"
Left("Et pourtant…", 8) vaut "Et pourt"
Right("Et pourtant…", 4) vaut "t…"
Trouve("Un pur bonheur", "pur") vaut 4
Trouve("Un pur bonheur", "techno") vaut 0
Il existe aussi dans tous les langages une fonction qui renvoie le caractère correspondant à un
code Ascii donné (fonction Asc), et Lycée de Versailles (fonction Chr) :
Asc("N") vaut 78
Chr(63) vaut "?"

J’insiste ; à moins de programmer avec un langage un peu particulier, comme le C, qui traite en réalité les chaînes de caractères comme des tableaux, on ne pourrait pas se passer des deux fonctions Len et Mid pour traiter les chaînes. Or, si les programmes informatiques ont fréquemment à traiter des nombres, ils doivent tout aussi fréquemment gérer des séries de caractères (des chaînes). Je sais bien que cela devient un refrain, mais connaître les techniques de base sur les chaînes est plus qu’utile : c’est indispensable.

3. TROIS FONCTIONS NUMÉRIQUES CLASSIQUES

Partie Entière

Une fonction extrêmement répandue est celle qui permet de récupérer la partie entière d’un nombre :
Après : A ← Ent(3,228) A vaut 3

Cette fonction est notamment indispensable pour effectuer le célébrissime test de parité (voir exercice dans pas longtemps).

Modulo
Cette fonction permet de récupérer le reste de la division d’un nombre par un deuxième nombre. Par exemple :

A ← Mod(10,3) A vaut 1 car 10 = 3*3 + 1
B ← Mod(12,2) B vaut 0 car 12 = 6*2
C ← Mod(44,8) C vaut 4 car 44 = 5*8 + 4

Cette fonction peut paraître un peu bizarre, est réservée aux seuls matheux. Mais vous aurez là aussi l’occasion de voir dans les exercices à venir que ce n’est pas le cas. Génération de nombres aléatoires Une autre fonction classique , car très utile, est celle qui génère un nombre choisi au hasard. Tous les programmes de jeu, ou presque, ont besoin de ce type d’outils, qu’il s’agisse de simuler un lancer de dés ou le déplacement chaotique du vaisseau spatial de l’enfer de la mort piloté par l’infâme Zorglub, qui veut faire main basse sur l’Univers (heureusement vous êtes là pour l’en empêcher, ouf).

Mais il n’y a pas que les jeux qui ont besoin de générer des nombres aléatoires. La modélisation (physique, géographique, économique, etc.) a parfois recours à des modèles dits stochastiques (chouette, encore un nouveau mot savant !). Ce sont des modèles dans lesquels les variables se déduisent les unes des autres par des relations déterministes (autrement dit des calculs), mais où l’on simule la part d’incertitude par une « fourchette » de hasard.

Par exemple, un modèle démographique supposera qu’une femme a en moyenne x enfants au cours de sa vie, mettons 1,5. Mais il supposera aussi que sur une population donnée, ce chiffre peut fluctuer entre 1,35 et 1,65 (si on laisse une part d’incertitude de 10%). Chaque année, c’est-à-dire chaque série de calcul des valeurs du modèle, on aura ainsi besoin de faire choisir à la machine un nombre au hasard compris entre 1,35 et 1,65.

Dans tous les langages, cette fonction existe et produit le résultat suivant :
Après : Toto ← Alea() On a : 0 =< Toto < 1

En fait, on se rend compte avec un tout petit peu de pratique que cette fonction Aléa peut nous servir pour générer n’importe quel nombre compris dans n’importe quelle fourchette. Je sais bien que mes lecteurs ne sont guère matheux, mais là, on reste franchement en deçà du niveau de feu le BEPC :

  • si Alea génère un nombre compris entre 0 et 1, Alea multiplié par Z produit un nombre entre 0 et Z. Donc, il faut estimer la « largeur » de la fourchette voulue et multiplier Alea par cette « largeur » désirée.
  • ensuite, si la fourchette ne commence pas à zéro, il va suffire d’ajouter ou de retrancher quelque chose pour « caler » la fourchette au bon endroit. Par exemple, si je veux générer un nombre entre 1,35 et 1,65 ; la « fourchette » mesure 0,30 de large. Donc : 0 =< Alea()*0,30 < 0,30 Il suffit dès lors d’ajouter 1,35 pour obtenir la fourchette voulue. Si j’écris que : Toto ← Alea()*0,30 + 1,35 Toto aura bien une valeur comprise entre 1,35 et 1,65. Et le tour est joué !

4. LES FONCTIONS DE CONVERSION

Dernière grande catégorie de fonctions, là aussi disponibles dans tous les langages, car leur rôle est parfois incontournable, les fonctions dites de conversion. Rappelez-vous ce que nous avons vu dans les premières pages de ce cours : il existe différents types de variables, qui déterminent notamment le type de codage qui sera utilisé. Prenons le chiffre 3.

Si je le stocke dans une variable de type alphanumérique, il sera codé en tant que caractère, sur un octet. Si en revanche je le stocke dans une variable de type entier, il sera codé sur deux octets. Et la configuration des bits sera complètement différente dans les deux cas. Une conclusion évidente, et sur laquelle on a déjà eu l'occasion d'insister, c'est qu'on ne peut pas faire n'importe quoi avec n'importe quoi, et qu'on ne peut pas par exemple multiplier "3" et "5", si 3 et 5 sont stockés dans des variables de type caractère.

Jusque là, pas de scoop me direz-vous, à juste titre vous répondrai-je, mais attendez donc la suite. Pourquoi ne pas en tirer les conséquences, et stocker convenablement les nombres dans des variables numériques, les caractères dans des variables alphanumériques, comme nous l'avons toujours fait ?

Parce qu'il y a des situations où on n'a pas le choix ! Nous allons voir dès le chapitre suivant un mode de stockage (les fichiers textes) où toutes les informations, quelles qu'elles soient, sont obligatoirement stockées sous forme de caractères. Dès lors, si l'on veut pouvoir récupérer des nombres et faire des opérations dessus, il va bien falloir être capable de convertir ces chaînes en numériques.

Aussi, tous les langages proposent-ils une palette de fonctions destinées à opérer de telles conversions. On trouvera au moins une fonction destinée à convertir une chaîne en numérique (appelons-la Cnum en pseudo-code), et une convertissant un nombre en caractère (Ccar).

ENONCÉ DES EXERCICES

Exercice 9.1

Parmi ces affectations (considérées indépendamment les unes des autres), lesquelles provoqueront des erreurs, et pourquoi ?


Variables A, B, C en Numérique
Variables D, E en Caractère
A ← Sin(B)
A ← Sin(A + B * C)
B ← Sin(A) – Sin(D)
D ← Sin(A / B)
C ← Cos(Sin(A)

Exercice 9.2

Ecrivez un algorithme qui demande un mot à l’utilisateur et qui affiche à l’écran le nombre de lettres de ce mot (c'est vraiment tout bête).

Exercice 9.3

Ecrivez un algorithme qui demande une phrase à l’utilisateur et qui affiche à l’écran le nombre de mots de cette phrase. On suppose que les mots ne sont séparés que par des espaces (et c'est déjà un petit peu moins bête).

Exercice 9.4

Ecrivez un algorithme qui demande une phrase à l’utilisateur et qui affiche à l’écran le nombre de voyelles contenues dans cette phrase. On pourra écrire deux solutions. La première déploie une condition composée bien fastidieuse. La deuxième, en utilisant la fonction Trouve, allège considérablement l'algorithme.

Exercice 9.5

Ecrivez un algorithme qui demande une phrase à l’utilisateur. Celui-ci entrera ensuite le rang d’un caractère à supprimer, et la nouvelle phrase doit être affichée (on doit réellement supprimer le caractère dans la variable qui stocke la phrase, et pas uniquement à l’écran).

Exercice 9.6 - Cryptographie 1

Un des plus anciens systèmes de cryptographie (aisément déchiffrable) consiste à décaler les lettres d’un message pour le rendre illisible. Ainsi, les A deviennent des B, les B des C, etc. Ecrivez un algorithme qui demande une phrase à l’utilisateur et qui la code selon ce principe. Comme dans le cas précédent, le codage doit s’effectuer au niveau de la variable stockant la phrase, et pas seulement à l’écran.

Exercice 9.7 - Cryptographie 2 - le chiffre de César

Une amélioration (relative) du principe précédent consiste à opérer avec un décalage non de 1, mais d’un nombre quelconque de lettres. Ainsi, par exemple, si l’on choisit un décalage de 12, les A deviennent des M, les B des N, etc.

Réalisez un algorithme sur le même principe que le précédent, mais qui demande en plus quel est le décalage à utiliser. Votre sens proverbial de l'élégance vous interdira bien sûr une série de vingt-six
"Si...Alors"

Exercice 9.8 - Cryptographie 3

Une technique ultérieure de cryptographie consista à opérer non avec un décalage systématique, mais par une substitution aléatoire. Pour cela, on utilise un alphabet-clé, dans lequel les lettres se succèdent de manière désordonnée, par exemple :
HYLUJPVREAKBNDOFSQZCWMGITX

C’est cette clé qui va servir ensuite à coder le message. Selon notre exemple, les A deviendront des H, les B des Y, les C des L, etc.
Ecrire un algorithme qui effectue ce cryptage (l’alphabet-clé sera saisi par l’utilisateur, et on suppose qu'il effectue une saisie correcte).

Exercice 9.9 - Cryptographie 4 - le chiffre de Vigenère

Un système de cryptographie beaucoup plus difficile à briser que les précédents fut inventé au XVIe siècle par le français Vigenère. Il consistait en une combinaison de différents chiffres de César. On peut en effet écrire 25 alphabets décalés par rapport à l’alphabet normal :

  • l’alphabet qui commence par B et finit par …YZA
  • l’alphabet qui commence par C et finit par …ZAB
  • etc.

Le codage va s’effectuer sur le principe du chiffre de César : on remplace la lettre d’origine par la lettre occupant la même place dans l’alphabet décalé. Mais à la différence du chiffre de César, un même message va utiliser non un, mais plusieurs alphabets décalés. Pour savoir quels alphabets doivent être utilisés, et dans quel ordre, on utilise une clé.

Si cette clé est "VIGENERE" et le message "Il faut coder cette phrase", on procèdera comme suit : La première lettre du message, I, est la 9e lettre de l’alphabet normal. Elle doit être codée en utilisant l’alphabet commençant par la première lettre de la clé, V. Dans cet alphabet, la 9e lettre est le D. I devient donc D.

La deuxième lettre du message, L, est la 12e lettre de l’alphabet normal. Elle doit être codée en utilisant l’alphabet commençant par la deuxième lettre de la clé, I. Dans cet alphabet, la 12e lettre est le S. L devient donc S, etc.
Quand on arrive à la dernière lettre de la clé, on recommence à la première. Ecrire l’algorithme qui effectue un cryptage de Vigenère, en demandant bien sûr au départ la clé à l’utilisateur.

Exercice 9.10

Ecrivez un algorithme qui demande un nombre entier à l’utilisateur. L’ordinateur affiche ensuite le message "Ce nombre est pair" ou "Ce nombre est impair" selon le cas.

Exercice 9.11

Ecrivez les algorithmes qui génèrent un nombre Glup aléatoire tel que …


• 0 =< Glup < 2 
• –1 =< Glup < 1 
• 1,35 =< Glup < 1,65 
• Glup émule un dé à six faces 
• –10,5 =< Glup < +6,5 
• Glup émule la somme du jet simultané de deux dés à six faces


CORRIGÉS DES EXERCICES

Exercice 9.1

A ← Sin(B) Aucun problème
A ← Sin(A + B * C) Aucun problème
B ← Sin(A) – Sin(D) Erreur ! D est en caractère
D ← Sin(A / B) Aucun problème… si B est différent de zéro
C ← Cos(Sin(A) Erreur ! Il manque une parenthèse fermante

Exercice 9.2

Vous étiez prévenus, c'est bête comme chou ! Il suffit de se servir de la fonction Len, et c'est réglé :


Variable Mot en Caractère
Variable Nb en Entier
Debut
Ecrire "Entrez un mot : "
Lire Mot
Nb ← Len(Mot)
Ecrire "Ce mot compte ", Nb, " lettres"
Fin

Exercice 9.3

Là, on est obligé de compter par une boucle le nombre d'espaces de la phrase, et on en déduit le nombre de mots. La boucle examine les caractères de la phrase un par un, du premier au dernier, et les compare à l'espace.


Variable Bla en Caractère
Variables Nb, i en Entier
Debut
Ecrire "Entrez une phrase : "
Lire Bla
Nb ← 0
Pour i ← 1 à Len(Bla)
 Si Mid(Bla, i , 1) = " " Alors
 Nb ← Nb + 1
 FinSi
i suivant
Ecrire "Cette phrase compte ", Nb + 1, " mots"
Fin

Exercice 9.4

Solution 1 : pour chaque caractère du mot, on pose une très douloureuse condition composée. Le moins que l'on puisse dire, c'est que ce choix ne se distingue pas par son élégance. Cela dit, il marche, donc après tout, pourquoi pas.


Variable Bla en Caractère
Variables Nb, i, j en Entier
Debut
Ecrire "Entrez une phrase : "
Lire Bla
Nb ← 0
Pour i ← 1 à Len(Bla)
 Si Mid(Bla, i, 1) = "a" ou Mid(Bla, i, 1) = "e" ou Mid(Bla, i, 1) = "i" ou
Mid(Bla, i, 1) = "o" ou Mid(Bla, i, 1) = "u" ou Mid(Bla, i, 1) = "y" Alors
 Nb ← Nb + 1
 FinSi
i suivant
Ecrire "Cette phrase compte ", Nb, " voyelles"
Fin

Solution 2 : on stocke toutes les voyelles dans une chaîne. Grâce à la fonction Trouve, on détecte immédiatement si le caractère examiné est une voyelle ou non. C'est nettement plus sympathique...


Variables Bla, Voy en Caractère
Variables Nb, i, j en Entier
Debut
Ecrire "Entrez une phrase : "
Lire Bla
Nb ← 0
Voy ← "aeiouy"
Pour i ← 1 à Len(Bla)
 Si Trouve(Voy, Mid(Bla, i, 1)) <> 0 Alors
 Nb ← Nb + 1
 FinSi
i suivant
Ecrire "Cette phrase compte ", Nb, " voyelles"
Fin

Exercice 9.5

Il n'existe aucun moyen de supprimer directement un caractère d'une chaîne… autrement qu'en procédant par collage. Il faut donc concaténer ce qui se trouve à gauche du caractère à supprimer, avec ce qui se trouve à sa droite. Attention aux paramètres des fonctions Mid, ils n'ont rien d'évident !


Variable Bla en Caractère
Variables Nb, i, j en Entier
Début
Ecrire "Entrez une phrase : "
Lire Bla
Ecrire "Entrez le rang du caractère à supprimer : "
Lire Nb
L ← Len(Bla)
Bla ← Mid(Bla, 1, Nb – 1) & Mid(Bla, Nb + 1, L – Nb)
Ecrire "La nouvelle phrase est : ", Bla
Fin

Exercice 9.6

Sur l'ensemble des exercices de cryptographie, il y a deux grandes stratégies possibles :

  • soit transformer les caractères en leurs codes ASCII. L'algorithme revient donc ensuite à traiter des nombres. Une fois ces nombres transformés, il faut les reconvertir en caractères.
  • soit en rester au niveau des caractères, et procéder directement aux transformations à ce niveau.

C'est cette dernière option qui est choisie ici, et pour tous les exercices de cryptographie à venir. Pour cet exercice, il y a une règle générale : pour chaque lettre, on détecte sa position dans l'alphabet, et on la remplace par la lettre occupant la position suivante. Seul cas particulier, la vingt-sixième lettre (le Z) doit être codée par la première (le A), et non par la vingt-septième, qui n'existe pas !


Variables Bla, Cod, Alpha en Caractère
Variables i, Pos en Entier
Début
Ecrire "Entrez la phrase à coder : "
Lire Bla
Alpha ← "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Cod ← ""
Pour i ← 1 à Len(Bla)
 Let ← Mid(Bla, i, 1) 
 Si Let <> "Z" Alors
 Pos ← Trouve(Alpha, Let)
 Cod ← Cod & Mid(Alpha, Pos + 1, 1) 
 Sinon
 Cod ← Cod & "A" 
 FinSi
i Suivant
Bla ← Cod
Ecrire "La phrase codée est : ", Bla
Fin

Exercice 9.7

Cet algorithme est une généralisation du précédent. Mais là, comme on ne connaît pas d'avance le décalage à appliquer, on ne sait pas a priori combien de "cas particuliers", à savoir de dépassements au-delà du Z, il va y avoir.

Il faut donc trouver un moyen simple de dire que si on obtient 27, il faut en réalité prendre la lettre numéro 1 de l'alphabet, que si on obtient 28, il faut en réalité prendre la numéro 2, etc. Ce moyen simple existe : il faut considérer le reste de la division par 26, autrement dit le modulo. Il y a une petite ruse supplémentaire à appliquer, puisque 26 doit rester 26 et ne pas devenir 0.


Variable Bla, Cod, Alpha en Caractère
Variables i, Pos, Décal en Entier
Début
Ecrire "Entrez le décalage à appliquer : "
Lire Décal
Ecrire "Entrez la phrase à coder : "
Lire Bla
Alpha ← "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Cod ← ""
Pour i ← 1 à Len(Bla)
 Let ← Mid(Bla, i, 1) 
 Pos ← Trouve(Alpha, Let)
 NouvPos ← Mod(Pos + Décal, 26)
 Si NouvPos = 0 Alors
 NouvPos ← 26
 FinSi
 Cod ← Cod & Mid(Alpha, NouvPos, 1) 
i Suivant
Bla ← Cod
Ecrire "La phrase codée est : ", Bla
Fin

Exercice 9.8

Là, c'est assez direct.


Variable Bla, Cod, Alpha en Caractère
Variables i, Pos, Décal en Entier
Début
Ecrire "Entrez l’alphabet clé : "
Lire Clé
Ecrire "Entrez la phrase à coder : "
Lire Bla
Alpha ← "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Cod ← ""
Pour i ← 1 à Len(Bla)
 Let ← Mid(Bla, i, 1) 
 Pos ← Trouve(Alpha, Let)
 Cod ← Cod & Mid(Clé, Pos, 1) 
i Suivant
Bla ← Cod
Ecrire "La phrase codée est : ", Bla
Fin

Exercice 9.9

Le codage de Vigenère n’est pas seulement plus difficile à briser; il est également un peu plus raide à programmer. La difficulté essentielle est de comprendre qu’il faut deux boucles: l’une pour parcourir la phrase à coder, l’autre pour parcourir la clé. Mais quand on y réfléchit bien, ces deux boucles ne doivent surtout pas être imbriquées. Et en réalité, quelle que soit la manière dont on l'écrit, elle n’en forment qu’une seule.


Variables Alpha, Bla, Cod, Clé, Let en Caractère
Variables i, Pos, PosClé, Décal en Entier
Début
Ecrire "Entrez la clé : "
Lire Clé
Ecrire "Entrez la phrase à coder : "
Lire Bla
Alpha ← "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Cod ← ""
PosClé ← 0
Pour i ← 1 à Len(Bla)
On gère la progression dans la clé. J’ai effectué cela "à la main" par une boucle, mais un joli emploi
de la fonction Modulo aurait permis une programmation en une seule ligne!
 Posclé ← Posclé + 1
 Si PosClé > Len(Clé) Alors
 PosClé ← 1
 FinSi

On détermine quelle est la lettre clé et sa position dans l’alphabet


 LetClé ← Mid(Clé, PosClé, 1)
 PosLetClé ← Trouve(Alpha, LetClé)

On détermine la position de la lettre à coder et le décalage à appliquer. Là encore, une solution alternative aurait été d’employer Mod : cela nous aurait épargné le Si…


 Let ← Mid(Bla, i, 1)
 Pos ← Trouve(Alpha, Let)
 NouvPos ← Pos + PosLetClé
 Si NouvPos > 26 Alors
 NouvPos ← NouvPos – 26
 FinSi
 Cod ← Cod & Mid(Alpha, NouvPos, 1) 
i Suivant
Bla ← Cod
Ecrire "La phrase codée est : ", Bla
Fin

Exercice 9.10

On en revient à des choses plus simples...


Variable Nb en Entier
Ecrire "Entrez votre nombre : "
Lire Nb
Si Nb/2 = Ent(Nb/2) Alors
 Ecrire "Ce nombre est pair"
Sinon
 Ecrire "Ce nombre est impair"
FinSi
Fin

Exercice 9.11

a) Glup ← Alea() * 2
b) Glup ← Alea() * 2 - 1
c) Glup ← Alea() * 0,30 + 1,35
d) Glup ← Ent(Alea() * 6) + 1
e) Glup ← Alea() * 17 – 10,5
f) Glup ← Ent(Alea()*6) + Ent(Alea()*6) + 2