Valid XHTML     Valid CSS2    

Décomposition, Conception et Réalisation d'Applications

T.D. 2 : Structuration, instructions vectorielles, boucles et optimisation

                    gilles.hunault "at" univ-angers.fr

Table des matières cliquable

  1. Structuration dans le développement Web

  2. Instructions vectorielles et fonctionnelles (1)

  3. Instructions vectorielles et fonctionnelles (2)

  4. Boucles et optimisation (1)

  5. Boucles et optimisation (2)

  6. Optimisation dans le développement Web

Il est possible d'afficher toutes les solutions via ?solutions=1 et de les masquer via ?solutions=0.

 

1. Structuration dans le développement Web

Comment fait-on pour structurer une page Web ou un site Web en PHP ? Comment fait-on pour structurer un programme en général ?

Faut-il passer à des sites Web non écrits en PHP ? Que signifie le terme full stack ?

Solution :  

 

2. Instructions vectorielles et fonctionnelles (1)

La programmation vectorielle met en jeu des instructions basées, soit en entrée, soit en sortie, sur des structures de type tableau mais nommées vecteurs par analogie avec les vecteurs mathématiques de $\mathbf{\Bbb{R}^n}$. On notera pour cet exercice $V_i$ la i-ème composante du vecteur $V$, équivalente à V[i] ou V[i-1] pour l'informatique. Les calculs usuels s'étendent naturellement aux vecteurs, comme en mathématiques, dès lors que les contraintes de longueur sont respectées. En particulier, pour un vecteur $V$ et un nombre $a$, le vecteur $aV$ a pour i-ème composante la valeur $aV_i$. Pour deux vecteurs $V$ et $W$ de même longueur, $V+W$ est le vecteur dont la i-ème composante est $V_i+W_i$, et $V\times{}W$ est le vecteur dont la i-ème composante est $V_i\times{}W_i$ («produit scalaire»).

On admettra pour ce qui suit qu'on dispose des fonctions vectorielles suivantes :

  • indices(n) qui renvoie, pour un entier $n$, le vecteur de longueur $n$ dont la i-ème composante est $i$ 

  • longueur(V) qui renvoie le nombre d'éléments du vecteur V ;

  • somme(V) qui renvoie la somme des éléments du vecteur V ;

  • produit(V) qui renvoie le produit des éléments du vecteur V ;

  • cumul(V) qui renvoie le vecteur des sommes cumulées de V ;

Donner les instructions vectorielles qui permettent de calculer :

  • - le vecteur $I$ des $n$ premiers entiers ;

  • - la somme $S = \sum i$ des $n$ premiers entiers ;

  • - la somme $C = \sum i^2$ des n premiers carrés d'entiers ;

  • - la valeur $F = n!$ ("factorielle n") ;

  • - la moyenne $M$ et la variance (empirique) $V$ d'un vecteur $W$ numérique ;

  • - le vecteur $P$ des fréquences cumulées d'un vecteur $W$ d'effectifs (positifs ou nuls) de somme non nulle.

On pourra imaginer que $n$ vaut 5 pour vérifier les calculs à la main, et que $W$ est le vecteur (1,5,3,1).

Quels langages implémentent de tels calculs ? Quelle est alors la syntaxe exacte à utiliser ?

Solution :  

 

3. Instructions vectorielles et fonctionnelles (2)

On suppose désormais que les comparaisons logiques usuelles sont aussi des opérations vectorielles qui renvoient, indice par indice, 0 lorsque le résultat du test est faux et 1 lorsque le résultat du test est vrai. Ainsi, pour le vecteur $V=(5,8,2,1,9)$, la comparaison $V>3$ renvoie $(1,1,0,0,1)$.

Détailler ce que réalisent les calculs suivants écrits en APL, sachant que Γ correspond à la fonction max(). On pourra essayer d'inventer la syntaxe algorithmique correspondante et on se posera la question de savoir comment écrire cela en R puis en Python, sans doute là encore à l'aide de NumPy.

Atttention : APL interprète les opérations à partir de la droite afin de minimiser le nombre de parenthèses à écrire. Ainsi 2 × 3 +5 correspond à 2 × (3 +5) soit 16.

Numéro Instruction APL Remarque
1     V=W V et W sont des vecteurs numériques ou caractères
2     +/V=W V et W sont des vecteurs numériques ou caractères
3     +/V>0 V est un vecteur numérique
4     +/Γ/V=V V est un vecteur numérique
5     +/V=Γ/V V est un vecteur numérique
6     +/V$\times$W V est un vecteur numérique
7     +/V$\times$V V est un vecteur numérique

On commencera par donner le vecteur résultat correspondand à chaque instruction pour les vecteurs $V=(5,8,-2,1,8)$ et $W=(5,8,2,1,9)$.

Solution :  

 

4. Boucles et optimisation (1)

On se donne deux valeurs numériques $a$ et $b$ et un entier $n$. Ecrire un algorithme qui calcule les valeurs des $n$ points équidistants $x_i$, $i$ de 1 à $n$ avec $a=x_1$ et $b=x_n$. On commencera par trouver la formule qui sépare deux points sucessifs. On discutera s'il faut utiliser une boucle pour, une boucle tant que, ou se passer de boucle et on viendra optimiser le nombre d'opérations.

Au passage, que sont les $x_i$ pour $n=10$ avec $a=1$ et $b=10$ ? Et pour $n=11$ avec $a=0$ et $b=1$ ?

Trouver ensuite une solution vectorielle. Quelles solutions sont proposées par R et Python ?

Solution :  

 

5. Boucles et optimisation (2)

Comment calculer de façon optimisée le maximum, le nombre d'occurrences de ce maximum et sa première position pour un vecteur $V$ ?

Est-ce qu'une solution vectorielle pour ce problème est forcément optimisée ?

Quelles solutions sont proposées par R, APL et Python ?

Le code proposé est-il valide pour des vecteurs de chaines de caractères plutôt que pour des vecteurs de nombres ?

Solution :  

 

6. Optimisation dans le développement Web

Ce qu'on a vu précédemment montre que dans de nombreux cas, des calculs simples comme le maximum, les valeurs d'une suite arithmétique sont déjà programmés. Peut-on penser que dans l'utilisation de bases de données, on trouve le même genre de solutions pré-programmées ? Et dans le cas du développement Web ?

Comment garantir par exemple qu'une requête MySQL est optimisée ?

Comment tester la vitesse d'exécution de code en R et en Python ?

Solution :  

 

       retour au plan de cours  

 

Code-source PHP de cette page ; code Javascript associé.

 

retour gH    Retour à la page principale de   (gH)