Premiers éléments de programmation impérative#

À faire

2024-2025 Réinsérer les boucles while simple. En 2023-2024 l’amphi n’a duré que 1h15 sur 1h30.

Prélude#

Comment vous sentez-vous en ce début de cours?#

Curieux

Énervé

Inquiet

Fatigué

Avez vous bien avancé le TP chez vous?#

J’ai fini tous les exercices du TP (laby, …)

J’ai retravaillé au moins deux heures de plus sur le TP

Je n’ai pas pu utiliser myDocker

Il fallait retravailler sur le TP?

Résumé des épisodes précédents …#

  • Info 111: modalités et infrastructure

  • Informatique: usage, technologie, science

  • Objectif d’Info 111: initier à la science via la technologie

  • Concrètement: bases de la programmation impérative + …

Rappel#

Définition : Programmes

Programme (program) : séquence d’instructions qui spécifie étape par étape les opérations à effectuer pour obtenir à partir des entrées (input (informal)) un résultat (la sortie (output (informal))).

Exemple

debut()
droite()
avance()
prend()
gauche()
avance()
pose()
droite()
avance()
gauche()
avance()
avance()
droite()
ouvre()
../_images/laby01.png

Comment rompre la monotonie?#

  • Découper en petits programmes : les fonctions

Expressions#

Définition : Expressions

Expression (expression) : combinaison de valeurs par des opérations donnant une nouvelle valeur

Exemple

L’expression 3 * (1 + 3) + (1 + 4) * (2 + 4) vaut 42

Opérations sur les entiers

Opération

Exemple

Résultat

opposé

-(-5)

5

addition

17 + 5

22

soustraction

17 - 5

12

multiplication

17 * 5

85

division entière

17 / 5

3

reste de la division entière

17 % 5

2

Astuce

Aparté : syntaxe, sémantique, algorithme

  • Syntaxe (syntax) : comment cela s’écrit

  • Sémantique (semantics) : ce que cela fait

  • Algorithme (algorithm) : comment c’est fait

Exemple

  • Syntaxe : 17 / 5

  • Sémantique : calcule la division entière de 17 par 5

  • Algorithme : division euclidienne

Expressions booléennes#

Définition : Expressions booléennes (conditions)

Une expression booléenne (Boolean expression) est une expression dont la valeur est «vrai» ou «faux» (type : bool).

Une expression booléenne est aussi appelée une condition (condition).

Exemples :

true
false
  • regarde() == Vide

  • x > 3.14

  • 2 <= n  and  n <= 5

Opérations booléennes usuelles

Opération

Exemple

Résultat

comparaison

3 <= 5

true

comparaison stricte

3 < 5

true

comparaison stricte

3 > 5

false

égalité

3 == 5

false

inégalité

3 != 5

true

négation

not 3 <= 5

false

et

3 < 5 and 3 > 5

false

ou

3 < 5 or  3 > 5

true

Variables#

À faire

  • Transformer en un problème plutôt qu’un exemple

  • Préparer le terrain pour écrire le code en amphi. Par exemple via BEGIN/END SOLUTION

  • Est-ce que les notes imprimées devraient, ou pas, contenir la solution?

Exemple

Calculer l” énergie cinétique \(\frac12 m v^2\) d’un objet de masse \(14,5\) kg selon qu’il aille à \(1\), \(10\), \(100\), ou \(1000\) m/s.

1. / 2 * 14.5 * 1 * 1
1. / 2 * 14.5 * 10 * 10
1. / 2 * 14.5 * 100 * 100
1. / 2 * 14.5 * 1000 * 1000 

Qu’est-ce qui n’est pas satisfaisant?

double v;
double m;
v = 1000;
m = 14.5;
1. / 2 * m * v * v

Définition : Variables

Une variable (variable) est un espace de stockage nommé où le programme peut mémoriser une donnée

Indication

Objectif

  • Stocker des informations pour usage ultérieur

  • Nommer des informations pour faciliter la lecture du programme

À retenir

En C++, une variable possède quatre propriétés :

  • un nom (ou identificateur)

  • une adresse
    à préciser la semaine prochaine

  • un type

  • une valeur

La valeur peut changer en cours d’exécution du programme (d’où le nom de variable)

Notion de type#

Les variables peuvent contenir toutes sortes de données différentes :

  • nombres entiers, réels, booléens, …

  • textes

  • relevés de notes, images, musiques, …

Définition : Types

  • Une variable C++ ne peut contenir qu’une seule sorte de données.

  • On appelle cette sorte le type (type (informal)) de la variable.

  • On dit que C++ est un langage typé statiquement.

Définition : Types de base

Les types de base en C++ sont :

  • Les entiers (integer) (mots clés int, long int)
    Exemples : 1, 42, -32765

  • les réels (float) (mots clés float, double)
    Exemples : 10.43, 1.0324432e22

  • les chaînes de caractères (string) (mot clé string)
    Exemples : « bonjour », « Alice aime Bob »

  • les booléens (Boolean type) (mot clé bool)
    Exemples : true (vrai), false (faux)

Les entiers, les caractères et les booléens forment les types ordinaux (ordinal type).

La déclaration des variables#

Pour chaque variable, il faut donner au programme son nom et son type. On dit que l’on déclare la variable (variable declaration).

Syntaxe : déclaration des variables

type nomvariable;
type nomvariable1, nomvariable2, ...;

Exemple

int x, y, monEntier;
double f, g;
bool b;

Note : en C++ (compilé) on ne peut pas redéclarer une variable avec le même nom!

L’affectation#

Syntaxe

identificateur = expression;

Exemple

x = 3 + 5;

Sémantique

  • Calcul (ou évaluation) de la valeur de l’expression

  • Stockage de cette valeur dans la case mémoire associée à cette variable.

  • La variable et l’expression doivent être de même type!

Exemples d’affectations#

int x, y;

On affecte la valeur 1 à la variable x :

x = 1;

On affecte la valeur 3 à la variable y :

y = 3;

Valeurs des variables après l’affectation :

x
y

Exemple : affecter la valeur d’une variable à une autre variable

x = y;
x
y

Indication

Note

  • Affectation x = y : copie de la valeur

  • y garde sa valeur

  • L’ancienne valeur de x est écrasée!

Exemple : incrémentation

int x; x = 1;

x = x + 1;
x

Variantes :

x -= 2;
x
x++;
x

Quelques raccourcis pratiques

Syntaxe

Sémantique

Syntaxe équivalente

x += a

Incrémenter x de a

x = x + a

x -= a

Décrémenter x de a

x = x - a

x++

Incrémenter x

x = x + 1

x--

Décrémenter x

x = x - 1

Avertissement

Affectation et égalité : deux concepts différents

  • L’affectation x = 5 :

    Une instruction modifiant l’état de la mémoire.

  • Le test d’égalité x == 5 :

    Une expression booléenne (valeur vrai ou faux) :

    « x est égal à 5? »

    Autrement dit : est-ce que la valeur contenue dans la variable x est 5?

Fonctions#

Retour sur notre exemple :

Calculer l’énergie cinétique \(\frac12 m v^2\) d’un objet de masse \(14,5\) kg selon qu’il aille à \(1\), \(10\), \(100\), ou \(1000\) km/h.

Voilà comment nous avions procédé :

m = 14.5;
v = 100;
1. / 2 * m * v * v

Comment éviter de retaper chaque fois la formule?

Fonctions#

Définition : Fonctions

Informellement, une fonction (programming function (informal)) est un petit programme :

  • Entrées

  • Traitement

  • Sortie

À faire

  • Préparer le terrain pour écrire le code en amphi.

  • Coder l’appel à la fonction, puis la fonction elle même.

  • Donner l’exemple avant la définition de fonction

Exemple :

double energie_cinetique(double m, double v) {
    return 1. / 2 * m * v * v;
}
energie_cinetique(14.5, 10)
  • Entrées : la masse et la vitesse (des nombres réels)

  • Sortie : l’énergie cinétique (un nombre réel)

  • Traitement : 1. / 2 * m * v * v

Autres exemples de fonctions#

Exemples

Chou-Chèvre-Loup :

void transporter(... T) {
    charger(T);
    traverser();
    decharger(T);
}

Laby :

void avance_tant_que_tu_peux() {
    while ( regarde() == Vide ) {
        avance();
    }
}

Structures de contrôle#

Rôle des structures de contrôle#

Rappel#

Les instructions sont exécutées de manière séquentielle (les unes après les autres), dans l’ordre du programme.

Exemple :

debut()
droite()
avance()
prend()
gauche()
avance()
pose()
droite()
avance()
gauche()
avance()
avance()
droite()
ouvre()
../_images/laby01.png

Le problème#

On a souvent besoin de rompre l’exécution séquentielle :

  • Des instructions différentes selon le contexte :

    Le labyrinthe 3a avec petite et grande toile
  • Des instructions répétées :

    Un labyrinthe tout en longueur

Nous avons besoin des structures de contrôle.

Instructions conditionnelles#

#include <laby/global_fr.hpp>
LABY("3a")
debut();
droite();
avance();
gauche();

Solution complète :

LABY("3a")
debut()
droite();
avance();
gauche();

if ( regarde() == Toile ) {
    gauche();
    avance();
    avance();
    droite();
    avance();
    avance();
    droite();
    avance();
    gauche();
} else {
    avance();
    avance();
    gauche();
    avance();
    droite();
}
ouvre();

Définition : Blocs d’instructions

Un bloc d’instructions (code block) est une suite d’instructions à exécuter successivement. Il est décrit par la syntaxe suivante :

{
    instruction 1;
    instruction 2;
    ...
    instruction n;
}

Une instruction toute seule est aussi considérée comme un bloc d’instructions.

Instruction conditionnelle simple : «si … alors …»#

Instruction conditionnelle : en fonction d’une condition, on va exécuter ou non un bloc d’instructions.

Syntaxe :

if ( condition ) {
    bloc d instructions;
}

Sémantique

  1. Évaluation de la condition

  2. Si sa valeur est vraie, exécution du bloc d’instructions

Exemple

if ( regarde() == Toile ) {     // Au secours, fuyons!
    gauche();
    gauche();
}
if ( x >= 0 ) gauche();

Instruction conditionnelle : «si … alors … sinon …»#

Syntaxe

if ( condition ) {
    bloc d instructions 1;
} else {
    bloc d instructions 2;
}

Sémantique

  1. Évaluation de la condition

  2. Si sa valeur est «Vrai», exécution du bloc d’instructions 1

  3. Si sa valeur est «Faux», exécution du bloc d’instructions 2

Exemples d’instruction alternative#

Exemple

if ( regarde() == Toile ) {     // Au secours, fuyons!
    gauche();
    gauche();
} else {                        // Tout va bien
    avance();
}

Exemples d’instruction alternative (2)#

Exemple : Calcul du maximum et du minimum de x et y

int x = 3, y = 5;              // Les entrées
int maximum, minimum;          // Les sorties

if ( x > y ) {
    maximum = x;
    minimum = y;
} else {
    maximum = y;
    minimum = x;
}
minimum
maximum

Résumé#

Un aperçu de premiers éléments de programmation :

On reviendra dessus!