Programmation

Taper votre programme dans la fenêtre du bas, puis lancez le dans la console (en haut).

Quelques notions de programmation sont données ci-dessous dans l'esprit du nouveau programme de seconde.

Attention : l'instruction "saisir" et le débogueur (qui permet de suivre l'exécution d'un programme pas à pas) ne sont pas disponibles sous Xcas en ligne. Téléchargez le "vrai" Xcas pour les utiliser.

A. Notions de programmation

1. Notion de fonction

En mathématiques une fonction transforme une chose en une autre. Par exemple, la fonction définie pour tous les nombres réels par f(x)=x² transforme tous les nombres en leur carré. Ainsi f(2)=4, f(-3)=9, etc ...

La notion est exactement la même en programmation, ainsi la fonction précédente se programme ainsi :

f(x):= {
  retourne x*x;
}

Vous pouvez copier cette fonction dans la fenêtre du bas, puis taper f(-3) dans la fenêtre du haut : Xcas en ligne vous retrounera 9.

Dans Xcas en ligne, tout programme prendra la forme d'une fonction. Xcas a l'avantage sur d'autre programme de programmation d'accepter une syntaxe proche du français, mais aussi d'être capable de dessiner des figures. Voici par exemple une fonction qui construit le cercle circonscrit d'un triangle ABC :

Cercle_circ(A,B,C):={
   local d1,d2,Q;
   d1:=mediatrice(A,B);
   d2:=mediatrice(A,C);
   Q:=inter_unique(d1,d2);
   retourne distance(Q,A);
}

Quand on lance cette fonction, il faut lui passer les trois points. Par exemple, taper dans la console :
Cercle_circ(point(0,0), point(2,0), point(0,2))

Attention ! Vous pouvez taper plusieurs fonctions à la suite, mais il faudra séparer celles-ci par un point-virgule.

2. Instruction "afficher"

Cette instruction permet d'afficher ce qu'on veut dans la console. Par exemple, soit le programme:

test():= {
  afficher("2+3");
  afficher(2+3);
  retourne "ok";
}

On lance le programme en tapant test() dans la console. la première instruction affiche "2+3" car l'usage des guillements indique à Xcas qu'il doit afficher un texte. Par contre, la seconde instruction affiche 5.

3. Variables et affectation

Dans un programme, une variable a exactement le même sens qu'en mathématiques. C'est une lettre ou un mot qui désigne quelque-chose de ... variable.
Le mot-clé local permet de créer une variable et l'opérateur := lui affecte une valeur. Soit par exemple le petit programme :

test():= {
  local n;
  n:=2;
  afficher(n);
  retourne;
}

Ce programme définit une variable nommée n, lui donne la valeur 2, puis affiche celle-ci. Il suffira de taper test() dans la fenêtre du haut pour lancer ce programme.

On peut bien sûr changer la valeur d'une variable en cours de route, comme le montre l'exemple suivant :

test():= {
  local n;
  n:=2;
  afficher(n);
  n:=n+3;
  afficher(n);
  retourne;
}

L'instruction n:=n+3; augmente la valeur de n de 3 unités.

4. Instructions conditionnelles

Nous allons constuire un petit programme qui simule le lancement d'une pièce de monnaie ayant les mêmes probabilités de tomber sur "pile" ou sur "face".

Algorithme :

1) Tirer au sort un nombre réel x entre 0 et 1.
2) Si x<0.5 alors écrire "Pile".
3) Sinon, écrire "Face".

Traduction Xcas :
piece():= {
  local n:=hasard(0,1);
  si n<0.5 alors
    retourne "pile";
  sinon
    retourne "face";
  fsi
}

Pour visualiser la structure du programme, certaines lignes sont décalées par rapport aux autres. Vous obtiendrez automatiquement cette présentation en cliquant sur le bouton "indentation automatique".

Dans une instruction si :

5. Exemple plus complexe

Nous allons construire un petit programme capable de déterminer l'équation d'une droite connaissant deux points A et B.

Algorithme

1) Demander les coordonnées de A
2) Demander les coordonnées de B
3) Afficher les coordonnées de A et de B
4) Si A et B sont confondus, afficher un message d'erreur
5) Sinon, si xA et xB sont égaux, afficher l'équation x=xA
6) Sinon, calculer le coefficient directeur m, puis l'ordonnée à l'origine p, puis afficher l'équation y=mx+p.

Programme
eqdroite(xA,yA,xB,yB):={
  local eq;
  local m;
  local p;
  afficher(xA,yA);
  afficher(xB,yB);
  si xA==xB et yA==yB alors
    eq:="Donnez deux points distincts";
  sinon
    si xA=xB alors
      eq:=(x=xA);
    sinon 
      m:=(yB-yA)/(xB-xA);
      p:= yA-m*xA;
      eq:=(y=m*x+p);
    fsi
  fsi
  retourne "(AB) : "+eq;
}

On observera que la variable "eq" est une variable formelle et que sa valeur est l'équation de la droite.

6. Les boucles

Une boucle est formée d'instructions qu'on va pouvoir répéter plusieurs fois.

Par exemple, on peut imaginer un programme qui imprimerait la table de multiplication par douze. On pourrait bestialement écrire :

table12():= {
  afficher("0*12="+0*12);
  afficher("1*12="+1*12);
  // je vous epargne le reste ...
}

Au lieu de cela, on écrira une boucle avec l'instruction "repeter" (sans accent) :

Algorithme

1) Créer une variable appelée "k" lui donner la valeur 0;
2) Ecrire le résultat de la multiplication de k par douze
3) Augmenter k d'une unité
4) Si k<13, retourner à l'étape 2

Programme

table12():= {
  local k:=0;
  repeter
    afficher(k+"*12="+k*12);
    k:=k+1;
  jusqua k==13;
}

On peut aussi programmer cet algorithme avec l'instruction "tantque" (un seul mot) :

table12():= {
  local k:=0;
  tantque k<13 faire
    afficher(k+"*12="+k*12);
    k:=k+1;
  ftantque
}

On peut aussi programmer cet algorithme avec l'instruction "pour" :

table12():= {
  local k;
  pour k de 0 jusque 13 pas 1 faire
    afficher(k+"*12="+k*12);
  fpour
}

7. Quelques fonctions utiles

Voici quelques fonctions mathématiques qui peuvent vous être utiles pour vos programmes :

Fonction Syntaxe Exemple
partie entière floor(nombre) floor(-3.5)
Valeur absolue abs(nombre) abs(-3)
Puissance x^n 3^-2
Racine carrée sqrt(nombre) sqrt(2)
Minimum min(liste) min(1,3,-1,5)
Maximum max(liste) max(1,3,-1,5)
Réel au hasard dans [a;b] hasard(a,b) hasard(0,1)
Entier au hasard entre 0 et n alea(n) alea(5)

B. Exercices

Pour chaque exercice, écrire l'algorithme, puis le programme.

1) Le plan est muni d'un rep&eagrave;re. A, B et C  étant trois points dont on connaît les coodonnées, faire afficher les coordonnées du point D tel que ABCD soit un parallèlogramme.
(d'après "Ressources pour la classe de seconde" ÉduSCOL)

2) Dresser un tableau de valeurs de la fonction "racine carrée" en partant de x=0 jusqu'à x=100 avec un pas de 5.

3)Jeu du lièvre et de la tortue : on lance 6 fois de suite un dé non pipé. Si le 6 sort, le lièvre gagne, sinon la tortue avance d'une case. La tortue gagne quand elle a avancé 6 fois. Programmer le jeu, sans boucle puis avec une boucle.
(d'après "Ressources pour la classe de seconde" ÉduSCOL)

4) Soit un naturel n. Si n est non nul, alors la factorielle de n est le produit de tous les entiers compris entre 1 et n (inclus). Si n=0, alors la factorielle de n est égale à 1. Calculer la factorielle de n.

5) Lancer 1000 fois un dé non truqué et calculer la fréquence du 6

6) On appelle "triplet de Pythagore" tout triplet (a ; b ; c) ordonné d'entiers naturels non nuls tels que le carré de c soit égal à la somme des carrés de a et de b. Par exemple (3 ; 4 ; 5) est un triplet de Pythagore car 9+16=25.
a) Expliquer pourquoi, dans un triplet de Pythagore, on ne peut avoir ni a=1 ni a=b.
b) Dresser la liste de tous les triplets de pythagore avec a et b inférieurs où égaux à 1000.

4) Encadrement d'une racine carrée par l'algorithme de Babylone : Un rectangle R1 d'aire A a pour dimensions x1=1 et y1=A. On fabrique le rectangle R2 de dimensions x2=(x1+y1)/2 et y2=A/x2, donc de même aire que le rectangle R1. En réitérant le procédé on va se rapprocher d'un carré d'aire A. Cet algorithme permet d'encadrer la racine carrée de A de plus en plus finement.
Encadrer la racine de 5 à 0.001 près avec cet algorithme.

5) La méthode de recherche "par dichotomie" permet de trouver des encadrements de plus en plus fins de la racine cubique de 2, c'est à dire du nombre réel x dont le cube vaut deux. On commence par encadrer x par deux nombres a et b, par exemple a=1 et b=2. On calcule ensuite c=(a+b)/2 et on examine si x se trouve entre a et c ou bien entre c et b : on obtient de la sorte un encadrement deux fois plus en plus fin de x. Il suffit de réitérer ce procédé jusqu'à la précision souhaitée.

6) L'algorithme d'Euclide permet de calculer le pgcd de deux entiers naturels a et b (avec a>b). On commence par calculer le reste de la division de a par b, qu'on note r ; puis on remplace a par b, puis b par r, et on réapplique le procédé depuis le début. Le pgcd cherché est le dernier reste non nul.
Remarque : le reste de la division de a par b s'obtient avec a%b.

7) (difficile) Lancer un dé non truqué jusqu'à ce que toutes les faces soient sorties. Compter alors le nombre de lancers qu'il a fallu faire. Réitérer l'opération et faire la moyenne du nombre de lancers nécessaires.

C. Programmer des figures

Xcas permet de concevoir des programmes qui dessinent des figures. Il est auparavant conseiller de visiter le module graphique pour aborder la syntaxe.

Avec certains navigateurs, il est nécessaire d'afficher une fois le module graphique avant de lancer un programme graphique.

Voici par exemple un programme qui construit une suite de rectangles illustrant le fait que la somme des puissances entières de 1/2 est égale à 2.

test():={
  local x1,y1,x2,y2,k;
  [x1,y1,x2,y2]:=[0,0,1,1];
  pour k de 0 jusque 10 faire
    polygone([x1,y1],[x2,y1],[x2,y2],[x1,y2]);
    si irem(k,2)==0 alors
      [x1,y1,x2,y2]:=[x2,y1,2*x2-x1,(y1+y2)/2];
    sinon
      [x1,y1,x2,y2]:=[x1,y2,(x1+x2)/2,2*y2-y1];
    fsi
  fpour
}

Cet autre programme utilise les nombres complexes pour tracer une suite de carrés :

suitecarre(x, y, n):={
  local k, xNouveau;
  pour k de 0 jusque n faire
    carre(x,y);
    xNouveau:=x+(y-x)*i/4;
    y:=x+(y-x)*3/4;
    x:=xNouveau;
  fpour
}

On le lance en tapant dans la console (en haut) :
suitecarre(-2,2,10)