# Bases de la programmation

Benoît Prieur

► To cite this version:

Benoît Prieur. Bases de la programmation. École thématique. IT-Akademy, France. 2020, pp.68.
hal-02527209v2

HAL Id: hal-02527209

https://hal.science/hal-02527209v2

Submitted on 2 May 2020

HAL is a multi-disciplinary open access
archive for the deposit and dissemination of sci-
entific research documents, whether they are pub-
lished or not. The documents may come from
teaching and research institutions in France or
abroad, or from public or private research centers.

L'archive ouverte pluridisciplinaire HAL, est
destinée au dépôt et à la diffusion de documents
scientifiques de niveau recherche, publiés ou non,
émanant des établissements d'enseignement et de
recherche français ou étrangers, des laboratoires
publics ou privés.

<figure><img src="image_1.png" /></figure>
<figure><img src="image_2.png" /></figure>

# Bases de la programmation

V 0.4 (2 mai 2020) - IT-Akademy (Lyon, mars-avril 2020)

Benoît Prieur - Soarthec - CC-By-SA 4.0
<figure><img src="image_3.png" /></figure>

# Objectifs

* Bases de la programmation

* Algorithmique

* Usage de PHP/MySQL/PhpMyAdmin
# Notion de CLI

* command line interface
(interface en ligne de commande)

* MS DOS et Power Shell
  (Windows)

* BASH : shell Unix du projet GNU (Linux)

* Terminal (MacOS)

<figure><img src="image_4.png" /></figure>

Crédit : Microsoft Corporation / Public domain
# Applications fenêtrées

* Applications “Desktop”

<figure><img src="image_5.png" /></figure>

Crédit : http://hacktolive.org LGPL (http://www.gnu.org/licenses/libl.html)
<figure><img src="image_6.png" /></figure>

# Applications web (1)

* Client-serveur

* Technologie web (HTML, CSS, javascript)

* Serveur web (serveur de pages web)
# Applications web (2)

<figure><img src="image_7.png" /></figure>

Crédit : Rapha222 / CC BY-SA (https://creativecommons.org/licenses/by-sa/3.0)
<figure><img src="image_8.png" /></figure>

Applications hybrides

* Utilisation du navigateur web

* Ou du moins des technologies web en local

* L'exemple du développement mobile (cross-platform software)
<figure><img src="image_9.png" /></figure>

# Applications mobiles natives

* Native, hybride ou web

* Native

* iOS (Objective-C, Swift)

* Android (Java)

* Hybride/web

* Ionic

* Cordova

* Autre exemple : Xamarin
<figure><img src="image_10.png" /></figure>

# Applications embarquées (1)

* Informatique embarquée

* Objets connectés
Applications embarquées (2)

* Notions de driver (pilote)

* Notions de firmware (micrologiciel)

* firmware des ordinateurs (BIOS ou EFI) exécuté par le CPU
Applications embarquées (3)

<figure><img src="image_11.png" /></figure>

Crédit : B.ramanou / CC BY-SA (https://creativecommons.org/licenses/by-sa/4.0)
<figure><img src="image_12.png" /></figure>

# Langages de scripts (interprétés)

* Interprété par un interpréteur en temps réel

* Langage semi-interprété : préalablement traduit en bytecode (préservation des performances)

* Exemples de .Net ou Java

* Séquence d'interprétation :

* Lire et analyser une instruction

* Si l'instruction est correcte, l'exécuter

* Passer à l'instruction suivante
# Langages compilés

* "Traduction" en langage machine, par la compilation (compilateur)

* Par opposition au script (exécution pas-à-pas)

* Quelques exemples :

* C/C++

* Fortran

* Rust, etc.
# Langages de programmation de bas niveau

* Proximité au matériel

* Langage machine

* Peu d'abstraction par rapport au processeur

* Adressage et allocation sur le tas (heap)

* Usage de la pile (stack)
<figure><img src="image_13.png" /></figure>

# Langages de programmation de haut niveau

* De l'abstraction

* Perte de performance très relatif (optimisation)

* La question des langages C/C++

* Notion de garbage collector
# Langages spécialisés

* Le langage R

* Spécialisé en statistique et en sciences des données (data science)

PCA 5 vars

princomp(x = data, cor = cor)

<figure><img src="image_14.png" /></figure>

(1-3) 60%

<figure><img src="image_15.png" /></figure>

Clustering 4 groups

<figure><img src="image_16.png" /></figure>

<figure><img src="image_17.png" /></figure>

Factor 1 [41%]

<figure><img src="image_18.png" /></figure>

Factor 3 [19%]

<figure><img src="image_19.png" /></figure>
Langage R, exemple de code

> x <- 1:6 # Create vector.

> y <- x^2 # Create vector by formula.

> print(y) # Print the vector's contents.
[1] 1 4 9 16 25 36

> mean(y) # Arithmetic mean of vector.
[1] 15.16667
# Langage SQL

* Langage de requêtage des bases de données relationnelles

* Exemples de requêtes avec l'exemple ci-joint.

<figure><img src="image_20.png" /></figure>
<figure><img src="image_21.png" /></figure>

# Paradigmes de programmation

* Procédural

* Programmation orientée objet (POO)

* Fonctionnel
Lien direct :

https://upload.wikimedia.org/wikipedia COMMONS/f/f7/Programming paradigms.svg

<figure><img src="image_22.png" /></figure>

<figure><img src="image_23.png" /></figure>

Crédit : MovGP0 / CC BY-SA (https://creativecommons.org/licenses/by-sa/3.0)
<figure><img src="image_24.png" /></figure>

# Programmation procédurale

* Procédure, routine, sous-routine ou fonction

* Parfois complétée par la POO
<figure><img src="image_25.png" /></figure>

# Programmation orientée objet (1)

* Objet (attributs et méthodes)

* Héritage et polymorphisme

* Notion de classe et d'instance de classe (métaphore du moule)
# Programmation orientée objet (2)

* Exemple de la classe Button

* Mention de UML

<table><thead><tr><th>Button</th></tr></thead><tbody><tr><td>- xsize</td></tr><tr><td>- ysize</td></tr><tr><td>- label_text</td></tr><tr><td>- interested_listener</td></tr><tr><td>- xposition</td></tr><tr><td>- yposition</td></tr><tr><td>+ draw()</td></tr><tr><td>+ press()</td></tr><tr><td>+ register_callback()</td></tr><tr><td>+ unregister_callback()</td></tr></tbody></table>
<figure><img src="image_26.png" /></figure>

# Programmation fonctionnelle

* Calcul comme évaluation de fonctions mathématiques

* OCaml, LISP, SCALA
## Approche client-serveur

<figure><img src="image_27.png" /></figure>

Crédit : Gnome-fs-server.svg : David Vignoni
Gnome-fs-client.svg : David Vignoni - derivative work :
Calimo (d) / LGPL (http://www.gnu.org/licenses/libpl.html)
<figure><img src="image_28.png" /></figure>

# Langages client-side et server-side

* Activité collective

* Lieu d'exécution des langages :

* HTML, PHP, Javascript, CSS, Python

* Autres langages
<figure><img src="image_29.png" /></figure>

# Installation de l'environnement de développement (1)

* IDE : Visual Studio Code

* Installation :

* Apache (serveur web)

* PHP (environnement)

* MySQL (base de données) et PhpMyAdmin (client web)
<figure><img src="image_30.png" /></figure>

# Installation de l'environnement de développement (2)

* Vérifier la bonne installation de MySQL en accédant aux bases de données avec PhpMyAdmin

* Vérifier la bonne installation de PHP avec `<?php phpinfo();?>`

* Vérifier la bonne installation de PHP CLI avec un script à exécuter en ligne de commande
<figure><img src="image_31.png" /></figure>

# Installation de l'environnement de développement (3)

* Tester PHP CLI

```php
<?php

echo "Hello! What is your name (enter below):\n";

$strName = fread(STDIN, 80);

echo 'Hello ', $strName, "\n";

?>
```
<figure><img src="image_32.png" /></figure>

## Notion de tableau (1)

* Structure de données

* Tableau à une dimension

* Tableau à plusieurs dimensions

* Index commence à zéro en général
<figure><img src="image_33.png" /></figure>

## Notion de tableau (2)

<table><tr><th>Valeur</th><td>45</td><td>154</td><td>58</td><td>78</td><td>31</td><td>5</td><td>74</td></tr><tr><th>Index</th><td>0</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td></tr></table>
# Notion de tableau (3)

<figure><img src="image_34.png" /><figcaption>Tableaux de valeurs</figcaption></figure>
# Notion de pseudo-code (1)

* Langage de Description d'Algorithmes (LDA)

* Langage (presque) naturel

## Fonction factorielle (n)

r = 1

Pour i de 1 jusqu'à n avec un pas de 1

r = r*i

Fin pour

Retourner r

Fin Fonction
## Notion de pseudo-code (2)

1. Prendre en paramètre deux longueurs d'un triangle rectangle. Calculer la longueur de l'hypoténuse. Fonction **Racine(a)**.

2. Retourner le nombre d'occurrences d'une lettre dans une chaîne de caractères pour une lettre donnée.

3. Renvoyer vrai quand le nombre passé en paramètre est pair. Renvoyer faux sinon.

a. Fonction **Modulo(a, b)**.
<figure><img src="image_35.png" /></figure>

# Notion de pseudo-code (3)

On a un tableau en entrée. Il inclut les notes d'une classe dans une matière donnée. De 0 à 20. Par exemple [ 4 15 18 9 13 12 ]

* Note présente ou non. Chercher(tableau) ; renvoie un booléen.

* Somme(tableau)

* Moyenne(tableau)

* Min(tableau)

* Max(tableau)
# Notion de variable (1)

* Un nom et une valeur

* Les types :

* Chaîne de caractères (string)

* Nombres entiers (int)

* Nombre décimaux (float)

* Booléens (bool)

* “rien” (NULL)
<figure><img src="image_36.png" /></figure>

# Notion de variable (2)

<?php

$annee_courante = 2020;

?>
<figure><img src="image_37.png" /></figure>

# Notion de variable (3)

## Notion de concaténation

<?php

$annee_courante = 2020;

echo "Nous sommes en ";

echo $annee_courante;

?>

<?php

$annee_courante = 2020;

echo "Nous sommes en $annee_courante";

?>
<figure><img src="image_38.png" /></figure>

# Calculs arithmétiques (1)

• +

• -

• *

• /

<?php

$nombre = 2 + 4;

$nombre = 3 - 2;

$nombre = 3 * 6;

$nombre = 10 / 5;

$nombre = 3 * 3 + 3;

$nombre = (3 + 3) * 2;

?>

?>
<figure><img src="image_39.png" /></figure>

# Calculs arithmétiques (2)

* -$a : négation

* $a \% $b : modulo

* $a ** $b : exponentielle
<figure><img src="image_40.png" /></figure>

Conditions (1)

* == : est égal à

* > : est supérieur à

* < : est inférieur à

* >= : est supérieur ou égal à

* <= : est inférieur ou égal à

* != : est différent de
<figure><img src="image_41.png" /></figure>

Conditions (2)

```php
<?php
$nombre = 8;

if ($nombre < 10)
{
    echo "En-dessous de la moyenne";
}
else
{
    echo "Au-dessus de la moyenne";
}

?>
```
<figure><img src="image_42.png" /></figure>

# Conditions multiples (1)

* AND (&&)

* OR (||)
<figure><img src="image_43.png" /></figure>

Conditions multiples (2)

* AND (&&)

* OR (||)

```perl
if ($club == "OL" OR $club == "LOU")
{
    echo "Le club est basé à Lyon";
}
```
<figure><img src="image_44.png" /></figure>

switch...case...default

<?php
$temp = 25;
}

switch ($temp) // commentaire
{

case 0:
echo "Il gèle";
break;

case 5:
echo "Il fait froid";
break;

case 20:
echo "Il fait chaud";
break;

default:
echo "Coucou";

}

<figure><img src="image_45.png" /></figure>
Boucle while (tant que)

?php
while ($continuer == true)
{
    // instructions
}
?>

<figure><img src="image_46.png" /><figcaption>Crédit : ske / Public domain</figcaption></figure>
<figure><img src="image_47.png" /></figure>

Boucle for

?php
for ($nombre = 1; $nombre <= 100; $nombre++)
{
    echo $nombre;
}
?>

<figure><img src="image_48.png" /></figure>

Crédit : ske / Public domain
<figure><img src="image_49.png" /></figure>

# Tableaux en PHP (1)

<?php

$prenoms = array('Jean-Philippe', 'Régis', 'Sophiane', 'Nicolas');

?>
<figure><img src="image_50.png" /></figure>

# Tableaux en PHP (3)

?php

echo $prenoms[1];

?>
# Tableaux associatifs en PHP (1)

<?php

$fiche = array (
    'prenom' => 'Benoît',
    'nom' => 'Prieur',
    'ville' => 'Saint-Maurice-de-Beynost');
?>

<?php

$fiche['prenom'] = 'Benoît';
$fiche['nom'] = 'Prieur';
$fiche['ville'] =
'Saint-Maurice-de-Beynost';
?>
<figure><img src="image_51.png" /></figure>

# Tableaux associatifs en PHP (2)

?php

echo $fiche['ville'];

?>
<figure><img src="image_52.png" /></figure>

# Parcours de tableaux en PHP (1)

* Boucle for

* bouche foreach

* print_r
<figure><img src="image_53.png" /></figure>

Parcours de tableaux en PHP (2)

```php
for ($numero = 0; $numero < 5; $numero++)
{
    echo $prenoms[$numero];
}

foreach ($fiche as $element)
{
    echo $element;
}
```
## Parcours de tableaux en PHP (3)

```php
<?php foreach($fiche as $cle => $element) ?>
    foreach($fiche as $cle => $element)
    {
        echo '['. $cle . '] vaut ' . $element;
    }
```
<figure><img src="image_54.png" /></figure>

## print_r pour le débogage en PHP

* Affiche l'ensemble du contenu du tableau

print_r($fiche);
<figure><img src="image_55.png" /></figure>

# Les fonctions en PHP (1)

* Fonctions prêtes à l'emploi

* Fonctions définies
<figure><img src="image_56.png" /></figure>

Les fonctions en PHP (2)

<?php

$phrase = 'Bonjour IT-Akademy';

$longueur = strlen($phrase);

echo 'La phrase a ' . $longueur . ' caractères';

$phrase2 = str_replace('Bonjour', 'Coucou', $phrase);

?>
<figure><img src="image_57.png" /></figure>

Les fonctions en PHP (3)

* strlen

* str_replace

* str shuf fl e

• strlower

* date

* etc.
<figure><img src="image_58.png" /></figure>

Les fonctions en PHP (4)

<?php

function Bonjour($nom)

{

echo 'Bonjour ' . $nom;

}

Bonjour('Benoît');

Bonjour('Toto');

?>
<figure><img src="image_59.png" /></figure>

## Exercice en PHP CLI (1)

On a un tableau en entrée. Il inclut les notes d'une classe dans une matière donnée. De 0 à 20. Demander à l'utilisateur le nombre de notes. Puis faire entrer les notes.

* Moyenne(tableau)

* Min(tableau)

* Max(tableau)
Exercices en PHP CLI (2)

1. Prendre en paramètre deux longueurs d'un triangle rectangle. Calculer la longueur de l'hypoténuse (voir fonction sqrt)

2. Retourner le nombre d'occurrences d'une lettre dans une chaîne de caractères pour une lettre donnée.

3. Renvoyer vrai quand le nombre passé en paramètre est pair. Renvoyer faux sinon (voir %)
Exercice en PHP Web (1)

* Créer une page PHP

* Afficher la date du jour dans une balise H1

* Afficher une liste à puces (tags li, ul) contenant une liste de prénoms ("codés en dur"). Utiliser une boucle.

* Afficher un tableau des capitales du monde. Utiliser une boucle.
<figure><img src="image_60.png" /></figure>

La notion d'include (1)

* Inclusion de page en PHP

?php include("menus.php");?>
<figure><img src="image_61.png" /></figure>

La notion d'include (2)
<figure><img src="image_62.png" /></figure>

La notion de require

<?php

require('somefile.php');

?>
<figure><img src="image_63.png" /></figure>

# Exercice en PHP Web (2)

(facultatif)

* Afficher une combobox listant quelques pays du monde.

* Quand on choisit un pays, on obtient la capitale.

* Les pays-capitales sont issus d'une table MySQL PAYS.
<figure><img src="image_64.png" /></figure>

# Les 7 travaux-pratiques

* Envoi du README.txt (Github) par messagerie instantanée

* Réaliser le tout et le livrer dans un repository Github dédié