modifications des tp, exercices, ajouts d'indications en JS, d'exemples en gloutons, 3 semaines de boulot enfin voilà
This commit is contained in:
259
gloutons/EXERCICES.md
Normal file
259
gloutons/EXERCICES.md
Normal file
@@ -0,0 +1,259 @@
|
||||
### Exercices - Algorithmes Gloutons
|
||||
|
||||
---
|
||||
|
||||
## Exercice 1 : Achat de V-Bucks (Fortnite)
|
||||
|
||||
Dans Fortnite, on peut acheter des V-Bucks avec les packs suivants : `{500, 1000, 2800, 5000, 13500}` V-Bucks.
|
||||
|
||||
Tu veux acheter exactement **8000 V-Bucks** en utilisant le moins de packs possible.
|
||||
|
||||
1. Appliquer l'algorithme glouton **à la main** pour obtenir 8000 V-Bucks. Combien de packs sont nécessaires ?
|
||||
2. Existe-t-il une meilleure solution ?
|
||||
3. Ce système est-il canonique (le glouton donne-t-il toujours l'optimal) ?
|
||||
|
||||
<details>
|
||||
<summary><strong>Voir la correction</strong></summary>
|
||||
|
||||
**Question 1 : Algorithme glouton**
|
||||
- On prend 5000 (le plus grand ≤ 8000) : reste 3000
|
||||
- On prend 2800 : reste 200
|
||||
- 200 < 500, on ne peut plus rien prendre !
|
||||
|
||||
L'algorithme glouton **échoue** à donner exactement 8000.
|
||||
|
||||
**Question 2 : Meilleure solution**
|
||||
- 8000 = 5000 + 1000 + 1000 + 1000 = **4 packs**
|
||||
- Ou : 8000 = 2800 + 2800 + 1000 + 1000 + 500 - 100... non ça ne marche pas non plus facilement.
|
||||
|
||||
En fait, 8000 = 5000 + 1000 × 3 = **4 packs** est la solution.
|
||||
|
||||
**Question 3 :**
|
||||
Non, ce système n'est pas canonique. L'algorithme glouton ne fonctionne pas toujours car les valeurs ne sont pas des multiples les unes des autres.
|
||||
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
## Exercice 2 : Playlist Spotify optimale
|
||||
|
||||
Tu prépares une playlist pour un trajet de **60 minutes**. Tu veux y mettre le maximum de sons parmi tes favoris :
|
||||
|
||||
| Titre | Artiste | Durée (min) |
|
||||
|-------|---------|-------------|
|
||||
| Alibi | Sevdaliza | 4 |
|
||||
| La Kiffance | Naps | 3 |
|
||||
| Bande organisée | Jul & SCH | 6 |
|
||||
| Mood | 24kGoldn | 2 |
|
||||
| Fever | Dua Lipa | 3 |
|
||||
| Blinding Lights | The Weeknd | 3 |
|
||||
| Peaches | Justin Bieber | 3 |
|
||||
| Heat Waves | Glass Animals | 4 |
|
||||
| Iko Iko | Justin Wellington | 3 |
|
||||
| Astronaut in the Ocean | Masked Wolf | 2 |
|
||||
|
||||
**Objectif** : Maximiser le nombre de titres dans la playlist sans dépasser 60 minutes.
|
||||
|
||||
1. Quelle stratégie gloutonne proposez-vous ?
|
||||
2. Appliquer cette stratégie. Combien de titres obtenez-vous ?
|
||||
3. Quelle est la durée totale de la playlist ?
|
||||
|
||||
<details>
|
||||
<summary><strong>Voir la correction</strong></summary>
|
||||
|
||||
**Question 1 : Stratégie gloutonne**
|
||||
Pour maximiser le **nombre** de titres, on prend les titres **les plus courts en premier**.
|
||||
|
||||
**Question 2 : Application**
|
||||
Tri par durée croissante :
|
||||
- Mood (2 min) → total = 2
|
||||
- Astronaut in the Ocean (2 min) → total = 4
|
||||
- La Kiffance (3 min) → total = 7
|
||||
- Fever (3 min) → total = 10
|
||||
- Blinding Lights (3 min) → total = 13
|
||||
- Peaches (3 min) → total = 16
|
||||
- Iko Iko (3 min) → total = 19
|
||||
- Alibi (4 min) → total = 23
|
||||
- Heat Waves (4 min) → total = 27
|
||||
- Bande organisée (6 min) → total = 33
|
||||
|
||||
**Tous les 10 titres** rentrent dans 60 minutes !
|
||||
|
||||
**Question 3 :**
|
||||
Durée totale : **33 minutes**
|
||||
|
||||
*Note : Dans ce cas, la contrainte de 60 min n'était pas limitante. On aurait pu ajouter d'autres titres.*
|
||||
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
## Exercice 3 : Inventaire Minecraft
|
||||
|
||||
Tu joues à Minecraft et ton inventaire peut contenir **64 objets** maximum. Tu veux maximiser la valeur totale des objets pour le commerce avec les villageois.
|
||||
|
||||
| Objet | Quantité dispo | Valeur (émeraudes) | Poids (slots) |
|
||||
|-------|----------------|-------------------|---------------|
|
||||
| Diamant | 10 | 8 | 1 |
|
||||
| Lingot d'or | 20 | 3 | 1 |
|
||||
| Fer | 50 | 1 | 1 |
|
||||
| Livre enchanté | 5 | 15 | 1 |
|
||||
| Émeraude | 30 | 1 | 1 |
|
||||
|
||||
*Chaque objet prend 1 slot, mais tu ne peux pas dépasser 64 slots au total.*
|
||||
|
||||
1. Calculer le ratio valeur/slot pour chaque objet.
|
||||
2. Appliquer l'algorithme glouton (meilleur ratio d'abord).
|
||||
3. Quelle est la valeur totale obtenue ?
|
||||
|
||||
<details>
|
||||
<summary><strong>Voir la correction</strong></summary>
|
||||
|
||||
**Question 1 : Ratios valeur/slot**
|
||||
|
||||
| Objet | Valeur | Ratio |
|
||||
|-------|--------|-------|
|
||||
| Livre enchanté | 15 | 15.0 |
|
||||
| Diamant | 8 | 8.0 |
|
||||
| Lingot d'or | 3 | 3.0 |
|
||||
| Émeraude | 1 | 1.0 |
|
||||
| Fer | 1 | 1.0 |
|
||||
|
||||
**Question 2 : Algorithme glouton**
|
||||
Tri par ratio décroissant, on prend dans l'ordre :
|
||||
- Livre enchanté : 5 objets → slots = 5, valeur = 75
|
||||
- Diamant : 10 objets → slots = 15, valeur = 75 + 80 = 155
|
||||
- Lingot d'or : 20 objets → slots = 35, valeur = 155 + 60 = 215
|
||||
- Émeraude : 29 objets (64-35=29) → slots = 64, valeur = 215 + 29 = 244
|
||||
|
||||
**Question 3 : Valeur totale**
|
||||
**244 émeraudes** avec 64 slots utilisés.
|
||||
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
## Exercice 4 : Planning de stream Twitch
|
||||
|
||||
Tu es streamer et tu dois planifier tes lives pour demain. Plusieurs marques te proposent des partenariats avec des créneaux imposés :
|
||||
|
||||
| Sponsor | Début | Fin | Rémunération |
|
||||
|---------|-------|-----|--------------|
|
||||
| Red Bull | 14h | 17h | 200€ |
|
||||
| Logitech | 15h | 18h | 180€ |
|
||||
| Samsung | 17h | 19h | 150€ |
|
||||
| Razer | 18h | 20h | 120€ |
|
||||
| Discord | 19h | 21h | 100€ |
|
||||
| NordVPN | 20h | 22h | 90€ |
|
||||
|
||||
**Objectif** : Maximiser le nombre de partenariats (pas de chevauchement possible).
|
||||
|
||||
1. Quelle stratégie gloutonne permet de maximiser le **nombre** de streams ?
|
||||
2. Appliquer cette stratégie. Quels sponsors sélectionnez-vous ?
|
||||
3. Implémenter l'algorithme en Python.
|
||||
|
||||
<details>
|
||||
<summary><strong>Voir la correction</strong></summary>
|
||||
|
||||
**Question 1 : Stratégie**
|
||||
Pour maximiser le nombre d'activités, on trie par **heure de fin croissante** et on prend chaque activité compatible.
|
||||
|
||||
**Question 2 : Application**
|
||||
Tri par heure de fin : Red Bull (17h), Logitech (18h), Samsung (19h), Razer (20h), Discord (21h), NordVPN (22h)
|
||||
|
||||
- Red Bull (14h-17h) : OK
|
||||
- Logitech (15h-18h) : chevauche Red Bull, refusé
|
||||
- Samsung (17h-19h) : commence à 17h, Red Bull finit à 17h, OK
|
||||
- Razer (18h-20h) : chevauche Samsung, refusé
|
||||
- Discord (19h-21h) : commence à 19h, Samsung finit à 19h, OK
|
||||
- NordVPN (20h-22h) : chevauche Discord, refusé
|
||||
|
||||
**Sponsors sélectionnés : Red Bull, Samsung, Discord** = 3 streams
|
||||
|
||||
Rémunération totale : 200 + 150 + 100 = **450€**
|
||||
|
||||
**Question 3 : Code Python**
|
||||
|
||||
```python
|
||||
def planning_stream(sponsors):
|
||||
"""
|
||||
sponsors : liste de tuples (nom, debut, fin, remuneration)
|
||||
Retourne la liste des sponsors sélectionnés
|
||||
"""
|
||||
# Trier par heure de fin croissante
|
||||
sponsors_tries = sorted(sponsors, key=lambda x: x[2])
|
||||
|
||||
selection = []
|
||||
derniere_fin = 0
|
||||
|
||||
for nom, debut, fin, remuneration in sponsors_tries:
|
||||
if debut >= derniere_fin:
|
||||
selection.append((nom, debut, fin, remuneration))
|
||||
derniere_fin = fin
|
||||
|
||||
return selection
|
||||
|
||||
# Exemple d'utilisation
|
||||
sponsors = [
|
||||
('Red Bull', 14, 17, 200),
|
||||
('Logitech', 15, 18, 180),
|
||||
('Samsung', 17, 19, 150),
|
||||
('Razer', 18, 20, 120),
|
||||
('Discord', 19, 21, 100),
|
||||
('NordVPN', 20, 22, 90)
|
||||
]
|
||||
|
||||
planning = planning_stream(sponsors)
|
||||
total = sum(s[3] for s in planning)
|
||||
print("Sponsors sélectionnés :")
|
||||
for nom, debut, fin, remuneration in planning:
|
||||
print(f" {nom} : {debut}h - {fin}h ({remuneration}€)")
|
||||
print(f"Rémunération totale : {total}€")
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
## Exercice 5 : Réflexion
|
||||
|
||||
1. Dans l'exercice 4, on a maximisé le **nombre** de streams. Si on voulait maximiser la **rémunération totale**, l'algorithme glouton donnerait-il le même résultat ?
|
||||
|
||||
2. Parmi ces situations, lesquelles peuvent être résolues de manière optimale par un algorithme glouton ?
|
||||
- Choisir les meilleurs joueurs pour une équipe FIFA (budget limité)
|
||||
- Organiser l'ordre de visionnage de films sur Netflix (minimiser le temps total)
|
||||
- Rendre la monnaie avec des pièces européennes
|
||||
- Trouver le chemin le plus court dans Google Maps
|
||||
|
||||
<details>
|
||||
<summary><strong>Voir la correction</strong></summary>
|
||||
|
||||
**Question 1 :**
|
||||
Non ! Pour maximiser la rémunération, l'algorithme glouton pourrait donner un résultat différent.
|
||||
|
||||
Avec notre solution (Red Bull + Samsung + Discord) : 450€
|
||||
|
||||
Si on avait pris Red Bull (200€) + Razer (120€) + NordVPN (90€) : 410€ (moins bien)
|
||||
|
||||
Mais que se passe-t-il si on prend Logitech (180€) + Discord (100€) = 280€ ? C'est pire.
|
||||
|
||||
En fait, pour ce problème précis, la solution gloutonne par heure de fin est bonne, mais **maximiser la rémunération** est un problème différent (problème du sac à dos déguisé) qui ne se résout pas toujours de manière optimale avec un glouton.
|
||||
|
||||
**Question 2 :**
|
||||
|
||||
| Situation | Optimal avec glouton ? |
|
||||
|-----------|------------------------|
|
||||
| Équipe FIFA (budget) | Non (c'est un sac à dos) |
|
||||
| Ordre films Netflix | Ça dépend du critère... |
|
||||
| Monnaie européenne | Oui (système canonique) |
|
||||
| Google Maps | Non (Dijkstra n'est pas vraiment glouton au sens strict, mais utilise une approche similaire) |
|
||||
|
||||
</details>
|
||||
|
||||
----------
|
||||
|
||||
Auteur : Florian Mathieu
|
||||
|
||||
Licence CC BY NC
|
||||
|
||||
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>
|
||||
@@ -22,16 +22,16 @@ Selon le problème on utilise une méthode pour résoudre ce dernier. Il peut ex
|
||||
|
||||
À un problème d'optimisation, on associe une fonction objective.
|
||||
|
||||
Prenons un exemple simple : la liste des 23 joueurs selectionnés pour la coupe du monde :
|
||||
Prenons un exemple simple : la liste des 23 joueurs sélectionnés pour la coupe du monde :
|
||||
|
||||
```
|
||||
Didier Desvilles est bien embêté : il doit choisir 23 joueurs pour aller jouer une compétition.
|
||||
Dans cette optique, il décide d'utiliser une méthode simple: choisir le meilleur joueur possible pour chaque poste, puis le deuxième meilleur comme remplaçant.
|
||||
|
||||
Peu importe si les joueurs selectionnés ne s'entendent pas forcément très bien, comme Olivier Gibrun et Karim Benzemb, l'important c'est de faire le meilleur choix à chaque étape.
|
||||
Peu importe si les joueurs sélectionnés ne s'entendent pas forcément très bien, comme Olivier Gibrun et Karim Benzemb, l'important c'est de faire le meilleur choix à chaque étape.
|
||||
```
|
||||
|
||||
Un algorithme glouton ne renvoie pas obligatoirement un résultat optimal, dans ce cas la, on parle ***d'heuristique.*** Il renverra un résultat optimal pour chacun des sous-problèmes.
|
||||
Un algorithme glouton ne renvoie pas obligatoirement un résultat optimal, dans ce cas-là, on parle ***d'heuristique.*** Il renverra un résultat optimal pour chacun des sous-problèmes.
|
||||
|
||||
Un algorithme glouton ne revient pas sur un sous-problème déjà traité.
|
||||
|
||||
@@ -41,23 +41,19 @@ Un algorithme glouton ne revient pas sur un sous-problème déjà traité.
|
||||
|
||||
> Le problème du rendu de monnaie s'énonce de la façon suivante : étant donné un système de monnaie (pièces et billets), comment rendre une somme donnée de façon optimale, c'est-à-dire avec le nombre minimal de pièces et billets ?
|
||||
|
||||
On veut programmer une caisse automatique qui rend de façon optimal la monnaie (le moins de pièces/billets) :
|
||||
On veut programmer une caisse automatique qui rend de façon optimale la monnaie (le moins de pièces/billets) :
|
||||
|
||||
#### **Des exemples**
|
||||
|
||||
```
|
||||
Système de monnaie : ```{1, 2, 5, 10}```
|
||||
**Exemple 1 :**
|
||||
- Système de monnaie : `{1, 2, 5, 10}`
|
||||
- Recherché : `14`
|
||||
- Résultat optimal : `10 + 2 + 2` (3 pièces)
|
||||
|
||||
Recherché : ```14```
|
||||
|
||||
Résultat optimal : 10 + 2 + 2
|
||||
```
|
||||
|
||||
Système de monnaie : ```{1, 2, 5, 7, 10}```
|
||||
|
||||
Recherché : ```14```
|
||||
|
||||
Résultat optimal : 7 + 7
|
||||
**Exemple 2 :**
|
||||
- Système de monnaie : `{1, 2, 5, 7, 10}`
|
||||
- Recherché : `14`
|
||||
- Résultat optimal : `7 + 7` (2 pièces)
|
||||
|
||||
#### **Algorithme**
|
||||
|
||||
@@ -86,9 +82,9 @@ print(rendu_monnaie(systeme_2, 14)) # Devrait afficher [10, 2, 2] qui est non o
|
||||
|
||||
```
|
||||
|
||||
Force brute avec le ```system_2``` pour ```14```:
|
||||
Force brute avec le ```systeme_2``` pour ```14```:
|
||||
|
||||
On cherche **toute** les solutions possibles :
|
||||
On cherche **toutes** les solutions possibles :
|
||||
- \[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1\]
|
||||
- \[2, 2, 2, 2, 2, 2, 2\]
|
||||
- \[5, 5, 2, 2\]
|
||||
@@ -97,7 +93,7 @@ On cherche **toute** les solutions possibles :
|
||||
- \[10, 2, 2]
|
||||
- ...
|
||||
|
||||
On parcours la liste des solutions pour garder la solution la plus optimal (la plus courte) : **\[7, 7\]**.
|
||||
On parcourt la liste des solutions pour garder la solution la plus optimale (la plus courte) : **\[7, 7\]**.
|
||||
|
||||
### Exemples de problèmes que l'on peut résoudre par algorithme glouton
|
||||
|
||||
@@ -108,20 +104,131 @@ On parcours la liste des solutions pour garder la solution la plus optimal (la p
|
||||
|
||||
### **Sac à dos**
|
||||
|
||||
2 systemes : \[(valeur, poids)\]
|
||||
> Un voleur entre dans une maison avec un sac à dos pouvant contenir un poids maximum. Il trouve plusieurs objets, chacun ayant une valeur et un poids. Quels objets doit-il prendre pour maximiser la valeur totale sans dépasser la capacité du sac ?
|
||||
|
||||
- ```[(22, 11), (5, 5), (1, 1)]``` ;
|
||||
- ```[(12, 11), (10, 5), (10, 4), (1, 1)]```.
|
||||
#### Exemple
|
||||
|
||||
Pour un poids max de ```12```.
|
||||
Objets disponibles (valeur, poids) : `[(60, 10), (100, 20), (120, 30)]`
|
||||
|
||||
Plusieurs stratégies : **valeur/poids**, **le + de valeur** ou **le poids le plus gros**.
|
||||
Capacité du sac : `50 kg`
|
||||
|
||||
La fonction (et donc le résultat optimal) dépendra de la stratégie choisie.
|
||||
#### Stratégies gloutonnes possibles
|
||||
|
||||
1. **Prendre l'objet de plus grande valeur** en premier
|
||||
2. **Prendre l'objet le plus léger** en premier
|
||||
3. **Prendre l'objet avec le meilleur ratio valeur/poids** en premier (souvent la meilleure stratégie)
|
||||
|
||||
#### Algorithme (stratégie ratio valeur/poids)
|
||||
|
||||
```python
|
||||
def sac_a_dos_glouton(objets, capacite):
|
||||
"""
|
||||
objets : liste de tuples (valeur, poids)
|
||||
capacite : poids maximum du sac
|
||||
"""
|
||||
# Calculer le ratio valeur/poids et trier par ratio décroissant
|
||||
objets_avec_ratio = [(v, p, v/p) for v, p in objets]
|
||||
objets_tries = sorted(objets_avec_ratio, key=lambda x: x[2], reverse=True)
|
||||
|
||||
poids_total = 0
|
||||
valeur_totale = 0
|
||||
sac = []
|
||||
|
||||
for valeur, poids, ratio in objets_tries:
|
||||
if poids_total + poids <= capacite:
|
||||
sac.append((valeur, poids))
|
||||
poids_total += poids
|
||||
valeur_totale += valeur
|
||||
|
||||
return sac, valeur_totale, poids_total
|
||||
|
||||
# Exemple d'utilisation
|
||||
objets = [(60, 10), (100, 20), (120, 30)]
|
||||
capacite = 50
|
||||
|
||||
sac, valeur, poids = sac_a_dos_glouton(objets, capacite)
|
||||
print(f"Objets pris : {sac}")
|
||||
print(f"Valeur totale : {valeur}, Poids total : {poids}")
|
||||
# Résultat : [(60, 10), (100, 20)] avec valeur=160 et poids=30
|
||||
# Note : ce n'est pas optimal ! L'optimal serait [(100, 20), (120, 30)] = 220
|
||||
```
|
||||
|
||||
> **Attention** : L'algorithme glouton ne donne pas toujours la solution optimale pour le problème du sac à dos !
|
||||
|
||||
---------
|
||||
|
||||
### **Voyageur de commerce**
|
||||
|
||||
Le problème du **voyageur de commerce**, est un problème d'optimisation qui, étant donné une liste de villes, et des distances entre toutes les paires de villes, détermine un plus court circuit qui visite chaque ville une et une seule fois.
|
||||
> Un voyageur de commerce doit visiter plusieurs villes exactement une fois, puis revenir à son point de départ. Quel est le chemin le plus court ?
|
||||
|
||||
#### Exemple
|
||||
|
||||
Imaginons 4 villes : A, B, C, D avec les distances suivantes :
|
||||
|
||||
| De/Vers | A | B | C | D |
|
||||
|---------|---|---|---|---|
|
||||
| A | - | 10 | 15 | 20 |
|
||||
| B | 10 | - | 35 | 25 |
|
||||
| C | 15 | 35 | - | 30 |
|
||||
| D | 20 | 25 | 30 | - |
|
||||
|
||||
#### Stratégie gloutonne : "Plus proche voisin"
|
||||
|
||||
À chaque étape, on se déplace vers la ville non visitée la plus proche.
|
||||
|
||||
```python
|
||||
def voyageur_commerce_glouton(distances, depart=0):
|
||||
"""
|
||||
distances : matrice des distances entre villes
|
||||
depart : indice de la ville de départ
|
||||
"""
|
||||
n = len(distances)
|
||||
visitees = [False] * n
|
||||
chemin = [depart]
|
||||
visitees[depart] = True
|
||||
distance_totale = 0
|
||||
|
||||
ville_actuelle = depart
|
||||
|
||||
for _ in range(n - 1):
|
||||
# Trouver la ville non visitée la plus proche
|
||||
plus_proche = None
|
||||
dist_min = float('inf')
|
||||
|
||||
for ville in range(n):
|
||||
if not visitees[ville] and distances[ville_actuelle][ville] < dist_min:
|
||||
dist_min = distances[ville_actuelle][ville]
|
||||
plus_proche = ville
|
||||
|
||||
# Se déplacer vers cette ville
|
||||
chemin.append(plus_proche)
|
||||
visitees[plus_proche] = True
|
||||
distance_totale += dist_min
|
||||
ville_actuelle = plus_proche
|
||||
|
||||
# Retour au point de départ
|
||||
distance_totale += distances[ville_actuelle][depart]
|
||||
chemin.append(depart)
|
||||
|
||||
return chemin, distance_totale
|
||||
|
||||
# Exemple d'utilisation
|
||||
distances = [
|
||||
[0, 10, 15, 20], # Distances depuis A
|
||||
[10, 0, 35, 25], # Distances depuis B
|
||||
[15, 35, 0, 30], # Distances depuis C
|
||||
[20, 25, 30, 0] # Distances depuis D
|
||||
]
|
||||
|
||||
chemin, distance = voyageur_commerce_glouton(distances, depart=0)
|
||||
villes = ['A', 'B', 'C', 'D']
|
||||
chemin_noms = [villes[i] for i in chemin]
|
||||
print(f"Chemin : {' -> '.join(chemin_noms)}")
|
||||
print(f"Distance totale : {distance}")
|
||||
# Résultat : A -> B -> D -> C -> A avec distance = 80
|
||||
```
|
||||
|
||||
> **Note** : Le problème du voyageur de commerce est un problème **NP-difficile**. Pour un grand nombre de villes, trouver la solution optimale prend un temps exponentiel. L'approche gloutonne donne une solution acceptable rapidement, mais rarement optimale.
|
||||
|
||||
--------
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ D'ordre général, on parle de distance ***euclidienne*** que l'on peut noter co
|
||||
|
||||
Distance AB de deux points A (x<sub>a</sub>, y<sub>a</sub>) et B (x<sub>b</sub>,y<sub>b</sub>) =
|
||||
$$
|
||||
AB = \sqrt{(xa - xb)^2 + (ya - yb)^2}
|
||||
AB = \sqrt{(x_a - x_b)^2 + (y_a - y_b)^2}
|
||||
$$
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ il s'agit également d'une autre mesure de distance populaire, qui mesure la val
|
||||
|
||||
|
||||
$$
|
||||
Distance (AB) = |xa - xb| + |ya - yb|
|
||||
Distance(A, B) = |x_a - x_b| + |y_a - y_b|
|
||||
$$
|
||||
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
### Exercices
|
||||
|
||||
1. **Écrire une fonction `calculer_distance`** qui prend en entrée les caractéristiques de deux Pokémon et retourne la distance euclidienne entre eux.
|
||||
1. **Écrire une fonction `calculer_distance`** qui prend en entrée les caractéristiques de deux Pokémon et retourne la distance euclidienne entre eux.
|
||||
2. **Tester la fonction** avec des exemples simples pour vérifier son bon fonctionnement
|
||||
|
||||
Conseil : n'oubliez pas d'importer la bibliothèque `pandas`qui permet de travailler avec des fichiers csv (le cours se trouve [ici](../données_en_table))
|
||||
Conseil : n'oubliez pas d'importer la bibliothèque `pandas` qui permet de travailler avec des fichiers csv (le cours se trouve [ici](../données_en_table))
|
||||
|
||||
Le fichier [pokemons.csv](pokemons.csv) qui va avec.
|
||||
|
||||
@@ -13,7 +13,7 @@ Ne pas oublier d'installer la bibliothèque pandas
|
||||
pip install --upgrade --proxy=172.16.0.253:3128 pandas
|
||||
```
|
||||
|
||||
|
||||
Pour charger les données :
|
||||
|
||||
```python
|
||||
import pandas as pd
|
||||
@@ -21,6 +21,11 @@ import pandas as pd
|
||||
pokemons = pd.read_csv('chemin/vers/pokemons.csv')
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
<details>
|
||||
<summary><strong>Voir la correction</strong></summary>
|
||||
|
||||
```python
|
||||
import numpy as np
|
||||
|
||||
@@ -35,6 +40,8 @@ pokemon2 = [85, 80] # Exemple de stats pour le Pokémon 2
|
||||
|
||||
distance = calculer_distance(pokemon1, pokemon2)
|
||||
print(f"La distance entre les deux Pokémon est : {distance}")
|
||||
|
||||
```
|
||||
|
||||
**Résultat attendu :** `La distance entre les deux Pokémon est : 31.400636936215164`
|
||||
|
||||
</details>
|
||||
|
||||
@@ -48,7 +48,7 @@ import matplotlib.pyplot as plt
|
||||
# Supposons que ces listes contiennent les statistiques d'attaque et de défense de quelques Pokémon
|
||||
attaques = [55, 75, 150, 45]
|
||||
defenses = [45, 60, 50, 65]
|
||||
noms = ['Pikachu', 'Bulbasaur', 'Charizard', 'Squirtle']
|
||||
noms = ['Pikachu', 'Bulbizarre', 'Salameche', 'Carapuce']
|
||||
|
||||
plt.figure(figsize=(10, 5)) # Définit la taille de la figure
|
||||
plt.scatter(attaques, defenses, color='red') # Crée un nuage de points avec les statistiques d'attaque et de défense
|
||||
@@ -70,6 +70,130 @@ Ce code génère un graphique en nuage de points où chaque point représente un
|
||||
|
||||
--------
|
||||
|
||||
### Implémentation de l'algorithme KNN
|
||||
|
||||
Maintenant que nous savons visualiser nos données, passons à l'implémentation de l'algorithme.
|
||||
|
||||
#### Étape 1 : Calculer la distance entre deux points
|
||||
|
||||
```python
|
||||
import math
|
||||
|
||||
def calculer_distance(point1, point2):
|
||||
"""
|
||||
Calcule la distance euclidienne entre deux points.
|
||||
point1 et point2 sont des listes de coordonnées [x, y]
|
||||
"""
|
||||
somme = 0
|
||||
for i in range(len(point1)):
|
||||
somme += (point1[i] - point2[i]) ** 2
|
||||
return math.sqrt(somme)
|
||||
|
||||
# Test
|
||||
print(calculer_distance([0, 0], [3, 4])) # Affiche 5.0
|
||||
```
|
||||
|
||||
#### Étape 2 : Trouver les k plus proches voisins
|
||||
|
||||
```python
|
||||
def trouver_voisins(echantillons, mystere, k):
|
||||
"""
|
||||
Trouve les k plus proches voisins de mystere dans echantillons.
|
||||
|
||||
Paramètres:
|
||||
echantillons : liste de dictionnaires {'coords': [x, y], 'classe': 'Type'}
|
||||
mystere : liste [x, y] du point à classifier
|
||||
k : nombre de voisins à retourner
|
||||
|
||||
Retourne:
|
||||
Liste des k plus proches voisins
|
||||
"""
|
||||
# Calculer la distance pour chaque échantillon
|
||||
distances = []
|
||||
for echantillon in echantillons:
|
||||
dist = calculer_distance(echantillon['coords'], mystere)
|
||||
distances.append({'echantillon': echantillon, 'distance': dist})
|
||||
|
||||
# Trier par distance croissante
|
||||
distances_triees = sorted(distances, key=lambda x: x['distance'])
|
||||
|
||||
# Retourner les k premiers
|
||||
return [d['echantillon'] for d in distances_triees[:k]]
|
||||
```
|
||||
|
||||
#### Étape 3 : Déterminer la classe majoritaire
|
||||
|
||||
```python
|
||||
def classe_majoritaire(voisins):
|
||||
"""
|
||||
Détermine la classe la plus représentée parmi les voisins.
|
||||
|
||||
Paramètres:
|
||||
voisins : liste de dictionnaires avec une clé 'classe'
|
||||
|
||||
Retourne:
|
||||
La classe majoritaire (str)
|
||||
"""
|
||||
compteur = {}
|
||||
for voisin in voisins:
|
||||
classe = voisin['classe']
|
||||
if classe in compteur:
|
||||
compteur[classe] += 1
|
||||
else:
|
||||
compteur[classe] = 1
|
||||
|
||||
# Trouver la classe avec le plus grand nombre
|
||||
classe_max = None
|
||||
max_count = 0
|
||||
for classe, count in compteur.items():
|
||||
if count > max_count:
|
||||
max_count = count
|
||||
classe_max = classe
|
||||
|
||||
return classe_max
|
||||
```
|
||||
|
||||
#### Étape 4 : L'algorithme KNN complet
|
||||
|
||||
```python
|
||||
def knn(echantillons, mystere, k):
|
||||
"""
|
||||
Algorithme des k plus proches voisins.
|
||||
|
||||
Paramètres:
|
||||
echantillons : liste de dictionnaires {'coords': [x, y], 'classe': 'Type'}
|
||||
mystere : liste [x, y] du point à classifier
|
||||
k : nombre de voisins à considérer
|
||||
|
||||
Retourne:
|
||||
La classe prédite pour mystere
|
||||
"""
|
||||
voisins = trouver_voisins(echantillons, mystere, k)
|
||||
return classe_majoritaire(voisins)
|
||||
```
|
||||
|
||||
#### Exemple complet
|
||||
|
||||
```python
|
||||
# Échantillon de Pokémon
|
||||
pokemons = [
|
||||
{'coords': [49, 49], 'classe': 'Eau'}, # Ecayon
|
||||
{'coords': [50, 95], 'classe': 'Psy'}, # Deoxys
|
||||
{'coords': [80, 45], 'classe': 'Psy'}, # Eoko
|
||||
{'coords': [90, 75], 'classe': 'Psy'}, # Groret
|
||||
{'coords': [90, 75], 'classe': 'Eau'}, # Tarpaud
|
||||
]
|
||||
|
||||
# Pokémon mystère à classifier
|
||||
pokemon_mystere = [65, 40]
|
||||
|
||||
# Prédiction avec k=3
|
||||
prediction = knn(pokemons, pokemon_mystere, k=3)
|
||||
print(f"Le Pokémon mystère est probablement de type : {prediction}")
|
||||
```
|
||||
|
||||
--------
|
||||
|
||||
Auteur : Florian Mathieu
|
||||
|
||||
Licence CC BY NC
|
||||
|
||||
@@ -23,7 +23,7 @@ Parmi les modèles et méthodes de classification, on peut citer :
|
||||
|
||||
- K-NN Voisins
|
||||
- Arbres de décision
|
||||
- Réseaux de neuronnes
|
||||
- Réseaux de neurones
|
||||
|
||||
----------
|
||||
|
||||
@@ -33,7 +33,7 @@ L'algorithme des *k plus proches voisins* permet de résoudre certains problème
|
||||
|
||||
Il s'agit d'une méthode de raisonnement à partir de cas connus : ce modèle va aider à prendre des décisions en recherchant un ou des cas similaires déjà résolus.
|
||||
|
||||
Attention, ici, il n'y a pas d’étape d ’apprentissage: uniquement une construction d ’un ***modèle*** à partir d’un échantillon d'apprentissage.
|
||||
Attention, KNN est un algorithme dit ***paresseux*** (*lazy learning*) : contrairement à d'autres algorithmes de classification, il n'y a pas de phase d'entraînement où un modèle est construit. L'échantillon d'apprentissage est simplement mémorisé, et tout le travail de calcul se fait au moment de la prédiction.
|
||||
|
||||
### Qu'est ce qu'un modèle ?
|
||||
|
||||
@@ -58,7 +58,7 @@ Le Professeur Chen, inventeur du Pokédex, utilise cet algorithme afin que son a
|
||||
|
||||
Pour simplifier, imaginons que les Pokemons ne possèdent que deux caractéristiques : leurs points de vie et leur valeur d'attaque. On peut prendre deux types pour commencer.
|
||||
|
||||
| Nom | Écayon | Deoxys | Éoko | Groret | Taraud |
|
||||
| Nom | Écayon | Deoxys | Éoko | Groret | Tarpaud |
|
||||
| ------------- | ------ | ------ | ---- | ------ | ------ |
|
||||
| Points de vie | 49 | 50 | 80 | 90 | 90 |
|
||||
| Attaque | 49 | 95 | 45 | 75 | 75 |
|
||||
@@ -78,7 +78,7 @@ Pour simplifier, imaginons que les Pokemons ne possèdent que deux caractéristi
|
||||
|
||||

|
||||
|
||||
Il devrait donc se trouver dans zone. On peut alors trouver ses cinq ou six plus proches voisins.
|
||||
Il devrait donc se trouver dans cette zone. On peut alors trouver ses cinq ou six plus proches voisins.
|
||||
|
||||
- Parmi ces voisins se trouvent deux Pokémons de type Eau, et trois de types Psy.
|
||||
- Le Pokémon mystère sera donc probablement de type Psy !
|
||||
@@ -95,6 +95,8 @@ D'après vous, que faut-il pour pouvoir prédire la classe d'un Pokemon donné ?
|
||||
- Un pokemon *mystère* dont on souhaite prédire la classification
|
||||
- la valeur de *k*
|
||||
|
||||
> **Comment choisir k ?** On choisit généralement k impair (pour éviter les égalités lors du vote majoritaire) et une valeur raisonnable comme √n (racine carrée du nombre d'échantillons) ou entre 5 et 7 pour de petits échantillons.
|
||||
|
||||
Une fois ces données modélisées, on peut formuler notre algorithme:
|
||||
|
||||
- Trouver dans l'échantillon, les *k* plus proches voisins du pokemon *mystère*
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## Choixpeau Magique et KNN
|
||||
|
||||
##
|
||||
|
||||
|
||||
|
||||
<img src="assets/choixpeau.jpeg" alt="ChoixpeauMagique" style="zoom: 25%;" />
|
||||
@@ -87,7 +85,7 @@ def charger_table(nom_fichier):
|
||||
"courage": int(eleve[1]),
|
||||
"loyauté": int(eleve[2]),
|
||||
"sagesse":int(eleve[3]),
|
||||
"malicez":int(eleve[4]),
|
||||
"malice":int(eleve[4]),
|
||||
"maison" : eleve[5]})
|
||||
return table
|
||||
|
||||
|
||||
@@ -1,38 +1,128 @@
|
||||
# Imports regroupés en haut du fichier (PEP 8)
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
|
||||
# Chargement des données
|
||||
pokemons = pd.read_csv('pokemons.csv')
|
||||
|
||||
# Afficher les premières lignes pour vérification
|
||||
print("=== Aperçu des données ===")
|
||||
print(pokemons.head())
|
||||
|
||||
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
# Filtrons les données pour n'avoir que les Pokémon de type Eau
|
||||
eau_pokemons = pokemons.dropna(subset=['Pokemons de type Eau'])
|
||||
|
||||
# Création du graphe
|
||||
plt.scatter(eau_pokemons['points de vie'], eau_pokemons['Pokemons de type Eau'])
|
||||
plt.title('Points de vie vs Attribut Eau des Pokémon')
|
||||
plt.xlabel('Points de vie')
|
||||
plt.ylabel('Attribut Eau')
|
||||
plt.show()
|
||||
# Restructuration des données pour avoir une colonne "type" explicite
|
||||
def restructurer_donnees(df):
|
||||
"""
|
||||
Transforme le DataFrame pour avoir des colonnes : nom, points_de_vie, attaque, type
|
||||
"""
|
||||
donnees = []
|
||||
for _, row in df.iterrows():
|
||||
if pd.notna(row['Pokemons de type Eau']):
|
||||
donnees.append({
|
||||
'nom': row['nom'],
|
||||
'points_de_vie': row['points de vie'],
|
||||
'attaque': row['Pokemons de type Eau'],
|
||||
'type': 'Eau'
|
||||
})
|
||||
elif pd.notna(row['Pokemons de type Psy']):
|
||||
donnees.append({
|
||||
'nom': row['nom'],
|
||||
'points_de_vie': row['points de vie'],
|
||||
'attaque': row['Pokemons de type Psy'],
|
||||
'type': 'Psy'
|
||||
})
|
||||
return pd.DataFrame(donnees)
|
||||
|
||||
|
||||
import numpy as np
|
||||
pokemons_clean = restructurer_donnees(pokemons)
|
||||
print("\n=== Données restructurées ===")
|
||||
print(pokemons_clean.head(10))
|
||||
|
||||
# Ajoutons un Pokémon "mystère"
|
||||
pokemon_mystere = [70, 65]
|
||||
|
||||
# Visualisation des données
|
||||
def afficher_graphique(df, pokemon_mystere=None):
|
||||
"""
|
||||
Affiche un nuage de points des Pokémon par type
|
||||
"""
|
||||
plt.figure(figsize=(10, 6))
|
||||
|
||||
# Pokémon de type Eau
|
||||
eau = df[df['type'] == 'Eau']
|
||||
plt.scatter(eau['points_de_vie'], eau['attaque'], color='blue', label='Type Eau', s=100)
|
||||
|
||||
# Pokémon de type Psy
|
||||
psy = df[df['type'] == 'Psy']
|
||||
plt.scatter(psy['points_de_vie'], psy['attaque'], color='purple', label='Type Psy', s=100)
|
||||
|
||||
# Pokémon mystère si fourni
|
||||
if pokemon_mystere:
|
||||
plt.scatter(pokemon_mystere[0], pokemon_mystere[1], color='red', marker='X', s=200, label='Mystère')
|
||||
|
||||
plt.title('Classification des Pokémon par type')
|
||||
plt.xlabel('Points de vie')
|
||||
plt.ylabel('Attaque')
|
||||
plt.legend()
|
||||
plt.grid(True)
|
||||
plt.show()
|
||||
|
||||
|
||||
# Fonction de calcul de distance euclidienne
|
||||
def calculer_distance(pokemon1, pokemon2):
|
||||
"""
|
||||
Calcule la distance euclidienne entre deux Pokémon
|
||||
pokemon1 et pokemon2 sont des listes [points_de_vie, attaque]
|
||||
"""
|
||||
return np.sqrt(np.sum(np.square(np.array(pokemon1) - np.array(pokemon2))))
|
||||
|
||||
# Calculons la distance de chaque Pokémon de type Eau au Pokémon "mystère"
|
||||
distances = eau_pokemons.apply(lambda row: calculer_distance([row['points de vie'], row['Pokemons de type Eau']], pokemon_mystere), axis=1)
|
||||
|
||||
# Ajoutons ces distances au DataFrame
|
||||
eau_pokemons['Distance au mystère'] = distances
|
||||
# Algorithme KNN complet
|
||||
def knn(df, pokemon_mystere, k=5):
|
||||
"""
|
||||
Algorithme des k plus proches voisins
|
||||
|
||||
# Affichons les Pokémon triés par leur distance au mystère
|
||||
print(eau_pokemons.sort_values(by='Distance au mystère').head())
|
||||
Paramètres:
|
||||
df : DataFrame contenant les Pokémon avec colonnes points_de_vie, attaque, type
|
||||
pokemon_mystere : liste [points_de_vie, attaque] du Pokémon à classifier
|
||||
k : nombre de voisins à considérer
|
||||
|
||||
Retourne:
|
||||
Le type prédit pour le Pokémon mystère
|
||||
"""
|
||||
# Calcul des distances pour chaque Pokémon
|
||||
df_copy = df.copy()
|
||||
df_copy['distance'] = df_copy.apply(
|
||||
lambda row: calculer_distance([row['points_de_vie'], row['attaque']], pokemon_mystere),
|
||||
axis=1
|
||||
)
|
||||
|
||||
# Tri par distance croissante et sélection des k premiers
|
||||
k_voisins = df_copy.sort_values(by='distance').head(k)
|
||||
|
||||
print(f"\n=== Les {k} plus proches voisins ===")
|
||||
print(k_voisins[['nom', 'type', 'distance']])
|
||||
|
||||
# Vote majoritaire
|
||||
type_majoritaire = k_voisins['type'].value_counts().idxmax()
|
||||
votes = k_voisins['type'].value_counts()
|
||||
|
||||
print(f"\n=== Votes ===")
|
||||
print(votes)
|
||||
|
||||
return type_majoritaire
|
||||
|
||||
|
||||
# Exemple d'utilisation
|
||||
if __name__ == "__main__":
|
||||
# Définir un Pokémon mystère (points_de_vie, attaque)
|
||||
pokemon_mystere = [65, 40]
|
||||
|
||||
# Afficher le graphique avec le Pokémon mystère
|
||||
afficher_graphique(pokemons_clean, pokemon_mystere)
|
||||
|
||||
# Appliquer l'algorithme KNN avec k=5
|
||||
type_predit = knn(pokemons_clean, pokemon_mystere, k=5)
|
||||
|
||||
print(f"\n=== Résultat ===")
|
||||
print(f"Le Pokémon mystère ({pokemon_mystere[0]} PV, {pokemon_mystere[1]} attaque) est probablement de type : {type_predit}")
|
||||
|
||||
38
knn/pokemons_knn_original.py
Normal file
38
knn/pokemons_knn_original.py
Normal file
@@ -0,0 +1,38 @@
|
||||
import pandas as pd
|
||||
|
||||
# Chargement des données
|
||||
pokemons = pd.read_csv('pokemons.csv')
|
||||
|
||||
# Afficher les premières lignes pour vérification
|
||||
print(pokemons.head())
|
||||
|
||||
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
# Filtrons les données pour n'avoir que les Pokémon de type Eau
|
||||
eau_pokemons = pokemons.dropna(subset=['Pokemons de type Eau'])
|
||||
|
||||
# Création du graphe
|
||||
plt.scatter(eau_pokemons['points de vie'], eau_pokemons['Pokemons de type Eau'])
|
||||
plt.title('Points de vie vs Attribut Eau des Pokémon')
|
||||
plt.xlabel('Points de vie')
|
||||
plt.ylabel('Attribut Eau')
|
||||
plt.show()
|
||||
|
||||
|
||||
import numpy as np
|
||||
|
||||
# Ajoutons un Pokémon "mystère"
|
||||
pokemon_mystere = [70, 65]
|
||||
|
||||
def calculer_distance(pokemon1, pokemon2):
|
||||
return np.sqrt(np.sum(np.square(np.array(pokemon1) - np.array(pokemon2))))
|
||||
|
||||
# Calculons la distance de chaque Pokémon de type Eau au Pokémon "mystère"
|
||||
distances = eau_pokemons.apply(lambda row: calculer_distance([row['points de vie'], row['Pokemons de type Eau']], pokemon_mystere), axis=1)
|
||||
|
||||
# Ajoutons ces distances au DataFrame
|
||||
eau_pokemons['Distance au mystère'] = distances
|
||||
|
||||
# Affichons les Pokémon triés par leur distance au mystère
|
||||
print(eau_pokemons.sort_values(by='Distance au mystère').head())
|
||||
@@ -1,13 +1,23 @@
|
||||
# Le web
|
||||
|
||||
> Le **Web** est le terme communément employé pour parle du World Wide Web, ou WWW, traduit en français par la toile d’araignée mondiale. Il fait référence au système hypertexte fonctionnant sur le réseau informatique mondial internet.
|
||||
> Le **Web** est le terme communément employé pour parler du World Wide Web, ou WWW, traduit en français par la toile d’araignée mondiale. Il fait référence au système hypertexte fonctionnant sur le réseau informatique mondial Internet.
|
||||
|
||||
##
|
||||
---------
|
||||
|
||||
## Sommaire
|
||||
|
||||
| Chapitre | Description |
|
||||
|----------|-------------|
|
||||
| [HTML](html/) | Structure et contenu des pages web |
|
||||
| [CSS](css/) | Mise en forme et apparence |
|
||||
| [JavaScript](js/) | Interactivité et dynamisme |
|
||||
| [Travaux Pratiques](tp/) | Exercices pratiques |
|
||||
| [Ressources](ressources/) | Mémentos et aide-mémoires |
|
||||
|
||||
---------
|
||||
|
||||
## Historique
|
||||
|
||||
|
||||
|
||||
Le "World Wide Web", plus communément appelé "Web" a été développé au CERN (Conseil Européen pour la Recherche Nucléaire) par le Britannique *Sir Timothy John Berners-Lee* et le Belge *Robert Cailliau* au début des années 90.
|
||||
|
||||
À cette époque les principaux centres de recherche mondiaux étaient déjà connectés les uns aux autres, mais pour faciliter les échanges d'information Tim Berners-Lee met au point le système hypertexte.
|
||||
@@ -57,7 +67,7 @@ Vous devriez avoir quelque chose comme ça :
|
||||
|
||||

|
||||
|
||||
Nous verrons dans un prochaine exercice ce que tout cela signifie.
|
||||
Nous verrons dans un prochain exercice ce que tout cela signifie.
|
||||
|
||||
-------
|
||||
|
||||
@@ -67,14 +77,14 @@ En attendant, si vous souhaitez en savoir plus avant d'attaquer les activités e
|
||||
|
||||
- [MDN Web Docs](https://developer.mozilla.org/fr/docs/Learn) : Une ressource complète, écrite par Mozilla, pour les développeurs web. Les guides d'apprentissage du HTML et du CSS sont excellents pour les débutants.
|
||||
- [Codecademy](https://www.codecademy.com/learn/learn-html) : Des cours interactifs pour apprendre le HTML et le CSS. Leur format pratique est excellent pour se familiariser avec ces langages.
|
||||
- [W3Schools](https://www.w3schools.com/html/) : Une autre excellente ressource avec des exemples de code et des quiz pour tester la compréhension. Il s'agit d'un site déployé par le World Wide Web Consortium, c'est à dire les personnes chargées de définir les règles d'utilisation du web.
|
||||
- [W3Schools](https://www.w3schools.com/html/) : Une autre excellente ressource avec des exemples de code et des quiz pour tester la compréhension. Il s'agit d'un site déployé par le World Wide Web Consortium, c'est-à-dire les personnes chargées de définir les règles d'utilisation du web.
|
||||
- [freeCodeCamp](https://www.freecodecamp.org/learn/responsive-web-design/) : Un cours gratuit qui couvre à la fois le HTML et le CSS, ainsi que d'autres aspects de la conception web réactive.
|
||||
|
||||
- [FlexboxFroggy](https://flexboxfroggy.com/#fr): Probablement mon outil préféré pour apprendre le CSS. En utilisant les règles du CSS, vous verrez une grenouille se déplacer sur votre écran selon ce que vous aurez écrit.
|
||||
- [Grid Garden](https://cssgridgarden.com/#fr) qui est un jeu similaire pour apprendre le CSS Grid Layout.
|
||||
- [Code With Blocks](https://codewithblocks.com/new) : Permet de mieux se représenter l'arborescence d'une page html, à l'aide de blocs.
|
||||
- [CSS Diner](https://flukeout.github.io) : Permet d'apprendre à manier les selecteurs CSS.
|
||||
- [SmolCSS](https://smolcss.dev) : Une fois que vous maitriserez le CSS...Dans une dizaine d'années donc.
|
||||
- [SmolCSS](https://smolcss.dev) : Une fois que vous maîtriserez le CSS... dans une dizaine d'années donc.
|
||||
|
||||
Enfin, vous trouverez dans le répertoire [ressources](ressources/) plusieurs documents qui vous aideront.
|
||||
|
||||
|
||||
541
web/css/CORRECTION.md
Normal file
541
web/css/CORRECTION.md
Normal file
@@ -0,0 +1,541 @@
|
||||
# Correction des exercices - CSS
|
||||
|
||||
---------
|
||||
|
||||
## Exercice 1 : Premiers styles
|
||||
|
||||
**Fichier `style.css` :**
|
||||
|
||||
```css
|
||||
/* Couleur de fond de la page */
|
||||
body {
|
||||
background-color: #f0f0f0;
|
||||
}
|
||||
|
||||
/* Titres h1 en bleu et centrés */
|
||||
h1 {
|
||||
color: blue;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* Paragraphes en Arial, taille 16px */
|
||||
p {
|
||||
font-family: Arial, sans-serif;
|
||||
font-size: 16px;
|
||||
}
|
||||
```
|
||||
|
||||
**Fichier HTML associé :**
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Exercice 1</title>
|
||||
<link rel="stylesheet" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>Mon titre principal</h1>
|
||||
<p>Ceci est un paragraphe de texte pour tester mes premiers styles CSS.</p>
|
||||
<p>Voici un deuxième paragraphe.</p>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
**Points importants :**
|
||||
- `#f0f0f0` est un gris très clair en hexadécimal
|
||||
- `sans-serif` est une police de secours si Arial n'est pas disponible
|
||||
- Les commentaires en CSS s'écrivent entre `/*` et `*/`
|
||||
|
||||
---------
|
||||
|
||||
## Exercice 2 : Les classes
|
||||
|
||||
```css
|
||||
/* Classe pour texte important */
|
||||
.important {
|
||||
color: red;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* Classe pour encadrer un élément */
|
||||
.encadre {
|
||||
border: 2px solid black;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
/* Classe pour coins arrondis */
|
||||
.arrondi {
|
||||
border-radius: 15px;
|
||||
}
|
||||
```
|
||||
|
||||
**Exemple d'utilisation en HTML :**
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Exercice 2</title>
|
||||
<link rel="stylesheet" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<p class="important">Ce texte est important !</p>
|
||||
|
||||
<p class="encadre">Ce texte est encadré.</p>
|
||||
|
||||
<p class="encadre arrondi">Ce texte est encadré avec des coins arrondis.</p>
|
||||
|
||||
<div class="important encadre arrondi">
|
||||
On peut combiner plusieurs classes sur un même élément !
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
**Points importants :**
|
||||
- Les classes commencent par un point `.` en CSS
|
||||
- On peut appliquer plusieurs classes à un élément en les séparant par des espaces
|
||||
- `font-weight: bold` met le texte en gras
|
||||
- `padding` ajoute un espace intérieur entre le contenu et la bordure
|
||||
|
||||
---------
|
||||
|
||||
## Exercice 3 : Navigation
|
||||
|
||||
**Fichier `style.css` :**
|
||||
|
||||
```css
|
||||
/* Reset des marges par défaut de la liste */
|
||||
nav ul {
|
||||
list-style: none; /* Supprime les puces */
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
display: flex; /* Affichage horizontal */
|
||||
background-color: #333;
|
||||
}
|
||||
|
||||
/* Style des éléments de liste */
|
||||
nav li {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* Style des liens */
|
||||
nav a {
|
||||
display: block;
|
||||
color: white;
|
||||
text-decoration: none; /* Supprime le soulignement */
|
||||
padding: 15px 20px;
|
||||
}
|
||||
|
||||
/* Effet au survol */
|
||||
nav a:hover {
|
||||
background-color: #555;
|
||||
color: #ffd700; /* Couleur dorée */
|
||||
}
|
||||
```
|
||||
|
||||
**Fichier HTML :**
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Navigation</title>
|
||||
<link rel="stylesheet" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<nav>
|
||||
<ul>
|
||||
<li><a href="index.html">Accueil</a></li>
|
||||
<li><a href="produits.html">Produits</a></li>
|
||||
<li><a href="services.html">Services</a></li>
|
||||
<li><a href="contact.html">Contact</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
**Points importants :**
|
||||
- `list-style: none` supprime les puces de la liste
|
||||
- `display: flex` sur le `<ul>` met les `<li>` en ligne
|
||||
- `display: block` sur les liens permet d'appliquer padding correctement
|
||||
- `:hover` est une pseudo-classe qui s'active au survol de la souris
|
||||
|
||||
---------
|
||||
|
||||
## Exercice 4 : Carte de présentation
|
||||
|
||||
**Fichier `style.css` :**
|
||||
|
||||
```css
|
||||
/* Reset de base */
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
background-color: #f5f5f5;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
/* Style de la carte */
|
||||
.carte {
|
||||
width: 300px;
|
||||
background-color: white;
|
||||
border-radius: 10px;
|
||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
|
||||
overflow: hidden; /* Pour que l'image respecte le border-radius */
|
||||
}
|
||||
|
||||
/* Image dans la carte */
|
||||
.carte img {
|
||||
width: 100%;
|
||||
height: 200px;
|
||||
object-fit: cover; /* L'image remplit l'espace sans déformation */
|
||||
}
|
||||
|
||||
/* Contenu de la carte */
|
||||
.carte-contenu {
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
.carte-contenu h2 {
|
||||
color: #333;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.carte-contenu p {
|
||||
color: #666;
|
||||
font-size: 14px;
|
||||
line-height: 1.5;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
/* Bouton stylisé */
|
||||
.bouton {
|
||||
display: inline-block;
|
||||
background-color: #007bff;
|
||||
color: white;
|
||||
padding: 10px 20px;
|
||||
text-decoration: none;
|
||||
border-radius: 5px;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.bouton:hover {
|
||||
background-color: #0056b3;
|
||||
}
|
||||
```
|
||||
|
||||
**Fichier HTML :**
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Carte de présentation</title>
|
||||
<link rel="stylesheet" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="carte">
|
||||
<img src="photo.jpg" alt="Photo de profil">
|
||||
<div class="carte-contenu">
|
||||
<h2>Jean Dupont</h2>
|
||||
<p>
|
||||
Développeur web passionné par les nouvelles technologies.
|
||||
J'aime créer des sites web modernes et accessibles.
|
||||
</p>
|
||||
<a href="#" class="bouton">En savoir plus</a>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
**Points importants :**
|
||||
- `box-shadow` crée une ombre (décalage-X, décalage-Y, flou, couleur)
|
||||
- `rgba(0, 0, 0, 0.2)` est du noir avec 20% d'opacité
|
||||
- `overflow: hidden` cache ce qui dépasse (ici, les coins de l'image)
|
||||
- `object-fit: cover` permet à l'image de remplir son conteneur sans déformation
|
||||
- `cursor: pointer` change le curseur en main sur le bouton
|
||||
|
||||
---------
|
||||
|
||||
## Exercice 5 : Centrage Flexbox
|
||||
|
||||
**Fichier `style.css` :**
|
||||
|
||||
```css
|
||||
/* Reset */
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
/* Le body prend toute la hauteur de l'écran */
|
||||
body {
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
justify-content: center; /* Centrage horizontal */
|
||||
align-items: center; /* Centrage vertical */
|
||||
background-color: #2c3e50;
|
||||
}
|
||||
|
||||
/* L'élément à centrer */
|
||||
.boite {
|
||||
background-color: #3498db;
|
||||
color: white;
|
||||
padding: 40px 60px;
|
||||
border-radius: 10px;
|
||||
font-family: Arial, sans-serif;
|
||||
font-size: 24px;
|
||||
text-align: center;
|
||||
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
```
|
||||
|
||||
**Fichier HTML :**
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Centrage Flexbox</title>
|
||||
<link rel="stylesheet" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="boite">
|
||||
Je suis parfaitement centré !
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
**Points importants :**
|
||||
- `min-height: 100vh` fait que le body prend au minimum toute la hauteur de la fenêtre
|
||||
- `vh` signifie "viewport height" (1vh = 1% de la hauteur de la fenêtre)
|
||||
- `display: flex` active le mode Flexbox
|
||||
- `justify-content: center` centre sur l'axe principal (horizontal par défaut)
|
||||
- `align-items: center` centre sur l'axe secondaire (vertical par défaut)
|
||||
|
||||
---------
|
||||
|
||||
## Exercice 6 : Mise en page complète
|
||||
|
||||
**Fichier `style.css` :**
|
||||
|
||||
```css
|
||||
/* Reset et base */
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
line-height: 1.6;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
/* ============= HEADER ============= */
|
||||
header {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
background-color: #2c3e50;
|
||||
color: white;
|
||||
padding: 15px 20px;
|
||||
z-index: 1000; /* S'assure que le header est au-dessus */
|
||||
}
|
||||
|
||||
header h1 {
|
||||
display: inline-block;
|
||||
font-size: 24px;
|
||||
}
|
||||
|
||||
/* ============= NAVIGATION ============= */
|
||||
nav {
|
||||
background-color: #34495e;
|
||||
}
|
||||
|
||||
nav ul {
|
||||
list-style: none;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
nav a {
|
||||
display: block;
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
padding: 12px 25px;
|
||||
}
|
||||
|
||||
nav a:hover {
|
||||
background-color: #2c3e50;
|
||||
}
|
||||
|
||||
/* ============= CONTENU PRINCIPAL ============= */
|
||||
.conteneur {
|
||||
display: flex;
|
||||
margin-top: 120px; /* Espace pour header + nav fixes */
|
||||
min-height: calc(100vh - 120px - 60px); /* Hauteur moins header et footer */
|
||||
}
|
||||
|
||||
/* Contenu principal (70%) */
|
||||
main {
|
||||
flex: 7; /* 70% de l'espace */
|
||||
padding: 20px;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
main h2 {
|
||||
color: #2c3e50;
|
||||
margin-bottom: 15px;
|
||||
border-bottom: 2px solid #3498db;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
main p {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
/* Barre latérale (30%) */
|
||||
aside {
|
||||
flex: 3; /* 30% de l'espace */
|
||||
padding: 20px;
|
||||
background-color: #ecf0f1;
|
||||
border-left: 1px solid #bdc3c7;
|
||||
}
|
||||
|
||||
aside h3 {
|
||||
color: #2c3e50;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
aside ul {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
aside li {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
aside a {
|
||||
color: #3498db;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
aside a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* ============= FOOTER ============= */
|
||||
footer {
|
||||
background-color: #2c3e50;
|
||||
color: white;
|
||||
text-align: center;
|
||||
padding: 20px;
|
||||
height: 60px;
|
||||
}
|
||||
```
|
||||
|
||||
**Fichier HTML :**
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Mise en page complète</title>
|
||||
<link rel="stylesheet" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<h1>Mon Site Web</h1>
|
||||
</header>
|
||||
|
||||
<nav>
|
||||
<ul>
|
||||
<li><a href="#">Accueil</a></li>
|
||||
<li><a href="#">Articles</a></li>
|
||||
<li><a href="#">Projets</a></li>
|
||||
<li><a href="#">Contact</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="conteneur">
|
||||
<main>
|
||||
<h2>Bienvenue sur mon site</h2>
|
||||
<p>
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||
Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
||||
</p>
|
||||
<p>
|
||||
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
|
||||
nisi ut aliquip ex ea commodo consequat.
|
||||
</p>
|
||||
|
||||
<h2>Mes projets récents</h2>
|
||||
<p>
|
||||
Duis aute irure dolor in reprehenderit in voluptate velit esse
|
||||
cillum dolore eu fugiat nulla pariatur.
|
||||
</p>
|
||||
</main>
|
||||
|
||||
<aside>
|
||||
<h3>Liens utiles</h3>
|
||||
<ul>
|
||||
<li><a href="#">Documentation</a></li>
|
||||
<li><a href="#">Tutoriels</a></li>
|
||||
<li><a href="#">Ressources</a></li>
|
||||
<li><a href="#">FAQ</a></li>
|
||||
</ul>
|
||||
|
||||
<h3>Catégories</h3>
|
||||
<ul>
|
||||
<li><a href="#">HTML</a></li>
|
||||
<li><a href="#">CSS</a></li>
|
||||
<li><a href="#">JavaScript</a></li>
|
||||
<li><a href="#">Python</a></li>
|
||||
</ul>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<footer>
|
||||
<p>© 2024 - Mon Site Web - Tous droits réservés</p>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
**Points importants :**
|
||||
- `position: fixed` fixe le header en haut de la page
|
||||
- `z-index` contrôle l'ordre d'empilement (plus grand = au-dessus)
|
||||
- `flex: 7` et `flex: 3` créent une proportion 70/30
|
||||
- `calc()` permet de faire des calculs (ex: `100vh - 120px`)
|
||||
- `margin-top` sur le conteneur compense la hauteur du header fixe
|
||||
|
||||
---------
|
||||
|
||||
Auteur : Florian Mathieu
|
||||
|
||||
Licence CC BY NC
|
||||
|
||||
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.
|
||||
802
web/css/README.md
Normal file
802
web/css/README.md
Normal file
@@ -0,0 +1,802 @@
|
||||
# Le CSS
|
||||
|
||||
> Le CSS (Cascading Style Sheets ou Feuilles de Style en Cascade) est le langage qui permet de mettre en forme les pages HTML. Il gère les couleurs, les polices, les espacements, la disposition des éléments, etc.
|
||||
|
||||
---------
|
||||
|
||||
## Qu'est-ce que le CSS ?
|
||||
|
||||
Le CSS **n'est pas un langage de programmation**, c'est un langage de **mise en forme**. Il vient compléter le HTML :
|
||||
|
||||
- **HTML** = Structure et contenu (le squelette)
|
||||
- **CSS** = Présentation et apparence (l'habillage)
|
||||
|
||||
### Pourquoi séparer HTML et CSS ?
|
||||
|
||||
1. **Maintenabilité** : Modifier l'apparence sans toucher au contenu
|
||||
2. **Réutilisabilité** : Un même fichier CSS pour plusieurs pages
|
||||
3. **Performances** : Le CSS est mis en cache par le navigateur
|
||||
4. **Clarté** : Code plus lisible et organisé
|
||||
|
||||
---------
|
||||
|
||||
## Intégrer du CSS
|
||||
|
||||
Il existe trois façons d'ajouter du CSS à une page HTML :
|
||||
|
||||
### 1. CSS en ligne (inline) - À éviter
|
||||
|
||||
Directement dans l'attribut `style` d'une balise :
|
||||
|
||||
```html
|
||||
<p style="color: red; font-size: 20px;">Texte rouge</p>
|
||||
```
|
||||
|
||||
> **Inconvénient** : Mélange contenu et présentation, difficile à maintenir.
|
||||
|
||||
### 2. CSS interne (dans le head)
|
||||
|
||||
Dans une balise `<style>` dans le `<head>` :
|
||||
|
||||
```html
|
||||
<head>
|
||||
<style>
|
||||
p {
|
||||
color: red;
|
||||
font-size: 20px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
```
|
||||
|
||||
> **Utilité** : Pour des styles spécifiques à une seule page.
|
||||
|
||||
### 3. CSS externe (fichier séparé) - Recommandé
|
||||
|
||||
Dans un fichier `.css` séparé, lié avec `<link>` :
|
||||
|
||||
```html
|
||||
<head>
|
||||
<link rel="stylesheet" href="style.css">
|
||||
</head>
|
||||
```
|
||||
|
||||
Fichier `style.css` :
|
||||
```css
|
||||
p {
|
||||
color: red;
|
||||
font-size: 20px;
|
||||
}
|
||||
```
|
||||
|
||||
> **Avantage** : Séparation claire, réutilisable, mise en cache.
|
||||
|
||||
---------
|
||||
|
||||
## Syntaxe CSS
|
||||
|
||||
Une règle CSS est composée de :
|
||||
|
||||
```css
|
||||
selecteur {
|
||||
propriete: valeur;
|
||||
propriete2: valeur2;
|
||||
}
|
||||
```
|
||||
|
||||
### Exemple
|
||||
|
||||
```css
|
||||
h1 {
|
||||
color: blue;
|
||||
font-size: 32px;
|
||||
text-align: center;
|
||||
}
|
||||
```
|
||||
|
||||
- **Sélecteur** : `h1` (cible tous les titres h1)
|
||||
- **Propriétés** : `color`, `font-size`, `text-align`
|
||||
- **Valeurs** : `blue`, `32px`, `center`
|
||||
|
||||
> **Important** : Chaque déclaration se termine par un point-virgule `;`
|
||||
|
||||
---------
|
||||
|
||||
## Les sélecteurs
|
||||
|
||||
Les sélecteurs permettent de cibler les éléments HTML à styliser.
|
||||
|
||||
### Sélecteurs de base
|
||||
|
||||
| Sélecteur | Exemple | Cible |
|
||||
|-----------|---------|-------|
|
||||
| Élément | `p` | Tous les `<p>` |
|
||||
| Classe | `.rouge` | Tous les éléments avec `class="rouge"` |
|
||||
| ID | `#menu` | L'élément avec `id="menu"` |
|
||||
| Universel | `*` | Tous les éléments |
|
||||
|
||||
### Exemples
|
||||
|
||||
```html
|
||||
<p>Paragraphe normal</p>
|
||||
<p class="important">Paragraphe important</p>
|
||||
<p id="intro">Introduction unique</p>
|
||||
```
|
||||
|
||||
```css
|
||||
/* Tous les paragraphes */
|
||||
p {
|
||||
font-family: Arial;
|
||||
}
|
||||
|
||||
/* Éléments avec la classe "important" */
|
||||
.important {
|
||||
color: red;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* L'élément avec l'id "intro" */
|
||||
#intro {
|
||||
font-size: 20px;
|
||||
background-color: yellow;
|
||||
}
|
||||
```
|
||||
|
||||
### Sélecteurs combinés
|
||||
|
||||
```css
|
||||
/* Descendant : p à l'intérieur de div */
|
||||
div p {
|
||||
color: blue;
|
||||
}
|
||||
|
||||
/* Enfant direct : p directement dans div */
|
||||
div > p {
|
||||
color: green;
|
||||
}
|
||||
|
||||
/* Plusieurs sélecteurs, mêmes styles */
|
||||
h1, h2, h3 {
|
||||
font-family: Georgia;
|
||||
}
|
||||
|
||||
/* Élément avec une classe spécifique */
|
||||
p.important {
|
||||
border: 1px solid red;
|
||||
}
|
||||
```
|
||||
|
||||
### Pseudo-classes
|
||||
|
||||
Les pseudo-classes ciblent un état particulier d'un élément :
|
||||
|
||||
```css
|
||||
/* Lien non visité */
|
||||
a:link {
|
||||
color: blue;
|
||||
}
|
||||
|
||||
/* Lien visité */
|
||||
a:visited {
|
||||
color: purple;
|
||||
}
|
||||
|
||||
/* Au survol de la souris */
|
||||
a:hover {
|
||||
color: red;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* Lors du clic */
|
||||
a:active {
|
||||
color: orange;
|
||||
}
|
||||
|
||||
/* Premier enfant */
|
||||
li:first-child {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* Dernier enfant */
|
||||
li:last-child {
|
||||
color: gray;
|
||||
}
|
||||
```
|
||||
|
||||
---------
|
||||
|
||||
## Les couleurs
|
||||
|
||||
### Différentes notations
|
||||
|
||||
```css
|
||||
/* Nom de couleur */
|
||||
color: red;
|
||||
color: blue;
|
||||
color: darkgreen;
|
||||
|
||||
/* Hexadécimal (#RRGGBB) */
|
||||
color: #FF0000; /* Rouge */
|
||||
color: #00FF00; /* Vert */
|
||||
color: #0000FF; /* Bleu */
|
||||
color: #FFFFFF; /* Blanc */
|
||||
color: #000000; /* Noir */
|
||||
|
||||
/* Hexadécimal court (#RGB) */
|
||||
color: #F00; /* Rouge (#FF0000) */
|
||||
|
||||
/* RGB (Red, Green, Blue) : 0-255 */
|
||||
color: rgb(255, 0, 0); /* Rouge */
|
||||
color: rgb(128, 128, 128); /* Gris */
|
||||
|
||||
/* RGBA (avec transparence : 0-1) */
|
||||
color: rgba(255, 0, 0, 0.5); /* Rouge semi-transparent */
|
||||
|
||||
/* HSL (Teinte, Saturation, Luminosité) */
|
||||
color: hsl(0, 100%, 50%); /* Rouge */
|
||||
```
|
||||
|
||||
### Propriétés utilisant les couleurs
|
||||
|
||||
```css
|
||||
color: red; /* Couleur du texte */
|
||||
background-color: yellow; /* Couleur de fond */
|
||||
border-color: black; /* Couleur de bordure */
|
||||
```
|
||||
|
||||
---------
|
||||
|
||||
## Le texte
|
||||
|
||||
### Police de caractères
|
||||
|
||||
```css
|
||||
/* Famille de police */
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
|
||||
/* Taille */
|
||||
font-size: 16px;
|
||||
font-size: 1.2em; /* Relatif à la taille parente */
|
||||
font-size: 1.2rem; /* Relatif à la taille racine (html) */
|
||||
|
||||
/* Graisse (épaisseur) */
|
||||
font-weight: normal; /* 400 */
|
||||
font-weight: bold; /* 700 */
|
||||
font-weight: 300; /* Léger */
|
||||
|
||||
/* Style */
|
||||
font-style: normal;
|
||||
font-style: italic;
|
||||
```
|
||||
|
||||
### Alignement et décoration
|
||||
|
||||
```css
|
||||
/* Alignement horizontal */
|
||||
text-align: left;
|
||||
text-align: center;
|
||||
text-align: right;
|
||||
text-align: justify;
|
||||
|
||||
/* Décoration */
|
||||
text-decoration: none; /* Supprime le soulignement */
|
||||
text-decoration: underline; /* Souligne */
|
||||
text-decoration: line-through; /* Barré */
|
||||
|
||||
/* Transformation */
|
||||
text-transform: uppercase; /* MAJUSCULES */
|
||||
text-transform: lowercase; /* minuscules */
|
||||
text-transform: capitalize; /* Première Lettre En Majuscule */
|
||||
```
|
||||
|
||||
### Espacement
|
||||
|
||||
```css
|
||||
/* Interligne */
|
||||
line-height: 1.5;
|
||||
line-height: 24px;
|
||||
|
||||
/* Espacement entre les lettres */
|
||||
letter-spacing: 2px;
|
||||
|
||||
/* Espacement entre les mots */
|
||||
word-spacing: 5px;
|
||||
|
||||
/* Retrait de première ligne */
|
||||
text-indent: 30px;
|
||||
```
|
||||
|
||||
---------
|
||||
|
||||
## Le modèle de boîte (Box Model)
|
||||
|
||||
Tout élément HTML est considéré comme une **boîte rectangulaire** composée de plusieurs couches :
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────┐
|
||||
│ margin │ ← Marge externe
|
||||
│ ┌───────────────────────────────┐ │
|
||||
│ │ border │ │ ← Bordure
|
||||
│ │ ┌─────────────────────────┐ │ │
|
||||
│ │ │ padding │ │ │ ← Marge interne
|
||||
│ │ │ ┌───────────────────┐ │ │ │
|
||||
│ │ │ │ content │ │ │ │ ← Contenu
|
||||
│ │ │ └───────────────────┘ │ │ │
|
||||
│ │ └─────────────────────────┘ │ │
|
||||
│ └───────────────────────────────┘ │
|
||||
└─────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Les propriétés
|
||||
|
||||
```css
|
||||
/* Contenu */
|
||||
width: 300px;
|
||||
height: 200px;
|
||||
|
||||
/* Marge interne (padding) */
|
||||
padding: 20px; /* Les 4 côtés */
|
||||
padding: 10px 20px; /* Vertical | Horizontal */
|
||||
padding: 10px 20px 15px 25px; /* Haut | Droite | Bas | Gauche */
|
||||
padding-top: 10px;
|
||||
padding-right: 20px;
|
||||
padding-bottom: 15px;
|
||||
padding-left: 25px;
|
||||
|
||||
/* Bordure */
|
||||
border: 1px solid black; /* Épaisseur | Style | Couleur */
|
||||
border-width: 2px;
|
||||
border-style: solid; /* solid, dashed, dotted, double... */
|
||||
border-color: red;
|
||||
border-radius: 10px; /* Coins arrondis */
|
||||
|
||||
/* Marge externe (margin) */
|
||||
margin: 20px; /* Les 4 côtés */
|
||||
margin: 10px 20px; /* Vertical | Horizontal */
|
||||
margin: 0 auto; /* Centrer horizontalement */
|
||||
margin-top: 10px;
|
||||
```
|
||||
|
||||
### Box-sizing
|
||||
|
||||
Par défaut, `width` et `height` ne concernent que le contenu. Pour inclure padding et border :
|
||||
|
||||
```css
|
||||
/* Recommandé : appliquer à tous les éléments */
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
```
|
||||
|
||||
---------
|
||||
|
||||
## Les dimensions et unités
|
||||
|
||||
### Unités absolues
|
||||
|
||||
| Unité | Description |
|
||||
|-------|-------------|
|
||||
| `px` | Pixels |
|
||||
| `cm`, `mm` | Centimètres, millimètres |
|
||||
| `pt` | Points (1pt = 1/72 inch) |
|
||||
|
||||
### Unités relatives
|
||||
|
||||
| Unité | Description |
|
||||
|-------|-------------|
|
||||
| `%` | Pourcentage du parent |
|
||||
| `em` | Relatif à la taille de police du parent |
|
||||
| `rem` | Relatif à la taille de police de `<html>` |
|
||||
| `vw` | 1% de la largeur de la fenêtre |
|
||||
| `vh` | 1% de la hauteur de la fenêtre |
|
||||
|
||||
### Exemples
|
||||
|
||||
```css
|
||||
/* Largeur fixe */
|
||||
width: 300px;
|
||||
|
||||
/* Largeur relative au parent */
|
||||
width: 50%;
|
||||
|
||||
/* Largeur relative à la fenêtre */
|
||||
width: 80vw;
|
||||
|
||||
/* Largeur maximale */
|
||||
max-width: 1200px;
|
||||
|
||||
/* Largeur minimale */
|
||||
min-width: 300px;
|
||||
```
|
||||
|
||||
---------
|
||||
|
||||
## Les bordures et arrondis
|
||||
|
||||
```css
|
||||
/* Bordure simple */
|
||||
border: 2px solid black;
|
||||
|
||||
/* Bordure par côté */
|
||||
border-top: 3px dashed red;
|
||||
border-bottom: 1px dotted blue;
|
||||
|
||||
/* Coins arrondis */
|
||||
border-radius: 10px; /* Tous les coins */
|
||||
border-radius: 10px 20px; /* Haut-gauche/Bas-droite | Haut-droite/Bas-gauche */
|
||||
border-radius: 50%; /* Cercle parfait (si carré) */
|
||||
|
||||
/* Ombre de boîte */
|
||||
box-shadow: 5px 5px 10px rgba(0,0,0,0.3);
|
||||
/* Décalage-X | Décalage-Y | Flou | Couleur */
|
||||
```
|
||||
|
||||
---------
|
||||
|
||||
## Les arrière-plans
|
||||
|
||||
```css
|
||||
/* Couleur de fond */
|
||||
background-color: lightblue;
|
||||
|
||||
/* Image de fond */
|
||||
background-image: url('image.jpg');
|
||||
|
||||
/* Répétition */
|
||||
background-repeat: no-repeat;
|
||||
background-repeat: repeat-x;
|
||||
background-repeat: repeat-y;
|
||||
|
||||
/* Position */
|
||||
background-position: center;
|
||||
background-position: top right;
|
||||
background-position: 50% 50%;
|
||||
|
||||
/* Taille */
|
||||
background-size: cover; /* Couvre tout l'élément */
|
||||
background-size: contain; /* Image entière visible */
|
||||
background-size: 100px 200px;
|
||||
|
||||
/* Raccourci */
|
||||
background: url('image.jpg') no-repeat center/cover;
|
||||
```
|
||||
|
||||
---------
|
||||
|
||||
## L'affichage (display)
|
||||
|
||||
La propriété `display` contrôle le comportement d'affichage :
|
||||
|
||||
```css
|
||||
/* Bloc : prend toute la largeur, retour à la ligne avant/après */
|
||||
display: block; /* div, p, h1... */
|
||||
|
||||
/* En ligne : prend juste la place du contenu, pas de retour à la ligne */
|
||||
display: inline; /* span, a, strong... */
|
||||
|
||||
/* En ligne-bloc : comme inline mais accepte width/height */
|
||||
display: inline-block;
|
||||
|
||||
/* Masquer un élément */
|
||||
display: none;
|
||||
```
|
||||
|
||||
### Différences block vs inline
|
||||
|
||||
| Propriété | Block | Inline |
|
||||
|-----------|-------|--------|
|
||||
| Largeur | 100% du parent | Contenu seulement |
|
||||
| Hauteur | Ajustable | Contenu seulement |
|
||||
| Retour à la ligne | Oui | Non |
|
||||
| Margin/Padding | Tous les côtés | Gauche/Droite seulement |
|
||||
|
||||
---------
|
||||
|
||||
## Le positionnement
|
||||
|
||||
### Position static (par défaut)
|
||||
|
||||
```css
|
||||
position: static; /* Flux normal du document */
|
||||
```
|
||||
|
||||
### Position relative
|
||||
|
||||
L'élément reste dans le flux mais peut être décalé :
|
||||
|
||||
```css
|
||||
position: relative;
|
||||
top: 20px; /* Décale de 20px vers le bas */
|
||||
left: 10px; /* Décale de 10px vers la droite */
|
||||
```
|
||||
|
||||
### Position absolute
|
||||
|
||||
L'élément sort du flux et se positionne par rapport à son parent positionné :
|
||||
|
||||
```css
|
||||
.parent {
|
||||
position: relative; /* Référence pour l'enfant */
|
||||
}
|
||||
|
||||
.enfant {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0; /* Coin supérieur droit du parent */
|
||||
}
|
||||
```
|
||||
|
||||
### Position fixed
|
||||
|
||||
L'élément reste fixe par rapport à la fenêtre :
|
||||
|
||||
```css
|
||||
.menu-fixe {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
}
|
||||
```
|
||||
|
||||
### Position sticky
|
||||
|
||||
Hybride entre relative et fixed :
|
||||
|
||||
```css
|
||||
.titre {
|
||||
position: sticky;
|
||||
top: 0; /* Reste collé en haut lors du défilement */
|
||||
}
|
||||
```
|
||||
|
||||
---------
|
||||
|
||||
## Flexbox (disposition flexible)
|
||||
|
||||
Flexbox permet de créer des mises en page flexibles facilement.
|
||||
|
||||
### Conteneur flex
|
||||
|
||||
```css
|
||||
.conteneur {
|
||||
display: flex;
|
||||
}
|
||||
```
|
||||
|
||||
### Direction des éléments
|
||||
|
||||
```css
|
||||
flex-direction: row; /* En ligne (défaut) */
|
||||
flex-direction: row-reverse; /* En ligne inversée */
|
||||
flex-direction: column; /* En colonne */
|
||||
flex-direction: column-reverse; /* En colonne inversée */
|
||||
```
|
||||
|
||||
### Alignement horizontal (axe principal)
|
||||
|
||||
```css
|
||||
justify-content: flex-start; /* Au début */
|
||||
justify-content: flex-end; /* À la fin */
|
||||
justify-content: center; /* Au centre */
|
||||
justify-content: space-between; /* Espace entre les éléments */
|
||||
justify-content: space-around; /* Espace autour des éléments */
|
||||
justify-content: space-evenly; /* Espace égal partout */
|
||||
```
|
||||
|
||||
### Alignement vertical (axe secondaire)
|
||||
|
||||
```css
|
||||
align-items: stretch; /* Étiré (défaut) */
|
||||
align-items: flex-start; /* En haut */
|
||||
align-items: flex-end; /* En bas */
|
||||
align-items: center; /* Au centre */
|
||||
```
|
||||
|
||||
### Retour à la ligne
|
||||
|
||||
```css
|
||||
flex-wrap: nowrap; /* Pas de retour (défaut) */
|
||||
flex-wrap: wrap; /* Retour à la ligne */
|
||||
```
|
||||
|
||||
### Exemple : centrer un élément
|
||||
|
||||
```css
|
||||
.conteneur {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 100vh;
|
||||
}
|
||||
```
|
||||
|
||||
> **Ressource** : [Flexbox Froggy](https://flexboxfroggy.com/#fr) pour s'entraîner de façon ludique.
|
||||
|
||||
---------
|
||||
|
||||
## Les transitions et animations
|
||||
|
||||
### Transitions
|
||||
|
||||
Les transitions permettent d'animer le changement d'une propriété :
|
||||
|
||||
```css
|
||||
.bouton {
|
||||
background-color: blue;
|
||||
transition: background-color 0.3s ease;
|
||||
}
|
||||
|
||||
.bouton:hover {
|
||||
background-color: red;
|
||||
}
|
||||
```
|
||||
|
||||
Syntaxe complète :
|
||||
```css
|
||||
transition: propriété durée fonction délai;
|
||||
transition: all 0.5s ease-in-out 0.1s;
|
||||
```
|
||||
|
||||
Fonctions de timing :
|
||||
- `ease` : Lent-rapide-lent (défaut)
|
||||
- `linear` : Vitesse constante
|
||||
- `ease-in` : Démarre lentement
|
||||
- `ease-out` : Finit lentement
|
||||
- `ease-in-out` : Lent aux deux extrémités
|
||||
|
||||
### Animations
|
||||
|
||||
```css
|
||||
/* Définir l'animation */
|
||||
@keyframes apparition {
|
||||
0% {
|
||||
opacity: 0;
|
||||
transform: translateY(-20px);
|
||||
}
|
||||
100% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
/* Appliquer l'animation */
|
||||
.element {
|
||||
animation: apparition 1s ease forwards;
|
||||
}
|
||||
```
|
||||
|
||||
---------
|
||||
|
||||
## Les transformations
|
||||
|
||||
```css
|
||||
/* Déplacement */
|
||||
transform: translateX(50px);
|
||||
transform: translateY(20px);
|
||||
transform: translate(50px, 20px);
|
||||
|
||||
/* Rotation */
|
||||
transform: rotate(45deg);
|
||||
|
||||
/* Échelle (zoom) */
|
||||
transform: scale(1.5); /* Agrandit de 50% */
|
||||
transform: scale(0.5); /* Réduit de 50% */
|
||||
|
||||
/* Inclinaison */
|
||||
transform: skew(10deg);
|
||||
|
||||
/* Combinaisons */
|
||||
transform: rotate(45deg) scale(1.2) translateX(10px);
|
||||
```
|
||||
|
||||
---------
|
||||
|
||||
## Bonnes pratiques CSS
|
||||
|
||||
1. **Organiser son code** avec des commentaires
|
||||
```css
|
||||
/* ============= HEADER ============= */
|
||||
/* ============= NAVIGATION ============= */
|
||||
/* ============= CONTENU ============= */
|
||||
```
|
||||
|
||||
2. **Utiliser des classes plutôt que des IDs** pour plus de flexibilité
|
||||
|
||||
3. **Éviter les sélecteurs trop spécifiques**
|
||||
```css
|
||||
/* Éviter */
|
||||
div.container ul li a.link { }
|
||||
|
||||
/* Préférer */
|
||||
.nav-link { }
|
||||
```
|
||||
|
||||
4. **Utiliser des noms de classes descriptifs**
|
||||
```css
|
||||
/* Éviter */
|
||||
.rouge { }
|
||||
.grand { }
|
||||
|
||||
/* Préférer */
|
||||
.bouton-principal { }
|
||||
.titre-section { }
|
||||
```
|
||||
|
||||
5. **Réinitialiser les styles par défaut**
|
||||
```css
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
```
|
||||
|
||||
6. **Mobile-first** : Concevoir d'abord pour mobile, puis adapter pour écrans larges
|
||||
|
||||
---------
|
||||
|
||||
## Exercices
|
||||
|
||||
### Exercice 1 : Premiers styles
|
||||
|
||||
Créez un fichier `style.css` qui :
|
||||
- Change la couleur de fond de la page en gris clair (#f0f0f0)
|
||||
- Met tous les titres h1 en bleu et centrés
|
||||
- Met tous les paragraphes en police Arial avec une taille de 16px
|
||||
|
||||
### Exercice 2 : Les classes
|
||||
|
||||
Créez les styles pour :
|
||||
- Une classe `.important` qui met le texte en rouge et en gras
|
||||
- Une classe `.encadre` qui ajoute une bordure noire de 2px et un padding de 10px
|
||||
- Une classe `.arrondi` qui ajoute des coins arrondis de 15px
|
||||
|
||||
### Exercice 3 : Navigation
|
||||
|
||||
Créez un menu de navigation horizontal avec :
|
||||
- Une liste `<ul>` avec `display: flex`
|
||||
- Les liens sans soulignement
|
||||
- Un effet au survol (changement de couleur)
|
||||
|
||||
### Exercice 4 : Carte de présentation
|
||||
|
||||
Créez une "carte" de présentation avec :
|
||||
- Une largeur de 300px
|
||||
- Une ombre légère
|
||||
- Des coins arrondis
|
||||
- Une image en haut
|
||||
- Un titre et un paragraphe en dessous
|
||||
- Un bouton stylisé
|
||||
|
||||
### Exercice 5 : Centrage Flexbox
|
||||
|
||||
Créez une page avec un élément parfaitement centré (horizontalement et verticalement) en utilisant Flexbox.
|
||||
|
||||
### Exercice 6 : Mise en page complète
|
||||
|
||||
Créez une mise en page avec :
|
||||
- Un header fixe en haut
|
||||
- Un menu de navigation
|
||||
- Un contenu principal à deux colonnes (70% contenu, 30% barre latérale)
|
||||
- Un footer en bas
|
||||
|
||||
> **[Voir la correction](./CORRECTION.md)**
|
||||
|
||||
---------
|
||||
|
||||
## Ressources
|
||||
|
||||
- [MDN - CSS](https://developer.mozilla.org/fr/docs/Web/CSS) : Documentation complète
|
||||
- [W3Schools - CSS](https://www.w3schools.com/css/) : Tutoriels et exemples
|
||||
- [Flexbox Froggy](https://flexboxfroggy.com/#fr) : Apprendre Flexbox en jouant
|
||||
- [CSS Grid Garden](https://cssgridgarden.com/#fr) : Apprendre Grid en jouant
|
||||
- [CSS Diner](https://flukeout.github.io/) : Maîtriser les sélecteurs
|
||||
|
||||
---------
|
||||
|
||||
Auteur : Florian Mathieu
|
||||
|
||||
Licence CC BY NC
|
||||
|
||||
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.
|
||||
333
web/html/CORRECTION.md
Normal file
333
web/html/CORRECTION.md
Normal file
@@ -0,0 +1,333 @@
|
||||
# Correction des exercices - HTML
|
||||
|
||||
---------
|
||||
|
||||
## Exercice 1 : Structure de base
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Ma première page</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Bienvenue</h1>
|
||||
|
||||
<p>
|
||||
Bonjour et bienvenue sur ma première page web !
|
||||
Je suis en train d'apprendre le HTML en cours de NSI.
|
||||
</p>
|
||||
|
||||
<a href="https://www.google.fr">Aller sur Google</a>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
**Points importants :**
|
||||
- Le `<!DOCTYPE html>` indique qu'il s'agit d'HTML5
|
||||
- L'attribut `lang="fr"` précise la langue du document
|
||||
- Le `charset="UTF-8"` permet d'afficher les accents
|
||||
- Le `<title>` apparaît dans l'onglet du navigateur
|
||||
- Le contenu visible est dans le `<body>`
|
||||
|
||||
---------
|
||||
|
||||
## Exercice 2 : Les listes
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Mes listes</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Mes films préférés</h1>
|
||||
|
||||
<ul>
|
||||
<li>Inception</li>
|
||||
<li>Interstellar</li>
|
||||
<li>Le Seigneur des Anneaux</li>
|
||||
<li>Matrix</li>
|
||||
<li>Retour vers le Futur</li>
|
||||
</ul>
|
||||
|
||||
<h1>Comment faire des pâtes</h1>
|
||||
|
||||
<ol>
|
||||
<li>Faire bouillir de l'eau dans une grande casserole</li>
|
||||
<li>Ajouter du sel dans l'eau bouillante</li>
|
||||
<li>Verser les pâtes dans l'eau</li>
|
||||
<li>Laisser cuire selon le temps indiqué sur le paquet</li>
|
||||
<li>Égoutter les pâtes</li>
|
||||
<li>Ajouter la sauce de votre choix</li>
|
||||
<li>Servir et déguster !</li>
|
||||
</ol>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
**Points importants :**
|
||||
- `<ul>` pour une liste non ordonnée (puces)
|
||||
- `<ol>` pour une liste ordonnée (numérotée)
|
||||
- Chaque élément de liste est dans une balise `<li>`
|
||||
|
||||
---------
|
||||
|
||||
## Exercice 3 : Images et liens
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Images et liens</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Ma page avec images et liens</h1>
|
||||
|
||||
<!-- Image simple -->
|
||||
<img src="paysage.jpg" alt="Un magnifique paysage de montagne">
|
||||
|
||||
<!-- Lien vers Wikipédia dans un nouvel onglet -->
|
||||
<p>
|
||||
<a href="https://fr.wikipedia.org" target="_blank">
|
||||
Visiter Wikipédia (nouvel onglet)
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<!-- Image cliquable -->
|
||||
<p>
|
||||
<a href="https://unsplash.com">
|
||||
<img src="paysage.jpg" alt="Cliquez pour voir la source de l'image">
|
||||
</a>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
**Points importants :**
|
||||
- L'attribut `alt` est obligatoire pour l'accessibilité
|
||||
- `target="_blank"` ouvre le lien dans un nouvel onglet
|
||||
- Pour rendre une image cliquable, on l'entoure d'une balise `<a>`
|
||||
|
||||
---------
|
||||
|
||||
## Exercice 4 : Tableau
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Mes notes</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Bulletin de notes</h1>
|
||||
|
||||
<table border="1">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Matière</th>
|
||||
<th>Coefficient</th>
|
||||
<th>Moyenne</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Maths</td>
|
||||
<td>4</td>
|
||||
<td>14</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>NSI</td>
|
||||
<td>4</td>
|
||||
<td>16</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Français</td>
|
||||
<td>3</td>
|
||||
<td>12</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
**Points importants :**
|
||||
- `<thead>` contient l'en-tête du tableau
|
||||
- `<tbody>` contient le corps du tableau
|
||||
- `<tr>` définit une ligne (table row)
|
||||
- `<th>` définit une cellule d'en-tête (table header)
|
||||
- `<td>` définit une cellule de données (table data)
|
||||
- L'attribut `border="1"` ajoute une bordure (en pratique, on utilise le CSS)
|
||||
|
||||
---------
|
||||
|
||||
## Exercice 5 : Formulaire
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Inscription</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Formulaire d'inscription</h1>
|
||||
|
||||
<form action="traitement.php" method="post">
|
||||
<p>
|
||||
<label for="nom">Nom :</label>
|
||||
<input type="text" id="nom" name="nom" required>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<label for="email">Email :</label>
|
||||
<input type="email" id="email" name="email" required>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<label for="mdp">Mot de passe :</label>
|
||||
<input type="password" id="mdp" name="mdp">
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<input type="checkbox" id="cgu" name="cgu" required>
|
||||
<label for="cgu">J'accepte les conditions générales d'utilisation</label>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<button type="submit">S'inscrire</button>
|
||||
</p>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
**Points importants :**
|
||||
- L'attribut `required` rend le champ obligatoire
|
||||
- `type="email"` vérifie automatiquement le format de l'email
|
||||
- `type="password"` masque la saisie
|
||||
- Le `for` du label doit correspondre à l'`id` du champ
|
||||
- `type="checkbox"` crée une case à cocher
|
||||
|
||||
---------
|
||||
|
||||
## Exercice 6 : Page complète
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Le Python - Langage de programmation</title>
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<h1>Le Python</h1>
|
||||
<nav>
|
||||
<ul>
|
||||
<li><a href="#introduction">Introduction</a></li>
|
||||
<li><a href="#historique">Historique</a></li>
|
||||
<li><a href="#utilisations">Utilisations</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<article>
|
||||
<h2 id="introduction">Introduction au Python</h2>
|
||||
|
||||
<p>
|
||||
Python est un langage de programmation interprété, multiparadigme
|
||||
et multiplateformes. Il favorise la programmation impérative structurée,
|
||||
fonctionnelle et orientée objet.
|
||||
</p>
|
||||
|
||||
<img src="python-logo.png" alt="Logo du langage Python">
|
||||
|
||||
<p>
|
||||
Python est apprécié par les débutants pour sa syntaxe claire et lisible,
|
||||
qui utilise l'indentation pour délimiter les blocs de code.
|
||||
</p>
|
||||
|
||||
<h2 id="historique">Historique</h2>
|
||||
|
||||
<p>
|
||||
Python a été créé par Guido van Rossum et la première version
|
||||
a été publiée en 1991. Le nom "Python" fait référence aux
|
||||
Monty Python, groupe d'humoristes britanniques.
|
||||
</p>
|
||||
|
||||
<h2 id="utilisations">Utilisations</h2>
|
||||
|
||||
<p>Python est utilisé dans de nombreux domaines :</p>
|
||||
|
||||
<table border="1">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Domaine</th>
|
||||
<th>Exemples</th>
|
||||
<th>Bibliothèques</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Data Science</td>
|
||||
<td>Analyse de données</td>
|
||||
<td>Pandas, NumPy</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Intelligence Artificielle</td>
|
||||
<td>Machine Learning</td>
|
||||
<td>TensorFlow, PyTorch</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Web</td>
|
||||
<td>Sites web</td>
|
||||
<td>Django, Flask</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Automatisation</td>
|
||||
<td>Scripts</td>
|
||||
<td>Selenium, Beautiful Soup</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<aside>
|
||||
<h3>Ressources utiles</h3>
|
||||
<ul>
|
||||
<li><a href="https://www.python.org" target="_blank">Site officiel</a></li>
|
||||
<li><a href="https://docs.python.org/fr/" target="_blank">Documentation</a></li>
|
||||
</ul>
|
||||
</aside>
|
||||
|
||||
<footer>
|
||||
<p>© 2024 - Page créée dans le cadre du cours de NSI</p>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
**Points importants :**
|
||||
- Structure sémantique avec `<header>`, `<nav>`, `<main>`, `<article>`, `<aside>`, `<footer>`
|
||||
- Navigation avec des ancres (`#introduction`, `#historique`, `#utilisations`)
|
||||
- Les `id` sur les titres permettent de créer des liens internes
|
||||
- `©` affiche le symbole copyright ©
|
||||
- `target="_blank"` pour les liens externes
|
||||
|
||||
---------
|
||||
|
||||
Auteur : Florian Mathieu
|
||||
|
||||
Licence CC BY NC
|
||||
|
||||
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.
|
||||
579
web/html/README.md
Normal file
579
web/html/README.md
Normal file
@@ -0,0 +1,579 @@
|
||||
# Le HTML
|
||||
|
||||
> Le HTML (HyperText Markup Language) est le langage de balisage utilisé pour structurer le contenu des pages web. Il définit ce que contient une page : texte, images, liens, etc.
|
||||
|
||||
---------
|
||||
|
||||
## Qu'est-ce que le HTML ?
|
||||
|
||||
Le HTML n'est **pas un langage de programmation** : c'est un **langage de description** (ou de balisage). Il ne permet pas de faire des calculs, des boucles ou des conditions comme Python. Son rôle est de **structurer** le contenu d'une page web.
|
||||
|
||||
### Principe des balises
|
||||
|
||||
Le HTML fonctionne avec des **balises** (tags en anglais). Une balise est un mot-clé entouré de chevrons `< >`.
|
||||
|
||||
La plupart des balises fonctionnent **par paires** :
|
||||
- Une balise **ouvrante** : `<balise>`
|
||||
- Une balise **fermante** : `</balise>` (avec un slash `/`)
|
||||
|
||||
```html
|
||||
<p>Ceci est un paragraphe</p>
|
||||
```
|
||||
|
||||
Certaines balises sont **auto-fermantes** (elles n'ont pas de contenu) :
|
||||
```html
|
||||
<br> <!-- Retour à la ligne -->
|
||||
<hr> <!-- Ligne horizontale -->
|
||||
<img> <!-- Image -->
|
||||
```
|
||||
|
||||
### Les attributs
|
||||
|
||||
Les balises peuvent avoir des **attributs** qui apportent des informations supplémentaires :
|
||||
|
||||
```html
|
||||
<balise attribut="valeur">Contenu</balise>
|
||||
```
|
||||
|
||||
Exemples :
|
||||
```html
|
||||
<a href="https://www.google.fr">Lien vers Google</a>
|
||||
<img src="photo.jpg" alt="Description de l'image">
|
||||
```
|
||||
|
||||
---------
|
||||
|
||||
## Structure d'une page HTML5
|
||||
|
||||
Toute page HTML5 doit respecter une structure minimale :
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Titre de ma page</title>
|
||||
</head>
|
||||
<body>
|
||||
<!-- Le contenu visible de la page -->
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
### Explication de chaque élément
|
||||
|
||||
| Élément | Rôle |
|
||||
|---------|------|
|
||||
| `<!DOCTYPE html>` | Indique au navigateur qu'il s'agit d'un document HTML5 |
|
||||
| `<html lang="fr">` | Élément racine, contient toute la page. L'attribut `lang` précise la langue |
|
||||
| `<head>` | En-tête du document (métadonnées, titre, liens CSS...). **Non visible** |
|
||||
| `<meta charset="UTF-8">` | Définit l'encodage des caractères (UTF-8 pour les accents) |
|
||||
| `<title>` | Titre affiché dans l'onglet du navigateur |
|
||||
| `<body>` | Corps du document. **Contenu visible** de la page |
|
||||
|
||||
### Arborescence HTML
|
||||
|
||||
Une page HTML forme une **arborescence** (structure en arbre) :
|
||||
|
||||
```
|
||||
html
|
||||
├── head
|
||||
│ ├── meta
|
||||
│ └── title
|
||||
└── body
|
||||
├── h1
|
||||
├── p
|
||||
└── ...
|
||||
```
|
||||
|
||||
Les éléments à l'intérieur d'autres éléments sont appelés **enfants**. L'élément qui les contient est leur **parent**.
|
||||
|
||||
---------
|
||||
|
||||
## Les balises de texte
|
||||
|
||||
### Titres
|
||||
|
||||
HTML propose 6 niveaux de titres, de `<h1>` (le plus important) à `<h6>` (le moins important) :
|
||||
|
||||
```html
|
||||
<h1>Titre principal</h1>
|
||||
<h2>Titre de section</h2>
|
||||
<h3>Sous-titre</h3>
|
||||
<h4>Titre de niveau 4</h4>
|
||||
<h5>Titre de niveau 5</h5>
|
||||
<h6>Titre de niveau 6</h6>
|
||||
```
|
||||
|
||||
> **Bonne pratique** : Une page ne devrait avoir qu'un seul `<h1>`. Les titres doivent être hiérarchiques (pas de `<h3>` après un `<h1>` sans `<h2>` entre les deux).
|
||||
|
||||
### Paragraphes et mise en forme
|
||||
|
||||
```html
|
||||
<p>Un paragraphe de texte.</p>
|
||||
|
||||
<strong>Texte important (gras)</strong>
|
||||
<em>Texte mis en emphase (italique)</em>
|
||||
<mark>Texte surligné</mark>
|
||||
<del>Texte barré</del>
|
||||
<sub>Texte en indice</sub> (comme H<sub>2</sub>O)
|
||||
<sup>Texte en exposant</sup> (comme 2<sup>3</sup>)
|
||||
```
|
||||
|
||||
### Retour à la ligne et séparation
|
||||
|
||||
```html
|
||||
<br> <!-- Retour à la ligne simple -->
|
||||
<hr> <!-- Ligne de séparation horizontale -->
|
||||
```
|
||||
|
||||
---------
|
||||
|
||||
## Les liens hypertextes
|
||||
|
||||
Les liens sont créés avec la balise `<a>` (anchor = ancre) :
|
||||
|
||||
```html
|
||||
<a href="https://www.exemple.fr">Texte du lien</a>
|
||||
```
|
||||
|
||||
### Attributs importants
|
||||
|
||||
| Attribut | Rôle |
|
||||
|----------|------|
|
||||
| `href` | URL de destination (obligatoire) |
|
||||
| `target="_blank"` | Ouvre le lien dans un nouvel onglet |
|
||||
| `title` | Info-bulle au survol |
|
||||
|
||||
### Types de liens
|
||||
|
||||
```html
|
||||
<!-- Lien externe (vers un autre site) -->
|
||||
<a href="https://www.google.fr">Google</a>
|
||||
|
||||
<!-- Lien interne (vers une autre page du site) -->
|
||||
<a href="contact.html">Page contact</a>
|
||||
|
||||
<!-- Lien vers un fichier -->
|
||||
<a href="documents/rapport.pdf">Télécharger le PDF</a>
|
||||
|
||||
<!-- Lien vers une ancre (même page) -->
|
||||
<a href="#section2">Aller à la section 2</a>
|
||||
|
||||
<!-- Lien email -->
|
||||
<a href="mailto:contact@exemple.fr">Envoyer un email</a>
|
||||
```
|
||||
|
||||
### Créer une ancre
|
||||
|
||||
Pour créer un point d'ancrage dans la page :
|
||||
|
||||
```html
|
||||
<h2 id="section2">Section 2</h2>
|
||||
```
|
||||
|
||||
Le lien `<a href="#section2">` amènera directement à cet élément.
|
||||
|
||||
---------
|
||||
|
||||
## Les images
|
||||
|
||||
Les images sont insérées avec la balise `<img>` (auto-fermante) :
|
||||
|
||||
```html
|
||||
<img src="chemin/vers/image.jpg" alt="Description de l'image">
|
||||
```
|
||||
|
||||
### Attributs obligatoires
|
||||
|
||||
| Attribut | Rôle |
|
||||
|----------|------|
|
||||
| `src` | Chemin vers l'image (obligatoire) |
|
||||
| `alt` | Texte alternatif si l'image ne charge pas (obligatoire pour l'accessibilité) |
|
||||
|
||||
### Attributs optionnels
|
||||
|
||||
```html
|
||||
<img src="photo.jpg" alt="Photo de vacances" width="400" height="300">
|
||||
```
|
||||
|
||||
### Formats d'images courants
|
||||
|
||||
| Format | Extension | Utilisation |
|
||||
|--------|-----------|-------------|
|
||||
| JPEG | .jpg, .jpeg | Photos |
|
||||
| PNG | .png | Images avec transparence |
|
||||
| GIF | .gif | Animations simples |
|
||||
| SVG | .svg | Images vectorielles |
|
||||
| WebP | .webp | Format moderne (compression optimisée) |
|
||||
|
||||
### Image cliquable (lien)
|
||||
|
||||
```html
|
||||
<a href="https://www.exemple.fr">
|
||||
<img src="logo.png" alt="Logo">
|
||||
</a>
|
||||
```
|
||||
|
||||
---------
|
||||
|
||||
## Les listes
|
||||
|
||||
### Liste non ordonnée (à puces)
|
||||
|
||||
```html
|
||||
<ul>
|
||||
<li>Premier élément</li>
|
||||
<li>Deuxième élément</li>
|
||||
<li>Troisième élément</li>
|
||||
</ul>
|
||||
```
|
||||
|
||||
Rendu :
|
||||
- Premier élément
|
||||
- Deuxième élément
|
||||
- Troisième élément
|
||||
|
||||
### Liste ordonnée (numérotée)
|
||||
|
||||
```html
|
||||
<ol>
|
||||
<li>Premier élément</li>
|
||||
<li>Deuxième élément</li>
|
||||
<li>Troisième élément</li>
|
||||
</ol>
|
||||
```
|
||||
|
||||
Rendu :
|
||||
1. Premier élément
|
||||
2. Deuxième élément
|
||||
3. Troisième élément
|
||||
|
||||
### Liste de définitions
|
||||
|
||||
```html
|
||||
<dl>
|
||||
<dt>HTML</dt>
|
||||
<dd>HyperText Markup Language</dd>
|
||||
<dt>CSS</dt>
|
||||
<dd>Cascading Style Sheets</dd>
|
||||
</dl>
|
||||
```
|
||||
|
||||
### Listes imbriquées
|
||||
|
||||
```html
|
||||
<ul>
|
||||
<li>Fruits
|
||||
<ul>
|
||||
<li>Pomme</li>
|
||||
<li>Banane</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Légumes</li>
|
||||
</ul>
|
||||
```
|
||||
|
||||
---------
|
||||
|
||||
## Les tableaux
|
||||
|
||||
Les tableaux servent à présenter des données tabulaires (et non pour la mise en page !).
|
||||
|
||||
```html
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Nom</th>
|
||||
<th>Prénom</th>
|
||||
<th>Âge</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Dupont</td>
|
||||
<td>Jean</td>
|
||||
<td>25</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Martin</td>
|
||||
<td>Marie</td>
|
||||
<td>30</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
```
|
||||
|
||||
### Structure d'un tableau
|
||||
|
||||
| Balise | Rôle |
|
||||
|--------|------|
|
||||
| `<table>` | Conteneur du tableau |
|
||||
| `<thead>` | En-tête du tableau |
|
||||
| `<tbody>` | Corps du tableau |
|
||||
| `<tfoot>` | Pied du tableau (optionnel) |
|
||||
| `<tr>` | Ligne (table row) |
|
||||
| `<th>` | Cellule d'en-tête (table header) |
|
||||
| `<td>` | Cellule de données (table data) |
|
||||
|
||||
### Fusionner des cellules
|
||||
|
||||
```html
|
||||
<!-- Fusionner 2 colonnes -->
|
||||
<td colspan="2">Cellule sur 2 colonnes</td>
|
||||
|
||||
<!-- Fusionner 3 lignes -->
|
||||
<td rowspan="3">Cellule sur 3 lignes</td>
|
||||
```
|
||||
|
||||
---------
|
||||
|
||||
## Les balises sémantiques HTML5
|
||||
|
||||
HTML5 introduit des balises **sémantiques** qui donnent du sens à la structure :
|
||||
|
||||
```html
|
||||
<header> <!-- En-tête de page ou de section -->
|
||||
<nav> <!-- Menu de navigation -->
|
||||
<main> <!-- Contenu principal (unique par page) -->
|
||||
<article> <!-- Contenu autonome (article, post...) -->
|
||||
<section> <!-- Section thématique -->
|
||||
<aside> <!-- Contenu annexe (barre latérale) -->
|
||||
<footer> <!-- Pied de page ou de section -->
|
||||
```
|
||||
|
||||
### Exemple de structure sémantique
|
||||
|
||||
```html
|
||||
<body>
|
||||
<header>
|
||||
<h1>Mon Site</h1>
|
||||
<nav>
|
||||
<ul>
|
||||
<li><a href="index.html">Accueil</a></li>
|
||||
<li><a href="contact.html">Contact</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<article>
|
||||
<h2>Mon premier article</h2>
|
||||
<p>Contenu de l'article...</p>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
<aside>
|
||||
<h3>À propos</h3>
|
||||
<p>Informations complémentaires</p>
|
||||
</aside>
|
||||
|
||||
<footer>
|
||||
<p>© 2024 - Mon Site</p>
|
||||
</footer>
|
||||
</body>
|
||||
```
|
||||
|
||||
### Pourquoi utiliser les balises sémantiques ?
|
||||
|
||||
1. **Accessibilité** : Les lecteurs d'écran comprennent mieux la structure
|
||||
2. **SEO** : Les moteurs de recherche indexent mieux le contenu
|
||||
3. **Maintenabilité** : Le code est plus lisible et compréhensible
|
||||
|
||||
---------
|
||||
|
||||
## Les formulaires
|
||||
|
||||
Les formulaires permettent de collecter des informations auprès de l'utilisateur.
|
||||
|
||||
### Structure de base
|
||||
|
||||
```html
|
||||
<form action="traitement.php" method="post">
|
||||
<!-- Champs du formulaire -->
|
||||
<button type="submit">Envoyer</button>
|
||||
</form>
|
||||
```
|
||||
|
||||
| Attribut | Rôle |
|
||||
|----------|------|
|
||||
| `action` | URL vers laquelle les données seront envoyées |
|
||||
| `method` | Méthode HTTP (`get` ou `post`) |
|
||||
|
||||
### Les champs de saisie
|
||||
|
||||
```html
|
||||
<!-- Champ texte -->
|
||||
<input type="text" name="nom" placeholder="Votre nom">
|
||||
|
||||
<!-- Email -->
|
||||
<input type="email" name="email" placeholder="votre@email.fr">
|
||||
|
||||
<!-- Mot de passe -->
|
||||
<input type="password" name="mdp">
|
||||
|
||||
<!-- Nombre -->
|
||||
<input type="number" name="age" min="0" max="120">
|
||||
|
||||
<!-- Date -->
|
||||
<input type="date" name="naissance">
|
||||
|
||||
<!-- Case à cocher -->
|
||||
<input type="checkbox" name="newsletter" id="news">
|
||||
<label for="news">S'inscrire à la newsletter</label>
|
||||
|
||||
<!-- Bouton radio -->
|
||||
<input type="radio" name="genre" value="homme" id="h">
|
||||
<label for="h">Homme</label>
|
||||
<input type="radio" name="genre" value="femme" id="f">
|
||||
<label for="f">Femme</label>
|
||||
|
||||
<!-- Zone de texte multiligne -->
|
||||
<textarea name="message" rows="5" cols="30"></textarea>
|
||||
|
||||
<!-- Liste déroulante -->
|
||||
<select name="pays">
|
||||
<option value="fr">France</option>
|
||||
<option value="be">Belgique</option>
|
||||
<option value="ch">Suisse</option>
|
||||
</select>
|
||||
```
|
||||
|
||||
### Les labels
|
||||
|
||||
Les `<label>` améliorent l'accessibilité et l'ergonomie :
|
||||
|
||||
```html
|
||||
<label for="prenom">Prénom :</label>
|
||||
<input type="text" id="prenom" name="prenom">
|
||||
```
|
||||
|
||||
L'attribut `for` du label doit correspondre à l'`id` du champ.
|
||||
|
||||
### Attributs utiles des inputs
|
||||
|
||||
| Attribut | Rôle |
|
||||
|----------|------|
|
||||
| `required` | Champ obligatoire |
|
||||
| `placeholder` | Texte d'indication (grisé) |
|
||||
| `value` | Valeur par défaut |
|
||||
| `disabled` | Champ désactivé |
|
||||
| `readonly` | Champ en lecture seule |
|
||||
| `maxlength` | Nombre max de caractères |
|
||||
|
||||
---------
|
||||
|
||||
## Les commentaires
|
||||
|
||||
Les commentaires ne sont pas affichés par le navigateur :
|
||||
|
||||
```html
|
||||
<!-- Ceci est un commentaire -->
|
||||
|
||||
<!--
|
||||
Commentaire
|
||||
sur plusieurs
|
||||
lignes
|
||||
-->
|
||||
```
|
||||
|
||||
> **Utilité** : Documenter le code, désactiver temporairement du code, organiser les sections.
|
||||
|
||||
---------
|
||||
|
||||
## Les caractères spéciaux
|
||||
|
||||
Certains caractères doivent être encodés en HTML :
|
||||
|
||||
| Caractère | Code HTML | Nom |
|
||||
|-----------|-----------|-----|
|
||||
| `<` | `<` | Less than |
|
||||
| `>` | `>` | Greater than |
|
||||
| `&` | `&` | Ampersand |
|
||||
| `"` | `"` | Quote |
|
||||
| ` ` (espace insécable) | ` ` | Non-breaking space |
|
||||
| `©` | `©` | Copyright |
|
||||
| `€` | `€` | Euro |
|
||||
|
||||
---------
|
||||
|
||||
## Bonnes pratiques
|
||||
|
||||
1. **Toujours indenter** le code pour une meilleure lisibilité
|
||||
2. **Utiliser des noms de fichiers** en minuscules, sans accents ni espaces
|
||||
3. **Valider son code** avec le validateur W3C : https://validator.w3.org/
|
||||
4. **Utiliser les balises sémantiques** plutôt que des `<div>` partout
|
||||
5. **Toujours mettre un `alt`** sur les images
|
||||
6. **Séparer structure (HTML) et présentation (CSS)**
|
||||
|
||||
---------
|
||||
|
||||
## Exercices
|
||||
|
||||
### Exercice 1 : Structure de base
|
||||
|
||||
Créez une page HTML5 valide contenant :
|
||||
- Un titre de page "Ma première page"
|
||||
- Un titre principal `<h1>` "Bienvenue"
|
||||
- Un paragraphe de présentation
|
||||
- Un lien vers Google
|
||||
|
||||
### Exercice 2 : Les listes
|
||||
|
||||
Créez une page présentant :
|
||||
- Une liste non ordonnée de vos 5 films préférés
|
||||
- Une liste ordonnée des étapes pour faire des pâtes
|
||||
|
||||
### Exercice 3 : Images et liens
|
||||
|
||||
Créez une page contenant :
|
||||
- Une image de votre choix avec un texte alternatif approprié
|
||||
- Un lien vers Wikipédia qui s'ouvre dans un nouvel onglet
|
||||
- L'image doit être cliquable et mener vers la source de l'image
|
||||
|
||||
### Exercice 4 : Tableau
|
||||
|
||||
Créez un tableau HTML présentant les informations suivantes :
|
||||
|
||||
| Matière | Coefficient | Moyenne |
|
||||
|---------|-------------|---------|
|
||||
| Maths | 4 | 14 |
|
||||
| NSI | 4 | 16 |
|
||||
| Français | 3 | 12 |
|
||||
|
||||
### Exercice 5 : Formulaire
|
||||
|
||||
Créez un formulaire d'inscription contenant :
|
||||
- Un champ pour le nom (obligatoire)
|
||||
- Un champ pour l'email (obligatoire)
|
||||
- Un champ pour le mot de passe
|
||||
- Une case à cocher pour accepter les CGU
|
||||
- Un bouton d'envoi
|
||||
|
||||
### Exercice 6 : Page complète
|
||||
|
||||
Créez une page web complète sur un sujet de votre choix avec :
|
||||
- Une structure sémantique (header, nav, main, footer)
|
||||
- Un menu de navigation avec au moins 3 liens
|
||||
- Un article avec titre, paragraphes et une image
|
||||
- Un tableau récapitulatif
|
||||
- Un pied de page avec copyright
|
||||
|
||||
> **[Voir la correction](./CORRECTION.md)**
|
||||
|
||||
---------
|
||||
|
||||
## Ressources
|
||||
|
||||
- [MDN - HTML](https://developer.mozilla.org/fr/docs/Web/HTML) : Documentation complète
|
||||
- [W3Schools - HTML](https://www.w3schools.com/html/) : Tutoriels et exemples
|
||||
- [Validateur W3C](https://validator.w3.org/) : Vérifier la validité du code
|
||||
|
||||
---------
|
||||
|
||||
Auteur : Florian Mathieu
|
||||
|
||||
Licence CC BY NC
|
||||
|
||||
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.
|
||||
161
web/js/CORRECTION.md
Normal file
161
web/js/CORRECTION.md
Normal file
@@ -0,0 +1,161 @@
|
||||
# Correction des exercices - JavaScript
|
||||
|
||||
---------
|
||||
|
||||
## Exercice 1 : Pair ou impair
|
||||
|
||||
### Version simple avec prompt
|
||||
|
||||
```javascript
|
||||
const nombre = parseInt(prompt("Entrez un nombre :"));
|
||||
|
||||
if (nombre % 2 === 0) {
|
||||
document.write(nombre + " est pair");
|
||||
} else {
|
||||
document.write(nombre + " est impair");
|
||||
}
|
||||
```
|
||||
|
||||
### Version avec gestion des erreurs
|
||||
|
||||
```javascript
|
||||
const saisie = prompt("Entrez un nombre :");
|
||||
const nombre = parseInt(saisie);
|
||||
|
||||
if (isNaN(nombre)) {
|
||||
document.write("Erreur : vous n'avez pas entré un nombre valide");
|
||||
} else if (nombre % 2 === 0) {
|
||||
document.write(nombre + " est pair");
|
||||
} else {
|
||||
document.write(nombre + " est impair");
|
||||
}
|
||||
```
|
||||
|
||||
**Points importants :**
|
||||
- `%` est l'opérateur modulo (reste de la division)
|
||||
- Un nombre est pair si `nombre % 2` vaut 0
|
||||
- `isNaN()` vérifie si la valeur n'est pas un nombre (Not a Number)
|
||||
- `parseInt()` convertit une chaîne en entier
|
||||
|
||||
---------
|
||||
|
||||
## Exercice 2 : Calculatrice simple
|
||||
|
||||
### Version simple
|
||||
|
||||
```javascript
|
||||
const a = parseFloat(prompt("Entrez le premier nombre :"));
|
||||
const b = parseFloat(prompt("Entrez le deuxième nombre :"));
|
||||
const operation = prompt("Quelle opération ? (+, -, *, /)");
|
||||
|
||||
let resultat;
|
||||
|
||||
if (operation === "+") {
|
||||
resultat = a + b;
|
||||
} else if (operation === "-") {
|
||||
resultat = a - b;
|
||||
} else if (operation === "*") {
|
||||
resultat = a * b;
|
||||
} else if (operation === "/") {
|
||||
if (b === 0) {
|
||||
resultat = "Erreur : division par zéro impossible";
|
||||
} else {
|
||||
resultat = a / b;
|
||||
}
|
||||
} else {
|
||||
resultat = "Opération non reconnue";
|
||||
}
|
||||
|
||||
document.write(a + " " + operation + " " + b + " = " + resultat);
|
||||
```
|
||||
|
||||
### Version avec switch
|
||||
|
||||
```javascript
|
||||
const a = parseFloat(prompt("Entrez le premier nombre :"));
|
||||
const b = parseFloat(prompt("Entrez le deuxième nombre :"));
|
||||
const operation = prompt("Quelle opération ? (+, -, *, /)");
|
||||
|
||||
let resultat;
|
||||
|
||||
switch (operation) {
|
||||
case "+":
|
||||
resultat = a + b;
|
||||
break;
|
||||
case "-":
|
||||
resultat = a - b;
|
||||
break;
|
||||
case "*":
|
||||
resultat = a * b;
|
||||
break;
|
||||
case "/":
|
||||
if (b === 0) {
|
||||
resultat = "Erreur : division par zéro";
|
||||
} else {
|
||||
resultat = a / b;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
resultat = "Opération non reconnue";
|
||||
}
|
||||
|
||||
document.write(a + " " + operation + " " + b + " = " + resultat);
|
||||
```
|
||||
|
||||
**Points importants :**
|
||||
- `parseFloat()` convertit en nombre décimal (contrairement à `parseInt()` qui donne un entier)
|
||||
- Il faut vérifier la division par zéro
|
||||
- `switch` est une alternative à plusieurs `if/else if`
|
||||
- Chaque `case` doit se terminer par `break`
|
||||
|
||||
---------
|
||||
|
||||
## Exercice 3 : FizzBuzz
|
||||
|
||||
```javascript
|
||||
for (let i = 1; i <= 100; i++) {
|
||||
if (i % 3 === 0 && i % 5 === 0) {
|
||||
document.write("FizzBuzz<br>");
|
||||
} else if (i % 3 === 0) {
|
||||
document.write("Fizz<br>");
|
||||
} else if (i % 5 === 0) {
|
||||
document.write("Buzz<br>");
|
||||
} else {
|
||||
document.write(i + "<br>");
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Version alternative avec concaténation
|
||||
|
||||
```javascript
|
||||
for (let i = 1; i <= 100; i++) {
|
||||
let resultat = "";
|
||||
|
||||
if (i % 3 === 0) {
|
||||
resultat = resultat + "Fizz";
|
||||
}
|
||||
if (i % 5 === 0) {
|
||||
resultat = resultat + "Buzz";
|
||||
}
|
||||
|
||||
if (resultat === "") {
|
||||
resultat = i;
|
||||
}
|
||||
|
||||
document.write(resultat + "<br>");
|
||||
}
|
||||
```
|
||||
|
||||
**Points importants :**
|
||||
- L'ordre des conditions est important : on teste d'abord "multiple de 3 ET 5"
|
||||
- `&&` est l'opérateur ET logique
|
||||
- La version alternative évite la répétition du test "multiple de 3 ET 5"
|
||||
|
||||
---------
|
||||
|
||||
Auteur : Florian Mathieu
|
||||
|
||||
Licence CC BY NC
|
||||
|
||||
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.
|
||||
682
web/js/README.md
682
web/js/README.md
@@ -1,8 +1,8 @@
|
||||
# Le JavaScript
|
||||
|
||||
> Crée en 1995, JavaScript est un langage inspiré de Java (mais de façon simplifiée) qui permet d’accéder aux objets dans les applications web notamment. Il est utilisé pour vérifier les champs de saisies dans les formulaires, pour faire des animations ou des effets de transitions.
|
||||
> Créé en 1995, JavaScript est un langage inspiré de Java (mais de façon simplifiée) qui permet d'accéder aux objets dans les applications web notamment. Il est utilisé pour vérifier les champs de saisies dans les formulaires, pour faire des animations ou des effets de transitions.
|
||||
>
|
||||
> JavaScript s’utilise principalement dans un navigateur (qui intègre un moteur JavaScript).
|
||||
> JavaScript s'utilise principalement dans un navigateur (qui intègre un moteur JavaScript).
|
||||
|
||||
---------
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
------
|
||||
|
||||
## Intégration
|
||||
## Intégration
|
||||
|
||||
Comme pour le CSS, on peut très facilement intégrer du code JS dans du code HTML :
|
||||
|
||||
@@ -53,11 +53,11 @@ Ici, j'ai placé deux fois du code JavaScript dans ma page HTML.
|
||||
|
||||
Ici, le code va se charger **avant** la page web, ce qui peut occasionner des pages blanches si votre code est très long à charger.
|
||||
|
||||
- Ensuite, dans le < body > de la page HTML
|
||||
- Ensuite, dans le < body > de la page HTML
|
||||
|
||||
Dans ce cas, le script chargera lorsqu'il apparaîtra. Il s'executera alors immédiatement.
|
||||
Dans ce cas, le script chargera lorsqu'il apparaîtra. Il s'exécutera alors immédiatement.
|
||||
|
||||
Si vous placez votre code dans un fichier, celui ci sera chargé lorsqu'il apparaîtra dans le code **mais** s'il contient des ***fonctions***, celles ci ne ***s'executeront*** que lorsqu'elles seront ***appelées***.
|
||||
Si vous placez votre code dans un fichier, celui-ci sera chargé lorsqu'il apparaîtra dans le code **mais** s'il contient des ***fonctions***, celles-ci ne ***s'exécuteront*** que lorsqu'elles seront ***appelées***.
|
||||
|
||||
#### Résumé :
|
||||
|
||||
@@ -69,7 +69,7 @@ Si vous placez votre code dans un fichier, celui ci sera chargé lorsqu'il appar
|
||||
|
||||
Le JavaScript est un langage **interprété** tout comme le HTML & le CSS : dès lors que votre navigateur web va rencontrer une balise "script" il n'essaiera plus de lire mais laissera le moteur JS faire le travail. Une fois la balise fermante atteinte, le navigateur web reprendra la main.
|
||||
|
||||
Il est donc possible d'exécuter du code au moment voulu dans une page web : lancer un calcul, demander une action à l'utilisateur...
|
||||
Il est donc possible d'exécuter du code au moment voulu dans une page web : lancer un calcul, demander une action à l'utilisateur...
|
||||
|
||||
À votre avis, à quoi sert le code suivant ?
|
||||
|
||||
@@ -85,13 +85,13 @@ Il est donc possible d'exécuter du code au moment voulu dans une page web : la
|
||||
|
||||
-----------------
|
||||
|
||||
## 1ere Activité
|
||||
## 1ère Activité
|
||||
|
||||
|
||||
|
||||
### **Premier programme**
|
||||
|
||||
- Créons une page HTML5 nommée index.html. Vous pouvez utiliser une copie de votre précédent site. Ajoutons ensuite une ligne de code qui va demander l’exécution du code JavaScript :
|
||||
- Créons une page HTML5 nommée index.html. Vous pouvez utiliser une copie de votre précédent site. Ajoutons ensuite une ligne de code qui va demander l'exécution du code JavaScript :
|
||||
|
||||
```
|
||||
<!doctype html>
|
||||
@@ -110,9 +110,9 @@ Il est donc possible d'exécuter du code au moment voulu dans une page web : la
|
||||
</html>
|
||||
```
|
||||
|
||||
Nous avons donc ajouté la balise "script", cette balise accepte un attribut "src" qui correspond au chemin du fichier JavaScript (extension .js) qui doit être exécuté. Dans notre exemple, notre fichier "JavaScript" sera dans le même dossier que notre fichier "HTML" et se nommera "monprogramme .js".
|
||||
Nous avons donc ajouté la balise "script", cette balise accepte un attribut "src" qui correspond au chemin du fichier JavaScript (extension .js) qui doit être exécuté. Dans notre exemple, notre fichier "JavaScript" sera dans le même dossier que notre fichier "HTML" et se nommera "monprogramme.js".
|
||||
|
||||
Nous allons maintenant créer et enregistrer un fichier "monprogramme .js" dans notepad++ :
|
||||
Nous allons maintenant créer et enregistrer un fichier "monprogramme.js" dans notepad++ :
|
||||
|
||||
```
|
||||
document.write("Hello World !");
|
||||
@@ -122,167 +122,639 @@ Enregistrez le fichier et ouvrez le fichier HTML (index.html) avec le navigateur
|
||||
|
||||
|
||||
|
||||
À ce stade, vous devez juste avoir compris que le code document.write vous permet d'afficher la chaîne de caractères contenue entre les guillemets (dans notre exemple : Hello World !). Il est aussi important de noter qu'en JavaScript, une ligne de code doit se terminer par un point virgule.
|
||||
À ce stade, vous devez juste avoir compris que le code document.write vous permet d'afficher la chaîne de caractères contenue entre les guillemets (dans notre exemple : Hello World !). Il est aussi important de noter qu'en JavaScript, une ligne de code doit se terminer par un point virgule.
|
||||
|
||||
Pour votre information, il est aussi possible d'inclure le code JavaScript directement dans le code HTML
|
||||
|
||||
### Les variables en JavaScript
|
||||
|
||||
Vous devez tout d'abord déclarer votre variable en utilisant le mot clé var. var point_de_vie;
|
||||
En JavaScript moderne, on utilise **deux mots-clés** pour déclarer des variables :
|
||||
|
||||
Puis vous pouvez affecter une valeur à votre variable
|
||||
| Mot-clé | Utilisation |
|
||||
|---------|-------------|
|
||||
| `const` | Pour les valeurs qui **ne changent pas** (constantes) |
|
||||
| `let` | Pour les valeurs qui **peuvent changer** |
|
||||
|
||||
```
|
||||
point_de_vie=15;
|
||||
> **Note historique** : Avant 2015, on utilisait `var` pour déclarer les variables. Vous le verrez encore dans d'anciens codes, mais préférez toujours `let` et `const`.
|
||||
|
||||
#### Déclarer une variable
|
||||
|
||||
```javascript
|
||||
// Avec const (valeur fixe)
|
||||
const PI = 3.14159;
|
||||
const NOM_DU_JEU = "Space Invaders";
|
||||
|
||||
// Avec let (valeur modifiable)
|
||||
let point_de_vie = 15;
|
||||
let score = 0;
|
||||
```
|
||||
|
||||
Ces 2 actions peuvent être couplées :
|
||||
#### Modifier une variable
|
||||
|
||||
```
|
||||
var point_de_vie=15;
|
||||
```javascript
|
||||
let compteur = 0;
|
||||
compteur = 1; // OK : let permet la réassignation
|
||||
compteur = 2; // OK
|
||||
|
||||
const MAX = 100;
|
||||
MAX = 200; // ERREUR : const ne permet pas la réassignation
|
||||
```
|
||||
|
||||
- Voici un premier exemple : modifiez et enregistrez le fichier "monprogramme.js": var point_de_vie=15;
|
||||
#### Quelle règle suivre ?
|
||||
|
||||
**Utilisez `const` par défaut**, et `let` uniquement si vous savez que la valeur va changer.
|
||||
|
||||
```javascript
|
||||
const age = 17; // L'âge ne change pas pendant l'exécution
|
||||
let nombreDeVies = 3; // Le nombre de vies va diminuer
|
||||
```
|
||||
|
||||
- Voici un premier exemple : modifiez et enregistrez le fichier "monprogramme.js" :
|
||||
|
||||
```javascript
|
||||
const point_de_vie = 15;
|
||||
document.write(point_de_vie);
|
||||
```
|
||||
|
||||
- Ouvrez le fichier HTML à l'aide du navigateur Firefox et observez le résultat. ❑On peut aussi améliorer le message avec le code suivant :
|
||||
- Ouvrez le fichier HTML à l'aide du navigateur Firefox et observez le résultat. On peut aussi améliorer le message avec le code suivant :
|
||||
|
||||
```
|
||||
var point_de_vie=15;
|
||||
```javascript
|
||||
const point_de_vie = 15;
|
||||
document.write("point_de_vie a pour valeur ", point_de_vie);
|
||||
```
|
||||
|
||||
***À votre avis, à quoi sert la virgule entre valeur et point_de_vie ?***
|
||||
|
||||
JavaScript est un langage faiblement typé, il n'est donc pas nécessaire de préciser le type de la variable. Attention, cela ne veut pas dire que votre variable n'a pas de type, juste que le programmeur n'a pas besoin de le préciser.
|
||||
JavaScript est un langage faiblement typé, il n'est donc pas nécessaire de préciser le type de la variable. Attention, cela ne veut pas dire que votre variable n'a pas de type, juste que le programmeur n'a pas besoin de le préciser.
|
||||
|
||||
En JavaScript les types possibles sont : string (chaîne de caractères), boolean, les nombres (number) qui regroupent les entiers (type integer) et les nombres à virgule (type float). Attention pour le type float vous devez utiliser le point à la place de la virgule, par exemple le nombre pi ne s'écrit pas 3,14 mais 3.14.
|
||||
En JavaScript les types possibles sont : string (chaîne de caractères), boolean, les nombres (number) qui regroupent les entiers (type integer) et les nombres à virgule (type float). Attention pour le type float vous devez utiliser le point à la place de la virgule, par exemple le nombre pi ne s'écrit pas 3,14 mais 3.14.
|
||||
|
||||
- La fonction typeof() renvoie le type de la variable qui a été passé en argument (dans les parenthèses). **var a=4;**
|
||||
- La fonction typeof() renvoie le type de la variable qui a été passé en argument (dans les parenthèses) :
|
||||
|
||||
```
|
||||
document.write ("a a pour valeur ", a, ". Elle est de type ", typeof(a), "</br>");
|
||||
var b="Hello";
|
||||
document.write ("b a pour valeur ", b, ". Elle est de type ", typeof(b), "</br>");
|
||||
```javascript
|
||||
const a = 4;
|
||||
document.write("a a pour valeur ", a, ". Elle est de type ", typeof(a), "<br>");
|
||||
|
||||
const b = "Hello";
|
||||
document.write("b a pour valeur ", b, ". Elle est de type ", typeof(b), "<br>");
|
||||
|
||||
const c = true;
|
||||
document.write("c a pour valeur ", c, ". Elle est de type ", typeof(c), "<br>");
|
||||
|
||||
let d;
|
||||
document.write("d a pour valeur ", d, ". Elle est de type ", typeof(d), "<br>");
|
||||
```
|
||||
|
||||
**var c=true;**
|
||||
> **Note** : On utilise `let d;` car une variable déclarée sans valeur initiale ne peut pas être `const`.
|
||||
|
||||
```
|
||||
document.write ("c a pour valeur ", c, ". Elle est de type ", typeof(c), "</br>");
|
||||
```
|
||||
Vous avez dû noter que pour une variable de type string, la valeur est entre guillemets.
|
||||
|
||||
**var d;**
|
||||
- Ouvrez le fichier HTML à l'aide du navigateur Firefox et observez le résultat.
|
||||
|
||||
```
|
||||
document.write ("d a pour valeur ", d, ". Elle est de type ", typeof(d), "</br>");
|
||||
```
|
||||
Deux choses à bien noter dans cet exemple :
|
||||
|
||||
Vous avez dû noter que pour une variable de type string, la valeur est entre guillemets.
|
||||
- ➢ Vous avez sans doute reconnu la balise <br> ("retour à ligne") du HTML.
|
||||
|
||||
- Ouvrez le fichier HTML à l'aide du navigateur Firefox et observez le résultat.
|
||||
- document.write vous permet d'écrire du code HTML, il est donc logique d'utiliser la balise <br> pour effectuer un retour à la ligne (toute autre balise est aussi utilisable, essayez avec une balise <strong> par exemple).
|
||||
- Enlevez les <br> du code pour vous convaincre de leur utilité. Enfin, attention, tout comme le texte, les balises HTML doivent être entre guillemets. La variable et la fonction typeof ne sont pas entre guillemets.
|
||||
|
||||
Deux choses à bien noter dans cet exemple :
|
||||
- ➢ Une variable quand elle a été déclarée, mais qu'aucune valeur ne lui a été attribué, a pour valeur undefined et est de type undefined.
|
||||
|
||||
- ➢ Vous avez sans doute reconnu la balise </br> ("retour à ligne") du HTML.
|
||||
- Que se passe-t-il quand on utilise une variable qui n'a même pas été déclarée ?
|
||||
|
||||
- document.write vous permet d'écrire du code HTML, il est donc logique d'utiliser la balise </br> pour effectuer un retour à la ligne (toute autre balise est aussi utilisable, essayez avec une balise <strong> par exemple).
|
||||
- Enlevez les </br> du code pour vous convaincre de leur utilité. Enfin, attention, tout comme le texte, les balises HTML doivent être entre guillemets. La variable et la fonction typeof ne sont pas entre guillemets.
|
||||
|
||||
- ➢ Une variable quand elle a été déclarée, mais qu'aucune valeur ne lui a été attribué, a pour valeur undefined et est de type undefined.
|
||||
|
||||
- Que se passe-t-il quand on utilise une variable qui n'a même pas été déclarée ?
|
||||
|
||||
```
|
||||
var a=4;
|
||||
document.write ("a a pour valeur ", a);
|
||||
document.write ("b a pour valeur ", b);
|
||||
var c="Hello";
|
||||
document.write ("c a pour valeur ", c);
|
||||
```javascript
|
||||
const a = 4;
|
||||
document.write("a a pour valeur ", a);
|
||||
document.write("b a pour valeur ", b);
|
||||
const c = "Hello";
|
||||
document.write("c a pour valeur ", c);
|
||||
```
|
||||
|
||||
- 1ère ligne nous déclarons la variable a et nous lui attribuons la valeur (numérique) 4.
|
||||
- 2ème ligne, nous utilisons la variable a
|
||||
- 1ère ligne : nous déclarons la constante `a` avec la valeur numérique 4.
|
||||
- 2ème ligne : nous utilisons la variable `a`
|
||||
- 3ème ligne : nous utilisons une variable `b` qui n'a pas été déclarée !
|
||||
- 4ème ligne : nous déclarons la constante `c` avec la valeur chaîne "Hello".
|
||||
- 5ème ligne : nous utilisons `c`.
|
||||
|
||||
- 3ème ligne nous utilisons une variable b qui n'a pas été déclarée !
|
||||
- 4ème ligne nous déclarons la variable c et nous lui attribuons la valeur (chaîne) "Hello".
|
||||
|
||||
- 5ème ligne nous utilisons c.
|
||||
|
||||
- Ouvrez le fichier HTML à l'aide du navigateur Firefox et observez le résultat.
|
||||
Le programme s’est arrêté à la 3ème ligne. Utiliser une variable non déclarée est une erreur qui provoque l'arrêt du programme.
|
||||
Problème, rien ne nous signale cette erreur dans le navigateur (c'est assez logique, à la base un navigateur n'est pas un outil de développement !).
|
||||
- Ouvrez le fichier HTML à l'aide du navigateur Firefox et observez le résultat.
|
||||
Le programme s'est arrêté à la 3ème ligne. Utiliser une variable non déclarée est une erreur qui provoque l'arrêt du programme.
|
||||
Problème, rien ne nous signale cette erreur dans le navigateur (c'est assez logique, à la base un navigateur n'est pas un outil de développement !).
|
||||
|
||||
### Les boites de dialogue
|
||||
|
||||
- Pour debugger des programmes il suffit souvent de placer des alertes à différents endroits du code.
|
||||
- Pour debugger des programmes il suffit souvent de placer des alertes à différents endroits du code.
|
||||
|
||||
```
|
||||
```javascript
|
||||
alert("Une alerte simple");
|
||||
var myText="Une alerte avec le message dans une variable";
|
||||
|
||||
const myText = "Une alerte avec le message dans une variable";
|
||||
alert(myText);
|
||||
var myNumber=13;
|
||||
alert("La variable contient la valeur" + myNumber);
|
||||
|
||||
const myNumber = 13;
|
||||
alert("La variable contient la valeur " + myNumber);
|
||||
```
|
||||
|
||||
- Ouvrez le fichier HTML à l'aide du navigateur Firefox et observez le résultat.
|
||||
Notez qu’ici pour la dernière ligne de code l’opérateur + est un opérateur de concaténation. En effet ajouter
|
||||
- Ouvrez le fichier HTML à l'aide du navigateur Firefox et observez le résultat.
|
||||
Notez qu'ici pour la dernière ligne de code l'opérateur + est un opérateur de concaténation. En effet ajouter
|
||||
|
||||
deux chaînes de caractères revient à les coller à la suite l’une de l’autre : c’est une concaténation.
|
||||
Nous allons maintenant étudier la méthode qui permet à l'utilisateur de rentrer des valeurs au clavier : la
|
||||
deux chaînes de caractères revient à les coller à la suite l'une de l'autre : c'est une concaténation.
|
||||
Nous allons maintenant étudier la méthode qui permet à l'utilisateur de rentrer des valeurs au clavier : la
|
||||
|
||||
méthode prompt(). Nous allons utiliser une structure de la forme : var maVariable = prompt (message).
|
||||
méthode `prompt()`. Nous allons utiliser une structure de la forme : `const maVariable = prompt(message);`
|
||||
|
||||
L'utilisateur va alors saisir (au clavier) du texte dans la zone de saisie. La validation avec le bouton OK permettra d'attribuer le texte entré par l'utilisateur à la variable maVariable. Au cas où l'utilisateur ne rentrerait rien ou qu'il appuierait sur Annuler on aura alors maVariable = null (pas de valeur).
|
||||
L'utilisateur va alors saisir (au clavier) du texte dans la zone de saisie. La validation avec le bouton OK permettra d'attribuer le texte entré par l'utilisateur à la variable maVariable. Au cas où l'utilisateur ne rentrerait rien ou qu'il appuierait sur Annuler on aura alors maVariable = null (pas de valeur).
|
||||
|
||||
- Voici un exemple :
|
||||
var prenom=prompt("Quel est votre prénom ?");
|
||||
|
||||
```
|
||||
document.write ("Bonjour ", prenom, ", vous allez bien ?");
|
||||
```javascript
|
||||
const prenom = prompt("Quel est votre prénom ?");
|
||||
document.write("Bonjour ", prenom, ", vous allez bien ?");
|
||||
```
|
||||
|
||||
❑Ouvrez le fichier HTML à l'aide du navigateur Firefox et observez le résultat.
|
||||
Ouvrez le fichier HTML à l'aide du navigateur Firefox et observez le résultat.
|
||||
|
||||
❑Testez ce qui se passe si l'utilisateur n'entre rien (ou appuie sur le bouton Annuler).
|
||||
Testez ce qui se passe si l'utilisateur n'entre rien (ou appuie sur le bouton Annuler).
|
||||
|
||||
Pour éviter ce genre de chose, nous verrons un peu plus loin l'utilisation du couple if/else (les conditions)
|
||||
Pour éviter ce genre de chose, nous verrons un peu plus loin l'utilisation du couple if/else (les conditions)
|
||||
|
||||
- Un autre exemple : une machine à additionner
|
||||
- Un autre exemple : une machine à additionner
|
||||
|
||||
```
|
||||
document.write ("Nous allons additionner 2 nombres, a et b </br>");
|
||||
var a=prompt("Entrer a ");
|
||||
var b=prompt("Entrer b ");
|
||||
var resultat=a+b;
|
||||
document.write ("Résultat ",a," + ",b," = ",resultat);
|
||||
```javascript
|
||||
document.write("Nous allons additionner 2 nombres, a et b <br>");
|
||||
const a = prompt("Entrer a ");
|
||||
const b = prompt("Entrer b ");
|
||||
const resultat = a + b;
|
||||
document.write("Résultat ", a, " + ", b, " = ", resultat);
|
||||
```
|
||||
|
||||
- Ouvrez le fichier HTML à l'aide du navigateur Firefox et observez le résultat.
|
||||
- Ouvrez le fichier HTML à l'aide du navigateur Firefox et observez le résultat.
|
||||
|
||||
- Pour essayer de comprendre ce qui se passe, faites un "typeof()" sur les variables a et b.
|
||||
- Pour essayer de comprendre ce qui se passe, faites un `typeof()` sur les variables `a` et `b`.
|
||||
|
||||
Les variables a et b sont toutes deux de type string. Or, nous avons vu que si nous avons affaire à des chaînes de caractères le signe + est le signe de concaténation (mise bout à bout de 2 chaînes de caractère). Si nous mettons bout à bout 5 et 15, nous obtenons bien 515.
|
||||
Les variables a et b sont toutes deux de type string. Or, nous avons vu que si nous avons affaire à des chaînes de caractères le signe + est le signe de concaténation (mise bout à bout de 2 chaînes de caractère). Si nous mettons bout à bout 5 et 15, nous obtenons bien 515.
|
||||
|
||||
Pour que notre programme fonctionne, il faut "transformer" notre chaîne (variable de type string) en nombre (variable de type integer). Nous allons faire du transtypage (convertir un type en un autre).
|
||||
Pour que notre programme fonctionne, il faut "transformer" notre chaîne (variable de type string) en nombre (variable de type integer). Nous allons faire du transtypage (convertir un type en un autre).
|
||||
|
||||
- Pour se faire, utilisons la méthode parseInt() :
|
||||
- Pour ce faire, utilisons la méthode `parseInt()` :
|
||||
|
||||
```
|
||||
document.write ("Nous allons additionner 2 nombres, a et b </br>");
|
||||
var as=prompt("Entrer a ");
|
||||
var bs=prompt("Entrer b ");
|
||||
var a=parseInt(as);
|
||||
var b=parseInt(bs);
|
||||
var resultat=a+b;
|
||||
document.write ("Résultat ",a," + ",b," = ",resultat);
|
||||
```javascript
|
||||
document.write("Nous allons additionner 2 nombres, a et b <br>");
|
||||
const as = prompt("Entrer a ");
|
||||
const bs = prompt("Entrer b ");
|
||||
const a = parseInt(as);
|
||||
const b = parseInt(bs);
|
||||
const resultat = a + b;
|
||||
document.write("Résultat ", a, " + ", b, " = ", resultat);
|
||||
```
|
||||
|
||||
- Ouvrez le fichier HTML à l'aide du navigateur Firefox et observez le résultat.
|
||||
as et bs sont de type string, a et b sont maintenant des nombres, le résultat est maintenant correct.
|
||||
- Ouvrez le fichier HTML à l'aide du navigateur Firefox et observez le résultat.
|
||||
|
||||
`as` et `bs` sont de type string, `a` et `b` sont maintenant des nombres, le résultat est maintenant correct.
|
||||
|
||||
-------
|
||||
|
||||
## Les opérateurs
|
||||
|
||||
### Opérateurs arithmétiques
|
||||
|
||||
| Opérateur | Description | Exemple |
|
||||
|-----------|-------------|---------|
|
||||
| `+` | Addition | `5 + 3` donne `8` |
|
||||
| `-` | Soustraction | `5 - 3` donne `2` |
|
||||
| `*` | Multiplication | `5 * 3` donne `15` |
|
||||
| `/` | Division | `10 / 3` donne `3.333...` |
|
||||
| `%` | Modulo (reste) | `10 % 3` donne `1` |
|
||||
| `**` | Puissance | `2 ** 3` donne `8` |
|
||||
|
||||
### Opérateurs de comparaison
|
||||
|
||||
| Opérateur | Description | Exemple |
|
||||
|-----------|-------------|---------|
|
||||
| `==` | Égalité (valeur) | `5 == "5"` donne `true` |
|
||||
| `===` | Égalité stricte (valeur ET type) | `5 === "5"` donne `false` |
|
||||
| `!=` | Différent (valeur) | `5 != 3` donne `true` |
|
||||
| `!==` | Différent strict | `5 !== "5"` donne `true` |
|
||||
| `<` | Inférieur | `3 < 5` donne `true` |
|
||||
| `>` | Supérieur | `3 > 5` donne `false` |
|
||||
| `<=` | Inférieur ou égal | `5 <= 5` donne `true` |
|
||||
| `>=` | Supérieur ou égal | `3 >= 5` donne `false` |
|
||||
|
||||
> **Important** : Préférez `===` à `==` pour éviter les conversions de type implicites.
|
||||
|
||||
### Opérateurs logiques
|
||||
|
||||
| Opérateur | Description | Exemple |
|
||||
|-----------|-------------|---------|
|
||||
| `&&` | ET logique | `true && false` donne `false` |
|
||||
| `\|\|` | OU logique | `true \|\| false` donne `true` |
|
||||
| `!` | NON logique | `!true` donne `false` |
|
||||
|
||||
-------
|
||||
|
||||
## Les conditions
|
||||
|
||||
Les conditions permettent d'exécuter du code uniquement si une certaine condition est vraie.
|
||||
|
||||
### Structure if / else
|
||||
|
||||
```javascript
|
||||
const age = 18;
|
||||
|
||||
if (age >= 18) {
|
||||
document.write("Vous êtes majeur");
|
||||
} else {
|
||||
document.write("Vous êtes mineur");
|
||||
}
|
||||
```
|
||||
|
||||
### Structure if / else if / else
|
||||
|
||||
```javascript
|
||||
const note = 15;
|
||||
|
||||
if (note >= 16) {
|
||||
document.write("Très bien !");
|
||||
} else if (note >= 14) {
|
||||
document.write("Bien !");
|
||||
} else if (note >= 10) {
|
||||
document.write("Passable");
|
||||
} else {
|
||||
document.write("Insuffisant");
|
||||
}
|
||||
```
|
||||
|
||||
### Exemple avec prompt
|
||||
|
||||
Reprenons l'exemple du prompt pour gérer le cas où l'utilisateur annule :
|
||||
|
||||
```javascript
|
||||
const prenom = prompt("Quel est votre prénom ?");
|
||||
|
||||
if (prenom === null || prenom === "") {
|
||||
document.write("Vous n'avez pas entré de prénom !");
|
||||
} else {
|
||||
document.write("Bonjour ", prenom, " !");
|
||||
}
|
||||
```
|
||||
|
||||
### Conditions imbriquées
|
||||
|
||||
```javascript
|
||||
const age = parseInt(prompt("Quel est votre âge ?"));
|
||||
const permis = prompt("Avez-vous le permis ? (oui/non)");
|
||||
|
||||
if (age >= 18) {
|
||||
if (permis === "oui") {
|
||||
document.write("Vous pouvez conduire");
|
||||
} else {
|
||||
document.write("Passez d'abord le permis !");
|
||||
}
|
||||
} else {
|
||||
document.write("Vous êtes trop jeune pour conduire");
|
||||
}
|
||||
```
|
||||
|
||||
### L'opérateur ternaire
|
||||
|
||||
Pour des conditions simples, on peut utiliser l'opérateur ternaire :
|
||||
|
||||
```javascript
|
||||
const age = 20;
|
||||
const statut = (age >= 18) ? "majeur" : "mineur";
|
||||
document.write("Vous êtes ", statut);
|
||||
```
|
||||
|
||||
Syntaxe : `condition ? valeurSiVrai : valeurSiFaux`
|
||||
|
||||
-------
|
||||
|
||||
## Les boucles
|
||||
|
||||
Les boucles permettent de répéter des instructions plusieurs fois.
|
||||
|
||||
### La boucle while
|
||||
|
||||
La boucle `while` répète tant que la condition est vraie :
|
||||
|
||||
```javascript
|
||||
let compteur = 1;
|
||||
|
||||
while (compteur <= 5) {
|
||||
document.write("Tour numéro ", compteur, "<br>");
|
||||
compteur = compteur + 1;
|
||||
}
|
||||
```
|
||||
|
||||
> **Note** : On utilise `let` car `compteur` est modifié à chaque tour de boucle.
|
||||
|
||||
Résultat :
|
||||
```
|
||||
Tour numéro 1
|
||||
Tour numéro 2
|
||||
Tour numéro 3
|
||||
Tour numéro 4
|
||||
Tour numéro 5
|
||||
```
|
||||
|
||||
> **Attention** : N'oubliez pas d'incrémenter le compteur, sinon la boucle sera infinie !
|
||||
|
||||
### La boucle for
|
||||
|
||||
La boucle `for` est plus compacte quand on connaît le nombre d'itérations :
|
||||
|
||||
```javascript
|
||||
for (let i = 1; i <= 5; i++) {
|
||||
document.write("Tour numéro ", i, "<br>");
|
||||
}
|
||||
```
|
||||
|
||||
Structure : `for (initialisation; condition; incrémentation)`
|
||||
|
||||
- **Initialisation** : `let i = 1` (exécutée une seule fois au début)
|
||||
- **Condition** : `i <= 5` (vérifiée avant chaque tour)
|
||||
- **Incrémentation** : `i++` (exécutée après chaque tour)
|
||||
|
||||
> **Note** : `i++` est équivalent à `i = i + 1`
|
||||
|
||||
### Exemple : table de multiplication
|
||||
|
||||
```javascript
|
||||
const nombre = parseInt(prompt("Quelle table voulez-vous ?"));
|
||||
|
||||
document.write("<h2>Table de ", nombre, "</h2>");
|
||||
|
||||
for (let i = 1; i <= 10; i++) {
|
||||
const resultat = nombre * i;
|
||||
document.write(nombre, " x ", i, " = ", resultat, "<br>");
|
||||
}
|
||||
```
|
||||
|
||||
### Exemple : somme des nombres
|
||||
|
||||
```javascript
|
||||
const n = parseInt(prompt("Jusqu'à quel nombre ?"));
|
||||
let somme = 0;
|
||||
|
||||
for (let i = 1; i <= n; i++) {
|
||||
somme = somme + i;
|
||||
}
|
||||
|
||||
document.write("La somme des nombres de 1 à ", n, " est ", somme);
|
||||
```
|
||||
|
||||
### Les mots-clés break et continue
|
||||
|
||||
```javascript
|
||||
// break : sort de la boucle
|
||||
for (let i = 1; i <= 10; i++) {
|
||||
if (i === 5) {
|
||||
break; // Arrête la boucle quand i vaut 5
|
||||
}
|
||||
document.write(i, "<br>");
|
||||
}
|
||||
// Affiche : 1, 2, 3, 4
|
||||
|
||||
// continue : passe au tour suivant
|
||||
for (let i = 1; i <= 5; i++) {
|
||||
if (i === 3) {
|
||||
continue; // Saute le tour quand i vaut 3
|
||||
}
|
||||
document.write(i, "<br>");
|
||||
}
|
||||
// Affiche : 1, 2, 4, 5
|
||||
```
|
||||
|
||||
-------
|
||||
|
||||
## Les fonctions
|
||||
|
||||
Une fonction est un bloc de code réutilisable qui effectue une tâche spécifique.
|
||||
|
||||
### Déclarer une fonction
|
||||
|
||||
```javascript
|
||||
function direBonjour() {
|
||||
document.write("Bonjour !<br>");
|
||||
}
|
||||
```
|
||||
|
||||
### Appeler une fonction
|
||||
|
||||
```javascript
|
||||
direBonjour(); // Affiche : Bonjour !
|
||||
direBonjour(); // Affiche : Bonjour !
|
||||
```
|
||||
|
||||
### Fonction avec paramètres
|
||||
|
||||
```javascript
|
||||
function direBonjour(prenom) {
|
||||
document.write("Bonjour ", prenom, " !<br>");
|
||||
}
|
||||
|
||||
direBonjour("Alice"); // Affiche : Bonjour Alice !
|
||||
direBonjour("Bob"); // Affiche : Bonjour Bob !
|
||||
```
|
||||
|
||||
### Fonction avec plusieurs paramètres
|
||||
|
||||
```javascript
|
||||
function addition(a, b) {
|
||||
const resultat = a + b;
|
||||
document.write(a, " + ", b, " = ", resultat, "<br>");
|
||||
}
|
||||
|
||||
addition(5, 3); // Affiche : 5 + 3 = 8
|
||||
addition(10, 20); // Affiche : 10 + 20 = 30
|
||||
```
|
||||
|
||||
### Fonction avec retour (return)
|
||||
|
||||
Une fonction peut **retourner** une valeur :
|
||||
|
||||
```javascript
|
||||
function carre(nombre) {
|
||||
return nombre * nombre;
|
||||
}
|
||||
|
||||
const resultat = carre(5);
|
||||
document.write("Le carré de 5 est ", resultat); // Affiche : 25
|
||||
```
|
||||
|
||||
### Exemple : fonction estMajeur
|
||||
|
||||
```javascript
|
||||
function estMajeur(age) {
|
||||
if (age >= 18) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
const monAge = 20;
|
||||
if (estMajeur(monAge)) {
|
||||
document.write("Vous êtes majeur");
|
||||
}
|
||||
```
|
||||
|
||||
### Exemple : fonction maximum
|
||||
|
||||
```javascript
|
||||
function maximum(a, b) {
|
||||
if (a > b) {
|
||||
return a;
|
||||
} else {
|
||||
return b;
|
||||
}
|
||||
}
|
||||
|
||||
document.write("Le max de 5 et 8 est ", maximum(5, 8)); // Affiche : 8
|
||||
```
|
||||
|
||||
### Portée des variables
|
||||
|
||||
Les variables déclarées dans une fonction sont **locales** :
|
||||
|
||||
```javascript
|
||||
function test() {
|
||||
const variableLocale = "Je suis locale";
|
||||
document.write(variableLocale);
|
||||
}
|
||||
|
||||
test(); // Affiche : Je suis locale
|
||||
// document.write(variableLocale); // ERREUR : variable non définie
|
||||
```
|
||||
|
||||
> **Avantage de let/const** : Contrairement à `var`, les variables déclarées avec `let` et `const` ont une portée de **bloc** (entre `{}`), ce qui évite beaucoup de bugs.
|
||||
|
||||
-------
|
||||
|
||||
## Les tableaux (Arrays)
|
||||
|
||||
Un tableau permet de stocker plusieurs valeurs dans une seule variable.
|
||||
|
||||
### Créer un tableau
|
||||
|
||||
```javascript
|
||||
const fruits = ["Pomme", "Banane", "Orange"];
|
||||
const nombres = [1, 2, 3, 4, 5];
|
||||
const vide = [];
|
||||
```
|
||||
|
||||
> **Note** : On utilise `const` car la référence au tableau ne change pas, même si on modifie son contenu.
|
||||
|
||||
### Accéder aux éléments
|
||||
|
||||
Les indices commencent à **0** :
|
||||
|
||||
```javascript
|
||||
const fruits = ["Pomme", "Banane", "Orange"];
|
||||
|
||||
document.write(fruits[0]); // Affiche : Pomme
|
||||
document.write(fruits[1]); // Affiche : Banane
|
||||
document.write(fruits[2]); // Affiche : Orange
|
||||
```
|
||||
|
||||
### Modifier un élément
|
||||
|
||||
```javascript
|
||||
const fruits = ["Pomme", "Banane", "Orange"];
|
||||
fruits[1] = "Fraise"; // OK même avec const !
|
||||
// fruits vaut maintenant ["Pomme", "Fraise", "Orange"]
|
||||
```
|
||||
|
||||
> **Important** : Avec `const`, on ne peut pas réassigner le tableau (`fruits = autreTableau`), mais on peut modifier son contenu.
|
||||
|
||||
### Longueur d'un tableau
|
||||
|
||||
```javascript
|
||||
const fruits = ["Pomme", "Banane", "Orange"];
|
||||
document.write(fruits.length); // Affiche : 3
|
||||
```
|
||||
|
||||
### Parcourir un tableau
|
||||
|
||||
```javascript
|
||||
const fruits = ["Pomme", "Banane", "Orange"];
|
||||
|
||||
for (let i = 0; i < fruits.length; i++) {
|
||||
document.write(fruits[i], "<br>");
|
||||
}
|
||||
```
|
||||
|
||||
### Méthodes utiles
|
||||
|
||||
```javascript
|
||||
const fruits = ["Pomme", "Banane"];
|
||||
|
||||
// Ajouter à la fin
|
||||
fruits.push("Orange");
|
||||
// fruits = ["Pomme", "Banane", "Orange"]
|
||||
|
||||
// Retirer le dernier
|
||||
const dernier = fruits.pop();
|
||||
// dernier = "Orange", fruits = ["Pomme", "Banane"]
|
||||
|
||||
// Ajouter au début
|
||||
fruits.unshift("Fraise");
|
||||
// fruits = ["Fraise", "Pomme", "Banane"]
|
||||
|
||||
// Retirer le premier
|
||||
const premier = fruits.shift();
|
||||
// premier = "Fraise", fruits = ["Pomme", "Banane"]
|
||||
|
||||
// Trouver l'index d'un élément
|
||||
const index = fruits.indexOf("Banane"); // index = 1
|
||||
```
|
||||
|
||||
### Exemple : calculer la moyenne
|
||||
|
||||
```javascript
|
||||
const notes = [12, 15, 8, 14, 16];
|
||||
let somme = 0;
|
||||
|
||||
for (let i = 0; i < notes.length; i++) {
|
||||
somme = somme + notes[i];
|
||||
}
|
||||
|
||||
const moyenne = somme / notes.length;
|
||||
document.write("Moyenne : ", moyenne); // Affiche : 13
|
||||
```
|
||||
|
||||
-------
|
||||
|
||||
## Exercices
|
||||
|
||||
### Exercice 1 : Pair ou impair
|
||||
|
||||
Demandez un nombre à l'utilisateur et affichez si ce nombre est pair ou impair.
|
||||
|
||||
> **Indice** : Un nombre est pair si le reste de sa division par 2 est égal à 0.
|
||||
|
||||
### Exercice 2 : Calculatrice simple
|
||||
|
||||
Créez une calculatrice qui :
|
||||
1. Demande deux nombres à l'utilisateur
|
||||
2. Demande l'opération souhaitée (+, -, *, /)
|
||||
3. Affiche le résultat
|
||||
|
||||
### Exercice 3 : FizzBuzz
|
||||
|
||||
Affichez les nombres de 1 à 100, mais :
|
||||
- Pour les multiples de 3, affichez "Fizz"
|
||||
- Pour les multiples de 5, affichez "Buzz"
|
||||
- Pour les multiples de 3 ET 5, affichez "FizzBuzz"
|
||||
|
||||
> **[Voir la correction](./CORRECTION.md)**
|
||||
|
||||
-------
|
||||
|
||||
## Ressources
|
||||
|
||||
- [MDN - JavaScript](https://developer.mozilla.org/fr/docs/Web/JavaScript) : Documentation complète
|
||||
- [W3Schools - JavaScript](https://www.w3schools.com/js/) : Tutoriels et exemples
|
||||
- [JavaScript.info](https://fr.javascript.info/) : Tutoriel moderne et complet
|
||||
|
||||
-------
|
||||
|
||||
@@ -290,4 +762,4 @@ Auteur : Florian Mathieu
|
||||
|
||||
Licence CC BY NC
|
||||
|
||||
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.
|
||||
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.
|
||||
|
||||
49
web/ressources/README.md
Normal file
49
web/ressources/README.md
Normal file
@@ -0,0 +1,49 @@
|
||||
# Ressources - Aide-mémoires Web
|
||||
|
||||
Ce dossier contient des mémentos et aide-mémoires pour HTML et CSS.
|
||||
|
||||
---------
|
||||
|
||||
## Documents disponibles
|
||||
|
||||
### HTML
|
||||
|
||||
| Fichier | Description |
|
||||
|---------|-------------|
|
||||
| [Liste_balises_HTML-V2.pdf](Liste_balises_HTML-V2.pdf) | Liste des balises HTML les plus courantes avec leur utilisation |
|
||||
| [memo-html5.pdf](memo-html5.pdf) | Mémento complet HTML5 |
|
||||
| [help_sheet.jpeg](help_sheet.jpeg) | Aide-mémoire visuel HTML |
|
||||
| [html_input.jpeg](html_input.jpeg) | Les différents types d'input HTML |
|
||||
|
||||
### CSS
|
||||
|
||||
| Fichier | Description |
|
||||
|---------|-------------|
|
||||
| [CSS_Memento.pdf](CSS_Memento.pdf) | Mémento complet CSS |
|
||||
| [memento CSS.pdf](memento%20CSS.pdf) | Autre mémento CSS |
|
||||
| [memento_css2.1.pdf](memento_css2.1.pdf) | Mémento CSS 2.1 détaillé |
|
||||
| [css_cheat.png](css_cheat.png) | Cheat sheet CSS visuelle |
|
||||
|
||||
---------
|
||||
|
||||
## Comment utiliser ces ressources ?
|
||||
|
||||
Ces documents sont des **aide-mémoires** à consulter pendant vos travaux pratiques :
|
||||
|
||||
1. **Pendant les TP** : Gardez un mémento ouvert à côté de votre éditeur de code
|
||||
2. **Pour réviser** : Relisez les mémentos avant les évaluations
|
||||
3. **En cas de doute** : Consultez la liste des balises pour trouver celle dont vous avez besoin
|
||||
|
||||
---------
|
||||
|
||||
## Ressources en ligne complémentaires
|
||||
|
||||
- [MDN Web Docs](https://developer.mozilla.org/fr/) - La référence pour HTML, CSS et JavaScript
|
||||
- [W3Schools](https://www.w3schools.com/) - Tutoriels et exemples interactifs
|
||||
- [Can I Use](https://caniuse.com/) - Compatibilité des fonctionnalités CSS/HTML avec les navigateurs
|
||||
|
||||
---------
|
||||
|
||||
Auteur : Florian Mathieu
|
||||
|
||||
Licence CC BY NC
|
||||
77
web/tp/README.md
Normal file
77
web/tp/README.md
Normal file
@@ -0,0 +1,77 @@
|
||||
# Travaux Pratiques - Web
|
||||
|
||||
Ce dossier contient les travaux pratiques pour apprendre HTML et CSS.
|
||||
|
||||
---------
|
||||
|
||||
## Liste des TPs
|
||||
|
||||
| TP | Fichier | Thème | Prérequis |
|
||||
|----|---------|-------|-----------|
|
||||
| TP 1 | [TP.pdf](TP.pdf) | Découverte du HTML | Aucun |
|
||||
| TP 2 | [TP_2.pdf](TP_2.pdf) | HTML avancé | TP 1 |
|
||||
| TP 3 | [TP_3 - CSS et sections.pdf](TP_3%20-%20CSS%20et%20sections.pdf) | CSS et mise en page | TP 1 et 2 |
|
||||
|
||||
---------
|
||||
|
||||
## Progression recommandée
|
||||
|
||||
```
|
||||
TP 1 : HTML de base
|
||||
↓
|
||||
TP 2 : HTML avancé
|
||||
↓
|
||||
TP 3 : CSS et sections
|
||||
```
|
||||
|
||||
---------
|
||||
|
||||
## Ressources pour les TPs
|
||||
|
||||
### Dossier images
|
||||
|
||||
Le dossier `images/` contient les fichiers nécessaires pour certains TPs :
|
||||
- Photos d'exemple
|
||||
- Icônes
|
||||
- Éléments graphiques
|
||||
|
||||
Le fichier `images.zip` contient une archive de toutes les images.
|
||||
|
||||
### Aide-mémoires
|
||||
|
||||
Consultez le dossier [ressources](../ressources/) pour les mémentos HTML et CSS.
|
||||
|
||||
---------
|
||||
|
||||
## Conseils pour réussir les TPs
|
||||
|
||||
1. **Lisez l'énoncé en entier** avant de commencer
|
||||
2. **Testez régulièrement** votre code dans le navigateur
|
||||
3. **Utilisez les outils de développement** (F12) pour débugger
|
||||
4. **Consultez les mémentos** en cas de doute sur une balise ou propriété
|
||||
5. **Indentez votre code** pour une meilleure lisibilité
|
||||
6. **Validez votre HTML** sur [validator.w3.org](https://validator.w3.org/)
|
||||
|
||||
---------
|
||||
|
||||
## Structure d'un projet web
|
||||
|
||||
Pour vos TPs, organisez vos fichiers ainsi :
|
||||
|
||||
```
|
||||
mon_projet/
|
||||
├── index.html
|
||||
├── style.css
|
||||
├── images/
|
||||
│ ├── logo.png
|
||||
│ └── photo.jpg
|
||||
└── pages/
|
||||
├── contact.html
|
||||
└── about.html
|
||||
```
|
||||
|
||||
---------
|
||||
|
||||
Auteur : Florian Mathieu
|
||||
|
||||
Licence CC BY NC
|
||||
Reference in New Issue
Block a user