function

Aire et périmètre d'un disque.

Aire

Écrire une fonction javascript répondant à la spécification suivante :

  • Entrée : un réel r strictement positif.
  • Valeur retournée : l'aire du disque de rayon r.

La constante π s'obtient par Math.PI.

Périmètre

Écrire une fonction javascript répondant à la spécification suivante :

  • Entrée : un réel r strictement positif.
  • Valeur retournée : le périmètre du disque de rayon r.

Interface

Ajouter les éléments html et le code js nécessaires pour que l'utilisateur entre le rayon r dans un élément de formulaire (élément input) et que le résultat s'affiche dans un élément de type p dans la page.

Séparez calcul et affichage

Nous définissons une fonction qui s'occupe du calcul demandé puis une fonction qui affiche le résultat.

Il est important, en général, de ne pas mélanger les rôles de calcul et d'affichage. Assurez vous de bien saisir la différence de rôle entre un return et un affichage.

Premier code (sans interface utilisateur)

Interface

Échange.

Échanger le contenu de deux variables

Gaston aimerait écrire une fonction permettant d'échanger le contenu de deux variables contenant des entiers.

Il écrit le code suivant :

Obtient-il ainsi l'échange voulu des valeurs de a et b ?

Effet du code de Gaston

La fonction n'échangera pas les contenus des deux variables comme le montre l'exécution ci-dessous :

Le déroulement est le suivant :

  1. Lors de l'appel echange(a,b), la valeur de a est copiée dans la variable valeur1 (qui est locale à la fonction echange) et la valeur de b est copiée dans la variable valeur2 (variable également locale à la fonction).
  2. Ensuite un échange des valeurs des variables valeur1 et valeur2 a lieu.
  3. On sort ensuite de la fonction : les variables valeur1 et valeur2 n'existent plus et les variables a et b ont été inchangées.

Le code suivant montre que l'échange des valeurs des variables valeur1 et valeur2 a bien lieu dans la fonction :

Échange dans un array.

Échanger le contenu de deux éléments d'un array

Observez le code suivant. Puis expliquez en quoi il peut-être surprenant par rapport aux explications de l'exercice précédent. Cherchez une explication.

Une solution

Si l'on reprend la logique présentée dans l'exercice précédent, on s'attend au comportement suivant :

  1. Lors de l'appel echange(T, i, j);, le contenu du tableau T est copié dans le tableau local L et les valeurs 0 et 3 (de i et j) sont copiées dans les variables locales indice1, indice2.
  2. Un échange est fait entre les éléments d'indice 0 et d'indice 3 du tableau L.
  3. En sortant de la fonction, la variable locale L est oubliée et T est inchangé.

Or nous constatons que l'échange a bien eu lieu dans T.

Ceci est du au fait qu'un array n'est pas passé par valeur mais par référence.
Qu'est-ce que cela signifie ?

Cela signifie que lors de l'appel echange(T, i, j);, le contenu du tableau T n'est pas copié dans un nouveau tableau L. En fait, c'est l'adresse en mémoire de T qui est copiée et L désigne donc le même tableau que T (L et T ont la même adresse dans l'espace mémoire). Toute modification faite sur L sera donc faite effectivement sur T.

Pour saisir ce qu'il se passe, on peut penser les variables comme des étiquettes sur des boîtes contenant des valeurs.

  1. L'état avant l'appel de la fonction est le suivant :
    Etat initial
  2. L'état juste après appel de la fonction est le suivant :
    Etat après appel

On voit sur ce schéma :

  1. Pour des variables de type number, de nouvelles boîtes sont créées lors de l'appel de la fonction (avec de nouvelles étiquettes).
  2. Mais pour un array, la même boîte est utilisée et elle dispose d'une nouvelle étiquette provisoire.

Ainsi en sortant de la fonction, l'étiquette L n'existe plus, mais les modifications faites sont restées car L désignait la même boîte que T.

Par contre, toute modification des boîtes étiquetées indice1 et indice2 n'aurait aucun effet sur les boîtes étiquetées i et j.

Pourquoi?

Pourquoi les nombres sont-ils passés par valeur et les tableaux par référence?

Le passage par valeurs pour les nombres est en général plus pratique (la fonction peut mener des calculs intermédiaires sans interférer sur les valeurs de la variable se trouvant en partie principale).

Pour les tableaux (et de façon plus générale pour les objets), un passage systématique par valeur poserait un problème d'espace (imaginez que votre programme manipule un très grand tableau et que plusieurs fonctions fassent appel à ce tableau: chaque appel faisant une copie du tableau, beaucoup d'espace mémoire serait utilisé au risque d'un dépassement de la capacité mémoire). Un problème de temps est également en jeu: faire une copie d'une longue liste n'est pas instantané et l'exécution d'un programme pourrait ainsi être considérablement allongé.

Rappelons que l'on peut tout de même faire des copies de tableau (c'est à dire créer une variable tableau dans laquelle on recopiera les valeurs d'un autre tableau, ces deux tableaux occupant des espaces mémoire distincts). Cela permet de "simuler" un passage de tableau par valeurs si besoin.

Nombre triangulaire.

Écrire une fonction javascript répondant à la spécification suivante :

  • entrée : un entier naturel n.
  • valeur retournée : la somme 1+2+3+...+n (somme des n premiers entiers naturels non nuls)

Interface.

Ajouter ensuite les éléments nécessaires pour que l'utilisateur entre la valeur de n dans un élément de type input et que le résultat s'affiche dans un élément de type p.

Premier code (sans interface utilisateur)

Avec entrée donnée par l'utilisateur

Voyelles.

Écrire une fonction js répondant aux spécifications suivantes :

  • Entrée : un caractère
  • Valeur retournée : true si le caractère est une voyelle, false sinon.

Interface

Ajouter ensuite les éléments nécessaires pour que l'utilisateur entre le caractère dans un élément de type input et que le résultat s'affiche dans un élément de type p.

Un code possible (sans interface utilisateur).

Autre solution (sans interface utilisateur).

On utilise la méthode includes pour allèger une partie du code.

Avec entrée par l'utilisateur

Javanais.

Les règles du javanais :

  • On ajoute 'av' après chaque consonne ou groupe de consonnes (comme par exemple ch, cl, ph, tr,…) d’un mot.
  • Si le mot commence par une voyelle, on ajoute av devant cette voyelle.
  • On ne rajoute jamais av après la consonne finale d’un mot.

Écrire une fonction qui prend en entrée un mot et donne en sortie sa version javanaise.

La syllabe qui vient parasiter le mot (en javanais classique : 'av') pourra être modifiée et sera donc un paramètre de la fonction.

Exemples :

javanais('Abraracourcix','av') :  Avabravaravacavourcavix
javanais('Abraracourcix','oz') :  Ozabrozarozacozourcozix
javanais('javascript','ail') :  jailavailascrailipt 

Interface

Vous écrirez une version dans laquelle l'utilisateur entrera la syllabe pertubatrice et le mot initial dans des éléments de type input. La traduction s'inscrira dans un élément de type p.

Un code possible (sans interface utilisateur).

Avec entrées utilisateur

La traduction s'affiche lorsque la souris survole l'élément html prévu pour afficher cette traduction.