https://bns.sr/algo/
aassif.benassarou@univ-reims.fr
Ensemble de règles opératoires dont l'application permet de résoudre un problème énoncé au moyen d'un nombre fini d'opérations.
Un algorithme peut être traduit, grâce à un langage de programmation, en un programme exécutable par un ordinateur.
Larousse
Un algorithme, très simplement, c’est une méthode.
Une façon systématique de procéder pour faire quelque chose : trier des objets, situer des villes sur une carte, multiplier deux nombres, extraire une racine carrée, chercher un mot dans le dictionnaire…
Ph. Flajolet & É. Parizot, Qu'est-ce qu'un algorithme ?
Étude de la résolution de problèmes par la mise en œuvre de suites d'opérations élémentaires selon un processus défini aboutissant à une solution.
Arrêté du 27 juin 1989 relatif à
l'enrichissement du vocabulaire de l'informatique
Larousse
- Description de la suite, souvent cyclique, d'opérations que doit effectuer une machine quelconque (machine à laver, machine-outil, réacteur chimique à charges discrètes, ordinateur, etc.).
- Ensemble d'instructions et de données représentant un algorithme et susceptible d'être exécuté par un ordinateur.
Tandis que le langage naturel permet de communiquer avec d'autres humains,
le langage informatique permet de s'adresser à des ordinateurs.
Le langage informatique permet de formuler des algorithmes.
À l'instar du langage naturel, le langage informatique est défini par une grammaire
que tout programmeur doit respecter pour se faire comprendre par la machine.
Cette grammaire définit les mots acceptés par le langage
et les différentes façons de les assembler pour construire des phrases.
Une phrase adressée à un ordinateur est appelée instruction.
Chrome 71 | Safari 12 | Firefox 64 | Edge 18 | |
---|---|---|---|---|
ES5 | 100 % | 99 % | 100 % | 100 % |
ES6 | 98 % | 99 % | 98 % | 96 % |
2016+ | 100 % | 88 % | 80 % | 55 % |
aassif@localhost # nodejs Welcome to Node.js v16.17.1. Type ".help" for more information. > 'Hello, World!' 'Hello, World!' > Math.PI 3.141592653589793 > null > undefined > .exit aassif@localhost #
Conteneur pour une valeur susceptible d'être manipulée ou modifiée.
$
ou _
;break / case / catch / class / const / continue / debugger / default / delete / do / else / export / extends / finally / for / function / if / import / in / instanceof / new / return / super / switch / this / throw / try / typeof / var / void / while / with / yield ECMAScript 2015
let
suivi de l'identifiant choisi// Déclaration unique.
let variable;
// Déclarations multiples.
let var1, var2, var3;
Attribution d'une valeur à une variable.
variable = valeur
La valeur affectée peut être une donnée ou une autre variable.
// Déclaration de "var1".
let var1;
// Affectation de la donnée 0.
var1 = 0;
// Déclaration avec initialisation.
let var2 = var1;
Variable à affectation unique !
const constante = valeur;
> const zero; const zero; ^^^^ Uncaught SyntaxError: Missing initializer in const declaration > const zero = 0; > zero; 0 > zero = 1; Uncaught TypeError: Assignment to constant variable. >
// "un" n'existe pas encore.
let un = 1;
// "un" existe.
{
// "un" existe.
// "deux" n'existe pas encore.
let deux = 2;
// "un" et "deux" existent :)
}
// "un" existe toujours.
// "deux" n'a jamais existé ici.
Définit la nature des valeurs que peut prendre une donnée
et les opérateurs qui peuvent lui être appliqués.
undefined
boolean
(d'après George Boole)true | vrai |
false | faux |
> true true > false false > let vrai = true; > vrai; true > typeof vrai; 'boolean' >
!operande
> !true false > !false true > !!true true > !!false false >
expr1 === expr2
Vrai si les deux opérandes sont identiques ; faux sinon
expr1 !== expr2
Vrai si les deux opérandes sont différents ; faux sinon
> true === true true > true === false false > false === true false > false === false true >
> true !== true false > true !== false true > false !== true true > false !== false false >
(expr1 === expr2) === (expr2 === expr1)
(expr1 !== expr2) === (expr2 !== expr1)
(expr1 !== expr2) === !(expr1 === expr2)
!(expr1 !== expr2) === (expr1 === expr2)
« ET » logique
expr1 && expr2
Faux si le 1er opérande est faux ; sinon, valeur du 2nd opérande
« OU » logique
expr1 || expr2
Vrai si le 1er opérande est vrai ; sinon, valeur du 2nd opérande
L'évaluation du 2nd opérande est conditionnée par la valeur du 1er !
> true || true true > true || false true > false || true true > false || false false >
> true && true true > true && false false > false && true false > false && false false >
!(expr1 && expr2) === (!expr1 || !expr2)
!(expr1 || expr2) === (!expr1 && !expr2)
number
+Infinity
, -Infinity
, NaN
+
-
*
/
%
> 1 + 2 3 > 5 / 2 2.5 > 5 % 2 1 > 0.1 + 0.2 0.30000000000000004 > typeof NaN 'number' >
Il est possible de combiner une opération et une affectation
Affectation après addition | x += y | x = x + y |
Affectation après soustraction | x -= y | x = x - y |
Affectation après multiplication | x *= y | x = x * y |
Affectation après division | x /= y | x = x / y |
Affectation du reste | x %= y | x = x % y |
Les deux formes ont pour effet d'additionner 1
à la valeur d'une variable ;
la première de façon immédiate, l'autre de façon différée.
y = ++x;
équivaut à x += 1; y = x;
y = x++;
équivaut à y = x; x += 1;
Les deux formes ont pour effet de soustraire 1
à la valeur d'une variable ;
la première de façon immédiate, l'autre de façon différée.
y = --x;
équivaut à x -= 1; y = x;
y = x--;
équivaut à y = x; x -= 1;
===
!==
<
<=
>
>=
0 | » | Parenthèses | () |
3 | » | Incrémentation postfixe | ++ |
» | Décrémentation postfixe | -- | |
4 | « | Incrémentation préfixe | ++ |
« | Décrémentation préfixe | -- | |
« | NON logique | ! | |
« | Plus unaire | + | |
« | Négation unaire | - | |
« | Type | typeof | |
5 | » | Multiplication | * |
» | Division | / | |
» | Reste | % |
6 | » | Addition | + |
» | Soustraction | - | |
8 | » | Inférieur strict | < |
» | Inférieur ou égal | <= | |
» | Supérieur strict | > | |
» | Supérieur ou égal | >= | |
9 | » | Égalité | === |
» | Inégalité | !== | |
13 | » | ET logique | && |
14 | » | OU logique | || |
16 | « | Affectations | = += -= *= /= %= |
a /= (b + 5) * c++;
string
'
'
ou des guillemets "
"
+
et +=
// Déclaration d'une chaîne de caractères
let bonjour = "Bonjour !";
// Longueur d'une chaîne de caractères
let n = bonjour.length; // 9
// Accès à un caractère par son index
let c = bonjour [0]; // 'B'
// Accès à une portion de chaîne
let s = bonjour.substring (3, 7); // 'jour'
Objets structurés avec propriétés nommées
object
{
}
'clé' : valeur
let algo =
{
code : 'AlgoJS',
intitule : "Algorithmique et JavaScript",
enseignant : {prenom: 'Aassif', nom: 'Benassarou'},
'volume-horaire' : 47
};
console.log (algo.code); // AlgoJS
console.log (algo.enseignant.nom); // Benassarou
console.log (algo['volume-horaire']); // 47
Boolean(expression)
Number(expression)
String(expression)
> Boolean(0) false > Boolean(1) true > Boolean("") false > Boolean("false") true > Boolean(null) false > Boolean(undefined) false >
> Number(true) 1 > Number(false) 0 > Number("1.23e2") 123 > Number("0x7b") 123 > Number(null) 0 > Number(undefined) NaN >
> String(true) 'true' > String(false) 'false' > String(1.23e2) '123' > String(0x7b) '123' > String(null) 'null' > String(undefined) 'undefined' >
==
et !=
Comparaison avec conversion.
Usage déconseillé en algorithmique !
> 1 == '1' true > null == undefined true >
Contrairement à d'autres langages, comme le C, le C++ ou le Java,
JavaScript est un langage interprété, faiblement typé.
main(k){float i,j,r,x,y=-16;while(puts(""),y++<15)for(x
=0;x++<84;putchar(" .:-;!/>)|&IH%*#"[k&15]))for(i=k=r=0;
j=r*r-i*i-2+x/25,i=2*r*i+y/10,j*j+i*i<11&&k++<111;r=j);}
gcc mandelbrot.c -o mandelbrot
Les structures de contrôle font partie intégrante des langages informatiques.
Généralement, elles sont mises en places à l'aide de mots-clés et de blocs.
Elles proposent un cheminement non linéaire au sein d'un programme ;
certaines conditionnent l'éxécution d'instructions,
d'autres permettent de les répéter.
Exécution conditionnée d'un bloc d'instructions
if (condition)
{
// Instructions exécutées
// si condition vaut "true".
instructions;
}
if (condition)
{
// Instructions exécutées
// si condition vaut "true".
instructions1;
}
else
{
// Instructions exécutées
// si condition vaut "false".
instructions2;
}
Soit b un booléen tiré au hasard.
Nous souhaitons afficher la chaîne "vrai" si b est vrai ;
sinon, nous afficherons la chaîne "faux".
// Tirage aléatoire.
let x = Math.random ();
//console.log ('x', x);
// Booléen.
let b = (x >= 0.5);
//console.log ('b', b);
// Alternative
if (b)
console.log ('vrai');
else
console.log ('faux');
condition ? valeur1 : valeur2
valeur1
si condition
; valeur2
sinon
Cet opérateur permet de créer des expressions conditionnelles.
let x = Math.random ();
if (x >= 0.5)
console.log ('vrai');
else
console.log ('faux');
let x = Math.random ();
console.log (x >= 0.5 ? 'vrai' : 'faux');
if (condition1)
{
instructions1;
if (condition2) {instructions2;}
else {instructions3;}
instructions4;
}
else
{
instructions5;
if (condition3) {instructions6;}
else {instructions7;}
instructions8;
}
if (condition1) {
instructions1;
}
else
if (condition2) {
instructions2;
}
else
if (condition3) {
instructions3;
}
else {
instructions4;
}
if (expression === valeur1)
{
instructions1;
}
else if (expression === valeur2)
{
instructions2;
}
// …
else
{
instructions;
}
switch (expression)
{
case valeur1 :
instructions1; break;
case valeur2 :
instructions2; break;
// …
default :
instructions;
}
while (condition) {instructions;}
while
Soit \(x\) un nombre compris dans l'intervalle \([0, 1[\).
Pour jouer à pile ou face, nous considérerons qu'une valeur de \(x\) inférieure à \(0.5\) correspondra à l'événement « pile ». Toute autre valeur correspondra à « face ».
Si l'événement « face » survient, le jeu s'arrête ; sinon, il recommence.
// Tirage aléatoire.
let x = Math.random ();
// Nombre d'essais.
let n = 1;
// Tant que "x" < 0.5…
while (x < 0.5)
{
// Nouveau tirage.
x = Math.random ();
// Incrémentation du compteur.
++n; // n = n + 1;
}
console.log (n);
do {instructions;} while (condition);
do
et while
let x = 0, n = 0;
do
{
x = Math.random ();
++n;
}
while (x < 0.5);
console.log (n);
for (initialisation; condition; mise_à_jour) {instructions;}
// Répéter 10 fois :
for (let i = 0; i < 10; ++i)
{
// Afficher "bonjour !"
console.log ('bonjour !');
}
// Répéter 10 fois :
for (let i = 0; i < 10; ++i)
{
// Afficher le compteur.
console.log (i);
}
// Ouverture d'un bloc
// pour limiter la portée
// de la variable
{
// Déclaration du compteur
let i = 0;
// Test de la condition
while (i < 10)
{
// Corps de la boucle
console.log (i);
// Incrémentation
++i;
}
}
Accès tour à tour aux propriétés d'un objet
for (let variable in objet) {instructions;}
variable
est un itérateur de l'objet objet
let algo =
{
code : 'AlgoJS',
intitule : "Algorithmique et JavaScript",
enseignant : {prenom: 'Aassif', nom: 'Benassarou'},
'volume-horaire' : 47
};
for (let k in algo) console.log (k, algo[k]);
code AlgoJS intitule Algorithmique et JavaScript enseignant { prenom: 'Aassif', nom: 'Benassarou' } volume-horaire 47
Ré-utilisation du code
function f (param1, param2, …, param)
{
instructions;
}
function
suivi du nom de la fonctionparam1
, param2
, …, param
sont les paramètres de la fonctionUn paramètre est une variable locale à la fonction.
Son nom permet de l'identifier dans le corps de la fonction.
function f (a, b)
{
console.log ('a', a);
console.log ('b', b);
}
Une fonction peut retourner un résultat avec le mot-clé return
.
function f (param1, param2, …, param)
{
instructions;
return expression;
}
Une fonction sans résultat a pour type de retour undefined
.
f (expr1, expr2, …, expr)
Pour invoquer une fonction, il faut lui fournir des arguments.
Cette action se nomme appel de fonction.
Les types des expressions doivent correspondre aux types attendus.
Les arguments sont alors substitués aux paramètres,
le corps de la fonction est évalué et la fonction renvoie un résultat.
Un appel de fonction est une expression
dont la valeur est égale à celle du resultat retourné.
// Carré.
function f (x)
{
return x * x;
}
f (3); // 9
f (f (3)); // 81
// Somme.
function g (x, y)
{
return x + y;
}
g (1, 2); // 3
g (1, '2'); // '12'
g (1, 2, 3); // 3
g (1); // NaN
En JavaScript, le nombre d'arguments et le nombre de paramètres peuvent différer.
Tout argument absent lors de l'appel vaut undefined
.
Il est possible de spécifier une valeur par défaut pour chaque argument.
function f (param1 = v1, param2 = v2, …, param = valeur)
{
instructions;
}
Fonction dont le calcul nécessite d'invoquer la fonction elle-même.
// Suite de Fibonacci : 0, 1, 1, 2, 3, 5, 8, …
function f (n)
{
return (n < 2 ? n : f (n-2) + f (n-1));
}
function f (n)
{
let u = 0;
let v = 1;
for (let i = 2; i <= n; ++i) {
let t = u + v;
u = v;
v = t;
}
return v;
}
Un tableau est une liste ordonnée de \(n\) valeurs.
Les valeurs contenues dans un tableau sont appelées éléments.
Généralement, ces valeurs sont toutes du même type.
Chaque élément est identifié par son indice (de \(0\) à \(n-1\)).
\[ \underbrace{ \begin{array}{|c|c|c|c|c|c|c|c|c|c|} \hline 0&1&2&3&4&5&6&7&8&9\\ \hline \end{array} }_{10} \]
En JavaScript, un tableau est un objet de classe Array
Sa taille est accessible via une propriété nommée length
Ses éléments le sont via l'opérateur []
Son initialisation s'effectue également avec des crochets
entre lesquels sont énumérés tous ses éléments.
> let tableau = [4, 8, 15, 16, 23, 42]; > tableau; [ 4, 8, 15, 16, 23, 42 ] > typeof tableau; 'object' > tableau.length; 6 > tableau [5]; 42 > typeof tableau [5]; 'number' >
for (let i = 0; i < tableau.length; ++i)
console.log (i, tableau [i]);
0 4 1 8 2 15 3 16 4 23 5 42
Accès tour à tour aux éléments d'un tableau
for (let variable in tableau) {instructions;}
for (let variable of tableau) {instructions;}
variable
est un itérateur du tableau tableau
// Accès au premier élément.
let locke = tableau [0];
// Accès au deuxième élément.
let reyes = tableau [1];
// Accès eu troisème élément.
let ford = tableau [2];
// Accès simultané aux trois éléments.
let [locke, reyes, ford] = tableau;
> let tableau = [4, 8, 15, 16, 23, 42]; > let [locke, reyes, ...etc] = tableau; > etc.length; 4 > etc; [ 15, 16, 23, 42 ] >
// Paramètres du reste.
function f (a, b, ...params)
{
// Utilisation de "a" et "b".
console.log (a, b);
// Utilisation de "params".
for (let p of params)
console.log (p);
}
(param1, param2, …, param) => {instructions;}
this
indemneArray.forEach
1/3Exécution d'une tâche élément par élément
tableau.forEach (variable => {instructions;});
Array.forEach
est invoquée à partir d'un objet de type Array
Array.forEach
2/3tableau.forEach ((v, i, t) => {instructions;});
Le callback attendu doit accepter trois arguments :
Array.forEach
3/3> let tableau = [4, 8, 15, 16, 23, 42]; > let somme = 0; > tableau.forEach (x => {somme += x;}); > somme; 108 >
Array.map
1/3Création d'un nouveau tableau par transformations élémentaires
let destination = source.map (variable => expression);
destination
contient autant d'éléments que le tableau source
destination
sont construits à partir des éléments de source
Array.map
2/3let destination = source.map ((v, i, t) => expression);
Le callback attendu doit accepter trois arguments :
Array.map
3/3> let tableau = [4, 8, 15, 16, 23, 42]; > tableau.map (x => Math.sqrt (x)); [ 2, 2.8284271247461903, 3.872983346207417, 4, 4.795831523312719, 6.48074069840786 ] >
Array.filter
1/3Sous-ensemble du tableau d'origine
let destination = source.filter (predicat);
source
sont conservés s'ils remplissent une condition donnéetrue
pour chaque élément devant être conservéArray.filter
2/3let destination = source.map ((v, i, t) => expression);
Le callback attendu doit accepter trois arguments :
Array.filter
3/3> let tableau = [4, 8, 15, 16, 23, 42]; > tableau.filter (x => x % 2); [ 15, 23 ] >
Array.reduce
1/3Calcul d'un résultat unique construit par récurrence
let resultat = tableau.reduce (callback, accumulateur);
accumulateur
représente une valeur initialecallback
sera invoquée pour chaque élémentArray.reduce
2/3let resultat = tableau.reduce ((a, v, i, t) => expression, a0);
Array.reduce
3/3> let tableau = [4, 8, 15, 16, 23, 42]; > tableau.reduce ((somme, x) => somme + x, 0); 108 >