Débuter en programmation

Une version pdf de ces activités est disponible ici.

Pour mener à bien le projet informatique que vont nous confier les élèves de SL (Sciences de Laboratoire), nous allons devoir programmer un ordinateur. La programmation consiste à écrire des instructions compréhensibles par l'ordinateur pour qu'il réalise les tâches qu'on souhaite lui confier. Pour cela, nous allons lui écrire dans un langage qui est une collection d'instructions de base qu'il peut exécuter.

Il existe beaucoup de langages informatiques (Java, Perl, Python, html, C++, ...). Nous allons apprendre cette année le JavaScript. Ce langage est exécutable dans les navigateurs internet (Firefox, IE, Chrome, ...) et donc utilisable sur toutes les machines supportant ces navigateurs (ordinateurs, tablettes, téléphones, ...).

Pour simplifier l'écriture de nos programmes, nous allons rapidement utiliser une bibliothèque d'instructions appelée P5.js (p5js.org) qui nous permettra de simplifier notre code (notamment pour dessiner à l'écran).

Dans un premier temps, nous utiliserons une plateforme de développement " en ligne" : jsfiddle.net.

Vous allez réaliser les exercices de ce document en autonomie et recopier le code de chaque programme demandé dans un document du dossier ICN de votre drive (utilisez le " copier-coller" !). Pensez à le présenter correctement (comme un devoir) avec obligatoirement les éléments suivants (voir exemple ci-dessous) :


Un exemple de rédaction

Enfin, lorsque vous êtes " bloqués", pensez à utiliser internet pour chercher de l'aide avant d'appeler "au secours" le professeur s'il est déjà occupé ! Un exemple de site où sont référencés la plupart des instructions JavaScript : www.w3schools.com/jsref/default.asp

Pour débuter

Affichage

Le premier programme que nous allons écrire consiste à écrire un texte à l'écran :

// Ceci est un commentaire (indispensable au correcteur mais non lu par l'ordinateur)
document.write("Bonjour, bienvenue en ICN");
Modifier ce programme pour afficher votre nom et votre classe.
Le langage JavaScript sert à exécuter des programme dans des pages web (en langage html). Dans l'affichage des textes on peut donc utiliser des balises html (une balise est un code permettant d'améliorer la mise en page, créer des liens, afficher des images, ...). On donne dans le tableau suivant quelques balises :

Quelques balises HTML
Balise Effet
<strong>texte</strong> met texte en caractères gras
<em>texte</em> met texte en emphase (en valeur)
<u>texte</u> met texte en caractères gras
<code>texte</code> met texte en police fixe (code informatique)
<br/> saut de ligne

Créer un affichage qui utilise une ou deux balises au choix.

Compléments

On peut passer ce paragraphe dans une première lecture.

En écrivant document.write, JSFiddle nous prévient d'une erreur : " document.write is disallowed in JSFiddle environment and might break your fiddle."

Pour les modestes programmes que nous écrirons, ce n'est pas grave mais pour votre culture, il faut savoir qu'il est préférable d'écrire dans la zone "HTML" le code suivant :

<div id="texte"></div>
Et dans la zone "javascript", on remplace document.write(...) par :
document.getElementById('texte').innerHTML = "Bonjour, bienvenue en ICN";

Variables

Une variable est un espace mémoire dans lequel le programme peut stocker de l'information qui peut être numérique, booléenne (Une variable booléenne ne peut contenir que deux valeurs : TRUE ou FALSE.}), alphanumérique, ... On peut " modéliser" une variable comme étant une boîte qui contient une information qui peut varier (d'où son nom !) au cours de l'exécution du programme.

En JavaScript, pour définir une variable, on commence par lui choisir un nom (qui commence par une lettre) par exemple compteur puis on utilise le mot clé var suivi du nom choisi et enfin on peut l'initialiser :

var compteur;
compteur = 1;
ou plus simplement :
var compteur = 1;


On donne le code suivant :
var salaire = 10000;
document.write("salaire");

  1. Que va afficher ce code ? Vérifier dans \url{http://jsfiddle.net}.
  2. Corriger le code pour qu'il affiche le contenu de la variable \verb+salaire+.
Pour modifier le contenu d'une variable on écrit nomVariable = suivi d'une expression qui sera son nouveau contenu.

On donne le code suivant :
var compteur = 1;
document.write(compteur + "<br/>");
compteur = 4;
document.write(compteur+ "<br/>");
compteur = compteur + 3;
document.write(compteur + "<br/>" );
document.write("fin");
  1. Qu'affiche-t-il ? Vérifier dans jsfiddle.net.
  2. Expliquer la ligne 5.

Saisie au clavier

Dans un programme, il peut être utile de demander une information à l'utilisateur du programme. Pour cela on utilise la fonction prompt (Nous verrons plus tard ce qu'est une fonction et comment écrire nos propres fonctions) :
var nom, prenom, age;
nom = prompt("Quel est votre nom ?");
prenom = prompt("Quel est votre prénom ?");
age = prompt("Quel est votre age ?");
document.write("Bonjour " + prenom + " " + nom + ".");
document.write("Tu as " + age + "ans");

Complément sur les variables : les types

En JavaScript, toutes les variables sont déclarées grâce au mot clé var. Pourtant elles ne contiennent pas nécessairement le même type de données (numériques, textes, booléennes. Il est parfois utile de connaître le type des données contenues dans une variable et surtout de faire des conversions entre les types.
On donne le code ci-dessous (à tester !) :
var a="bonjour ", b="Thomas";
var c = a+b;
document.write(c);
Dans cet exemple, les variables a et b contiennent des textes, dans ce cas, l'opérateur "+" sert à concaténer les chaînes de caractères : il les met " bout à bout".

Ceci est important pour comprendre l'exercice ci-dessous.


On donne le code suivant :
var a = prompt("Saisir un nombre :");
var b = prompt("Saisir un nombre :");
var somme = a + b;
document.write("La somme vaut : " + somme);
  1. L'utilisateur saisit les nombres 4 et 5. Qu'affiche le programme ?
  2. Vérifier avec jsfiddle.net. Donner une explication.

Pour connaître les trois principaux types de variables, écrivons ce programme :
var a = "2", b = 2;
var c = (2 < 3);
document.write("a = " + a + " est du type " + typeof(a) + "<br/>");
document.write("b = " + b + " est du type " + typeof(b) + "<br/>");
document.write("c = " + c + " est du type " + typeof(c) + "<br/>");

Heureusement, il existe des fonctions pour convertir les types de données. Ces fonctions sont résumées dans le programme ci-dessous :
var a = "2";
var b = 5;
var c = b + parseInt(a);// a est converti en nombre
var d = a + b.toString();
document.write(c + "<br/>");
document.write(d);

Corriger l'exercice vu précédemment pour qu'il fasse ce qu'on attend de lui !

Autres méthodes utiles :

Dans chaque cas a et b sont des variables " numériques" et str1, str2, ... des variables " chaînes de caractères".

Méthodes sur les variables
Instruction Description
b = a.toFixed(3) b contient la valeur de a avec 3 chiffres après la virgule
b.isInteger() renvoie TRUE si c'est un entier et FALSE sinon
str1.length donne la longueur de la chaîne str1
str2=str1.toLowerCase() écrit dans str2 le contenu de str1 mais en minuscules
str2=str1.toUpperCase() écrit dans str2 le contenu de str1 mais en majuscules

Beaucoup plus de propriétés et de méthodes ici pour les numériques et pour les chaînes

Tests et boucles

Dans un programme, il est parfois utile de pouvoir exécuter ou non une partie de programme selon qu'une condition est réalisée ou non (un exemple " concret" : SI il pleut ALORS je prends mon parapluie). Il est aussi parfois intéressant de répéter un certain nombre de fois une même série d'instructions, dans ce cas on écrit une boucle. Dans cette partie, nous allons apprendre à utiliser ces deux types de structures.

Tests

Le code pour écrire un branchement conditionnel simple est :
if(<condition>) {
  <instructions si condition vraie>
} else {
  <instructions sinon>
}
Quelques précisions :

On donne le code suivant :
var d = Math.floor(Math.random()*6 + 1);
document.write("Résultat : " + d + '');
if(d == 6) {
    document.write("Bravo ! Tu as fait un 6.");
} else {
    document.write("Essaye encore.");
}    
On précise que Math.floor arrondit à l'entier inférieur et Math.random() donne un nombre aléatoire entre 0 et 1.
  1. Expliquer la ligne 1 de ce programme.
  2. Que fait ce programme ?

Boucles

Vous avez déja utilisé la notion de boucle depuis le début d'année :
On voit dans ces deux exemples qu'il existe (au moins) deux types de boucles :
On donne le code suivant :
var table = 4;
var i;
for(i=0; i<=10; i=i+1) {
  document.write(table +" x " + i + " = " + table*i + "<br/>");
}    
  1. Peut-on déterminer le nombre de fois que sera exécutée cette boucle ?
  2. Que fait ce programme ?
  3. Modifier ce programme pour qu'on demande à l'utilisateur quelle table il souhaite afficher.
  4. Modifier ce programme en ajoutant une variable fin dont le contenu est demandé à l'utilisateur et qui donne le dernier facteur à multiplier. Modifier la ligne 3 pour tenir compte de cette contrainte supplémentaire.
  1. Écrire un programme qui affiche 10 nombres aléatoires entre 1 et 6.
  2. Modifier le programme précédent pour qu'il compte en plus le nombre de fois où le " 6" est sorti.
En utilisant une boucle et un branchement conditionnel, écrire un programme qui affiche tous les diviseurs d'un nombre demandé à l'utilisateur dans une variable appelée n.
Aides :
On donne le code suivant :

var de = Math.floor(Math.random()*6 + 1);
document.write("dé sorti : " + de + "<br/>");
while (de < 6) {
  de = Math.floor(Math.random()*6 + 1);
  document.write("dé sorti : " + de + "<br/>");
}    
  1. Peut-on prévoir le nombre de fois que le bloc d'instructions (lignes 4 et 5) va s'exécuter ?
  2. Que fait ce programme ?
  3. Modifier le code pour qu'il compte le nombre de lancers effectués.
Écrire un programme qui pose des questions sur les tables de multiplication (" combien font 3 fois 7 ?") avec les contraintes suivantes :

Fonctions

Vous avez déjà utilisé la notion de fonction dans le jeu LightBot : une fonction permettait d'exécuter plusieurs fois la même séquence d'instructions et donc " d'économiser" des cases d'instructions dans le programme principal.
Observons le code suivant (exemple mathématique avec les fonctions affines) :

var i;
// Définition de la fonction f affine f:x->2x-3
function f(x) {
  var y = 2*x - 3 ;
  return y;
}

// Utilisation de f dans un programme "principal" :
for (i=-3; i<=3; ++i) {
  document.write("l'image de " + i + " est " + f(i) + "<br/>");
}
Dans la définition de la fonction, x est un argument. Sa valeur n'est connue qu'à l'intérieur de la fonction (si on cherche à afficher la valeur de x ailleurs, il ne se passera rien). Une fonction peut prendre plusieurs arguments séparés par des virgules ou n'en prendre aucun (dans ce cas on la définit ainsi : function nomDeMaFonction() {}). À la ligne 10, le programme fait appel à la fonction f et remplace f(i) par la valeur de l'expression qui est située après l'instruction return.
Ajouter l'instruction suivante à la fin du programme précédent :
document.write("y = " + y);
Affiche-t-il une valeur ? Pourquoi ne connait-il pas la variable y ?
En informatique, une fonction ne permet pas seulement de faire des calculs et elle ne renvoie pas nécessairement un résultat. On peut aussi la définir à n'importe quel endroit du programme (ce n'est pas obligatoire qu'elle soit au début).
On donne le code suivant :
var directeur = "Claude";
courier("Thomas");
courier("Alexandre");
courier(directeur);


function courier(nom) {
  document.write("Bonjour " + nom + "<br/>");
  document.write("Merci de bien vouloir passer dans mon bureau pour...");
  document.write("<br/>");
  document.write("À bientôt " + nom + "");
}
Que fait ce programme ?
Écrire une fonction qui prend un argument appelé nombre et qui renvoie le texte + ou - selon que nombre est positif ou négatif. Tester cette fonction dans un programme.
Écrire une fonction qui prend deux arguments texte et n et qui écrit n fois le contenu de texte en passant à la ligne à chaque fois.

Variables : un peu plus loin...

Parfois, il peut-être utile de stocker un grand nombre de données de même type (numérique, texte, ...) dans une seule variable; on appelle une telle variable un tableau. Il existe aussi dans de nombreux langages (les langages orientés objet) des sortes de " super variables" que l'on peut construire et qu'on appelle objets; ces objets sont eux-même constitués de variables et de fonctions (ou méthodes).

Tableaux

On peut définir un tableau comme une liste ordonnée de valeurs rangées dans une variable. Par exemple :
var eleves = {"Laura", "Enzo", "Lucas", "Artur", "Luca"};
définit le tableau eleves qui est constitué de 5 entrées numérotées de 0 à 4 (on commence toujours la numérotation à zéro). On peut lire, écrire, modifier le contenu de chacune de ses entrées :
var eleves = ["Laura", "Enzo", "Lucas", "Artur", "Luca"];
var i;
document.write(eleves[0] + " est la première de la liste.");
eleves[3] = "Arthur";// c'est mieux non ?
eleves[4] = eleves[4] + "s";// ajouter un 's' 
for (i=0; i<5; ++i) {
  document.write(eleves[i] + "<br/>");
}
On peut aussi déclarer un tableau et le remplir ensuite :
var notes = [];
var i, nbEleves = 3, somme = 0;
for (i=0; i < nbEleves; ++i) {
  notes[i] = prompt("Quelle note pour l'élève " + i + " ?");
  somme = somme + notes[i];
}
var moy = somme / nbEleves;
document.write("La moyenne de classe est " + moy);
  1. Tester ce programme dans jsfiddle.net. Fonctionne-t-il ?
  2. Ajouter une ligne document.write(somme + "<br/>"); avant l'affichage de la moyenne. Que constate-t-on pour la somme ?
  3. Convertir le résultat de prompt(...) en nombre avant de le stocker dans le tableau notes. Tester à nouveau.

Objets

Cette partie est plus difficile et réservée à ceux qui ont bien compris le reste de ce document...

Si on souhaite programmer un jeu de societé, il faudra " gérer" plusieurs joueurs qui chacun auront un nom, une position, un nombre de points, un pion,... Dans ce cas, il est judicieux de créer un objet Joueur qui aura tous ces attributs et aura même des méthodes permettant de modifier ces attributs, de les afficher, ...
Observons le code suivant :
// On crée le type d'objets "Joueur"
Joueur = function() {
  var nom;
  var position;
  var pion;
  var points;
  // Méthode d'initialisation
  this.init = function(nom, pion) {
    this.nom = nom;
    this.pion = pion
    this.position = 0;
    this.points = 100;
  }
  //Méthode pour faire avancer le pion
  this.avance = function(n) {
    this.position = this.position + n;
  }
  // Méthode pour augmenter/diminuer le nombre de points
  this.gagne = function(n) {
    this.points = this.points + n;
  }
  // Méthode pour afficher le bilan du joueur
  this.affiche = function() {
    document.write(this.nom + " a choisi le pion " + this.pion + "; il a " + this.points + " pts et il est sur la case " + this.position);
    document.write("<br/>");
  }

}

// Programme principal : on crée les joueurs et on les initialise
j1 = new Joueur();
j2 = new Joueur();
j1.init("Laura", "voiture");
j2.init("Enzo", "avion");

j1.affiche();
j2.affiche();

j1.gagne(20);
j1.avance(2);
j2.gagne(-10);

j1.affiche();
j2.affiche();
À vous d'inventer de nouveaux objets dans le cadre de vos projets...

Pour finir...

La plateforme jsfiddle.net nous a été très utile pour apprendre les rudiments du JavaScript, désormais nous allons créer de " vraies" pages html en y intégrant nos scripts.
Sur votre clé usb (ou à défaut dans votre espace personnel) créer un dossier ICN et y placer le dossier " dezippé" que vous pouvez télécharger en cliquant ici.
Désormais, tout ce qu'on écrivait dans la fenêtre HTML de JSFiddle, s'écrira dans le fichier index.html, tout ce qu'on codait dans la fenêtre JAVASCRIPT de JSFiddle sera à copier dans le fichier script.js.
Pour ceux qui connaissent le langage css, vous pouvez modifier le fichier style.css également.
Le résultat sera visible en ouvrant le fichier index.html dans votre navigateur préféré et les modifications seront à faire en ouvrant les fichier du dossier dans un éditeur de texte quelconque (nous utiliserons NotePad++ au lycée - à télécharger gratuitement chez vous si vous le souhaitez).