Voici 6 problèmes d’algorithmique simple en environnement Xcas.
Les tests avec Xcas nécessitent la présence de ce logiciel sur votre machine. Il est téléchargeable ici.
Question 1
Soit A(-53 ;-28) et B(17 ; 35) deux points fixes et M(a ; b) un point variable dans le plan.
1) Trouvez une équation cartésienne de la droite (AB). On donnera cette équation sous la forme suivante :
$$\mathbf{Ax-By+C=0}$$
2) Vérifiez le résultat précédent avec Xcas.
Question 2
Rédigez un algorithme puis un programme en langage Xcas nommé SurLaDroite qui affichera dans la zone intermédiaire M est sur la droite (AB) ou M n’est pas sur la droite (AB) selon que M est ou n’est pas aligné avec A et B, qui retournera vrai (1) ou faux (0) selon le cas. Adaptez ce programme pour obtenir l’affichage des réponses dans un écran graphique en haut et à gauche.
L’algorithme
saisir a,b
temp:=9a-10b+197
si temp==0 alors
afficher("M est sur la droite (AB)")
retourne 1
sinon
afficher("M n'est pas sur la droite (AB)")
retourne 0
fsi
Le programme Xcas
Ce texte peut-être copié-collé dans l’éditeur de programmes de Xcas.
Les // indiquent un commentaire qui est ignoré par le compilateur.
Consultez l’aide pour comprendre la syntaxe des commandes.
En dessous du texte un aperçu de ce que vous devriez obtenir dans l’éditeur de programmes de Xcas qui utilise la coloration syntaxique.
SurLaDroite(a,b):={ //NomDeLaFonction(parametre1,parametre2)
local temp; //temp est une variable qui n'existe qu'à l'intérieur de ce programme
temp:=9a-10b+197; //temp vaut 0 si et seulement si M est sur la droite
si temp==0 alors
//affichage d'une chaîne de caractères "..." dans la zone intermédiaire
//en bleu au dessus de la valeur de retour
afficher("M est sur la droite (AB)")
retourne 1 //valeur de retour 1 ou vrai si le point est sur la droite
sinon
afficher("M n'est pas sur la droite (AB)")
retourne 0 //valeur de retour 0 ou faux si le point n'est pas sur la droite
fsi
} //pour refermer le bloc d'instructions

Modifions le programme précédent pour afficher une légende dans un écran graphique (nous gardons le même nom).
SurLaDroite(a,b):={
local temp;
temp:=9a-10b+197; //temp vaut 0 si et seulement si M est sur la droite
si temp==0 alors
//affichage d'une chaîne de caractères "..." dans l'écran de géométrie
retourne legende([50,50],"M est sur la droite (AB)")
sinon
retourne legende([50,50],"M n'est pas sur la droite (AB)")
fsi
}

Question 3
Ouvrez maintenant un écran de géométrie (Menu Geo Nouvelle Figure 2d) puis définissez
successivement :
- le point A
- le point B
- la droite (AB)
- le paramètre a variant de -100 à 100 avec un pas de 1 (taper
a:=element(-100..100)
puis après validation changer le pas) - le paramètre b variant de -100 à 100 avec un pas de 1
- le point M
Ajoutez dans ce script SurLaDroite(a,b) puis pour vérification est_aligne(A,B,M).
Faites varier a et b avec les flèches des curseurs situés à droite du dessin.
Notez sur votre feuille des couples d’entiers, coordonnées de points situés sur la droite (AB). Vérifiez par le calcul qu’il s’agit bien de points appartenant à la droite.

Les élèves les plus rapides pourront élaborer un programme pour rechercher tous les couples d’entiers (x ; y) vérifiant :

CoordEntieres(p,n):={
local L,x,y;
L:=NULL; //ou L:=[] (voir question 5)
pour x de p jusque n faire
y:=(9x+197)/10;
si irem(9x+97,10)==0 alors
L:=L,[x,y]; //ou L:=append(L,[x,y]) (voir question 5)
fsi
fpour
retourne L
}

Pour les élèves rapides et désireux d’aller en Terminale S (Spécialité Math) sachez qu’il est possible de trouver la forme générale des solutions entières de l’équation 9x - 10y + 197 = 0. Montrez (c’est facile) la proposition suivante :
si M(-3 + 10k ; 17 + 9k) et k entier alors M appartient à la droite d’équation 9x - 10y + 197 = 0 et a des coordonnées entières.
Question ouverte ( c’est moins facile !) : prouvez que la proposition réciproque est vraie. Sinon attendez deux ans !
Question 4
1) Soit M(127 ; k) sur la droite (AB). Trouvez k. Vérifiez avec Xcas.
2) Soit M(k ;-73) sur la droite (AB). Trouvez k. Vérifiez avec Xcas.

Notez la différence entre sol qui contient une liste et sol[0] qui contient le premier élément de cette liste.
Question 5
On veut dessiner toutes les droites passant par A dont le coefficient directeur m est un entier compris entre -12 et 15. Ecrivez un algorithme et un programme nommé Faisceau en langage Xcas en utilisant soit une boucle conditionnelle, soit une boucle itérative. Compilez puis exécutez.
Le programme avec une boucle tantque
Faisceau():={ //fonction sans paramètre
local L,m; //déclaration des variables locales
m:=-12; //initialisation de la variable m
L:=NULL; //L est une séquence vide avant d'entrer dans la boucle
tantque m<=15 faire //début de la boucle
L:=L,droite(y=m*x+53m-28); //à chaque passage la séquence contient une droite de plus
m:=m+1; //incrémentation (augmentation) de la variable m de 1
ftantque //fin de la boucle
retourne L
}

Le programme avec une boucle pour
Dans ce programme L est une liste.
Remarquez la commande append pour ajouter un élément en fin de liste.
Faisceau():={
local L,m;
L:=[]; //L est une liste vide avant d'entrer dans la boucle
pour m de -12 jusque 15 faire //début de la boucle
//à chaque passage la liste contient une droite de plus
L:=append(L,droite(y=m*x+53m-28));
fpour //fin de la boucle
retourne L //la valeur de retour est une liste d'objets de type droite
}

Question 6
On veut obtenir les abscisses des points d’intersection des droites précédentes avec l’axe des abscisses.
Ecrivez un algorithme et un programme nommé AbsInter1 en langage Xcas avec une boucle itérative qui renvoie ces abscisses sous forme d’une liste. Exécutez le. Que se passe-t-il ?
De toute évidence on est en présence d’un bug. Faites debug(AbsInter1()) et constatez en avançant pas à pas (sst) le problème pour m = 0. Expliquez alors pourquoi solve renvoie une liste vide si m = 0.
Corrigez le programme, nommez le AbsInter2(), en ajoutant un test dans la boucle pour ignorer la valeur m = 0. Prévoyez l’affichage du nombre de points d’intersection. Compilez. Exécutez.
Le programme AbsInter1() plante car si m = 0 alors sol est une liste vide. Donc sol[0] équivaut à [ ][0] qui renvoie logiquement Erreur : Dimension incorrecte puisque cette instruction consiste à rechercher le premier élément (d’indice 0) d’une liste vide !
AbsInter1():={
local L,m,sol;
L:=[];
pour m de -12 jusque 15 faire
sol:=solve(m*x+53m-28=0,x); // sol: liste, sol[0]: le premier élément de la liste
L:=append(L,sol[0]); // à chaque passage la liste contient une abscisse de plus
fpour
retourne L
}

Le programme corrigé et complété
AbsInter2():={
local L,m,sol,c;
L:=[];
c:=0; // pour compter le nombre de points d'intersection
pour m de -12 jusque 15 faire
// si m=0 on passe à l'itération suivante, c n'est pas incrémenté
si m==0 alors continue fsi;
sol:=solve(m*x+53m-28=0,x);
L:=append(L,sol[0]);
c:=c+1; // incrémentation du compteur de points
fpour
afficher("ce faisceau coupe l'axe des abscisses en "+c+" points")
afficher("voici la liste des abscisses de ces points")
retourne L // valeur de retour ici une liste de 27 éléments
}

Solutions de ces 6 problèmes en un seul fichier :

- Corrigé des 6 problèmes
Test de ces programmes avec Xcas :
Dans le dossier zippé ci-dessous, on trouve le fichier session.xws. Téléchargez le. Si Xcas est installé sur votre ordinateur, l’ouverture de session.xws (restitué par dézippage) vous permet de tester les 6 solutions proposées.

- Fichier solutions Xcas
Cette manipulation un peu artisanale est rendue nécessaire par le fait que SPIP ne reconnaît pas les fichiers .xws
Voici un autre article à propos d’Xcas que le lecteur pourra consulter.