Une fonction associe à une variable x une autre variable y ; lorsqu’un groupe opère sur un ensemble, il transforme les nombres. Il semble qu’en algorithmique, la seconde notion soit plus naturelle que la première
par Alain Busser, Florian Tobé
Cet article peut être librement diffusé à l’identique dans la limite d’une utilisation non commerciale suivant la licence CC-by-nc-nd (http://creativecommons.org/licenses/by-nc-nd/3.0/fr/)
Pour le prof, les deux phrases suivantes sont équivalentes :
- Mettre x+1 dans x
- Augmenter x de 1
Mais pas pour les élèves, en terme de facilité d’abstraction. Ceux-ci préfèrent souvent transformer les nombres in situ plutôt que faire des allers-retours entre lecture et écriture.
Ainsi, « augmenter x de 1 » (traduction de « incrémenter x ») ne se traduit pas automatiquement en « mettre x+1 dans x ».
Idée folle : Et si on créait un langage de programmation axé sur les transformations de nombres ?
En fait, un tel langage existe depuis assez longtemps : Il s’agit de COBOL, initié par Grace Hopper. Par exemple, « ajouter 2 à x » qui, en CoffeeScript, se note x = x+2
ou x += 2
, et qui a bien pour effet de transformer x, se code en COBOL :
ADD 2 TO x
D’où l’idée de chercher un COBOL en français qui tournerait en html5 (typiquement, programmé en JavaScript ou en CoffeeScript)... Or, s’il existe bien un COBOL en CoffeeScript, d’ailleurs décrit comme un langage dédié [7], celui-ci est écrit en anglais, et il subsiste le besoin de refaire tout ça en français. On va donc dans la suite de cet article, montrer comment on peut créer un tel langage spécialisé dans les transformations sur les variables, et que l’on propose d’appeler Sophus [8].
Variables transformables
La POO répond facilement à la question de la transformabilité d’une variable : Une variable est un objet, possédant une propriété appelée « valeur », qu’il est possible de modifier. Pour éviter les erreurs de syntaxe (oubli d’initialiser la variable), on donne par défaut la valeur 0 à la « valeur » de la variable :
- class Variable
- constructor: (@valeur=0) ->
- toString: -> @valeur.toString()
La dernière ligne a pour but de détourner l’affichage d’une variable, en affichant sa valeur à la place de [object Object]
donné par CoffeeScript par défaut.
- class Variable
- constructor: (@valeur=0) ->
- toString: -> @valeur.toString()
- mettreDans = (variable,bidule) =>
- variable.valeur = bidule
- null
L’algorithme x←3 ; x ←x+2 devient alors
- x = new Variable 3
- mettreDans x, x.valeur+2
- alert x
fonctions
On peut simplifier des fonctions en enlevant le préfixe Math
de JavaScript, par exemple
- racine = (nombre) -> Math.sqrt(nombre)
- sinus = (nombre) -> Math.sin(nombre*π/180)
(à condition d’avoir défini la variable π = Math.PI
au préalable).
Mais, s’il est intéressant de redéfinir la fonction carré par
- carré = (nombre) ->
- nombre * nombre
il est encore plus intéressant de définir une transformation éleverAuCarré
qui transforme une variable en son carré :
- éleverAuCarré = (o) =>
- o.valeur *= o.valeur
Ensuite on peut remplacer x par son carré avec quelque chose comme ceci :
- c = new Variable 4
- éleverAuCarré c
- alert c
On a ajouté les transformations éleverAuCube
et inverser
ainsi que extraireLaRacineDe
qui transforment une variable selon des méthodes vues au collège. Cependant, les techniques exposées dans l’onglet « pourcentages » permettent de créer une instruction élever
, utilisable au choix avec l’une des syntaxes suivantes :
- élever x, "au carré"
- élever x, auCarré
- élever x, aLaPuissance, 2
- élever x, "à la puissance", 2
incrémentation
L’incrémentation est une opération très importante sur les nombres entiers puisqu’elle sert à compter. Les « range » de Python (langage) sont d’ailleurs une version active de l’incrémentation. En fait, l’incrémentation est une version opératoire du deuxième des axiomes de Peano.
Pour incrémenter un nombre, on peut lui ajouter 1 avec l’instruction « ajouter » décrite dans le prochain onglet, mais plus simplement, utiliser le verbe « incrémenter » [10] avec la fonction suivante :
- incrémenter = (o) =>
- o.valeur += 1
- null
Cette fonction renvoit « null » pour éviter les effets de bords dans CoffeeScript.
De même, on peut décrémenter une variable de la manière suivante :
- décrémenter = (o) =>
- o.valeur -= 1
- null
L’incrémentation sert à parcourir une suite arithmétique de raison 1, typiquement celles des entiers naturels. Une première généralisation, où la raison n’est pas nécessairement 1, est développée dans l’onglet suivant.
pourcentages
On peut ensuite penser à quelque chose comme
- augmenter =(o,increment) =>
- o.valeur += increment
Mais dans ce cas, la syntaxe s’éloigne de la langue française [11] puisque pour incrémenter un indice on ferait
- indice = new Variable
- augmenter indice, 1
Pour retrouver le dynamisme de la langue de Molière [12], il suffit d’ajouter une variable qui devra nécessairement être égale au texte « de » (et on peut se passer de guillemets en créant une variable globale de même nom. Alors
- de = "de"
- augmenter =(o,de="de",increment) =>
- if de is "de"
- o.valeur += increment
- else
- montrer "De combien voulez-vous donc que j'augmente cette variable à la fin ?"
permet d’incrémenter l’indice en écrivant
- indice = new Variable
- augmenter indice, de, 1
On peut également diminuer une variable dans les mêmes conditions.
tests et boucles
La difficulté à faire évaluer en temps réel les booléens fait que les tests multiples (« else », « switch ») ne peuvent pas facilement être programmés fonctionnellement, ni les boucles « while » et « until ». Sophus ne connaît donc que les boucles simples (sans indice) et les tests simples (sans clause alternative).
Tests
Dans l’esprit de Sophus, qui transparaît dans les onglets précédents, la fonction suivante permet de faire un test simple :
- si = (booleen,fonction) ->
- do fonction if booleen
- null
Le « sinon » n’étant pas permis, on peut le compenser par un second test, dont le booléen est le contraire du premier. Par exemple pour la suite de Collatz, une fois qu’on a regardé si un est pair, on regarde s’il est impair :
- collatz = new Variable 3
- U=[collatz]
- 8.foisFaire ->
- si collatz.estImpair(), ->
- tripler collatz
- incrémenter collatz
- null
- si collatz.estPair(), ->
- diviser collatz, par, 2
- null
- U.empiler collatz.valeur
- montrer U
La fonction suivante fonctionne [14] aussi :
- aMoinsQue = (booleen,fonction) ->
- do fonction unless booleen
- null
Boucles
Le langage LOGO, destiné à des enfants, possédait une boucle « repeat » permettant simplement de faire quelque chose plusieurs fois, en modifiant éventuellement quelques variables dans la boucle. Aussi lorsque Alan Kay a créé le langage Smalltalk, a-t-il conservé [15] cette boucle sans indice, comme méthode de l’objet « entier ». Dans Sophus cette boucle existe aussi, elle s’appelle foisFaire et on l’a vue ci-dessus dans l’exemple de la suite de Collatz.
Si par malheur on a besoin d’utiliser l’indice de la boucle (par exemple pour additionner les valeurs successives de celui-ci) on peut toujours en créer un avant la boucle, et l’incrémenter dans la boucle. Attention toutefois à ne pas modifier l’indice dans la boucle, c’est un risque avec la modification in situ. Par exemple, pour additionner les 10 premiers nombres entiers en Sophus, on peut faire ainsi, avec deux variables somPart stockant la somme partielle au cours de la boucle, et indice matérialisant l’indice de la boucle :
- #pour calculer 0+1+2+...+9
- somPart = new Variable 0
- indice = new Variable 0
- 10.foisFaire ->
- augmenter somPart, de, indice
- incrémenter indice
- montrer somPart
Il est possible de modifier ce « SophuScript » en ajoutant un affichage dans la boucle :
- #pour calculer 0+1+2+...+9
- somPart = new Variable 0
- indice = new Variable 0
- 10.foisFaire ->
- augmenter somPart, de, indice
- incrémenter indice
- montrer "#{indice} : #{somPart}"
- montrer somPart
Pour les boucles à condition de sortie, on peut comparer avec un seuil, par exemple voici le corrigé sophusien du bac ES Antilles-Guyane septembre 2013. La condition « le nombre d’adhérents est inférieur à 180 » se traduit en Sophus par "180 est plus grand que le nombre d’adhérents :
- année = new Variable 2005
- adhérents = new Variable 80
- 180.tantQuePlusGrandQue adhérents, ->
- incrémenter année
- diminuer adhérents, de, 10, pourcents
- augmenter adhérents, de, 20
- arrondir adhérents
- montrer année
Un autre exemple : Combien de fois doit-on lancer un dé pour que la probabilité d’avoir au moins une fois un 6 dépasse 99 chances sur 100 ?
La probabilité de ne pas avoir de 6 est une suite géométrique de raison 5/6, on passe donc de chaque terme au suivant en enlevant un sixième de celui-ci. On veut que la probabilité du contraire passe en-dessous de 0,01 :
- probabilité = new Variable 1 #au début la probabilité de ne pas avoir de 6 est 1
- tentatives = new Variable 0 # puisqu'on n'a pas encore lancé le dé
- 0.01.tantQuePlusPetitQue probabilité, ->
- diminuer probabilité, de, 1, sixième
- incrémenter tentatives
- montrer tentatives
Il est toujours possible de programmer en Sophus avec des boucles classiques et des tests multiples, puisque ceux-ci sont disponibles en CoffeeScript, qui est le support de Sophus. La situation est d’ailleurs tout-à-fait analogue pour la Ti82Stats-fr, à en juger par les copies d’écran suivantes :
Comme sophus (interpréteur de Sophus) est libre, il est normal que son téléchargement soit aisé. Le voici donc en version source et en version JavaScript (à mettre dans un fichier html) :
le source | le JavaScript | l’interpréteur hors ligne |
Et voici un interpréteur Sophus en ligne :
Interpréteur Sophus
Exemples
On peut tester l’interpréteur Sophus ci-dessus avec les scripts ci-dessous, concernant des sujets d’examen de la session 2014.
Bac ES Amérique du Nord
Afin d’entretenir une forêt vieillissante, un organisme régional d’entretien des forêts décide d’abattre chaque année 5% des arbres existants et de replanter 3 000 arbres. Le nombre d’arbres de cette forêt est modélisé par une suite notée u où un désigne le nombre d’arbres au cours de l’année (2013+n). En 2013, la forêt compte 50 000 arbres. |
Voici l’algorithme de la fin de la question (recherche d’un seuil ; plus précisément quand le nombre d’arbres dépassera 57000) :
- arbres = new Variable 50000
- année = new Variable 2013
- 57000.tantQuePlusGrandQue arbres, ->
- diminuer arbres, de, 5, pourcents
- augmenter arbres, de, 3000
- incrémenter année
- montrer année
DNB
Voici un programme de calcul : |
1. Montrer que si on choisit 8 comme nombre de départ, le programme donne 12 comme résultat. 2. Pour chacune des affirmations suivantes, indiquer si elle est vraie ou fausse. On rappelle que les réponses doivent être justifiées. Proposition 1 Le programme peut donner un résultat négatif ; Proposition 2 si on choisit 1/2 comme nombre de départ, le programme donne 33/4 comme résultat ; Proposition 3 Le programme donne 0 comme résultat pour exactement deux nombres ; Proposition 4 la fonction qui, au nombre de départ, associe le résultat du programme est une fonction linéaire. |
Question 1
Pour répondre à la question 1, on transforme le programme de calcul en suite d’instructions Sophus. Mais les variables locales gauche et droite doivent être créées et initialisées avec la valeur de la variable nombre (soit, avec 8).
- nombre = new Variable 8
- gauche = new Variable nombre
- droite = new Variable nombre
- diminuer gauche, de, 6
- diminuer droite, de, 2
- multiplier gauche, par, droite
- montrer gauche
Question 2
Pour répondre à la question 2, il est plus pratique de transformer le programme de calcul en une fonction.
Pour la proposition 2, on à juste à afficher l’image de 1/2 par la fonction :
- Programme = (nombre) ->
- gauche = new Variable nombre
- droite = new Variable nombre
- diminuer gauche, de, 6
- diminuer droite, de, 2
- multiplier gauche, par, droite
- gauche
- montrer Programme 1/2
Pour les autres propositions, on peut constituer un tableau de valeurs en empilant les images d’entiers successifs par cette fonction, dans un tableau :
- Programme = (nombre) ->
- gauche = new Variable nombre
- droite = new Variable nombre
- diminuer gauche, de, 6
- diminuer droite, de, 2
- multiplier gauche, par, droite
- gauche
- variable = new Variable 0
- tabval = []
- 8.foisFaire ->
- tabval.empiler Programme(variable)
- incrémenter variable
- montrer tabval
Bac ES Pondichery
Une association décide d’ouvrir un centre de soin pour les oiseaux sauvages victimes de la pollution. Leur but est de soigner puis relâcher ces oiseaux une fois guéris. Le centre ouvre ses portes le 1er janvier 2013 avec 115 oiseaux. Les spécialistes prévoient que 40% des oiseaux présents dans le centre au 1er janvier d’une année restent présents le 1er janvier suivant et que 120 oiseaux nouveaux sont accueillis dans le centre chaque année. On s’intéresse au nombre d’oiseaux présents dans le centre au 1er janvier des années suivantes. |
Voici l’algorithme en Sophus :
- oiseaux = new Variable 115
- année = new Variable 2013
- durée = parseInt(prompt "pendant combien d'années ?")
- durée.foisFaire ->
- diminuer oiseaux, de, 60, pourcents
- augmenter oiseaux, de, 120
- incrémenter année
- montrer année
La seule difficulté est que la durée est un entier à entrer, ce qui oblige à convertir la valeur entrée (par défaut, du texte) en entier.
Bac ES Liban
La médiathèque d’une petite ville a ouvert ses portes le 2 janvier 2013 et a enregistré 2 500 inscriptions en 2013. Elle estime que, chaque année, 80% des anciens inscrits renouvelleront leur inscription l’année suivante et qu’il y aura 400 nouveaux adhérents. On modélise cette situation par une suite numérique (an). On note a0 = 2500 le nombre d’inscrits à la médiathèque en 2013 et an représente le nombre d’inscrits à la médiathèque pendant l’année 2013+n. |
Voici la traduction de l’algorithme de l’énoncé (recherche de seuil : Quand le nombre d’adhérents passe en-dessous de 2050) :
- adhérents = new Variable 2500
- année = new Variable 2013
- 2050.tantQuePlusPetitQue adhérents, ->
- diminuer adhérents, de, 20, pourcents
- augmenter adhérents, de, 400
- incrémenter année
- montrer année
Bac ES Centres étrangers
Dans une ville, un nouveau lycée vient d’ouvrir ses portes et accueille pour sa première rentrée 500 élèves. D’une année sur l’autre, le proviseur du lycée prévoit une perte de 30% de l’effectif et l’arrivée de 300 nouveaux élèves. On modélise cette situation par une suite numérique... |
La difficulté est qu’une fois de plus, on demande d’entrer une donnée (alors qu’il aurait été tellement plus simple de l’initialiser...). Il faut alors la convertir en un entier puisque par défaut, JavaScript convertit automatiquement tout en chaînes de caractères :
- élèves = new Variable 500
- année = new Variable 2013
- durée = parseInt(prompt "pendant combien d'années ?")
- durée.foisFaire ->
- diminuer élèves, de, 30, pourcents
- arrondir élèves
- augmenter élèves, de, 300
- incrémenter année
- montrer élèves
Bac ES Polynésie
Le sujet portait sur une suite récurrente $(u_n)$ définie par
- $u_0=5$
- $u_{n+1}=\frac{1}{2}u_n +1$
L’algorithme étant un simple algorithme d’affichage des termes de la suite.
Première version : Afficher, en boucle, tous les termes :
- u = new Variable 5
- N = 4
- N.foisFaire ->
- diviser u, par, 2
- incrémenter u
- montrer u
Deuxième version : Avec un seul affichage, celui d’un tableau dans lequel on empile successivement les termes de la suite :
- u = new Variable 5
- suite = []
- N = 4
- N.foisFaire ->
- suite.empiler u
- diviser u, par, 2
- incrémenter u
- montrer suite
Bac ES Antilles-Guyane
Obligatoire
Un opérateur de téléphonie mobile constate que, chaque année, il perd 8% de ses précédent abonnés et que, par ailleurs, il gagne 3millions de nouveaux abonnés. En 2013 le nombre d’abonnés est de 20 millions. On s’intéresse au nombre d’abonnés, en millions, pour l’année 2013+n. [...] Compte tenu des investissements, l’opérateur considère qu’il réalisera des bénéfices lorsque le nombre d’abonnés dépassera 25 millions. |
On modélise le nombre d’abonnés, en millions, par la suite $(u_n)$ telle que
- $u_0=20$
- $u_{n+1}=0,92 u_n + 3$
Mais voici une description plus sophusienne de la suite :
- abonnés = new Variable 20000000
- année = new Variable 2013
- 25000000.tantQuePlusGrandQue abonnés, ->
- diminuer abonnés, de, 8, pourcents
- augmenter abonnés, de, 3000000
- arrondir abonnés, à, 1000, près #choix de l'énoncé...
- incrémenter année
- montrer année
L’algorithme, donné dans l’énoncé, visait à déterminer quand l’opérateur réalisera des bénéfices.
Spécialité
Les services commerciaux d’une grande surface de produits alimentaires ont défini un profil de client qui a été appelé « consommateur bio ». Sur la base d’observations réalisées les années précédentes, il a été constaté que : 90% des clients « consommateur bio »maintenaient cette pratique l’année suivante ; 15% des clients n’ayant pas le profil de « consommateur bio » entraient dans la catégorie « consommateur bio » l’année suivante. On suppose que cette évolution se poursuit d’une année à l’autre à partir de 2013, année au cours de laquelle il a été constaté que 20% des clients ont le profil « consommateur bio ». |
Le calcul matriciel dans Sophus ressemble donc à ceci :
- N = new Variable 0
- B = new Variable 0.2
- C = new Variable 0.8
- 0.5.tantQuePlusGrandQue B, ->
- diminuer B, de, 10, pourcents
- multiplier C, par, 0.15
- augmenter B, de, C
- mettreDans C, 1-B.valeur
- incrémenter N
- montrer N
Bac ES Asie
Pour modéliser l’évolution temporelle de la population d’une ville, on résout approximativement une équation en échantillonnant une fonction pour la transformer en suite, et en cherchant un seuil pour cette suite :
- f = (x) ->
- y = new Variable Math.exp(-0.05*x)
- doubler y
- incrémenter y
- inverser y
- tripler y
- y
- X = new Variable 0
- 2.tantQuePlusGrandQue f(X), ->
- incrémenter X
- montrer X
Ce script permet de montrer comment on peut programmer une fonction en Sophus.
Bac ES métropole-Réunion
Obligatoire
À l’automne 2010, Claude achète une maison à la campagne ; il dispose d’un terrain de 1 500 m² entièrement engazonné. Mais tous les ans, 20% de la surface engazonnée est détruite et remplacée par de la mousse. Claude arrache alors, à chaque automne, la mousse sur une surface de 50 m² et la remplace par du gazon. |
On veut savoir quand Claude aura moins de 500 m² de gazon épargné par la mousse.
Voici la solution en Sophus :
- surface = new Variable 1500
- année = new Variable 2010
- 500.tantQuePlusPetitQue surface, ->
- incrémenter année
- diminuer surface, de, 20, pourcents
- augmenter surface, de, 50
- montrer année
Spécialité
Alice participe à une compétition de tir à l’arc ; elle effectue plusieurs lancers de flèches. Lorsqu’elle atteint la cible à un lancer, la probabilité qu’elle atteigne la cible au lancer suivant est égale à 0,9. Lorsqu’elle a manqué la cible à un lancer, Alice se déconcentre et la probabilité qu’elle atteigne la cible au lancer suivant est égale à 0,4. On suppose qu’au premier lancer, elle a autant de chances d’atteindre la cible que de la manquer. |
Pour connaître la probabilité qu’Alice atteigne la cible au bout de 5 lancers, on calcule des puissances de matrices. Ici Sophus est plutôt classique avec ses affectations :
- a = new Variable 0.5
- b = new Variable 0.5
- n = 5
- i = new Variable 2
- (n-2).foisFaire ->
- mettreDans a, 0.9*a.valeur+0.4*b.valeur
- mettreDans b, 1-a.valeur
- montrer a
- montrer b
Bac S Amérique du Nord
Voici le sujet :
Un volume constant de 2 200 m3 d’eau est réparti entre deux bassins A et B. Le bassin A refroidit une machine. Pour des raisons d’équilibre thermique on crée un courant d’eau entre les deux bassins à l’aide de pompes. On modélise les échanges entre les deux bassins de la façon suivante : • au départ, le bassin A contient 800m3 d’eau et le bassin B contient 1 400m3 d’eau ; • tous les jours, 15% du volume d’eau présent dans le bassin B au début de la journée est transféré vers le bassin A ; • tous les jours, 10% du volume d’eau présent dans le bassin A au début de la journée est transféré vers le bassin B. |
La quantité d’eau dans le bassin A est alors modélisée (voir la suite du sujet) par une suite récurrente $a$ telle que $a_0=800$ et $a_{n+1}=\frac{3}{4} a_n + 330$. On cherche à partir de quand $a_n \geq 1100$ :
Le script Sophus suivant permet de répondre sans utiliser le vocabulaire spécifique des suites récurrentes :
- jour = new Variable 0 # le numéro du jour
- bassinA = new Variable 800 # au jour 0 le bassin A contient 800 mètres cubes
- 1100.tantQuePlusGrandQue bassinA, ->
- diminuer bassinA, de, 1, quart
- augmenter bassinA, de, 330
- incrémenter jour
- montrer jour
Bac S Polynésie
Sujet « spécialité »
Un magicien essaye de deviner le jour de l’anniversaire d’une personne dans la salle, à partir du résultat d’un programme de calcul :
Lors d’une autre représentation, le magicien décide de changer son programme de calcul. Pour un spectateur dont le numéro du jour de naissance est j et le numéro du mois de naissance est m, le magicien demande de calculer le nombre z défini par z = 12j +31m. Dans les questions suivantes, on étudie différentes méthodes permettant de retrouver la date d’anniversaire du spectateur. |
Le script en CoffeeScript ressemble à l’algorithme du sujet :
- nom = ['janvier','février','mars','avril','mai','juin','juillet','août','septembre','octobre','novembre','décembre']
- for mois in [1..12]
- for jour in [1..31]
- z = 12*jour+31*mois
- if z is 503
- alert "La personne est née le #{jour}ième jour du mois de #{nom[mois]}"
Voici, à fins de comparaison, la version Sophus (les deux peuvent être testées ci-dessus) :
- z = new Variable #variable à tester dans la boucle
- mois = new Variable 1 #numéro du mois
- 12.foisFaire -> # il y a 12 mois...
- jour = new Variable 1 #numéro du jour dans le mois
- 31.foisFaire -> # il y a 31 jours maximum dans le mois
- mettreDans z, 12*jour.valeur+31*mois.valeur
- si z.valeur == 503, ->
- montrer jour
- montrer mois
- incrémenter jour
- incrémenter mois
Bac S Antilles-Guyane
Obligatoire
Le sujet portait sur la suite récurrente $(u_n)$ définie par
- $u_0=2$
- $u_{n+1}=\frac{1}{5}u_n + 3 \times 0.5^n$
La version Sophus est un autre point de vue :
- n = new Variable 0
- u = new Variable 2
- p = new Variable 3
- 0.01.tantQuePlusPetitQue u, ->
- incrémenter n
- diviser p, par, 2
- diviser u, par, 5
- augmenter u, de, p
- montrer n
Spécialité
En montagne, un randonneur a effectué des réservations dans deux types d’hébergements : L’hébergement A et l’hébergement B. Une nuit en hébergement A coûte 24 € et une nuit en hébergement B coûte 45 €. Il se rappelle que le coût total de sa réservation est de 438 €. On souhaite retrouver les nombres x et y de nuitées passées respectivement en hébergement A et en hébergement B |
Comme il faut boucler sur des indices, Sophus nous oblige à créer ces indices x et y, puis à les incrémenter dans la boucle :
- x = new Variable 0
- 18.foisFaire ->
- y = new Variable 0
- 9.foisFaire ->
- A = new Variable x.valeur
- multiplier A, par, 24 # 24 € par nuit pour la chambre A
- B = new Variable y.valeur
- multiplier B, par, 45 # 45 € par nuit, pour y nuits
- prixTotal = A
- augmenter prixTotal, de, B
- si prixTotal.valeur == 438, ->
- montrer x
- montrer y
- incrémenter y
- incrémenter x
Bac S Asie
Pour calculer des intégrales par la méthode des rectangles, Sophus est tout indiqué avec son instruction ajouter :
- n = new Variable 0
- entrer n
- f = (x) ->
- y = new Variable x.valeur
- élever y, "à la puissance", n.valeur
- incrémenter y
- inverser y
- y
- I = new Variable 0
- x = new Variable 0
- p = new Variable
- entrer p
- p = parseInt(p.valeur) # convertir la variable p en un entier
- p.foisFaire ->
- pas = f(x)
- diviser pas, par, p
- augmenter I, de, pas
- augmenter x, de, 1/p
- montrer I
Quelques remarques sur les types des variables :
- n est une variable de type Variable puisqu’elle a été initialisée comme tel.
- On doit donc faire appel à n.valeur pour la traiter comme un entier.
- La fonction f admet en entrée, un réel (transformé en variable y au début de sa description) ; elle retourne une variable Sophus.
- Lors de sa création, le nombre de termes p est une Variable, dont la valeur est entrée au clavier.
- Mais p.valeur est une chaîne de caractère (facétie de JavaScript) et la ligne commençant par parseInt transforme p en un entier. p n’est alors plus une variable Sophus mais un entier JavaScript