3 Programmes
3 Programmes
Windows/Linux Mac
Sélectionner tout CTRL-A CMD-A
Sauvegarder CTRL-S CMD-S
• soit sélectionner « SciNotes » dans le menu « Applications ».
Une fenêtre s’ouvre alors. SciNotes étant un outil essentiel, nous allons de Ouvrir un nouvel onglet CTRL-N CMD-N
suite l’intégrer à notre environnement de travail. Pour ce faire, on arrime la
Enregistrer et exécuter F5 fn-F5
fenêtre SciNotes en lieu et place de la fenêtre « Navigateur de variables »
(cf docking et explications du CH I). Corriger l’indentation CTRL-I CMD-I
1
ECE1-B 2014-2015
II.1. Introduction Une fois ce premier script écrit dans une fenêtre SciNotes, il convient de
le sauvegarder. Pour ce faire, une fois SciNotes sélectionné comme fenêtre
Le terme script est utilisé ici pour désigner un fichier de commandes. de travail, on peut :
On distingue cette notion de celle de fonction qui sera présentée dans le • soit sélectionner « Enregistrer » dans le menu « Fichier »,
paragraphe suivant.
• soit utiliser le raccourci clavier correspondant :
CTRL-S (Windows/Linux) ou CMD-S (Mac).
II.2. Un premier script
Il faudra évidemment sélectionner le dossier adéquat pour la sauvegarde.
On s’intéresse au script suivant dont le but est de calculer le discriminant
Remarque : par défaut, un script sera sauvegardé avec l’extension .sce.
du polynôme aX 2 + bX + c, avec a = 3, b = 5, c = 2.
// Un calcul de discriminant Dès que vous modifiez un fichier, il faut penser à le sauvegarder.
a = 3; Dans le cas contraire, vous serez à la merci d’un bug de l’ordina-
b = 5; teur, d’une mauvaise manipulation ou même d’une simple panne de
c = 2; courant. Sauvegarder doit donc devenir un réflexe !
delta = b∧ 2-4?a?c
1 À titre d’exemple, le logiciel qui dirige une ligne automatique de métro parisien
2
(ligne 1 et 14) contient environ 150 000 lignes de code.
ECE1-B 2014-2015
Ces deux modes sont proposés dans le menu « Exécuter », visible lorsque III.2. Syntaxe d’une fonction
SciNotes est choisi comme fenêtre de travail. Pour ce type de scripts, seul
La syntaxe d’une fonction est la suivante.
le mode d’exécution avec écho fait sens. Il est accessible depuis le raccourci :
CTRL-L sous Windows/Linux, et CMD-L sous Mac. // Description
function sortie = maFonction(entrée)
II.5. Ouvrir un ancien script corps
endfunction
Lors d’une nouvelle séance, il peut être utile de charger un ancien fichier.
Pour ce faire, il y a une nouvelle fois deux solutions :
• soit utiliser le « Navigateur de fichiers » : on se déplace jusqu’au fichier Détaillons les différents éléments de cette syntaxe.
concerné. L’ouverture dans SciNotes se fait par un double-clic. • // Description : ce sont les commentaires détaillant les spécificités de la
fonction qui suit.
• soit sélectionner « Ouvrir un fichier » dans le menu « Fichier » (lorsque la
• function . . . endfunction : ce sont les mots clés du langage utilisés pour
fenêtre de travail est SciNotes ou la console).
signifier le début et la fin de la fonction.
• sortie : c’est ce qui est calculé par la fonction. Ces arguments de sortie
III. Les fonctions Scilab seront, selon les cas, zéro, une ou plusieurs variables.
• maFonction : c’est le nom choisi pour la fonction. Comme pour les va-
III.1. Analogie avec la recette de cuisine
riables, on choisira un nom explicite et, de préférence, assez court.
On a précédemment défini la notion de programme comme la traduction • entrée : c’est ce qui est pris comme entrée de la fonction. Ces arguments
dans un langage informatique d’un algorithme. Pour bien comprendre la no- d’entrée seront, selon les cas, zéro, une ou plusieurs variables.
tion d’algorithme, il est fréquent de l’illustrer par un algorithme de la vie
• corps : c’est la suite finie d’instructions qui permet à la fonction, à l’aide
quotidienne : la recette de cuisine.
des arguments d’entrée, de calculer les arguments de sortie.
Une recette de cuisine est structurée comme suit.
À titre d’illustration, reprenons l’exemple précédent du calcul de discri-
1) Des ingrédients. minant. En prenant comme arguments d’entrée a, b et c on peut calculer le
Ce sont les entrées de l’algorithme discriminant de n’importe quel polynôme du second degré aX 2 + bX + c. On
2) Les différentes étapes de réalisation. stocke ce discriminant dans une variable nommée delta.
C’est la suite finie d’instructions
// discrim(a, b, c) permet de calculer le
3) Le plat obtenu.
// discriminant du polynôme aX ∧ 2+bX+c
C’est la sortie de l’algorithme function delta = discrim(a, b, c)
Comme nous allons le voir, une fonction Scilab i.e. un programme écrit en delta = b∧ 2-4?a?c
Scilab respecte cette structure en trois points. endfunction
3
ECE1-B 2014-2015
III.3. Sauvegarder une fonction Pour les fonctions, on utilisera toujours le mode d’exécution sans écho.
On peut d’ailleurs retenir le raccourci F5 qui permet à la fois de sauvegarder
Le principe de sauvegarde est le même que pour les scripts. Comme pré-
et d’exécuter une fonction.
cisé précédemment, on peut utiliser le raccourci clavier :
CTRL-S (Windows/Linux) ou CMD-S (Mac).
III.5. Tester une fonction
Remarque :
Insistons tout d’abord sur le fait que, lors de l’exécution d’une fonction,
• par défaut, les fonctions sont sauvegardées avec l’extension .sci. Il y a aucune analyse n’est effectuée par Scilab. En conséquence, aucune erreur ne
donc une différence de traitement entre les scripts (sauvegardés en .sce) et sera détectée lors de cette phase. Par contre, lors de l’appel d’une fonction
les fonctions (sauvegardées en .sci). sur un jeu de données (discrim(3, 5, 2) par exemple), la fonction est in-
• Scilab propose, par défaut, d’utiliser le nom de la fonction pour nommer terprétée et un message d’erreur peut apparaître. Ces messages d’erreurs
le fichier sauvegardé. Ceci incite à respecter la règle suivante : sont mis en place pour aider le programmeur à débugger sa fonction. De ce
fait, ces messages précisent les règles du langage qui, selon l’interpréteur, ont
« 1 fonction = 1 fichier » été violées.
III.4. Exécuter une fonction Une fois la fonction sauvegardée et exécutée, il est primordial de la tester
sur plusieurs données différentes. C’est, encore une fois, une règle de bonne
Concernant les modes d’exécution, il n’y a pas de différence avec les conduite que l’on devra respecter. Pour chacun de ces tests, on vérifiera si :
scripts. Pour rappel, il y a deux modes d’exécution : • l’appel ne produit pas de message d’erreur.
• Exécuter fichier sans écho : exécution sans affichage console. • le résultat correspond aux spécifications de la fonction.
−−> exec(’/Info/Exemple_cours/[Link]’, -1) Par exemple, on peut tester la fonction discrim sur le jeu de données suivant.
• Exécuter fichier avec écho : exécution avec rappel de chaque ligne de −−> discrim(3, 5, 2)
la fonction dans la console. ans =
1.
−−> // discrim(a,b,c) permet de calculer le
−−> discrim(-7, -4, 0)
−−> // discriminant du polynôme aX∧ 2+bX+c
ans =
−−> function delta = discrim(a, b, c)
16.
−−> delta = b∧ 2-4?a?c
−−> discrim(1, 4, 3)
−−> endfunction
ans =
L’exécution du code d’une fonction ne produit pas de résultat. En fait, cette 4.
action correspond seulement à faire apprendre à Scilab une nouvelle défini-
Les résultats sont bien ceux attendus et aucun message d’erreur n’est levé.
tion que l’on pourra utiliser par la suite.
Cela permet d’accroître notre confiance en le calcul réalisé par cette fonction.
4
ECE1-B 2014-2015
III.6. Ouverture d’une précédente fonction Nous nous intéressons ici particulièrement aux fonctions prenant plusieurs
arguments de sortie. Pour comprendre ce mécanisme, nous l’illustrons en
L’ouverture d’une fonction s’effectue de la même manière que pour les
développant l’exemple précédent. Considérons donc la fonction racP dont le
scripts. Afin de pouvoir utiliser une fonction écrite dans une précédente
but est de calculer les racines d’un polynôme du second degré aX 2 + bX + c
séance, il faut l’ouvrir dans SciNotes et l’exécuter de nouveau. Il faut bien
pris en paramètre. La plus grande racine sera stockée dans la variable xPlus
comprendre que lors de la fermeture, Scilab oublie toutes les définitions de
et la plus petite dans la variable xMoins.
fonctions que l’on vient de lui apprendre. Plus précisément, la mémoire uti-
lisée par ces définitions est libérée lors de la fermeture. Cette mesure permet // racP(a, b, c) permet de calculer les
de s’assurer que Scilab n’utilisera pas la mémoire de l’ordinateur de manière // racines du polynôme aX ∧ 2+bX+c
incontrôlée. function [xPlus, xMoins] = racP(a, b, c)
delta = b∧ 2-4?a?c;
Notez que si plusieurs fonctions sont ouvertes dans SciNotes, il est pos- xPlus = (-b + sqrt(delta))/(2?a)
sible de toutes les exécuter en une fois. Pour ce faire, une fois SciNotes xMoins = (-b - sqrt(delta))/(2?a)
choisi comme fenêtre de travail, on peut : endfunction
• soit sélectionner « Enregistrer et exécuter tous les fichiers » dans le menu
« Exécuter ». Du point de vue de la syntaxe, on remarque que l’on a encadré les deux va-
• soit directement utiliser le raccourci correspondant : riables de sortie xPlus et xMoins par une paire de crochets [ ]. On détaillera
CTRL-F5 (Windows/Linux) ou CMD-F5 (Mac). le sens de ces symboles dans le « CH V : Matrices ».
Il est aussi possible d’enregistrer toutes les variables et fonctions créées lors Testons maintenant la fonction racP.
d’une séance. Pour ce faire, une fois la console choisie comme fenêtre de tra-
−−> racP(3, 5, 2)
vail, il faut sélectionner « Enregistrer l’environnement » dans le menu « Fi-
ans =
chier ». Lors de la séance suivante, il faudra alors « Charger l’environnement »
- 0.6666667
depuis le même menu.
Le résultat n’est pas satisfaisant puisqu’une seule des deux racines est affi-
III.7. Fonction à plusieurs arguments de sortie chée. Afin de permettre l’affichage des deux racines, on stocke le résultat de
La fonction qu’on a pris pour exemple possède plusieurs arguments en l’appel dans deux variables que l’on nomme (par exemple) x1 et x2. Pour ce
entrée et un seul en sortie. Il n’y a toutefois pas de restriction sur le nombre de faire, on procède comme suit.
ces arguments. Comme précisé précédemment, une fonction peut posséder : −−> [x1, x2] = racP(3, 5, 2)
• 0, 1 ou plusieurs arguments d’entrée, x2 =
• 0, 1 ou plusieurs arguments de sortie. - 1.
x1 =
- 0.6666667
5
ECE1-B 2014-2015
III.8. Fonction utilisant le résultat d’une autre fonction IV. Les fonctions d’affichage
La définition d’une fonction peut contenir l’appel à d’autres fonctions IV.1. Affichage des sorties : la fonction disp
déjà implémentées dans Scilab. Par exemple, la fonction discrim utilise les
opérateurs +, -, ?, qui sont des fonctions prédéfinies de Scilab. Il est aussi Le fonction disp, abréviation du terme anglais display est utilisée pour
possible de faire appel à une fonction que nous avons nous-mêmes définie. réaliser des affichages dans le but d’améliorer l’expérience utilisateur. Afin
C’est même l’une des fonctionnalités les plus importantes des fonctions ! de comprendre comment utiliser cette fonction, reprenons notre exemple.
Reprenons l’exemple précédent de la fonction racP. Nous l’avons implé- Tout d’abord, on peut estimer que ce que l’on obtient lors de l’appel
mentée sans nous servir de la fonction discrim et avons donc dû copier/coller de la fonction racP n’est pas très lisible. Soulignons notamment que l’ordre
le code de la fonction discrim dans le code de la fonction racP. Cette ma- d’affichage des racines (x2 suivi de x1) ne correspond pas à l’ordre du calcul
nière de faire est envisageable ici car la fonction discrim est très courte (1 (x1 suivi de x2), ce qui pourrait être source de confusion. On se propose donc
ligne de code) mais n’est pas très satisfaisante. On préférera l’implémentation que la valeur de chaque racine soit intégrée à une interface graphique plus
suivante. explicite tel que l’affichage : « La plus grande racine vaut . . . ».
// racP2 est une alternative à la fonction racP // racPDisp permet d’afficher les valeurs des
function [xPlus, xMoins] = racP2(a, b, c) // deux racines d’un polynôme pris en paramètre
delta = discrim(a, b, c); function racPDisp(a, b, c)
xPlus = (-b + sqrt(delta))/(2?a) delta = discrim(a, b, c);
xMoins = (-b - sqrt(delta))/(2?a) xPlus = (-b + sqrt(delta))/(2?a);
endfunction xMoins = (-b - sqrt(delta))/(2?a);
disp("La plus grande racine vaut " + string(xPlus));
disp("La plus petite racine vaut " + string(xMoins));
On teste la fonction racP2 de la même façon que la fonction racP.
endfunction
−−> [x1, x2] = racP2(3, 5, 2)
+ En première ligne de la fonction, on se dispense d’arguments de sortie.
x2 =
Ces arguments sont a priori inutiles : on souhaite réaliser un affichage,
- 1. pas utiliser les résultats de la fonction dans une autre.
x1 =
+ La phrase d’affichage apparaît entre guillemets " ", et forme une chaîne
- 0.6666667
de caractères (string en anglais). L’opérateur « + » permet de coller la
valeur des variables xPlus et xMoins à la suite de cette phrase. Enfin,
Évidemment, on veillera à ce que la fonction discrim ait été sauvegardée et l’opérateur string est utilisé pour transformer la valeur des variables en
exécutée avant de réaliser ce test. chaîne de caractères. Cette construction sera développée au « CH IV :
Types de données ».
6
ECE1-B 2014-2015
Le test de la fonction racPDisp fait apparaître l’intérêt de la fonction disp : Tester ce script correspond à l’exécuter. Pour ce type de scripts, on préférera
l’affichage du résultat est plus agréable. le mode exécution sans écho (F5), qui permet d’afficher les effets des fonctions
input et disp tout en évitant la recopie des lignes de code, inutile ici.
−−> racPDisp(3, 5, 2)
La plus grande racine vaut -0.6666667 −−> exec(’/Info/Exemple_cours/[Link]’, -1)
La plus grande racine vaut -1. Entrez la valeur du coefficient a : 3
Entrez la valeur du coefficient b : 5
Entrez la valeur du coefficient c : 2
IV.2. Affichage en entrée : la fonction input
La plus grande racine vaut -0.6666667
Il est aussi possible de créer une interface graphique en entrée. Ceci est
effectué par la fonction input, terme anglais signifiant entrée. Plus précisé- La plus petite racine vaut -1.
ment, la fonction input permet de proposer à l’utilisateur de choisir la valeur
des variables en entrée. Les valeurs 3, 5 et 2 sont celles entrées au clavier par l’utilisateur. La première
ligne témoigne du fait que l’on exécute le script nommé racPDispInp et
Illustrons de nouveau cette fonctionnalité à l’aide de la fonction de calcul détaille son adresse de sauvegarde.
de racines.
IV.3. Script ou fonction ?
// Le script suivant demande la valeur d’un polynôme
// et affiche ses deux racines IV.3.a) D’un point de vue intérêt en informatique
a = input("Entrez la valeur du coefficient a : ");
Avec l’utilisation de la fonction input, on a vu comment intégrer des
b = input("Entrez la valeur du coefficient b : ");
variables d’entrée à un script. On obtient alors des scripts dont le fonction-
c = input("Entrez la valeur du coefficient c : ");
nement se rapproche de celui des fonctions. Il est donc légitime de se poser
delta = discrim(a, b, c);
la question : doit-on préférer l’écriture sous forme de script ou de fonction ?
xPlus = (-b + sqrt(delta))/(2?a);
Pour y répondre, on compare le code de la fonction racP avec sa version
xMoins = (-b - sqrt(delta))/(2?a);
script enregistrée sous le nom racPDispInp.
disp("La plus grande racine vaut " + string(xPlus));
disp("La plus petite racine vaut " + string(xMoins)); + D’un point de vue algorithmique, la version script d’une fonction
n’a pas beaucoup de sens. En effet, en privilégiant l’affichage graphique
+ Nous n’avons plus affaire à une fonction puisqu’il n’y a plus d’arguments des sorties à l’aide de la fonction disp, on supprime une fonctionnalité
en entrée. La valeur de ces variables est entrée au clavier par l’utilisateur. primordiale de la fonction : il n’est pas possible de réutiliser directement
le calcul des racines dans une autre fonction.
+ Chaque phrase de demande de valeur apparaît entre guillemets " ". Ce
sont toutes des chaînes de caractères. Chaque valeur entrée par l’utilisa- + D’un point de vue utilisateur, la version script, plus graphique, sera
teur est stockée dans une variable que l’on peut utiliser par la suite. certainement la plus appréciée.
7
ECE1-B 2014-2015
En résumé, utiliser des fonctions d’affichage, c’est se projeter du côté de IV.3.b) D’un point de vue concours
l’utilisateur qui apprécie généralement de disposer d’une interface graphique.
Nous avons encore peu de visibilité sur les questions informatiques qui
Au contraire, utiliser des fonctions c’est s’intéresser purement au calcul qui
seront posées au concours. En effet, les premières questions Scilab n’appa-
est réalisé. On peut ainsi concevoir d’utiliser la version script lorsque l’on
raîtront que lors de la session 2015. Toutefois, il semblerait que la distinction
fait un calcul qui n’a pas pour finalité d’être utilisé par une autre fonction.
script / fonction ne s’applique pas aux concours. Une des raisons principales
est que les programmes informatiques que l’on vous demandera d’écrire ou
Enfin il existe une manière simple de bénéficier à la fois des avantages de
simplement de comprendre seront généralement courts, sans appel à une
la fonction tout en améliorant l’expérience utilisateur :
autre fonction et auront pour but de réaliser un affichage (notamment le
1) on code d’abord la fonction (racP ou racP2 dans notre exemple), tracé d’une courbe ou d’un histogramme). Autrement dit, la version script
2) on lui ajoute une surcouche graphique. risque d’être à chaque fois privilégiée aux concours.
Le script suivant fournit une interface graphique que l’on peut utiliser pour
tester la fonction racP. IV.3.c) Pour les exercices de cette année
Lors des TP ou des examens, la distinction script / fonction sera effectuée
// Test de la fonction racP avec demande des entrées même si, au vu des exigences des concours, elle ne sera pas sanctionnée.
// et affichage des sorties Il faudra alors choisir le code approprié en fonction de la formulation des
a = input("Entrez la valeur du coefficient a : "); questions. En guise d’exemple :
b = input("Entrez la valeur du coefficient b : ");
1) Écrire un programme Scilab qui prend en paramètre un polynôme du
c = input("Entrez la valeur du coefficient c : ");
second degré et renvoie ses deux racines.
[xPlus, xMoins] = racP(a, b, c);
+ on souhaite le code de racP
disp("La plus grande racine vaut " + string(xPlus));
disp("La plus petite racine vaut " + string(xMoins)); 2) Écrire un programme Scilab qui prend en paramètre un polynôme du
second degré et affiche ses deux racines.
Cette manière de faire est généralisable pour toute fonction. Il s’agit tout + on souhaite le code de racPDisp
d’abord de demander à l’utilisateur la valeur des variables d’entrée grâce 3) Écrire un programme Scilab qui demande un polynôme du second degré
à des input ; puis de calculer la valeur des sorties en appelant la fonction et affiche ses deux racines.
considérée ; et enfin d’afficher la valeur de ces sorties grâce à des disp. + on souhaite le code du script enregistré sous le nom [Link]
8
ECE1-B 2014-2015
Polynômes et racines . . .
Lors de ce cours, nous avons volontairement parlé des « deux racines
d’un polynôme du second degré » et même de la « plus grande » de ces
deux racines. Cette dernière formulation est évidemment fausse car elle sous-
entend que tout polynôme du second degré admet des racines réelles. Or, ce
n’est le cas que pour les polynômes dont le discriminant est positif. Il faudrait
donc disposer d’un mécanisme de test permettant de s’assurer du caractère
positif du discriminant avant d’en calculer la racine carrée. Patience, on y
viendra au « CH 7 : Conditionnelles ».