Programmation Javascript (NFA041)

Feuille 1

Olivier Pons
(pons@cnam.fr)

2022

En passant dans la console du Navigateur (F12) ou en lançant node.js dans un terminal on dispose d'une boucle d'interaction (qu'on appel aussi Toplevel ou REPL (Read Eval Print Loop)). Tout les premiers exercices sont à faire à ce niveau.

Exercice 1

Prévoir puis vérifier en javascript la valeur et le type de chacune des expressions ci-dessous.
On pourra utiliser l'opérateur typeof

1+2;
4/2*2;
-4/(2*2);
5/2;
5 % 2;
1/0;

Exercice 2

Prévoir puis vérifier en javascript la valeur et le type de chacune des expressions ci-dessous.
On pourra utiliser l'opérateur typeof

1.1e-3 + 2.5 * 2.0 - 1e+2;
- 1.0 / 2.5;
1 + 3.6;
1.2 + 3.4;

Exercice 3

Prévoir puis vérifier en javascript la valeur de chacune des expressions ci-dessous. On pourra utiliser l'opérateur typeof On pourra consulter L'objet Math

Math.sqrt(4.0);
Math.sqrt(4);
Math.floor(2.6) ;
Math.floor(-3.7) ;
Math.ceil(2.6) ;
Math.ceil(-3.7) ;
Math.sqrt(4.000000000000001);
Math.sqrt(4.00000000000000001);  //piege ;-)

Exercice 4

Prévoir puis vérifier en javascript la valeur de chacune des expressions suivantes : On pourra utiliser l'opérateur typeof

Number("3")+5
"3"+5              // attention conversion implicite
String(3)+"5"
Number("trois")+5
parseInt("9.6")
parseFloat("9.6")
parseFloat("9.6cm")
Number("9.6cm")

Exercice 5

Déterminer le résultat renvoyé par javascript pour chacune des expressions suivantes :

"Le résultat est : " + (7*3);
"salut"[0];
"salut".charAt(3)
"salut"[3];
"salut"[8];
"salut".substring(0,3);
"salut".substring(0,3);
"salut".substring(3, "salut".lenght - 3);
12345.substring(1,3)      // Attention pb
"ABC".charCodeAt(0)   
"ABC".charCodeAt(1)
"ABC".charCodeAt(2)   
"ABC".charCodeAt(3)   

Exercice 6

Déterminer le résultat renvoyé par javascript pour chacune des expressions suivantes :

 1 < 2 ||  1.1 != 3.2;
 2 === 3 && 1.34e+6 - 4.9e-4 > 23.4e5;
 2>1 || 3<4 & 5>=6 ;
 (2>1 || 3<4) && 5>=6 ;
 ! 2<1 || 3<4 ;
 ! (2<1 || 3<4) ;

Exercice 7

Solution

> let grosNombre = 1e150
undefined
> let plusGros =grosNombre * grosNombre 
undefined
> plusGros
9.999999999999999e+299   // pb d'appoximation 
> plusGros===1e300
false
> plusGros * grosNombre  
Infinity                // trop grand
> 

Exercice 8

Solution

> let petitNombre=1e-150
undefined
> let plusPetit=petitNombre*petitNombre
undefined
> plusPetit
1e-300
> plusPetit*petitNombre
0
> 

Dépassement et soupassement (overflow et underflow)

Les opérations arithmétiques effectuées par les ordinateurs présentent certaines limites. L'une d'entre elles est le problème du dépassement de capacité. Le dépassement des nombres entiers se produit lorsque la valeur de l'expression entière dépasse la valeur de l'entier maximum. En Javascript cela conduit à un renvoyer Infini. Il n'y a ni warning ni message d'erreur.

Un deuxième problème, le soupassement, se produit lorsque l'on travaille avec des réels. Si un nombre réel est trop petit pour être représenté, il est remplacé par 0.

On pourra lire ça et ca

Exercice 9

  1. Définissez deux variables : p ayant pour valeur 5 et q ayant pour valeur 3*p.

  2. Avec une seule instruction console.log(…) et en utilisant les variables p et q, faites afficher la phrase suivante : "p vaut 5 et q vaut 15, leur somme fait 20"

N.B. La solution suivante n'est PAS celle que l'on attend bien entendu : console.log('p vaut 5 et q vaut 15, leur somme fait 20')

  1. Demandez en a l’interpréteur javascript « q est-il un multiple de p ? » [utilisez le reste de la division]

  2. Écrivez les lignes de code permettant d’échanger les valeurs de p et q, en utilisant une variable temporaire tmp. Vérifiez ensuite que les valeurs de p et q ont bien été permutées.

  3. Échangez à nouveau les valeurs de p et q, mais SANS utiliser de variable temporaire ! Soyez astucieux, jouez avec des opérations arithmétiques…

Solution

let p=5;
let q=3*5;

console.log("p vaut "+p+" et q vaut "+q+", leur somme vaut "+(p+q));
console.log(`p vaut ${p} et q vaut ${q} leur somme vaut ${p+q}`);
console.log("p vaut ",p," et q vaut ",q,", leur somme vaut ",(p+q));

q%p===0

let tmp=p;
p=q;
q=tmp;

p=q-p;
q=q-p
p=p+q

Exercice 10

Écrire une fonction qui calcul le prix TTC en fonction du prix HT sachant que la TVA est de 18,6%.

Solution

function tva(ht){
    return 118,6*ht/100;
}

Exercice 11

Définir la fonction cube qui à \(x\) associe \(x^3\)

Solution

function cube(x){
    return x*x*x
}

Exercice 12

Utiliser votre fonction cube pour écrire une fonction qui calcule le volume d'une sphere ( \(\frac{4}{3}\pi R^3\)) de rayon \(R\)

Solution

function volumeSphere(r){
    return (4*Math.PI*cube(r))/3;
}

Exercice 13

Écrire une fonction verifierUrlAbsolue qui prend en argument une chaîne de caractère et renvoie true si elle contient http::// et false sinon.

par exemple:

> verifierUrlAbsolue("http://example.org/")
true
> verifierUrlAbsolue("/exercice1/solution.html")
false
> 

Solution

function verifierUrlAbsolue(s){
    return s.indexOf("http://") != -1;
}

Exercice 14

En utilisant une boucle for programmer une fonction affichant un compte à rebours de n à 0. Puis écrire la meme fonction en utilisant une boucle while

> compte_a_rebours(5);
5
4
3
2
1
undefined
> 

Solution

function compte_a_reboursFor(n){
    for(let i=n;i>=0;i--){
        console.log(i);
    }
}

function compte_a_reboursWhile(n){
    let i=n;
    while (i>=0){
        console.log(i);
        i--;
    }
}

Exercice 15

Programmer une fonction récursive affichant un compte à rebours de n à 0 :

Solution

function compte_a_rebours(n){
    if (n>=0){
    console.log(n);
    compte_a_rebours(n-1);    
    }
}

Exercice 16

Programmer une fonction récursive calculant une puissance entière (et positive) d’un réel : puiss(x,n)\(=x^n\)

Comparer le résultat à celui de Math.pow

Solution

function puiss(x,n){
    if (0 === n){return 1}
    else{return x*puiss(x,n-1)}
}


function checkPuissance(x,n){
    return puiss(x,n) === Math.pow(x,n);
}

Exercice 17

Programmer une fonction iterative (avec for ou while) calculant une puissance entière d’un réel : puissIter(x,n)\(=x^n\)

Solution


function puissIter(x,n){
    if (n===0){return 1}
    let res=x;
    for(let i=1;i<n;i++){
        res=res*x;
    }
    return res;
}



function checkPuissance(x,n){
    return puissIter(x,n) === Math.pow(x,n);
}

Exercice 18

En utilisant l'algorithme d'Euclide écrire une fonction qui renvoie le pgcd de deux nombres:

> pgcd(51,87)
3           // car 51 = 3* 17 et 87 = 3 * 29
> 

Solution

Recursive
function pgcd(a, b) {
  if (!b) {
    return a;
  }

  return pgcd(b, a % b);
}
Itérative
function pgcdIt( a,  b){
    let  r;  // on declare r
    // boucle tant que le reste est  0
    while (b > 0){
        r = a%b; // reste
        // a devient b et  b devient r 
        a = b;
        b = r;
    }
return a;
}

Exercice 19

Déterminer le résultat affiché par javascript pour chacune des requêtes suivantes :

(4<5)?"oui":"non"                  // expression (valeur) 
if (4<5) {"oui"} else{"non"};      //instruction (pas une valeur meme 
                                   // .       si la ca ne se voit pas )
let res1=(4<5)?"oui":"non"         //correcte on met la valeur de 
                                   // l'expression dans res1
let res2=if (4<5) {"oui"} else{"non"};  //err
if (4<5) {res2="oui"} else {res2=("non")}; //correcte

Exercice 20

Écrire une fonction à trois arguments réels a, b, c,, et qui retourne le nombre de solutions réelles de l’équation \(aX^2+bX+X\) Si on doit se rafraîchir la mémoire sur les mathématiques de lycée

> resolveSolution(1,1,-2)        // x²+x-2 = 0 a 2 solutions 
2                               //(delta positif)

> resolveSolution(1,1,1)        //x²+x+1=0  n'a pas de solution 
0                               //(delta négatif)

> resolveSolution(4,4,1)        //4x²+4x+1=0 1 solution car 
1                               //(delta == 0)

> 

Solution

function resolveSolution(a,b,c){
    let delta=(b*b)-(4*a*c);
    if(delta>0){
        return 2
    }else{
    if (delta === 0){
        return 1
        }else{
            return 0   
        }
    }
}