Algorithmes en seconde

Cette page permet d'entrer dans le cadre de droite en haut des petits programmes écrits en javascript.

Quand on clique sur le bouton  EXE le programme s'exécute.

A. Quelques notions de javascript

Un programme en javascript est constitué de plusieurs instructions séparées par un point-virgule. L'usage est de mettre une instruction par ligne.

1) Instructions d'entrée-sortie

Ces instructions permettent de communiquer avec l'utilisateur du programme. Nous en avons fabriqué deux pour ce cours :

Si l'utilisateur entre plusieurs données à la fois, séparées par une virgule ou par un point-virgule, celles-ci seront stockée dans une suite. Soit par exemple l'instruction :
var v=demander("Entrez xA et yA séparées par une virgule");
Si on répond "-1, 3" ou "-1 ; 3", la variable v est alors égale à la suite de premier terme v[0] et de second terme v[1]. L'instruction afficher(v[0]) affichera donc -1.

Vous pouvez aussi écrire vos résultats sous forme de tableaux. Le petit programme suivant montre comment faire :

var monTableau=new tableau("Article","Prix");
monTableau.ajouter("cafe",0.40);
monTableau.ajouter("petit pain",0.70);

2) 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é var permet de créer une variable et l'opérateur = lui affecte une valeur. Soit par exemple le petit programme :

var n;
n=2;
afficher(n);

La première ligne créee une variable nommée n.
La seconde lui affecte la valeur 2.
La troisième l'écrit dans le cadre du bas.

Attention ! Comme dans la plupart des langages de programmation, le symbole = est un opérateur d'affectation (pour donner une valeur à une variable). L'opérateur mathématique d'égalité est représenté par le symbole ==.
Par exemple, le petit programme suivant est parfaitement valide :

var n=2;
afficher(n);
n=n+1;
afficher(n);

La troisième ligne est surprenante, puisque de toute évidence n est différent de n+1 ! En fait, l'instruction n=n+1 change la valeur de n en augmentant l'ancienne valeur de 1 unité : il faudrait lire "n devient n+1".

Exercice

Ecrire un programme qui demande une somme d'argent en euro, convertit celle-ci en dollars et affiche le résultat.

3) 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 en javascript :

var x=Math.random();
if (x<0.5)
  afficher("Pile");
else
  afficher("Face");

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 "indente".

Dans une instruction if :

4) Rôle des accolades

L'exemple précédent pose un nouveau problème : comment s'y prendre si on doit exécuter plusieurs instructions pour chaque alternative de l'instruction conditionnelle ?

La réponse est simple : il faut regrouper ces instructions en un bloc qui sera délimité par des accolades.

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

var xA=demander("Entrez xA");
var yA=demander("Entrez yA");
var xB=demander("Entrez xB");
var yB=demander("Entrez yB");
afficher("A(", xA, ",", yA, ") B(", xB, ",", yB, ")");
if (xA==xB && yA==yB)
    afficher("entrez deux points differents");
else if(xA==xB)
     afficher("(AB) : x=", xA);
else {
    var m=(yB-yA)/(xB-xA);
    var p=yA-m*xA;
    afficher("(AB) : y=", m, "x +",p);
}

Exercice

Reprendre le programme sur la conversion euros-dollars, en demandant préalablement à l'utilisateur s'il souhaite convertir des euros en dollars ou bien l'inverse.

5) 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 :

afficher("0*12=",0*12);
afficher("1*12=",1*12);
// je vous épargne la suite...

Au lieu de cela, on écrira une boucle avec l'instruction while :

Algorithme

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

Programme

var i=0;
while (i<11) {
       afficher("12*",i,"=",12*i);
       i=i+1;
}

On peut aussi programmer cet algorithme avec l'instruction for :

var i;
for (i=0 ; i<11 ; i++) {
       afficher("12*",i,"=",12*i);
}

6) Fonctions

En programmation, la notion de fonction est exactement la même qu'en mathématiques : une fonction calcule quelque chose "en fonction" d'une variable. Par exemple, soit la fonction f définie sur IR par f(x)=x².
Cette fonction se programme ainsi an javascript :

function f(x){
    return x*x;
}

Utiliser la fonction:  il suffira de taper un peu plus loin "ecrire( f(3) )", par exemple : exactement comme en mathématiques !

Quelques fonctions prédéfinies

Javascript possède des fonctions mathématiques que vous pouvez utiliser dans vos programmes.

B. Exercices

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

1) Ecrire un algorithme puis un programme permettant d'additionner deux fractions dont on connaît le numérateur et le dénominateur.

2) Demander à l'utilisateur d'entrer deux intervalles fermés et afficher leur intersection.

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

4) Développez un jeu qui consiste à tirer au sort un entier compris entre 0 et 1000, puis à demander au joueur de deviner quel est ce nombre, jusqu'à ce qu'il donne la bonne réponse. En cas de mauvaise réponse, le jeu répondra simplement "trop petit" ou "trop grand".

5) 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.

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

7) 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.

8) 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.

9) Calculer le minimum, le maximum, la moyenne et l'écart-type d'une série statistique.

10) Méthode du "tri bulle" : soit une suite de nombres qu'on veut ranger dans l'ordre croissant. L'algorithme consiste à parcourir la suite en échangeant systématiquement les éléments consécutifs qui ne sont pas dans le bon ordre. On réitère le processus jusqu'à ce qu'il n'y ait plus d'éléments à échanger.

11) 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.

12) 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.

13) (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.

14) (difficile) Le crible d'Eratosthène permet d'écrire la suite des nombres premiers compris entre 2 et n. Commencer par initialiser une suite vide de nombres premiers (avec var p=[ ]). Examiner ensuite un par un les naturels compris entre 2 et n. Pour chacun de ces naturels, tester s'il est un un multiple d'un des nombres premiers déjà trouvés -on parcourt la liste avec for (j=0 ; j<p.length ; j++). Si le naturel testé n'est le multiple d'aucun des nombres premiers, ajoutez-le à la suite des nombres premiers. On ajoute un entier i à la liste avec p.push(i) .

C. Dessiner avec Javascript

Les fonctions de dessin sont disponibles sous les navigateurs Firefox, Safari, Chrome et Opéra.

Pour dessiner, on construira un repère avec l'instruction :
new repere(xMin,yMin,xMax,yMax,larg,haut)
Par exemple :

var r=new repere(-10, -10, 10, 10, 300, 200);
r.couleurTrait("blue");
r.allerEn(5,5);
r.ligneVers(10,10);
r.couleurFond("yellow");
r.rectPlein(0,0,-2,-5);

Ce programme construit un nouveau repère qui va du point (-10, -10) jusqu'à (10, 10) dans un cadre de 300 par 200 pixels, place un crayon virtuel en (5,5) puis trace un segment bleu jusqu'au point (10, 10) ; puis dessine un rectangle jaune plein (on dispose aussi d'une fonction "rectCreux").

On peut dessiner des points (d'un pixel) avec r.point(x,y);

Si on avait pris un repère orthonormal on aurait pu dessiner un cercle avec r.cercle(x,y,r).

Voici un petit programme qui illustre le fait que la somme de toutes les puissances naturelles de 1/2 est égale à 2 :

var r=new repere(-1, -1, 2, 2, 200, 200);
var couleurs=["red","yellow","blue"];
var i, z, x1=0, y1=0, x2=1, y2=1;
for (i=0 ; i<100 ; i++) {
  r.couleurFond(couleurs[i%3]);
  r.rectPlein(x1, y1, x2, y2);
  if (i%2==0) {
    z=x1;
    x1=x2;
    x2=2*x2-z;
    y2=(y1+y2)/2;
  } else {
    x2=(x1+x2)/2;
    z=y1;
    y1=y2;
    y2=2*y2-z;
  }
}

Exercices

15) Représenter approximativement la fonction "racine carrée" à l'aide d'une suite de petits segments. Il s'agit bien d'une approximation puisque cette demi-parabole ne comporte aucun segment en réalité.

16) On lance 500 fois de suite une punaise qui a une chance sur trois de tomber sur la base et deux chances sur trois de tomber sur la pointe. Représenter graphiquement l'évolution de la fréquence des "pointes" en fonction du nombre de lancers.

17) Construisez une figure constituée de deux polygones emboîtés formés de n rectangles de largeur 1 et de hauteurs 1,2 ... n, comme le montre l'exemple suivant où n=5 : . Calculer l'aire totale de la figure de deux façons différentes. En déduire une formule de calcul de 1+2+...+n.

18) La méthode de "Monte-Carlo" permet (entre autres) d'estimer l'aire d'une région du plan délimitée par des courbes. Soit par exemple le domaine plan délimité par l'axe des abscisses, la courbe d'équation y=x², pour des abscisses comprises entre 0 et 2. Pour estimer son aire, on tire au sort 100 000 points tels que 0<x<2 et 0<y<4 et on compte le nombre n de points qui sont dans la région souhaitée. L'aire de celle-ci est proche de 8*n/100 000.

19) Représenter une série statistique discrète par un diagramme en bâtons.

20) (difficile) Représenter une série statistique continue par un histogramme.

Sorties du programme :