1 of 303

Problème :

Jeux pédagogique (gestion des ressources)

Aider les deux nobles paysans Ahmed et Ali de partager leur huile d’olive en deux quantités égaux dans les conditions suivantes :

  • Quantité : 8 litres;
  • Resource : 1 bidon de 8L;

1 bidon de 5L;

1 bidon de 3L.

  • situation : le bidon de 8L est complètement remplit et les autres sont vides;
  • Question : Ecrire les étapes a suivre afin de partager l’huile.

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

1

2 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

2

Résolution du jeux :

La situation actuel est : B8←8L, B5←0L, B3←0L.

La situation souhaite est : B8←4L, B5←4L, B3←0L.

  • B8←8L, B5←0L, B3←0L;

  • B8←3L, B5←5L, B3←0L;

  • B8←3L, B5←2L, B3←3L;

  • B8←6L, B5←2L, B3←0L;

  • B8←6L, B5←0L, B3←2L;

  • B8←1L, B5←5L, B3←2L;

  • B8←1L, B5←4L, B3←3L;

  • B8←4L, B5←4L, B3←0L.

Résolution du jeux :

3 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

3

4 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

4

Enoncé du problème

Cahier des charges

Algorithme

Programmation

Résultats

Etapes de réalisation d’un programme

5 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

5

  • Intérêt :

séparation analyse/codage (pas de préoccupation de syntaxe)

    •  Qualités :
    • Exact (fournit le résultat souhaité) ;
    • Efficace (temps d’exécution, mémoire occupée) ;
    • Clair (compréhensible) ;
    • Général (traite le plus grand nombre de cas possibles) ;
  • Une bonne connaissance de l’algorithmique permet d’écrire des algorithmes exacts et efficaces

6 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

6

Notion d’algorithme

I) Définition de l’algorithme :

Un algorithme est une suite d’actions appliquées sur des données dans un ordre logique afin d’obtenir des résultats.

Exemple :

Réaliser une opération de calcule grâce à la calculatrice, tel que 2+7 :

Début

  • Allumer la calculatrice
  • Taper la touche ❷
  • Taper la touche +
  • Taper la touche ❼
  • Taper la touche =
  • Puis on obtient le résultat 9 à l’écran

Fin

7 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

7

Remarque :

La résolution d’un problème se fait par la méthode suivante(analyse) :

  • Déterminer les données (entrés) ;
  • Déterminer le résultat (sortie) ;
  • Déterminer le processus de transformation des données en résultat (traitement).

Exercice d’application :

Calculer la somme de deux nombres réels.

  • L’analyse :
      • Les données fournies :

Deux nombre réel A et B

      • Le résultat désiré :

La somme S de deux nombres

8 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

8

      • Le processus de transformation des données en résultat :

Additionner les deux nombres A et B pour obtenir le résultat S

II) Notion de données  :

Une constante est une donnée fixe qui ne varie pas tout le long de l’algorithme.

Exemples :

Pi (π)=3,14 ; g=9,81 N/g ;R=8,31 SI ; Na=6,02 1023  ; e=1,6 10-19

1) Les constantes :

Une variable est le nom d’un espace mémoire (case mémoire) dont le contenu peut changer pendant l’exécution d’un algorithme.

2) Les variables :

Exemples :

Nom_eleve ; note_eleve ; Prix_unitaire ; x ; nom4

9 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

9

3) Les caractéristiques d’une donnée :

Pour définir une donnée il faut préciser les éléments suivants :

      • Le nom de la donnée (identificateur)  ;
      • Le type de donnée (caractère, chaîne de caractères, entier, réel, booléen, …) ;
      • La nature de la donnée (constante, variable).

Règles :

  • Les données (variables et constantes) doivent être déclarées avant d’être utilisées ;
  • Le choix des noms de variables est soumis à quelques règles :
  • Un nom doit commencer par une lettre alphabétique ;
  • Doit être constitué uniquement de lettres, de chiffres et du soulignement _ (Eviter les caractères de ponctuation et les espaces) ;
  • Doit être différent des mots réservés du langage ;
  • La longueur du nom doit être inférieure à la taille maximale spécifiée par le langage utilisé ;

10 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

10

Conseil :

Pour la lisibilité du code choisir des noms significatifs qui décrivent les données manipulées.

Remarque :

En pseudo-code algorithmique, on va respecter les règles citées, même si on est libre dans la syntaxe.

Rappel :

  • Toute variable utilisée dans un programme doit avoir fait l’objet d’une déclaration préalable ;
  • En pseudo-code, on va adopter la forme suivante pour la déclaration de variables :

Variables liste d'identificateurs : type

Exemples :

Variables i, j,k : entier

x, y : réel

OK : booléen

ch1, ch2 : chaîne de caractères

11 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

11

Remarques :

Deux valeurs VRAI ou FAUX, TRUE ou FALSE, 0 ou 1.

  • Le type d’une variable détermine l’ensemble des valeurs qu’elle peut prendre, les types offerts par la plupart des langages sont:  

Type numérique (entier ou réel) :

Type logique ou booléen :

    • Entier court (codé sur 2 octets) ;
    • Entier long (codé sur 4 ou 8 octets) ;
    • Réel simple précision (codé sur 4 octets) ;
    • Réel double précision (codé sur 8 octets).

Lettres majuscules, minuscules, chiffres, symboles, ….

Type caractère :

Type chaîne de caractère :

Toute suite de caractères.

Exemples :

’A’, ’a’, ’1’, ’?’, …

Exemples :

"Nom, Prénom", "code postale:1000", "CPGE ", …

  • Pour le type numérique on va se limiter aux entiers et réels sans considérer les sous types. 

12 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

12

1) Instruction de lecture :

III) Les instructions de base  :

Cette instruction permet de lire les données à travers le clavier, appelée également Instruction d’entrée.

L’instruction de lecture est notée :

Syntaxe :

Lire (Variable)

Exemples :

Lire (Note_eleve4) ; Lire (x) ; Lire (A8)

2) Instruction d’écriture :

Cette instruction permet d’afficher un message, le contenu d’une variable et/ou le résultat d’une opération de calcul, appelée aussi Instruction de sortie.

L’instruction d’écriture est représentée par :

Syntaxe :

Ecrire (Variable) ; Ecrire ("message") ; Ecrire (opération de calcul)

Exemples :

Ecrire (Note_eleve4) ; Ecrire ("Bonjour") ; Ecrire ((Note_eleve4+x)/3) ; Ecrire (x,A8,x+A8)

13 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

13

3) L’affectation (Assignation) :

Cette instruction permet d’attribuer une valeur à une variable, elle est représentée par une flèche dirigée vers la gauche "←".

Syntaxe :

Variable ← valeur, une autre variable ou bien une expression

Exemples :

X ← 12

X ← Y+4

Y ← X

12

X

Y+4

12

12

16

14 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

14

Exercice1 :

Donnez les valeurs des variables A, B et C après exécution des instructions suivantes ?

  • Algorithme :

Algorithme Affectation1

Variables A, B, C : Entier

Debut

A←3

B←7

A←B

B←A+5

C←A+B

C←B-A

Ecrire (A,B,C)

Fin

  • Version1 :

Algorithme Affectation2

Variables A, B : Entier

Debut

A←1

B←2

A←B

B←A

Ecrire (A,B)

Fin

  • Version2 :

Les deux dernières instructions (Version2) permettent-elles d’échanger les valeurs de A et B ?

Exercice2 :

Ecrire un algorithme permettant d’échanger les valeurs de deux variables A et B

15 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

15

      • La transformation des données en résultat :

Appliquer la relation qui donne la moyenne de deux nombres.

  • Algorithme :
  • Version1 :

Algorithme Moyenne1

Variables A, B, C : Réel

Debut

Lire (A)

Lire (B)

C ← (A+B)/2

Ecrire (C)

Fin

L’en-tête

Les déclarations

Le corps

Algorithme Moyenne1

Variables A, B, C : Réel

Debut

Lire (A,B)

C ← (A+B)/2

Ecrire (C)

Fin

Exercice d’application :

Ecrire un algorithme qui permet de lire deux nombres réels et d’afficher leur moyenne.

  • L’analyse du problème :
      • Les données fournies :

Deux nombres réels

      • Le résultat désiré :

La moyenne des deux nombres réels

16 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

16

Algorithme Moyenne2

Variables A, B, C : Réel

Debut

Ecrire ("Donner la valeur de A")

Lire (A)

Ecrire ("Donner la valeur de B")

Lire (B)

C ← (A+B)/2

Ecrire ("La moyenne de A et B est :",C)

Fin

L’en-tête

Les déclarations

Le corps

  • Version2 :

Algorithme Moyenne2

Variables A, B, C : Réel

Debut

Ecrire ("Donner la valeur de A et de B")

Lire (A,B)

C ← (A+B)/2

Ecrire ("La moyenne de A et B est :",C)

Fin

Ou bien :

17 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

17

Remarques :

  • Par convention, l’algorithme note certains des opérateurs différemment :

Opérateur

Représentation arithmétique

Représentation algorithmique

Exemple

Addition

+

+

A+B

Soustraction

-

-

A-B

Multiplication

×

*

A*B

Division

÷

/

A/B

Puissance

An

^

A^n

Modulo, reste de la division entière

21÷8=2

Reste 5

21 mod 8=5

A mod B

  • Pour les opérateurs arithmétiques donnés ci-dessus, l'ordre de priorité est le suivant

(du plus prioritaire au moins prioritaire) :

    • ^ (la puissance) ;
    • * , / (multiplication, division) ;
    • mod (modulo) ;
    • + , - (addition, soustraction).

2 + 3 * 7 vaut 23

Exemples :

  • En cas de besoin (ou de doute), on utilise les parenthèses pour indiquer les opérations

à effectuer en priorité :

Exemples :

(2 + 3) * 7 vaut 35

18 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

18

Langages informatiques

I) Définition :

Un langage informatique est un outil permettant de donner des ordres (instructions) à la machine.

Définition :

II) Langage machine :

  • Intérêt : écrire des programmes (suite consécutive d’instructions) destinés à effectuer une tâche donnée ;
  • Contrainte : être compréhensible par la machine.
  • Langage binaire : l’information est exprimée et manipulée sous forme d’une suite de bits ;
  • Un bit (binary digit) = 0 ou 1 (2 états électriques) ;
  • Une combinaison de 8 bits= 1 Octet 🡺 28=256 possibilités qui permettent de coder tous les caractères alphabétiques, numériques, et symboles tels que ?,*,&, … ;
  • Les opérations logiques et arithmétiques de base (addition, multiplication, …) sont effectuées en binaire.
  • Le code ASCII (American Standard Code for Information Interchange) donne les correspondances entre les caractères alphanumériques et leurs représentations binaires.

Exemple :

A= 01000001

?=00111100

19 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

19

II) Langage haut niveau :

  • Intérêts multiples pour le langage haut niveau :
  • Nécessite un traducteur (compilateur/interpréteur) ;
  • Exécution plus ou moins lente selon le traducteur.
  • Proche du langage humain «anglais» (compréhensible) ;
  • Permet une plus grande portabilité (indépendant du matériel) ;
  • Manipulation de données et d’expressions complexes (réels, objets, a*b/c, …).

Code source

en langage évolué

Langage machine

Compilateur ou

Interpréteur

  • Compilateur : traduire le programme entier une fois pour toutes :

1) Compilateur/interpréteur :

  • + plus rapide à l’exécution ;
  • + sécurité du code source ;
  • - il faut recompiler à chaque modification.

fichier exécutable

fichier source

exemple.c

Compilateur

Exécution

exemple.exe

20 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

20

  • Interpréteur : traduire au fur et à mesure les instructions du programme à chaque exécution.

fichier source

Interprétation+Exécution

exemple.py

  • + exécution instantanée appréciable pour les débutants ;
  • - exécution lente par rapport à la compilation.

Un langage de programmation est un langage informatique composé d’un ensemble d’instructions pouvant être traduites et exécutées par un ordinateur.

Exemple :

Basic, Pascal, COBOL, Fortaran, C, C++, LOGO, Python,…

A) Définition d’un langage de programmation :

1) Langages python (Code python) :

21 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

21

B) Définition d’un programme :

Un programme est une suite ordonnée d’instructions, compréhensibles par l’ordinateur, appliqué à des données afin d’obtenir des résultats.

C) L’identificateur :

Un identificateur en langage python doit débuter par une lettre suivie par un nombre de lettres ou de chiffres.

x, max, val4

Exemple :

D) Les types de données :

  • Le type entier :

Pas de valeur limite explicite, correspond au moins au long int du C (-263 à 263 ).

  • Le type réel :

Correspond au double du C (-1.7 10308 à +1.7 10308) .

22 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

22

  • Le type chaine de caractères :

Ce type sert à manipuler les caractères.

  • Le type booléen :

Ce type prend la valeur False pour faux et la valeur True pour vrai.

C) Les instructions :

i) l’instruction d’entrée :

L’instruction de lecture est symbolisée par input, elle permet le transfert des données vers la mémoire centrale .

Syntaxe :

l’identificateur=input() 

ii) l’instruction de sortie  :

L’écriture se fait de façon semblable que la lecture à l’aide de l’instruction print.

Syntaxe :

print(l’identificateur)

Exemple :

x=input() 

Exemple :

print(x) 

23 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

23

iii) l’instruction d’affectation :

Cette instruction permet de mettre une valeur dans une variable. Le symbole de l’affectation est =

Syntaxe :

variable = valeur

Remarques :

  • print permet d’afficher un texte.

Type

Format

Entier

int

%d

Réel (Flottant)

float

%f ou %e

Caractère

char

%c

Chaîne de caractères

char

%s

  • Les codes de format :

Exemple :

x=4 

24 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

24

Résultats

Enoncé du problème

Cahier des charges

Algorithme

Programme source

Interprétation et Exécution

Etapes de réalisation d’un programme

25 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

25

Structures de contrôle de base

I) Structure séquentielle :

La structure séquentielle est une suite d’instructions qui s’exécute l’une après l’autre dès le début jusqu'à la fin dans un algorithme.

Exemple :

Calcul de la moyenne des deux nombres réels A et B.

Définition :

(Algorithme et Programmation)

Langage python

# Programme Moyenne

A=input('Donner A:')

B=input('Donner B:')

A=float(A)

B=float (B)

Moyenne=(A+B)/2

print("La moyenne de",A,"et",B,"=",Moyenne)

Algorithme

Algorithme Moyenne

Variables A, B, Moyenne : Réel

Debut

Ecrire ("Donner la valeur de A")

Lire (A)

Ecrire ("Donner la valeur de B")

Lire (B)

Moyenne ← (A+B)/2

Ecrire ("La moyenne de A et B est :", Moyenne )

Fin

26 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

26

1) Définition :

II) Structure alternative :

La structure alternative permet d’exécuter un bloc d’instructions ou un autre en fonction de la réponse de la condition.

Langage python

if condition: ou if condition:

Instruction Instructions

Algorithme

Si condition alors

Instruction ou suite d'instructions

Finsi

2) Structure alternative simple :

Cette structure permet d’effectuer certaines opérations ou au contraire de ne rien faire.

Syntaxe :

Si la condition est vérifiée alors le bloc d’instructions serait exécuté, sinon il serait ignoré.

Cette instruction se lit :

27 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

27

Langage python

if Moyenne= =10:

print("Juste la moyenne")

Algorithme

Si Moyenne=10 alors

Ecrire ("Juste la moyenne")

Finsi

Remarques :

Opérateurs

Signification

Représentation algorithmique

Exemple

Représentation Langage python

Exemple

=

égal

=

A=B

= =

A= =B

Différent de…

<>

A<>B

!=

A!=B

<

Strictement plus petit que…

<

A<B

<

A<B

>

Strictement plus grand que…

>

A>B

>

A>B

plus petit ou égal à…

<=

A<=B

<=

A<=B

plus grand ou égal à…

>=

A>=B

>=

A>=B

Exemple :

28 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

28

Cette structure permet d’exécuter un bloc d’instructions ou un autre en fonction d’une condition.

Si la condition est vérifiée alors le bloc d’instructionsA sera exécuté et le bloc, d’instructionsB sera ignoré. Sinon le bloc d’instructionsB sera exécuté et le bloc d’instructionsA sera ignoré.

3) Structure alternative complète :

Cette instruction se lit :

Syntaxe :

Code python

if condition: ou if condition:

InstructionA InstructionsA

else : else :

InstructionB InstructionsB

Algorithme

Si condition alors

InstructionsA

Sinon

InstructionsB

Finsi

Exemple :

Langage python

if Moyenne= =10:

print("Juste la moyenne")

else :

print("La moyenne est différente de 10")

Algorithme

Si Moyenne=10 alors

Ecrire ("Juste la moyenne")

Sinon

Ecrire ("La moyenne est différente de 10")

Finsi

29 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

29

4) Structure alternative imbriquée  :

Cette structure est utilisée quand on a plus de deux conditions.

Syntaxe :

Algorithme

Si (condition1) alors

InstructionsA

Sinon

Si (condition2) alors

InstructionsB

Sinon

Si (condition3) alors

InstructionsC

Sinon

InstructionsD

Finsi

Finsi

Finsi

Langage python

if condition1:

InstructionsA

elif condition2:

InstructionsB

elif condition3:

InstructionC

else :

InstructionD

30 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

30

Algorithme

Si (Moyenne=10) alors

Ecrire ("Juste la moyenne")

Sinon

Si (Moyenne<10) alors

Ecrire ("La moyenne est inferieure à 10")

Sinon

Ecrire ("La moyenne est supérieure à 10")

Finsi

Finsi

Langage python

if Moyenne= =10 :

print("Juste la moyenne")

elif Moy<10 :

print("La moyenne est inferieure à 10")

else :

print("La moyenne est supérieure à 10")

Exemple1 :

Exemple2 :

Algorithme

Algorithme Temperature_eau

Variable Temperature : Entier

Debut

Ecrire ("Entrez la température de l’eau :")

Lire (Temperature)

Si (Temperature<=0) Alors

Ecrire ("C’est de la glace")

Sinon

Si (Temperature<=100) Alors

Ecrire ("C’est du liquide")

Sinon

Ecrire ("C’est du vapeur")

Finsi

Finsi

Fin

Langage python

# Programme Temperature Eau

Temperature=input('Entrez la température de l’eau:')

Temperature=int(Temperature)

if Temperature<=0 :

print("C’est de la glace")

elif Temperature<=100 :

print("C’est du liquide")

else :

print("C’est du vapeur")

31 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

31

Exemple3 :

Algorithme

Algorithme gestion_feu

Variable Couleur : caractere

Debut

Ecrire ("De quelle couleur est le feu?")

Lire (Couleur)

Si ((Couleur = ‘V’)OU(Couleur = ‘v’)) Alors

Ecrire ("Je passe")

Sinon

Si ((Couleur = ‘O’)OU(Couleur = ‘o’)) Alors

Ecrire ("Je ralentis")

Sinon

Si ((Couleur = ‘R’)OU(Couleur = ‘r’)) Alors

Ecrire ("Je m’arrête")

Sinon

Ecrire ("Cette couleur n’est pas une couleur de feu")

Finsi

Finsi

Finsi

Fin

Code python

# Programme Gestion Feu

Couleur=input('De quelle couleur est le feu?')

if Couleur= ='V' or Couleur= ='v':

print("Je passe")

elif Couleur= ='O' or Couleur= ='o':

print("Je ralentis")

elif Couleur= ='R' or Couleur= ='r':

print("Je m’arrête")

else:

print("Cette couleur n’est pas une couleur de feu")

32 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

32

5) Structure de choix :

Cette structure permet d’effectuer un choix parmi plusieurs cheminement proposés.

Syntaxe :

Algorithme

Selon que identificateur vaut

Valeur 1 faire Instructions 1

Valeur 2 faire Instructions 2

 

Valeur n faire Instructions n

Autrement que Instructions n+1

Finselon

Langage python

33 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

33

Exemple :

Algorithme

Algorithme gestion_feu1

Variable Couleur : caractere

Debut

Ecrire ("De quelle couleur est le feu?")

Lire (Couleur)

Selon que Couleur vaut

‘V’ ‘v’ faire Ecrire ("Je passe")

‘O’ ‘o’ faire Ecrire ("Je ralentis")

‘R’ ‘r’ faire Ecrire ("Je m’arrête")

Autrement que Ecrire ("Cette couleur n’est pas une couleur de feu")

Finselon

Fin

Code python

# Programme Gestion Feu

Couleur=input('De quelle couleur est le feu?')

if Couleur= ='V' or Couleur= ='v':

print("Je passe")

elif Couleur= ='O' or Couleur= ='o':

print("Je ralentis")

elif Couleur= ='R' or Couleur= ='r':

print("Je m’arrête")

else:

print("Cette couleur n’est pas une couleur de feu")

34 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

34

II) Instructions itératives (les boucles) :

Les boucles servent à répéter l'exécution d'un groupe d'instructions un certain nombre de fois.

Langage python

for compteur in range(initiale,finale+1,pas) :

  suite d'instructions

Algorithme

Pour compteur allant de initiale à finale par pas Faire

Instructions

FinPour

1) Les boucles Pour ou avec compteur :

On distingue trois sortes de boucles en langages de programmation.

Syntaxe :

  • Les boucles Tant que ;
  • Les boucles Jusqu’à ;
  • Les boucles Pour ;

On y répète des instructions en faisant évoluer un compteur (variable particulière) entre une valeur initiale et une valeur finale.

35 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

35

Exemple :

Langage python

# Programme Compteur

for i in range(1,6) :

print("La valeur de i=",i)

Algorithme

Algorithme Compteur

Variable i : entier

Debut

Pour i allant de 1 à 5 par pas 1 Faire

Ecrire (" La valeur de i est : " ,i)

FinPour

Fin

Algorigramme :

36 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

36

  • Pas peut ne pas être mentionné, car par défaut sa valeur est égal à 1. Dans ce cas, le nombre d'itérations est égal à finale - initiale+ 1 ;
  • Initiale et finale peuvent être des valeurs, des variables définies avant le début de la boucle ou des expressions de même type que compteur.

Remarque :

  • Le nombre d'itérations dans une boucle Pour est connu avant le début de la boucle ;
  • Il faut éviter de modifier la valeur du compteur (et finale) à l'intérieur de la boucle. En effet, une telle action :
  • perturbe le nombre d'itérations prévu par la boucle Pour ;
  • rend difficile la lecture de l'algorithme ;
  • présente le risque d'aboutir à une boucle infinie.

37 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

37

Exemple :

Langage python

# Programme Compteur

for i in range(1,6) :

i=i-1

print("La valeur de i=",i)

Algorithme

Algorithme Compteur

Variable i : entier

Debut

i←0

Pour i allant de 1 à 5 Faire

i←i-1

Ecrire (" La valeur de i est : " ,i)

FinPour

Fin

38 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

38

Langage python

while condition :

  suite d'instructions

Algorithme

TantQue condition Faire

instructions

FinTantQue

2) Les boucles Tant que :

Syntaxe :

On y répète des instructions tant qu'une certaine condition est réalisée.

Exemple :

Langage python

# Programme Compteur

i=0

while i<6 :

print("La valeur de i=",i)

i=i+1

Algorithme

Algorithme Compteur

Variable i : entier

Debut

i←0

TantQue i<=5 Faire

Ecrire (" La valeur de i est : " ,i)

i←i+1

FinTantQue

Fin

i) boucle Tant que … Faire :

39 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

39

Langage python

Algorithme

Faire

instructions

TantQue condition

Syntaxe :

Exemple :

Langage python

Algorithme

Algorithme Compteur

Variable i : entier

Debut

i←0

Faire

Ecrire (" La valeur de i est : " ,i)

i←i+1

TantQue i<=5

Fin

i) boucle Faire…Tant que :

40 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

40

Algorigramme :

  • La condition (dite condition de contrôle de la boucle) est évaluée avant chaque itération ;
  • Tant que la condition est vraie, on exécute les actions ;
  • Si la condition est fausse, on sort de la boucle et on exécute l'instruction qui est après FinTantQue.

Remarques :

  • Le nombre d'itérations dans une boucle TantQue n'est pas connu au moment d'entrée dans la boucle. Il dépend de l'évolution de la valeur de condition ;
  • Une des instructions du corps de la boucle doit absolument changer la valeur de condition de vrai à faux (après un certain nombre d'itérations), sinon le programme tourne indéfiniment ;

41 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

41

Exemple de boucle infinie  :

Attention aux boucles infinies !!!!

Langage python

# Programme Compteur

i=1

while i>0 :

print("La valeur de i=",i)

i=i+1

Algorithme

Algorithme Infinie

Variable i : entier

Debut

i ← 1

TantQue i>0 Faire

Ecrire("La valeur de i=",i)

i ← i+1

FinTantQue

Fin

  • Si on peut déterminer le nombre d'itérations avant l'exécution de la boucle, il est plus naturel d'utiliser la boucle Pour ;
  • S'il n'est pas possible de connaître le nombre d'itérations avant l'exécution de la boucle, on fera appel à TantQue.

Choix d'un type de boucle :

42 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

42

Langage python

Algorithme

Faire

Instructions

Jusqua condition

Syntaxe :

Exemple :

Langage python

Algorithme

Algorithme Compteur

Variable i : entier

Debut

Faire

Ecrire (" La valeur de i est : " ,i)

Jusqua i>5

Fin

3) Boucle Faire…Jusqu’à :

43 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

43

La boucle Pour est un cas particulier de TantQue (cas où le nombre d'itérations est connu et fixé). Tout ce qu'on peut écrire avec Pour peut être remplacé avec TantQue (la réciproque est fausse).

Lien entre Pour et TantQue :

Langage python

for compteur in range(initiale,finale+1,pas) :

  suite d'instructions

Algorithme

Pour compteur allant de initiale à finale par pas Faire

Instructions

FinPour

Peut être remplacé par :

Exemple :

Langage python

# Programme Compteur

compteur =initiale

while compteur <= finale :

  Instructions

compteur = compteur+1

Algorithme

Algorithme Compteur

Variable compteur : entier

Début

compteur ← initiale

TantQue compteur <= finale Faire

Instructions

compteur ← compteur+1

FinTantQue

Fin

44 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

44

Algorithme

Algorithme Boucle Imbriquée

Variable A,B,Moy : Reels

Reponse : caractère

Début

Reponse=‘o’

TantQue Reponse=‘O’ OU Reponse=‘o’ Faire

Ecrire (" Donner A et B :")

Lire(A,B)

Moy=(A+B)/2

Ecrire("La moyenne de ",A, "et",B, "est",Moy)

Si (Moy=10) alors

Ecrire ("Juste la moyenne")

Sinon

Si (Moy<10) alors

Ecrire ("La moyenne est inferieure à 10")

Sinon

Ecrire ("La moyenne est supérieure à 10")

Finsi

Finsi

Ecrire(" Voulez -Vous Continuer à exécuter ce programme? O/N ")

Lire(Reponse)

TantQue Reponse<>‘O’ ET Reponse<> ‘o’ ET Reponse<> ‘N’ ET Reponse<> ‘n’ Faire

Ecrire(" Donner une réponse O/N ")

Lire(Reponse)

FinTantQue

FinTantQue

Ecrire("Merci, Au revoir!!!!")

Fin

3) Boucle imbriquées  :

Les instructions d'une boucle peuvent être des instructions itératives. Dans ce cas, on aboutit à des boucles imbriquées.

Exemple :

45 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

45

Langage python

# Programme Boucle Imbriquée

Reponse='o'

while Reponse=='o' or Reponse=='O' :

A=input('Donner A:')

B=input('Donner B:')

A=int(A)

B=int(B)

Moy=(A+B)/2

print('La moyenne de',A,'et',B,'est',Moy)

if Moy==10:

print("Juste la moyenne")

elif Moy<10:

print("La moyenne est inferieure à 10")

else:

print("La moyenne est supérieure à 10")

print(" Voulez -Vous Continuer à exécuter ce programme? O/N")

Reponse=input()

while Reponse!='o' and Reponse!='O' and Reponse!='N' and Reponse!='n':

print("Donner une réponse O/N")

Reponse=input()

print("Merci, Au revoir!!!!")

46 of 303

Imbrications autorisées

Boucle 1

Fin Boucle 1

Boucle 2

Fin Boucle 2

Boucle 4

Fin Boucle 4

Boucle 3

Fin Boucle 3

Imbrications interdites

Boucle 1

Fin Boucle 1

Boucle 2

Fin Boucle 2

Boucle 4

Fin Boucle 4

Boucle 3

Fin Boucle 3

Imbrications de boucles :

*

46

Ingénierie numérique et simulation-MPSI/TSI/PCSI

L’instruction break :

Elle sert à interrompre le déroulement d’une boucle.

L’instruction Continue :

Elle permet de passer au tour de boucle suivant.

47 of 303

47

Un algorithme qui détermine le premier nombre entier N tel que la somme de 1 à N dépasse strictement 100.

Algorithme

Algorithme somme2

Variables som, i : entier

Debut

som ← 0

i ← 1

TantQue (som <=100) Faire

     som ← som + i

i ← i+1

FinTantQue

Ecrire ("La valeur cherchée est N= ",i-1)

Fin

Langage python

# Programme Somme100

i=0

Som=0

while Som<=100:

Som=Som+i

i=i+1

print("La valeur cherchée est N =",i-1)

Exercice1 :

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

48 of 303

48

Algorithme

Algorithme puissance

Variables x, puiss : réel

n, i : entier

Debut

Ecrire (" Entrez la valeur de x ")

Lire (x)

Ecrire (" Entrez la valeur de n ")

Lire (n)

puiss ← 1

Pour i allant de 1 à n Faire

puiss← puiss*x

FinPour

Ecrire (x, " à la puissance ", n, " est égal à ", puiss)

Fin

Langage python

# Programme Puissance

x=int(input("Entrez la valeur de x:"))

n=int(input("Entrer la valeur de n:"))

puiss=1

for i in range(1,n+1):

puiss=puiss*x

print(x,"à la puissance",n,"est égal à",puiss)

Exercice2 :

Donner un programme qui Calcul x à la puissance n où x est un réel non nul et n un entier positif ou nul.

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

49 of 303

49

Algorithme

Algorithme factorielle

Variables n,fact : entier

Debut

Ecrire (" Entrez la valeur de n")

Lire (n)

fact← 1

Pour i allant de 1 à n Faire

fact← fact*i

FinPour

Ecrire (" La factorielle de", n ,"est :", fact)

Fin

Langage python

# Programme Puissance

n=int(input("Entrer la valeur de n:"))

fact=1

for i in range(1,n+1):

fact=fact*i

print("La factorielle de",n,"est:",fact)

input()

Exercice3 :

Donner un programme qui Calcul la factorielle d’un nombre entier n.

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

50 of 303

50

Algorithme

Algorithme Fibonacci

Variables n, j, A,B,C : entier

Debut

B ← 1

C ← 1

Ecrire (" Donner La valeur de n ")

Lire (n)

Si (n=0 OU n=1) alors

Ecrire (" La valeur Un=1")

Sinon

Pour j allant de 2 à n Faire

A ←B + C

C ← B

B ← A

FinPour

Ecrire (" La valeur Un=",A)

Finsi

Fin

Langage python

# Programme Fibonacci

n=int(input("Entrer la valeur de n:"))

B=1

C=1

if n= =0 or n= =1 :

print("La valeur U",n,"=1")

else:

for j in range(2,n+1):

A=B+C

C=B

B=A

print("La valeur U",n,"=",A)

input()

Exercice4 :

Déterminez un algorithme permettant de calculer le terme de rang n de la suite de. Fibonacci. Avec : U0=U1=1 et Un=Un-1+Un-2.

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

51 of 303

51

Analyse descendante : Diviser pour régner

Diviser pour régner consiste à décomposer le problème complexe à résoudre en plusieurs sous problèmes moins complexes. A refaire cette décomposition sur les sous problèmes jusqu’à obtenir des sous problèmes faciles à résoudre.

Conclusion :

La solution à un problème bien défini peut être formulée comme une suite des trois énoncés suivants :

    • Séquentiel : suite d’étapes
    • Conditionnel : choix entre deux étapes suivant une condition
    • Répétitif (itératif) : répétition d’une étape

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

52 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

52

A

A1

A2

A

A1

A2

A11

A12

A21

A22

A

Action

abstraite

Actions mois

abstraites

Actions concrètes

Exemple :

Algorithme de résolution d'équation de second degré :

a x2 + b x + c = 0

53 of 303

53

ax2+bx+c=0

bx+c=0

ax2+bx+c=0

c=0

Infinités de solutions

Pas de solutions

x=-c/b

Δ=b2-4ac

Δ=0

x=-b/2a

Δ≠0

Δ<0

Pas de solutions réelles

Δ>0

x1=-b-(Δ)1/2/2a

x2=-b+(Δ)1/2/2a

a=0

a≠0

b=0

c=0

b≠0

c≠0

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

54 of 303

54

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

55 of 303

55

Algorithme Eq_Second_Degré

Réel a, b, c , Delta

Début

Ecrire ("Donner les coefficients : ")

Lire(a,b,c)

Si (a = 0) alors

Si (b = 0) alors

Si (c = 0) alors

Ecrire ("Infinités de solutions")

Sinon

Ecrire ("Pas de solutions")

FSi

Sinon

Ecrire ("Equation de 1er degré, une racine réelle : ",-c/b)

FSi

Sinon

Delta b*b –4*a*c

Si (Delta = 0) Alors

Ecrire ("Une racine réelle double : " , -b/(2*a))

Sinon

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

56 of 303

56

Si (Delta > 0) Alors

Ecrire("Deux racines réelles :  x1 = ", (-b + racine(Delta)) /(2*a) , " x2 = ", (-b + racine(Delta)) /(2*a) )

Sinon

Ecrire("Pas de solutions réelles ")

FSi

FSi

FSi

Fin

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

57 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

57

Complexités :

C’est l’étude de l’efficacité comparée des algorithmes. On mesure ainsi le temps et aussi l’espace nécessaire à un algorithme pour résoudre un problème.

  • Complexité temporelle : (ou en temps) : temps de calcul ;
  • Complexité spatiale : (ou en espace) : l’espace mémoire

requis par le calcul.

      • Complexité pratique : est une mesure précise des complexités

temporelles et spatiales pour un modèle de machine donné ;

      • Complexité théorique : est un ordre de grandeur de ces couts,

exprimé de manière la plus indépendante possible des conditions

pratiques d’exécution.

58 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

58

    • O(1) constant ;
    • O(log n) logarithmique;
    • O(n) linéaire;
    • O(n×log n) quasi-linéaire;
    • O(n²) quadratique;
    • O(np) polynomial;
    • O(an) exponentiel (problèmes très difficiles).

Les principales classes de complexité :

59 of 303

Langage C :

  • Le résultat d’une fonction peut ne pas être utilisé

  • Une fonction peut ne pas fournir aucun résultat

  • Une fonction peut fournir un résultat non scalaire

  • Un programme C est un ensemble de fonctions contenant au moins la fonction main (fonction obligatoire). Toutes ces fonctions sont au même niveau(pas d’imbrication de fonctions).

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

59

60 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

60

Liste des caractères non imprimables et des caractères spécifiques :

\f

Saut de page

\n

Saut de ligne

\r

Retour chariot

\t

Tabulation horizontale

\v

Tabulation verticale

\\

\

\"

"

Remarque :

Type

Format

Entier

int

%d

Réel (Flottant)

float

%f ou %e

Chaîne de caractères

str

%s

  • Les codes de format :

Bibliothèques :

Une bibliothèque est un ensemble de fonctions. Celles-ci sont regroupées et mises à disposition afin de pouvoir être utilisées sans avoir à les réécrire.

61 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

61

Liste des caractères non imprimables et des caractères spécifiques :

\n

Saut de ligne

\r

Retour chariot

\t

Tabulation horizontale

\\

\

\"

"

62 of 303

Programmation modulaire

Fonctions et procédures

62

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

ALGORITHMIQUE

63 of 303

Fonctions et procédures :

  • Certains problèmes conduisent à des programmes longs, difficiles à écrire et à comprendre. On les découpe en des parties appelées sous-programmes ou modules ;

  • Les fonctions et les procédures sont des modules (groupe d'instructions) indépendants désignés par un nom. Elles ont plusieurs intérêts :

    • permettent de "factoriser" les programmes, càd de mettre en commun les parties qui se répètent ;

    • permettent une structuration et une meilleure lisibilité des programmes ;

    • facilitent la maintenance du code (il suffit de modifier une seule fois) ;

    • ces procédures et fonctions peuvent éventuellement être réutilisées dans d'autres programmes.

63

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

64 of 303

Fonctions :

  • Le rôle d'une fonction en programmation est similaire à celui d'une fonction en mathématique : elle retourne un résultat à partir des valeurs des paramètres ;

  • Une fonction s'écrit en dehors du programme principal sous la forme :

Fonction nom_fonction (paramètres et leurs types) : type_fonction

Instructions constituant le corps de la fonction

Retourne (…)

FinFonction

  • Pour le choix d'un nom de fonction il faut respecter les mêmes règles que celles pour les noms de variables ;
  • Type_fonction est le type du résultat retourné ;
  • L'instruction Retourne sert à retourner la valeur du résultat.

64

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

65 of 303

  • La fonction SommeCarre suivante calcule la somme des carrées de deux réels x et y :

Fonction SommeCarre (x : réel, y: réel ) : réel

variable z : réel

z ←x^2+y^2

Retourne (z)

FinFonction

  • La fonction Pair suivante détermine si un nombre est pair :

Fonction Pair (n : entier ) : booléen

Retourne (n mod 2=0)

FinFonction

65

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

Exemple :

66 of 303

Utilisation des fonctions :

  • L'utilisation d'une fonction se fera par simple écriture de son nom dans le programme principale. Le résultat étant une valeur, devra être affecté ou être utilisé dans une expression, une écriture, ...

  • Exepmle :Algorithme exepmleAppelFonction

variables z : réel, b : booléen

Début

b ←Pair(3)

z ←5*SommeCarre(7,2)+1

Ecrire("SommeCarre(3,5)= ", SommeCarre(3,5))

Fin

  • Lors de l'appel Pair(3) le paramètre formel n est remplacé par le paramètre effectif 3

66

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

67 of 303

Arguments d'une fonction :

  • Les paramètres servent à échanger des données entre le programme principale (ou le module appelant) et la fonction appelée ;

  • Les arguments placés dans la déclaration d'une fonction sont appelés argument formels. Ces paramètres peuvent prendre toutes les valeurs possibles mais ils sont abstraits (n'existent pas réellement) ;

  • Les argument placés dans l'appel d'une fonction sont appelés argument effectifs.

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

67

68 of 303

Procédures :

  • Dans certains cas, on peut avoir besoin de répéter une tâche dans plusieurs endroits du programme, mais que dans cette tâche on ne calcule pas de résultats ou qu'on calcule plusieurs résultats à la fois ;

  • Dans ces cas on ne peut pas utiliser une fonction, on utilise une procédure ;

  • Une procédure est un sous-programme semblable à une fonction mais qui ne retourne rien ;

  • Une procédure s'écrit en dehors du programme principal sous la forme :

Procédure nom_procédure (paramètres et leurs types)

Instructions constituant le corps de la procédure

FinProcédure

  • Remarque : une procédure peut ne pas avoir de paramètres.

68

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

69 of 303

Appel d'une procédure :

  • L'appel d'une procédure, se fait dans le programme principale ou dans une autre procédure par une instruction indiquant le nom de la procédure :

Procédure exemple_proc (…)

FinProcédure

Algorithme exepmleAppelProcédure

Début

exemple_proc (…)

Fin

  • Remarque : contrairement à l'appel d'une fonction, on ne peut pas affecter la procédure appelée ou l'utiliser dans une expression. L'appel d'une procédure est une instruction autonome.

69

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

70 of 303

Paramètres d'une procédure :

  • Les paramètres servent à échanger des données entre le programme principal (ou la procédure appelante) et la procédure appelée ;

  • Les paramètres placés dans la déclaration d'une procédure sont appelés paramètres formels. Ces paramètres peuvent prendre toutes les valeurs possibles mais ils sont abstraits (n'existent pas réellement) ;

  • Les paramètres placés dans l'appel d'une procédure sont appelés paramètres effectifs. ils contiennent les valeurs pour effectuer le traitement ;

  • Le nombre de paramètres effectifs doit être égal au nombre de paramètres formels. L'ordre et le type des paramètres doivent correspondre.

70

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

71 of 303

Variables locales et globales :

  • On peut manipuler 2 types de variables dans un module (procédure ou fonction) : des variables locales et des variables globales. Elles se distinguent par ce qu'on appelle leur portée (leur "champ de définition", leur "durée de vie") ;

  • Une variable locale n'est connue qu'à l'intérieur du module ou elle a été définie. Elle est crée à l'appel du module et détruite à la fin de son exécution ;

  • Une variable globale est connue par l'ensemble des modules et le programme principale. Elle est définie durant toute l’application et peut être utilisée et modifiée par les différents modules du programme.

71

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

72 of 303

Variables locales et globales :

  • La manière de distinguer la déclaration des variables locales et globales diffère selon le langage :

    • En général, les variables déclarées à l'intérieur d'une fonction ou procédure sont considérées comme variables locales

  • En pseudo-code, on va adopter cette règle pour les variables locales et on déclarera les variables globales dans le programme principale ;

  • Conseil : Il faut utiliser autant que possible des variables locales plutôt que des variables globales. Ceci permet d'économiser la mémoire et d'assurer l'indépendance de la procédure ou de la fonction.

72

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

73 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

73

Langage python

def nom_fonction (paramètres) :

" Commentaire "

Instructions constituant le corps de la fonction

return (…)

74 of 303

Transmission des paramètres : exemples :

Procédure incrementer1 (x : entier par valeur, y : entier par adresse)

x ← x+1

y ← y+1

FinProcédure

Algorithme Test_incrementer1

variables n, m : entier

Début

n ← 3

m ← 3

incrementer1(n, m) résultat :

écrire (" n= ", n, " et m= ", m) n=3 et m=4

Fin

Remarque : l'instruction x ← x+1 n'a pas de sens avec un passage par valeur

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

74

75 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

75

Langage python

#Programme Incremetation1

#Definition de la Procédure Incremetation

def Incremetation(x) :

"Echange le contenu de deux variables"

global y

x=x+1

y=y+1

#Programme principale

x=float(input('Donner x:'))

y=float(input('Donner y:'))

print("x=",x,"et y=",y)

Incremetation(x)

print("x=",x,"et y=",y)

input()

76 of 303

Transmission des paramètres : exemples :

Procédure qui échange le contenu de deux variables :

Procédure Echange (x : réel par adresse, y : réel par adresse)

variables z : réel

z ← x

x ← y

y ← z

FinProcédure

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

76

Langage python

#Definition de la Procédure Permutation

def Echange() :

"Echange le contenu de deux variables"

global x

global y

z=x

x=y

y=z

77 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

77

Remarque :

Type

Format

Entier

int

%d

Réel (Flottant)

float

%f ou %e

Chaîne de caractères

str

%s

  • Les codes de format :

Bibliothèques :

Une bibliothèque est un ensemble de fonctions. Celles-ci sont regroupées et mises à disposition afin de pouvoir être utilisées sans avoir à les réécrire.

from math import sqrt

import math as ma

Exemple :

from math import *

import math

Exemple :

print(‘la racine carrée de %d est %f' % (n,sqrt(n)))

78 of 303

Les tableaux

78

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

79 of 303

Exemple introductif :

  • Supposons qu'on veut conserver les notes d'une classe de 30 étudiants pour extraire quelques informations. Par exemple : calcul du nombre d'étudiants ayant une note supérieure à 10
  • Le seul moyen dont nous disposons actuellement consiste à déclarer 30 variables, par exemple N1, …, N30. Après 30 instructions lire, on doit écrire 30 instructions Si pour faire le calcul

nbre ← 0

Si N1 >10 alors

nbre ←nbre+1

FinSi

….

Si N30>10 alors

nbre ←nbre+1

FinSi

c'est lourd à écrire

  • Heureusement, les langages de programmation offrent la possibilité de rassembler toutes ces variables dans une seule structure de donnée appelée tableau

79

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

80 of 303

Tableaux

  • Un tableau est un ensemble d'éléments de même type désignés par un identificateur unique ;
  • Une variable entière nommée indice permet d'indiquer la position d'un élément donné au sein du tableau et de déterminer sa valeur ;
  • La déclaration d'un tableau s'effectue en précisant le type de ses éléments et sa dimension (le nombre de ses éléments) ;
    • En pseudo code :

variable tableau identificateur[dimension] : type

    • Exemple :

variable tableau notes[30] : réel

  • On peut définir des tableaux de tous types : tableaux d'entiers, de réels, de caractères, de booléens, de chaînes de caractères, …

80

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

81 of 303

Remarques :

  • L'accès à un élément du tableau se fait au moyen de l'indice. Par exemple, notes[i] donne la valeur de l'élément i du tableau notes ;

  • Selon les langages, le premier indice du tableau est soit 0, soit 1. Le plus souvent c'est 0 (c'est ce qu'on va adopter en pseudo-code). Dans ce cas, notes[i] désigne l'élément i+1 du tableau notes ;

  • Il est possible de déclarer un tableau sans préciser au départ sa dimension. Cette précision est faite ultérieurement ;

  • Un grand avantage des tableaux est qu'on peut traiter les données qui y sont stockées de façon simple en utilisant des boucles.

81

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

82 of 303

Saisie et Affichage :

  • Méthodes qui permettent de saisir et d'afficher les éléments d'un tableau :

Algorithme SaisieTab� variable i: entier

Tableau T[n] :reel

Debut

Pour i allant de 0 à n-1�     Ecrire ("Saisie de l'élément ", i + 1)

     Lire (T[i] )

FinPour

Fin

Algorithme AfficheTabvariable i: entier

Tableau T[n] :reel

Debut

Pour i allant de 0 à n-1�     Ecrire ("T[",i, "] =", T[i])

FinPour

Fin

82

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

83 of 303

Exemples :

  • Pour le calcul du nombre d'étudiants ayant une note supérieure à 10 avec les tableaux, on peut écrire :

Algorithme Moyenne

Variables i ,nbre : entier

tableau notes[30] : réel

Début� nbre ← 0

Pour i allant de 0 à 29 � Ecrire ("Saisie de l'élément ", i + 1)

     Lire (notes[i])

Si notes[i] >10 alors

nbre ← nbre+1

FinSi

FinPour

Ecrire (" Le nombre de notes supérieures à 10 est : ", nbre)

Fin

83

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

84 of 303

84

  • Notation en Python :

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

En python les tableaux peuvent être représentés par des listes:

Une liste est une collection modifiable d’éléments éventuellement hétérogènes.

>>> T= [5, 38, 10, 25]

>>> T

[17, 38, 10, 25]

Voir cours : les liste en python

85 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

85

T=10*[0] #initialisation de la liste

for i in range(10):

T[i]=int(input(‘Donner T[%d]:' % (i)))

s=0

for i in range(10):

s+=T[i]

print ('s=',s)

Exemple 1 : Version1

Saisir 10 nombres entiers dans un tableau T, puis afficher leur somme.

T=10*[0] #initialisation de la liste

s=0

for i in range(10):

T[i]=int(input(‘Donner T[%d]:' % (i)))

s+=T[i]

print ('s=',s)

86 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

86

T=[] #liste vide

for i in range(10):

e=int(input(‘Donner T[%d]:' % (i)))

T+=[e]

Exemple 1 : Version2

s=0

for x in T:

s+=x

print ('s=',s)

T=[] #liste vide

s=0

for i in range(10):

e=int(input(‘Donner T[%d]:' % (i)))

T+=[e]

s+=e

print ('s=',s)

87 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

87

Chaînes de caractères : strings

  • Une chaîne de caractères est une suite finie de caractères consécutifs, qu’on note entre apostrophes ou guillemets ;

  • La chaîne vide se note ' ' ou " ".

Accès à un caractère:

  • On peut stocker une chaîne dans une variable :

>>> s = 'Bonjour'

  • Pour accéder à chacun des caractères on utilise la construction s[i] :

>>> s[2]

>>> 'n'

88 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

88

Concaténation :

  • On concatène deux chaînes à l’aide de l’opérateur + :

>>> s = 'Bonjour '+ 'lecteur !'

>>> s = 'Bonjour lecteur !‘

Longueur :

  • On utilise len pour obtenir la longueur d’une chaîne :

>>> len('Bonjour')

>>> 7

89 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

89

Sous-chaînes :

Un ensemble de caractères consécutifs à l’intérieur d’une chaîne s’appelle une sous-chaîne. Ainsi, 'lecteur' ou 'jour lec' sont des sous-chaînes de 'Bonjour lecteur !'. Pour extraire une sous-chaîne de s, on écrit s[i:j] où i est l’indice du premier caractère de la sous-chaîne et j est l’indice du dernier caractère plus un.

  • >>> s = 'Bonjour lecteur !'
  • >>> s[0:7]

>>> 'Bonjour'

  • >>> s[8:15]

>>> 'lecteur'

  • Si j ⩽ -len(ch)+i il n’y a pas de sous-chaîne correspondante. Python renvoie alors la chaîne vide : ' '
  • Si j dépasse la longueur de la chaîne, la sous-chaîne s’arrête au dernier caractère de la chaîne.

90 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

90

  • Il est à noter qu’il est également possible de tester la présence d’une sous-chaîne dans une chaîne avec la même construction :

>>> 'lecteur' in 'Bonjour lecteur !'

>>> True

>>> 'Bjr' in 'Bonjour lecteur !'

>>> False

Test d’appartenance :

  • l’opérateur in sert à tester l’appartenance d’un caractère à une chaîne :

>>> 'o' in 'Bonjour'

>>> True

91 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

91

  • Il est possible de reconvertir une telle chaîne vers une valeur d’un type simple :

>>> int('123')

>>> 123

>>> float('1.2')

>>> 1.2

>>> bool('True')

>>> True

Conversion vers des types simples :

  • On peut convertir une valeur d’un type simple vers une chaîne de caractères à l’aide de la construction str(e) :

>>> str(1.2)

>>> '1.2'

92 of 303

92

# Valeur maximale

def Maximum(T):

Max=T[0]

for i in range(1,len(T)):

if T[i]>Max:

Max=T[i]

return(Max)

  • Ecrire une fonction qui retourne la valeur maximale d’une liste .

Exercice 1 :

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

  • Ecrire une fonction qui retourne l’indice de la valeur maximale d’une liste .

#Indice de la valeur maximale

def Indice_Maximum(T):

Max=T[0]

p=0

for i in range(1,len(T)):

if T[i]>Max:

Max=T[i]

p=i

return(p)

93 of 303

93

# Valeur minimale

def Minimum(T):

Min=T[0]

for i in range(len(T)):

if T[i]<Min:

Min=T[i]

return(Min)

  • Ecrire une fonction qui retourne la valeur minimale d’une liste .

Exercice 2 :

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

  • Ecrire une fonction qui retourne l’indice de la valeur minimale d’une liste .

#Indice de la valeur minimale

def Indice_Minimum(T):

Min=T[0]

p=0

for i in range(len(T)):

if T[i]<Min:

Min=T[i]

p=i

return(p)

94 of 303

Tri d'un tableau

  • Le tri consiste à ordonner les éléments du tableau dans l’ordre croissant ou décroissant

  • Il existe plusieurs algorithmes connus pour trier les éléments d’un tableau :

    • Le tri par sélection
    • Le tri par insertion
    • Le tri à bulles

  • Nous verrons dans la suite le programme de tri par sélection, le programme de tri par insertion et le programme de tri à bulles. Le tri sera effectué dans l'ordre croissant

94

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

95 of 303

Tri par sélection

  • Principe : On cherche le plus petit élément du tableau et on le place en premier, puis on cherche le plus petit dans ce qui reste et on le met en second, etc…

  • Exemple :
    • Étape 1: on cherche le plus petit parmi les 5 éléments du tableau. On l’identifie en troisième position, et on l’échange alors avec l’élément 1 :

    • Étape 2: on cherche le plus petit élément, mais cette fois à partir du deuxième élément. On le trouve en dernière position, on l'échange avec le deuxième:

    • Étape 3:

95

9

4

1

7

3

1

4

9

7

3

1

3

9

7

4

1

3

4

7

9

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

96 of 303

Tri par sélection : version1

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

96

Langage python

#Fonction de la position du Minimum

def position_Minimum(T,debut,Fin) :

position=debut

Minimum=T[debut]

debut+=1

while debut<=Fin :

if T[debut]<Minimum : # on a trouvée plus petit

Minimum=T[debut] # mettre à jour la valeur ...

position=debut # ... et sa position

debut+=1

return(position)

# Procédure du Tri par sélection

def tri_Selection(T):

n=len(T)

debut=0

while debut<n-1: # pour chaque position de la liste trouver le minimum de T[i], ..., T[n - 1]

p=position_Minimum(T,debut,n-1)

# Echanger ce minimum avec T[i]

T[debut],T[p]=T[p],T[debut]

debut+=1

97 of 303

Tri par sélection : version2

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

97

Langage python

def Tri_Selection(T) :

n=len(T)

for i in range(0,n-1) :

pmin=i #position du minimum

for j in range(i+1,n) :

if T[j]<T[pmin] :

pmin=j

T[i],T[pmin]=T[pmin],T[i]

#Programme tri par sélection

n=int(input("Donner le nombre d'éléments de la liste T:"))

T=[]

for i in range(n) :

e=int(input('Donner T[%d]='%(i)))

T=T+[e]

print(T)

Tri_Selection(T)

print(T)

input()

98 of 303

Tri par insertion

  • Principe : dans cet algorithme, on peut considérer qu’à chaque etape, la suite à trier est constituée de deux sous-suites :la sous-suites D (destination) des éléments déjà triés et la sous-suites S (source) des éléments restant à trier

  • Le 1er élément de S (ième élément du tableau) doit être inséré dans D à la bonne place :

  • La situation initiale est la suivante :

98

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

99 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

99

100 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

100

Tri par insertion : version1

Langage python

#Programme et Procédure du Trie Par insertion

# Procédure du réinsertion de i dans j

def reinsertion(T,i,j):

# Sauvegarder l’élément à déplacer

e=T[i]

# Faire remonter d'une position les éléments entre i et j

k=i

while k>j:

T[k]=T[k-1]

k=k-1

# Copier l’élément à déplacer en position j

T[j]=e

# Procédure du Trie Par insertion

def tri_Insertion(T):

n=len(T)

i=1

while i<n: # Pour chaque position de la liste chercher à quelle position réinsérer T[i]

j=i-1

while j>=0 and T[j]>T[i]:

j=j-1

# Effectuer la réinsertion

reinsertion(T,i,j+1)

i=i+1

101 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

101

Tri par insertion : version2

Langage python

def Tri_Insertion(T):

n=len(T)

for i in range(1,n):

e=T[i]

j=i

while j>0 and T[j-1]> e:

T[j]=T[j-1]

j-=1

T[j]=e

#Programme par insertion

n=int(input("Donner le nombre d'éléments de la liste T:"))

T=[]

for i in range(n) :

e=int(input('Donner T[%d]='%(i)))

T=T+[e]

print(T)

Tri_Insertion(T)

print(T)

input()

102 of 303

Tri à bulles

  • Principe : L’algorithme consiste à comparer chaque paire d’éléments consécutifs, si ces éléments sont dans l’ordre, on passe à la paire suivante, sinon on procède à leur échange avant de traiter la paire suivante.

102

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

103 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

103

Tri à bulles : version1

Langage python

#Programme et Procédure du Trie à Bulles

# Procédure du Trie à Bulles

def Tri_bulle(T):

n=len(T)

change=True

while change :

change=False

for i in range(n-1) :

if T[i]>T[i+1] :

T[i],T[i+1]=T[i+1],T[i]

change = True

#Programme du Trie à Bulles

n=int(input("Donner le nombre d'éléments de la liste T:"))

T=[]

for i in range(n) :

e=int(input('Donner T[%d]='%(i)))

T=T+[e]

print(T)

Tri_bulle(T)

print(T)

input()

104 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

104

Tri à bulles : version2

Langage python

def Tri_Bulle(T):

n=len(T)

i=1

Trier=False

while not Trier :

Trier = True #on suppose que le tableau est trié

for i in range(0,n-1) :

if T[i]>T[i+1] :

T[i],T[i+1]=T[i+1],T[i]

Trier=False #le tableau n'est plus trié

#Programme du Tri à Bulles

n=int(input("Donner le nombre d'éléments de la liste T:"))

T=[]

for i in range(n) :

e=int(input('Donner T[%d]='%(i)))

T=T+[e]

print(T)

Tri_Bulle(T)

print(T)

input()

105 of 303

Tri par sélection : complexité

  • On effectue N-1 tests pour trouver le premier élément du tableau trié, N-2 tests pour le deuxième, et ainsi de suite. Soit : (N-1)+(N-2)+…+1 = N(N-1)/2 On effectue en plus (N-1) échanges.

  • La complexité du tri par sélection est d'ordre N² (O())

  • Pour un ordinateur qui effectue 109 tests par seconde on a :

105

N

103

106

109

temps

1ms

103 s

31,62 ans

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

106 of 303

106

  • Recherche d’un élément dans une liste :
  • Recherche séquentielle (linéaire) :
  • Recherche dichotomique :

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

107 of 303

107

Recherche séquentielle (linéaire) :

Exploration séquentielle de la liste.

Condition d’arrêt :

  • On a trouvé l’élément ;
  • On a parcouru toute la liste sans trouver l’élément.

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

108 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

108

Langage python

#Programme et Fonction Recherche linéaire

#Fonction Recherche linéaire

def Recherche_lineaire(L,X):

for t in L:

if X= =t:

return(True)

return(False)

#Programme Recherche linéaire

n=int(input("Donnez le nombre d'éléments de la liste T:"))

X=int(input("Donnez l'élement chercher dans la liste T:"))

T=[]

for i in range(n):

e=int(input('Donnez T[%d]='%(i)))

T=T+[e]

print(T)

if Recherche_lineaire(T,X):

print(X,"appartient à la liste T")

else:

print(X,"n'appartient pas à la liste T")

Recherche séquentielle (linéaire) :

#Fonction Recherche linéaire1

def Recherche_lineaire1(L,X):

return(t in L)

109 of 303

109

Complexité :

  • Pour évaluer l’efficacité de l'algorithme de recherche séquentielle, on va calculer sa complexité dans le pire des cas. Pour cela on va compter le nombre de tests effectués ;

  • Le pire des cas pour cet algorithme correspond au cas où X n'est pas dans la liste T ;

  • Si X n’est pas dans la liste , on effectue N tests : on répète N fois les tests X==t ;

  • La complexité dans le pire des cas est d'ordre N, (on note O(N)) ;

  • Pour un ordinateur qui effectue 109 tests par seconde on a :

N

103

106

109

temps

1µs

1ms

1s

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

110 of 303

110

Recherche dichotomique :

  • Dans le cas où la liste est ordonnée, on peut améliorer l'efficacité de la recherche en utilisant la méthode de recherche dichotomique;
  • Principe : diviser par 2 le nombre d'éléments dans lesquels on cherche la valeur X à chaque étape de la recherche. Pour cela on compare X avec T[milieu] :
  • Si X < T[milieu], il suffit de chercher X dans la 1ère moitié de la liste entre

(T[0] et T[milieu-1]) ;

  • Si X > T[milieu], il suffit de chercher X dans la 2ème moitié de la liste entre (T[milieu+1] et T[N-1]).

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

111 of 303

111

Exemple :

  • Considérons la liste T :

4

6

10

15

17

18

24

27

30

  • Si la valeur cherché est 20 alors les indices debut, fin et milieu vont évoluer comme suit :
  • Si la valeur cherché est 10 alors les indices debut, fin et milieu vont évoluer comme suit :

debut

0

5

5

6

fin

8

8

5

5

milieu

4

6

5

debut

0

0

2

fin

8

3

3

milieu

4

1

2

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

112 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

112

Langage python

#Programme et Fonction Recherche dichotomique

#Fonction Recherche dichotomique

def Recherche_dichotomique(L,X):

N=len(L)

Debut=0

Fin=N-1

while Debut<=Fin:

Milieu=(Debut+Fin)//2

if X= =L[Milieu]:

return(True)

elif X>L[Milieu]:

Debut=Milieu+1

else:

Fin=Milieu-1

return(False)

#Programme Recherche dichotomique

n=int(input("Donnez le nombre d'éléments de la liste T:"))

X=int(input("Donnez l'élement chercher dans la liste T:"))

T=[]

for i in range(n):

e=int(input('Donnez T[%d]='%(i)))

T=T+[e]

print(T)

if Recherche_dichotomique(T,X):

print(X,"appartient à la liste T")

else:

print(X,"n'appartient pas à la liste T")

Recherche dichotomique :

113 of 303

113

Complexité :

  • La complexité dans le pire des cas est d'ordre log2 N ;
  • L'écart de performances entre la recherche séquentielle et la recherche dichotomique est considérable pour les grandes valeurs de N.

Exemple :

Au lieu de N=1milion 220 opérations à effectuer avec une recherche séquentielle il suffit de 20 opérations avec une recherche dichotomique.

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

temps t

nombre des élements N

t = a · N

t = a · 2N

t = a · N2

t = a · logN

114 of 303

114

TABLEAUX DOUBLE DIMENSION

  • Un tableau double dimension est un tableau dont chaque élément est un tableau ;

  • On appelle L le nombre de lignes du tableau et C le nombre de colonnes du tableau. L et C sont alors les deux dimensions du tableau. Un tableau à deux dimensions contient donc L*C composantes.

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

115 of 303

115

  • Deux variables entières nommées indices permettent d'indiquer la position d'un élément donné au sein du tableau à deux dimensions et de déterminer sa valeur ;

(i.e. : L'accès à un élément du tableau à deux dimensions se fait au moyen de deux indices.)

Exemple : T[i][j] donne la valeur de l'élément de la ligne i+1 et de la colonne j+1.

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

116 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

116

  • La déclaration d'un tableau à deux dimensions s'effectue en précisant le type et le nombre de lignes et de colonnes ;

Syntaxe :

Variable Tableau identificateur[Nombre_lignes][Nombre_colonnes] : type

 

Exemple :

Variable Tableau T[30][50] : réel

  • Il est possible de déclarer un tableau à deux dimensions sans préciser au départ le nombre de lignes et de colonnes. Cette précision est faite ultérieurement.

Exemple :

Variable Tableau T[n][m] : réel

117 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

117

  • Saisie et Affichage :

Algorithme :

Algorithme SaisieMatrice

Variables i , j , n, m : entier

Tableau A[n][m] : réel

Debut

Ecrire("Donner le nombre de lignes et de colonnes :")

Lire(n,m)

Pour i allant de 0 à n-1 faire

Pour j allant de 0 à m-1 faire

Ecrire ("Entrez l'élément de la ligne", i + 1,"et de la colonne", j+1)

Lire (A[i][j])

FinPour

FinPour

Fin

Saisir les éléments d’un Tableau 2D (Matrice)

118 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

118

Algorithme :

Algorithme AffichageMatrice

Variables i , j , n, m : entier

Tableau A[n][m] : réel

Debut

Ecrire("Donner le nombre de lignes et de colonnes :")

Lire(n,m)

Pour i allant de 0 à n-1 faire

Pour j allant de 0 à m-1 faire

Ecrire (A[i][j])

FinPour

FinPour

Fin

Afficher les éléments d’un Tableau 2D (Matrice)

119 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

119

>>> M=3*[2*[0]]

>>> M

[[0, 0], [0, 0], [0, 0]]

>>> D=5*[3*['']]

>>> D

[['', '', ''], ['', '', ''], ['', '', ''], ['', '', ''], ['', '', '']]

>>> C=3*[3*[False]]

>>> C

[[False, False, False],

[False, False, False],

[False, False, False]]

Programme python

  • En python les tableaux à deux dimensions peuvent être représentés par des listes de listes.

Exemples :

120 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

120

Déclaration

  • Les déclarations suivantes en langage algorithmique :

tableau A[10][10] : entier

tableau B[2][20]  : réel

tableau C[3][3]  : booléen

tableau D[5][3] : caractère

  • En python un tableau double dimension est une liste dont chaque élément est une liste :

Exemples :

  • A=[10*[0] for i in range(10)]

B=[20*[0.0] for i in range(2)]

C=[3*[False] for i in range(3)] D=[3*[''] for i in range(5)]

  • A=10*[10*[0]]

B=2*[20*[0.0]]

C=3*[3*[False]]

D=5*[3*['']]

121 of 303

121

#Programme Saisie Matrice

n=int(input('Donner le nombre de lignes  :'))

m=int(input('Donner le nombre de colonnes :‘))

A=n*[m*[0]]

A = [m*[0] for i in range(n)]

for i in range(n):

for j in range(m):

A[i][j]=int(input('Elément de la ligne %d et

de la colonne %d :' % (i+1,j+1)))

Saisie  

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

#Programme Affichage Matrice

n=int(input('Donner le nombre de lignes  :'))

m=int(input('Donner le nombre de colonnes :‘))

for i in range(n):

for j in range(m):

print(A[i][j])

Affichage 

122 of 303

122

Donner un programme qui calcul la somme de deux matrices T[n][m], L[n][m].

Exercice1 :

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

Langage python

#Programme Somme de deux Listes 2 Dimensions

#Saisir Liste 2 Dimensions

n=int(input('Donner le nombre de lignes :'))

m=int(input('Donner le nombre de colonnes :'))

T=[m*[0] for i in range(n)]

L=[m*[0] for i in range(n)]

M=[m*[0] for i in range(n)]

for i in range(n):

for j in range(m):

T[i][j]=int(input('T[%d][%d]='%(i,j)))

L[i][j]=int(input('L[%d][%d]='%(i,j)))

#Somme de T et L

for i in range(n):

for j in range(m):

M[i][j]=T[i][j]+L[i][j]

#Afficher la liste M=T+L

for i in range(n):

for j in range(m):

print('M[%d][%d]=%d'%(i,j,M[i][j]))

123 of 303

123

Donner un programme qui calcul le Produit k×T[n][m] avec kєN.

Exercice2 :

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

Langage python

#Produit d’un scalaire et une Liste 2 Dimensions

k=int(input('Donner le nombre k :'))

#Saisir Liste 2 Dimensions

n=int(input('Donner le nombre de lignes :'))

m=int(input('Donner le nombre de colonnes :'))

T=[m*[0] for i in range(n)]

M=[m*[0] for i in range(n)]

for i in range(n):

for j in range(m):

T[i][j]=int(input('T[%d][%d]='%(i,j)))

# Produit k*T

for i in range(n):

for j in range(m):

M[i][j]=k*T[i][j]

#Afficher la liste M=k*T

for i in range(n):

for j in range(m):

print('M[%d][%d]=%d'%(i,j,M[i][j]))

124 of 303

124

Donner un programme qui calcul le Produit de deux matrices T[n][m], L[m][n].

Exercice3 :

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

Langage python

#Programme Produit de deux Listes 2 Dimensions

#Saisir Liste 2 Dimensions

n=int(input('Donner le nombre de lignes :'))

m=int(input('Donner le nombre de colonnes :'))

T=[m*[0] for i in range(n)]

L=[n*[0] for i in range(m)]

M=[n*[0] for i in range(n)]

for i in range(n):

for j in range(m):

T[i][j]=int(input('T[%d][%d]='%(i,j)))

for i in range(m):

for j in range(n):

L[i][j]=int(input('L[%d][%d]='%(i,j)))

#Produit de T et L

for i in range(n):

for j in range(n):

M[i][j]=0

for k in range(m):

M[i][j]=M[i][j]+T[i][k]*L[k][j]

#Afficher la liste M=T*L

for i in range(n):

for j in range(n):

print('M[%d][%d]=%d'%(i,j,M[i][j]))

125 of 303

Récursivité : Algorithme (Factorielle)

  • Un module (fonction) peut s'appeler lui-même: on dit que c'est un module récursif ;

  • Tout module récursif doit posséder un cas limite (cas trivial) qui arrête la récursivité ;

  • Exemple : Calcul du factorielle

Fonction fact (n : entier ) : entier

Si n=0 alors

retourne (1)

Sinon

retourne (n*fact(n-1))

Finsi

FinFonction

125

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

126 of 303

Récursivité : Algorithme (Suite de Fibonacci)

  • Ecrivez une fonction récursive qui calcule le terme n de la suite de Fibonacci définie par : U(0)=U(1)=1

U(n)=U(n-1)+U(n-2)

Fonction Fib (n : entier ) : entier

Variable res : entier

Si n=1 OU n=0 alors

res ←1

Sinon

res ← Fib(n-1)+Fib(n-2)

Finsi

retourne (res)

FinFonction

126

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

127 of 303

Récursivité : Programmation (Suite de Fibonacci)

127

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

Langage python

#Programme et Fonction Fibonacci Récursivité

#Fonction Factorielle Récursivité

def Fibonacci_Recursivite(n):

if n==0 or n==1:

return(1)

else:

return(Fibonacci_Recursivite(n-1)+Fibonacci_Recursivite(n-2))

#Programme Factorielle Récursivité

n=int(input('Donnez le nombre n:'))

print("le rang %d de la suite de Fibonacci est= %d"%(n,Fibonacci_Recursivite(n)) )

128 of 303

Récursivité : Programmation (Factorielle)

128

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

Langage python

#Programme et Fonction Factorielle Récursivité

#Fonction Factorielle Récursivité

def Factorielle_Recursivite(n):

if n==0:

return(1)

else:

return(n*Factorielle_Recursivite(n-1))

#Programme Factorielle Récursivité

n=int(input('Donnez le nombre n:'))

print("la factorielle de %d est= %d"%(n,Factorielle_Recursivite(n)) )

129 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

129

  • Dans cette définition, la valeur de n! n’est pas connue tant que l’on n’a pas atteint la condition terminale (ici n == 0). Le programme empile les appels récursifs jusqu’à atteindre la condition terminale puis dépile les valeurs.

Figure : Empilage/dépilage de 4 !

130 of 303

130

Pile :

  • Une pile (en anglais stack) est une structure de données fondée sur le principe « dernier arrivé, premier sorti » (ou LIFO : Last In, First Out)
  • Pile d'assiettes : on ajoute des assiettes sur la pile, et on les récupère dans l'ordre inverse, en commençant par la dernière ajoutée.
  • Les derniers éléments ajoutés à la pile seront les premiers à être récupérés.

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

131 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

131

Pile : Exemples

  • La fonction « Annuler la frappe» (en anglais Undo) mémorise les modifications apportées au texte dans une pile;
  • La touche « revenir en arrière» dans les pages web;
  • Les algorithmes récursifs utilisent implicitement une pile d'appels.

132 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

132

Pile : Opérations

  • Sommet(P) :
  • renvoie le dernier élément ajouté et non encore retiré : le sommet (top en anglais)
  • Empiler(P,elt) :
  • comme insérer;
  • place l’élément au sommet de la pile P (push en anglais)
  • Depiler(P) :
  • comme supprimer
  • retire de la pile le sommet (pop en anglais)
  • EstVide(P) :
  • Renvoie vrai si la pile est vide et faux sinon

133 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

133

Pile : Python

  • >>> pl= [ ]
  • >>>pl. append ( 10 )
  • >>> pl. append ( 15 )
  • >>> pl. append ( 20 )
  • >>> pl
  • [10,15,20]
  • >>>pl. pop ()
  • 20
  • >>>pl
  • [10,15]

134 of 303

134

File :

  • une file (en anglais queue) est une structure de données basée sur le principe « premier arrivé, premier sorti », en anglais FIFO : First In, First Out ;
  • Le fonctionnement ressemble à une file d'attente : les premières personnes à arriver sont les premières personnes à sortir de la file.
  • Les premiers éléments ajoutés à la file seront les premiers à être récupérés.

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

135 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

135

File : Exemples

  • les buffers (mémoire tampon = espace de mémorisation temporaire) ;
  • Les serveurs d'impression, qui doivent traiter les requêtes dans l'ordre dans lequel elles arrivent, et les insèrent dans une file d'attente.

136 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

136

File : Opérations

  • Debut(F) :
  • renvoie le premier élément ajouté et non encore retiré : le début ou le premier
  • Enfiler(F,elt) :
  • comme insérer;
  • place l’élément à la fin de la file F.
  • Defiler(F) :
  • comme supprimer
  • retire de la file le premier élément ajouté et non encore retiré
  • EstVide(F) :
  • Renvoie vrai si la file est vide et faux sinon

137 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

137

File : Python

  • >>> from collections import deque
  • >>>fl= deque ( )
  • >>>fl. append ( 10 )
  • >>> fl. append ( 15 )
  • >>> fl. append ( 20 )
  • >>> fl
  • deque([10,15,20])
  • >>>fl. popleft ()
  • 10
  • >>>fl
  • >>>deque([15,20])

138 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

138

LES FICHIERS

Notion de fichier :

Un fichier stocke des informations sur un support physique (disque dur, clé USB, CD, DVD, carte mémoire...).

Ouvrir un fichier consiste à le charger dans la mémoire vive (RAM) de l'ordinateur (c'est une mémoire volatile : elle s'efface quand on éteint l'ordinateur). Enregistrer un fichier consiste à l'écrire sur un support physique de stockage (l'information est alors conservée de manière permanente).

Ouverture d’un fichier :

139 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

139

  • Les fichiers textes : l'information est stockée sous forme de caractères lisibles par un éditeur de texte (principalement des lettres et des chiffres). Ils se manipulent ligne par ligne (ou caractère par caractère) ;
  • Les fichiers binaires : l' information est stockée en binaire (une suite d'octets). Ils se manipulent octets par octets.

Il existe deux types de fichiers :

Imaginons que vous ayez créé un fichier appelé "cpge.txt" (avec le bloc note par exemple).

  • Pour lire ce fichier, il faut d'abord l'ouvrir ;

Syntaxe :

fichier = open("cpge.txt","r")

  • Puis après utilisation, il faut le fermer ;

Syntaxe :

fichier.close()

Les fichiers textes :

Instructions à connaître :

140 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

140

  • Le "r" signifie "read" : votre fichier n'est ouvert qu'à la lecture.

On peut ensuite lire le contenu du fichier de différentes manières :

  • chaine = fichier.read() : lit le fichier en intégralité et renvoie une chaîne de caractères ;
  • chaine = fichier.read(n) : lit n caractères du fichier à partir de la position courante et renvoie une chaîne de caractères ;
  • ligne = fichier.readline() : lit une seule ligne à partir de la position courante ;
  • liste = fichier.readlines() : retourne une liste de toutes les lignes du fichier.

141 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

141

Pour écrire dans un fichier, il faut également l'ouvrir ; il faut toutefois savoir si on veut écraser le fichier précédent ("w" comme "write") ou ajouter à la fin du fichier ("a" comme "append"). Dans les deux cas, si le fichier n'existe pas il sera créé.

Ensuite il suffit d'appliquer la méthode suivante pour écrire une ligne dans le fichier :

Syntaxe :

fichier.write("mon texte ici")

142 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

142

Exemple1 : Le mode écriture

Langage python

# Création et ouverture du fichier test.txt en mode write 'w' (écriture)

# Si le fichier test.txt existe déjà, il est écrasé !

fichier=open("testEciture.txt","w")

# Ecriture dans le fichier avec la méthode write()

fichier.write("bonjour tous le monde!")

# Fermeture du fichier avec la méthode close()

fichier.close()

Remarques :

Le fichier test.txt est créé dans le répertoire courant.

L'écriture dans un fichier se fait avec la fonction open() en mode écriture :

143 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

143

Exemple2 : Le mode ajout

  • Le mode ajout :

Langage python

# Ouverture du fichier test.txt en mode ajout ‘a' (append)

fichier=open("testEciture.txt","a")

# Ecriture dans le fichier avec le mode ajout(append)

fichier.write("\nUne deuxième ligne:\n") # '\n' saut de ligne

fichier.write("bonjour\ttous le monde\tune deuxieme fois!\n") # '\t' tabulation

# fermeture du fichier avec la méthode close()

fichier.close()

Pour écrire à la fin d'un fichier, on utilise la fonction open() en mode ajout :

144 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

144

Exemple3 : Le mode lecture

  • Le mode lecture :

Langage python

# Ouverture du fichier test.txt en mode lecture ' r' (Read)

fichier=open("testEciture.txt","r")

Le mode ajout

# Lecture Test(read)

ch=fichier.read()

print("Contenu du fichier :"+ch) # Affichage du contenue du fichier

# fermeture du fichier avec la fonction close()

fichier.close()

La lecture dans un fichier texte se fait avec la fonction open() en mode lecture :

145 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

145

Langage python

#Lecture Nombres_pair1

f=open("testEciture.txt","r")

ch=f.readlines()

for i in ch:

print(i)

f.close()

Langage python

#Lecture test

f=open("testEciture.txt","r")

ch=f.read(4)

print(ch)

f.close()

Exemple4 : Le mode lecture

Exemple5 : Le mode lecture

146 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

146

  • Rappel sur les fichiers textes :
  • Ouverture du fichier ;
  • Ecriture ou lecture ligne à ligne ;
  • Fermeture du fichier.

147 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

147

148 of 303

Ingénierie numérique et simulation

148

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

149 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

149

Fonctions utiles de numpy

Créer des tableaux numpy :

La fonction array prend en argument une liste et renvoie un tableau numpy ayant les mêmes éléments. En cas de liste de listes, l’opérateur s’applique récursivement à chaque sous–liste : la valeur de retour est donc un tableau de tableaux.

Console python

>>> np.array([1, 2, 3]) # Un tableau d’entiers

array([1, 2, 3])

>>> np.array([1, 2, 3.0]) # On impose implicitement les flottants

array([ 1., 2., 3.])

>>> np.array([[1, 2], [3, 4]]) # Plus d’une dimensions

array([[1, 2],

[3, 4]])

Dans toute la suite on supposera qu’on a effectué :

Console python

>>>import numpy as np

150 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

150

arange, reshape :

Console python

>>> np.arange(1,6,2) # Même comportement que range, mais renvoie un array

array([1, 3, 5])

>>> a = np.arange(25) # Tableau 1D à 25 éléments

>>> a.reshape((5,5)) # Changé en tableau 2D à 5*5 éléments

array([[ 0, 1, 2, 3, 4],

[ 5, 6, 7, 8, 9],

[10, 11, 12, 13, 14],

[15, 16, 17, 18, 19],

[20, 21, 22, 23, 24]])

Utilisation de matrix :

La classe des matrices, permet de faire du calcul matriciel

Console python

>>> import numpy as np

>>> A = np.matrix(np.arange(9).reshape((3,3)))

>>> A # La matrice A

matrix([[0, 1, 2],

[3, 4, 5],

[6, 7, 8]])

151 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

151

Console python(suite)

>>> A**2 # Son carré matriciel,

matrix([[ 15, 18, 21],

[ 42, 54, 66],

[ 69, 90, 111]])

>>> A.transpose() # Sa transposée

matrix([[0, 3, 6],

[1, 4, 7],

[2, 5, 8]])

>>> A*A.transpose() # Le produit matriciel avec la transposée

matrix([[ 5, 14, 23],

[ 14, 50, 86],

[ 23, 86, 149]])

Pour une matrice numpy m, il est possible d’accéder directement à l’élément de ligne i et de colonne j avec la syntaxe m[i,j] (alors qu’avec une matrice python “classique” il faudrait écrire m[i][j]).

152 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

152

Exemple :

Console python

>>> a = [[2,3],[1,8]]

>>> b = np.array (a)

>>> b[1] # Ligne d’indice 1

array([1, 8])

>>> b[:,0] # Colonne d’indice 0

array([2, 1])

>>> b[:,-1] # Dernière colonne

array([3, 8])

>>> b[1,0] # Elément ligne 1 colonne 0

1

Ones et eye :

  • ones(n) : crée un tableau de longueur n contenant uniquement des 1.
  • ones((p,q)) : crée une matrice numpy avec p lignes et q colonnes composée uniquement de 1.
  • La fonction eye(n) renvoie la matrice identité de taille n.

153 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

153

Console python

>>> import numpy as np

>>> np.ones(2)

array([ 1., 1.])

>>> np.ones((2,3))

array([[ 1., 1., 1.],

[ 1., 1., 1.]])

>>> np.eye(2)

array([[ 1., 0.],

[ 0., 1.]])

Exemple :

Opérations sur les tableaux numpy :

Les opérations usuelles (addition, soustraction, multiplication, division) s’appliquent aux tableaux Numpy en opérant coefficient par coefficient.

154 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

154

Console python

>>> a=np.array([[1,4],[1,2]])

>>> b=np.ones((2,2))

>>> a*b

array([[ 1., 4.],

[ 1., 2.]])

>>> a/b # Au sens matriciel usuel b n’est pas inversible

array([[ 1., 4.],

[ 1., 2.]])

>>> a**2

array([[ 1, 16],

[ 1, 4]])

Exemple :

Remarque :

Chaque fonction mathématique usuelle possède une fonction Numpy qui lui est homonyme et qui calcule la même chose sur les objets de type float. Par exemple il existe math.sin et np.sin L’avantage des fonctions numpy f, c’est que si a est un tableau numpy a = array[a0, . . . , an-1], l’appel f(a) renvoie le tableau array[f(a0), . . . , f(an-1)]. Ce mécanisme s’applique aussi aux matrices.

155 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

155

Console python

>>> import numpy as np

>>> x=np.array([3,4])

>>> np.exp(x)

array([ 20.08553692, 54.59815003])

>>> import math

>>> math.exp(x)

TypeError: only length-1 arrays can be converted to Python scalars

Exemple :

Console python

>>> from numpy.linalg import dot

>>> dot ([[1,2],[3,4]], np.eye(2)) # Syntaxe correcte du produit matriciel

array([[ 1., 2.],

[ 3., 4.]])

>>> [[1,2],[3,4]] * np.eye(2) # Faux (produit terme a terme)

array([[ 1., 0.],

[ 0., 4.]])

Produit matriciel :

  • dot(A,B) : le produit matriciel A.B

Exemple :

156 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

156

  • solve(A,B) : le vecteur X solution de A.X = B

Exemple : résolution de :

Résolution d’un système de Cramer :

Console python

>>> from numpy.linalg import solve

>>> solve ([[1,2],[3,4]], [2,8])

array([ 4., -1.])

Console python

>>> from numpy.linalg import det

>>> det ([[1,2],[3,4]])

-2.0000000000000004

Déterminant :

  • det(A) : le déterminant de A

Exemple :

157 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

157

  • trace (A) : la trace de A.

Exemple :

Trace :

Console python

>>> from numpy import trace

>>> trace([[1,2],[3,4]])

5

Console python

>>> from numpy.linalg import inv

>>> inv ([[1,2],[3,4]])

array([[-2. , 1. ],

[ 1.5, -0.5]])

Inverse d’une matrice :

  • inv(A) : l’inverse de A (A-1)

Exemple :

158 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

158

  • matrix_power(A,n) : A à la puissance n (An).

Exemple :

Puissance d’une matrice :

Console python

>>> from numpy.linalg import matrix_power

>>> matrix_power ([[1,2],[3,4]], -2)

array([[ 5.5 , -2.5 ],

[-3.75, 1.75]])

Console python

>>> from numpy import transpose

>>> transpose([[1,2],[3,4]])

array([[1, 3],

[2, 4]])

Transposée d’une matrice :

  • transpose (A) : la transposée de A (tA)

Exemple :

159 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

159

  • rad2deg(), deg2rad() : conversion de radians en dégrées et vice versa. Notez bien, que partout en Python les angles sont donnés en radians ;
  • >>>import numpy as np
  • >>>np.deg2rad(180)

3.1415926535897931

  • cos(), sin(), tan() : les fonctions trigonométriques de base ;
  • arccos(), arcsin(), arctan() : les fonctions inverses de cos, sin et tan ;
  • ceil(), floor(), round() : arrondir une valeur ;
  • >>>np.ceil(3.01) # arrondi au plus petit entier supérieur
  • >>> np.floor(3.99) # arrondi au plus grand entier inférieur
  • >>> np.round(3.49) # arrondi au plus proche entier

160 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

160

  • sort() : Trier les éléments;
  • >>>import numpy as np
  • >>> x = np.array([10, 2, 72, 35, 4, 123, 8])
  • >>> x.sort() #np.sort(x)
  • sum() : Somme des éléments de x ;
  • >>> x.sum() #sum(x)
  • var() : La variance des éléments ;
  • >>> x.var() #np.var(x)
  • std() : L’écart-type des éléments ;
  • >>> x.std() #np.std(x)
  • max() : La valeur maximale ;
  • >>> x. max() #max(x)
  • min() : La valeur minimale ;
  • >>> x. min() #min(x)
  • mean() : La moyenne ;
  • >>>x.mean() #np.mean(x)

161 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

161

Résolution d'équation algébrique

Résolution approchée d’une équation :

  • Dans la mesure où on ne sait pas résoudre de manière exacte toutes les équations numériques que l’on peut être amené à rencontrer, il est légitime de mettre au point des démarches permettant d’obtenir une valeur approchée d’une solution d’équation.

  • La méthode de la dichotomie et la méthode de Newton sont deux techniques permettant, de manière algorithmique, de calculer une approximation d’une solution de l’équation f(x) = 0, f est une fonction définie sur un intervalle et à valeurs réelles.

Cadre de travail :

  • Dans la suite, on notera f une fonction continue sur un intervalle [a, b].
  • On supposera, en outre, que f s’annule en un unique point de [a, b], que l’on notera xsol.

162 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

162

163 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

163

Méthode de dichotomie :

On suppose que :

  • f est continue sur [a, b];

  • f(a) et f(b) sont de signes contraires.

Contexte de travail et idée de départ :

Démarche :

Technique à répéter :

  • On divise l’intervalle [a, b] en deux, et on ne garde que la section qui contient la solution:
  • Pour cela, on examine le signe de f((a+b)/2):
  • Si f(a) et f((a+b)/2) sont de signes contraires, on se place alors sur [a,(a+b)/2] ;
  • sinon, il faudra travailler sur [(a+b)/2,b].
  • Puis on recommence.

164 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

164

Langage python

def rech_solu_dichotomie(fonction,borne_inf,borne_sup,tolerance,nb_iterations_max) :

milieu=(borne_sup+borne_inf)/2

nombre_iterations=0

while abs(fonction(milieu) ) >tolerance and nombre_iterations<=nb_iterations_max :

if f(borne_inf)*f(milieu)<0 :

borne_sup=milieu

else :

borne_inf=milieu

milieu=(borne_sup+borne_inf)/2

nombre_iterations=nombre_iterations+1

return (milieu)

Remarques :

  • Dans Python, la bibliothèque scipy.optimize contient la méthode de dichotomie ;
  • Pour l’utiliser, il suffit de charger la bibliothèque, puis d’appliquer la fonction bisec en précisant (au moins) la fonction f considérée, ainsi que les bornes borne_inf et borne_sup de l’intervalle de travail.

165 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

165

Console python

>>> from scipy .optimize import bisect

>>>…….

>>> bisect(f,borne_inf,borne_sup)

Méthode de Newton :

Contexte de travail et idée de départ :

On suppose que :

  • f est dérivable sur [a, b] ;

  • f ne s’annule pas sur [a, b].

On va considérer que la représentation graphique Cf de f est «proche» de sa tangente en un point : l’intersection de cette tangente avec (Ox) doit nous « rapprocher » de xsol

166 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

166

167 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

167

Démarche :

Technique à répéter :

  • On considère un réel x0 dans I ; 
  • On considère alors la tangente à Cf au point d’abscisse x0, qui a pour équation cartésienne y = f’(x0)(xx0)+f(x0).
  • Le point d’intersection de cette droite et de l’axe des abscisses permet d’approcher xsol :
  • on note ainsi x1 le réel vérifiant 0 = f’(x0)(x1x0)+f(x0), c’est-à-dire que l’on pose x1 = x0 –(f(x0)/f’(x0)).
  • Puis on recommence : le réel xn étant construit, on pose :

xn+1 = xn –(f(xn)/f’(xn))

Langage python

def rech_solu_Newton(fonction,derivee_fonction,position_depart,tolerance,nb_iterations_max) :

xn =position_depart

nombre_iterations=0

while (abs(fonction(xn))>tolerance) and (nombre_iterations<=nb_iterations_max) :

xn = xn -fonction(xn)/fonction_derivee(xn)

nombre_iterations=nombre_iterations+1

return (xn)

168 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

168

Remarques :

  • Dans Python, la bibliothèque scipy.optimize contient la méthode de Newton ;
  • Pour l’utiliser, il suffit de charger la bibliothèque, puis d’appliquer la fonction newton en précisant (au moins) la fonction f considérée, sa dérivée der_f et la valeur initiale position_depart.

Console python

>>> from scipy .optimize import newton

>>>…….

>>> newton(f,position_depart,der_f)

169 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

169

Résolution approchée(numérique) d'une équation différentielle

  • De nombreux problèmes conduisent à la résolution d'équations différentielles du premier ordre du type :

  • Lorsqu'il n'est pas possible d'obtenir une solution explicite sous forme de fonctions usuelles, on détermine une solution approchée(numérique). Il existe plusieurs méthodes permettant de réaliser ceci. L'une d'entre elles est la méthode d'Euler qui sera étudiée ici.

170 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

170

Méthode d'Euler :

  • On veut déterminer une solution approchée de l’équation différentielle :

Où est une fonction continue sur l’intervalle [a,b].

avec une condition initiale : y(a)=y0

  • On considère une subdivision régulière t = (t0, t1, …, tn) de [a,b] de pas h =(b-a)/n, on a donc : ti =t0+ih =a+ih

Si h est suffisamment petit on a :

  • Les approximations sont alors calculées de proche en proche par :

171 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

171

  • Le module scipy contint une fonction de résolution d'équations différentielles.

  • La bibliothèque scipy.integrate contient la fonction odeint, qui résout numériquement des équations différentielles. On commence donc par la charger via :

from scipy.integrate import odeint

  • L'utilisation se fait sous la forme :

odeint(f, y0,T)

Programmation :

module scipy :

172 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

172

Exemple :

  • f(t,y)=y; a=0; b=1; T =[0, 0.25, 0.5, 0.75, 1], l'équation est donc :

Console python

>>> from scipy . integrate import odeint

>>>def f(y,t):

return (y)

>>> odeint(f,1,[0,0.25,0.5,0.75,1.0])

array([[ 1. ],

[ 1.28402541],

[ 1.64872127],

[ 2.11700009],

[ 2.7182819 ]])

173 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

173

  • Le tableau T peut être généré automatiquement de différentes manières :
  • A l'aide d'une boucle for : T = [k/20 for k in range(21)]

T=[0.0,0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.65,0.7,0.75,0.8,0.85,0.9,0.95,1.0].

  • La méthode habituelle est d'utiliser la fonction linspace du module numpy qui construit un tableau dont les valeurs sont équidistantes.

T=linspace(a,b,n) construit un tableau de n valeurs équidistantes dont la première est a et la dernière b.

Remarques :

Console python

>>> from numpy import linspace

>>> T=linspace(0,1,21)

>>> T

array([ 0. , 0.05, 0.1 , 0.15, 0.2 , 0.25, 0.3 , 0.35, 0.4 , 0.45, 0.5 , 0.55, 0.6 , 0.65, 0.7 , 0.75, 0.8 , 0.85, 0.9 , 0.95, 1. ])

174 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

174

  • Il existe également la fonction arange du module numpy qui s'utilise sous la forme :

arange(a,b,h) ou h est le pas, b étant exclu comme dans le cas de range. Si on veut un tableau identique aux précédents on écrit :

Console python

>>> from numpy import arange

>>> T=arange(0,1.05,0.05)

>>> T

array([ 0. , 0.05, 0.1 , 0.15, 0.2 , 0.25, 0.3 , 0.35, 0.4 , 0.45, 0.5 , 0.55, 0.6 , 0.65, 0.7 , 0.75, 0.8 , 0.85, 0.9 , 0.95, 1. ])

175 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

175

Langage python

from numpy import *

def Phi(x,y):

………

return(z)

def Euler(a,b,Phi,y0,n):

"""Méthode d'Euler d'intégration approchée de

y'=Phi(x,y(x)) sur [a,b] avec condition initiale y0=f(a)

avec n+1 points"""

x=linspace(a,b,n+1)

y=empty(n+1) # tableau vide de n+1 éléments

y[0]=y0

pas=(b-a)/float(n)

for k in range(n):

y[k+1]=y[k]+pas*Phi(x[k],y[k])

return(y)

176 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

176

Résolution d’EDO 2ème ordre

Langage python

from scipy.integrate import *

def phi(Y,t) :

lamb,w0=0.01,1.0

y,ypoint=Y

return([ypoint,-2*lamb*ypoint-w0**2*y])

Y0=[1.,0.]

t=range(4)

d=odeint(phiY0,t)

S=d[:,0]

177 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

177

Langage python

from scipy.integrate import *

from numpy import *

def phi(Y,t) :

lamb,w0,A,w=0.01,1.0,1.5,2.

y,ypoint=Y

return([ypoint,-2*lamb*ypoint-w0**2*y+A*cos(w*t)])

Y0=[1.,0.]

t=range(4)

d=odeint(phi,Y0,t)

S=d[:,0]

178 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

178

>>>import matplotlib.pyplot as plt

  • plot() : Pour tracer une courbe à partir d’un tableau de valeurs ;
  • >>> plt.plot(x,y)
  • show() : Pour ouvrir une fenêtre et afficher l’image crée ;
  • >>> plt.show()
  • savefig() : Pour enregistrer la figure dans un fichier image ;
  • >>> plt.savefig(‘fichier’)
  • xlabel(), ylabel() : Pour donner un nom aux axes ;
  • >>> plt.xlabel(‘axe des x’)
  • >>> plt.ylabel(‘axe des y’)
  • grid() : Pour ajouter une grille ;
  • >>> plt. grid(True)
  • title() : Pour ajouter le titre.
  • >>> plt. title(‘Le titre’)

Matplotlib

179 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

179

180 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

180

Résolution d’un système linéaire :

Méthode de Gauss

Langage python

#Recherche du Pivot de Gauss

def pivot(m,s) :

n=len(m)

numpiv=s # numero du pivot provisoire

for i in range(s+1,n) : # boucle sur les lignes restantes

if abs(m[i][s])>abs(m[numpiv][s]):

numpiv=i

return (numpiv)

Recherche du pivot :

Langage python

# Création d'une matrice

def matrice(n,p) :

return([p*[0] for i in range(n)])

Création d'une matrice :

181 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

181

Langage python

# Copie d'une matrice

def copie(m):

n=len(m)

p=len(m[0])

mat=matrice(n,p)

for i in range(n) : # boucle sur les lignes

mat[i]=m[i][:]

return(mat)

Echange de lignes :

Langage python

# Changement de lignes

def change(m,i,j):

n=len(m)

p=len(m[0])

mat=copie(m) # On fait l'échange sur une copie de la matrice

for k in range(p) : # Boucle sur les colonnes

mat[i][k],mat[j][k]=mat[j][k],mat[i][k]

return(mat)

182 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

182

Langage python

# Transvection

def transvection(m,s) : # s numéro du pivot utilisé

n=len(m)

p=len(m[0])

mat=copie(m)

for i in range(s+1,n) : # Boucle sur les colonnes

k=m[i][s]/m[s][s]

for j in range(s,p) : # Boucle sur les colonnes

mat[i][j]=mat[i][j]-k*mat[s][j]

return(mat)

Transvection :

183 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

183

Langage python

# Résolution d'un système triangulaire

def solution(m):

n=len(m)

p=len(m[0])

sol=n*[None] # Création d'une solution vide

for i in range(n-1,-1,-1) : # Boucle sur les lignes

sol[i]=m[i][p-1]

for j in range(i+1,p-1):

sol[i]-=m[i][j]*sol[j]

sol[i]=sol[i]/m[i][i]

return(sol)

Résolution d’un système triangulaire :

184 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

184

Programme final :

Langage python

# Programme final

def gauss(mat) :

n=len(mat)

for s in range(n-1) : # Le dernier pivot est à l'avant dernière ligne

piv=pivot(mat,s)

if piv !=s :

mat=change(mat,s,piv)

mat=transvection(mat,s)

sol=solution(mat)

return(sol)

185 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

185

Structures de données

  • Un tuple est une séquence immuable : on ne peut pas modifier ses éléments ni lui en ajouter ou lui en enlever ;
  • On crée un tuple en écrivant ses éléments, séparés par des virgules et encadrés par des parenthèses. Si cela ne crée aucune ambiguïté, les parenthèses peuvent être omises. Un tuple constitué d’un seul élément a doit être écrit « a, » ou « (a,) ». Le tuple sans éléments se note « () ».

Tuples :

Exemple :

Console python

>>> t = 2, ’deux’, 2.0, True, (1, 2, 3, 4)

>>> t

(2, ’deux’, 2.0, True, (1, 2, 3, 4))

>>> t, type(t), len(t)

((2, ’deux’, 2.0, True, (1, 2, 3, 4)), <type ’tuple’>, 5)

>>> t[1]

’deux’

>>> t[-1]

(1, 2, 3, 4)

186 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

186

Les ensembles sont des structures de données avec les caractéristiques suivantes :

  • il n’y a pas d’accès indexé aux éléments, ni d’ordre entre ces derniers ;
  • il n’y a pas de répétition des éléments : un élément appartient ou non `a un ensemble, mais cela n’a pas de sens de se demander s’il s’y trouve plusieurs fois.

On construit un ensemble par une expression de la forme set(séquence)

séquence est une donnée parcourable (liste, tuple, chaine de caractères, etc.).

Ensembles :

Exemple :

Console python

>>> s = set("abracadabra")

>>> s

set([’a’, ’r’, ’b’, ’c’, ’d’])

187 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

187

élément in ensemble :

élément appartient-il `a ensemble ?

ensemble.add(élément) :

ajout de l’élément indiqué à l’ensemble indiqué.

ensemble.remove(élément) :

suppression de l’élément indiqué de l’ensemble indiqué.

ensemble1.issubset(ensemble2) :

tous les éléments de ensemble1 appartiennent-ils à ensemble2 ?

ensemble1.union(ensemble2) :

ensemble des éléments appartenant à ensemble1 ou à ensemble2.

ensemble1.intersection(ensemble2) :

éléments de ensemble1 qui sont aussi éléments de ensemble2.

ensemble1.difference(ensemble2) :

éléments de ensemble1 qui ne sont pas dans ensemble2.

188 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

188

Un dictionnaire, ou table associative, est une collection de couples (clé, valeur) telle que :

  • il n’y a pas deux couples ayant la même clé ;
  • la structure est implémentée de manière que la recherche d’une valeur à partir de la clé correspondante soit extrêmement efficace.

On construit explicitement un dictionnaire par une expression de la forme {clé1 : valeur1, clé2 : valeur2, ... clék : valeurk}

Dictionnaires :

Opérations principales :

dict[clé]=valeur :

ajoute au dictionnaire dict une paire (clé, valeur) ou, si une telle paire existait déjà modifie sa partie valeur.

189 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

189

dict[clé]=valeur :

ajoute au dictionnaire dict une paire (clé, valeur) ou, si une telle paire existait déjà modifie sa partie valeur.

dict[clé] :

renvoie la valeur correspondant à la clé donnée ; une erreur est déclenchée si une telle cl´e n’existe pas dans le dictionnaire.

dict.get(clé [,valsinon]) :

renvoie la valeur correspondant à la clé donnée ; si une telle clé est absente, renvoie valsinon ou (si valsinon est omise) None.

dict.has_key(clé) :

vrai si et seulement si la clé indiquée existe dans le dictionnaire dict.

del dict[clé] :

supprime du dictionnaire dict la paire (clé, valeur).

190 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

190

dict.keys( ) :

renvoie une copie de la liste des clés du dictionnaire dict.

dict.values( ) :

renvoie une copie de la liste des valeurs du dictionnaire dict.

dict.items( ) :

renvoie une copie de la liste des associations constituant le dictionnaire dict.

191 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

191

192 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

192

Exemple :

Console python

>>> t = 2, ’deux’, 2.0, True, (1, 2, 3, 4)

>>> t

(2, ’deux’, 2.0, True, (1, 2, 3, 4))

>>> t, type(t), len(t)

((2, ’deux’, 2.0, True, (1, 2, 3, 4)), <type ’tuple’>, 5)

>>> t[1]

’deux’

>>> t[-1]

(1, 2, 3, 4)

193 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

193

>>>import matplotlib.pyplot as plt

>>> y1 = sin(x)

>>> y2 = cos(x)

>>> plt.plot(x,y1,"r-",x,y2,"g.“)

>>> plt.show()

>>> plt.savefig(‘fichier.pdf’)

194 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

194

  • Le tableau T peut être généré automatiquement de différentes manières :
  • A l'aide d'une boucle for : T = [k/20 for k in range(21)]

T=[0.0,0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.65,0.7,0.75,0.8,0.85,0.9,0.95,1.0].

  • La méthode habituelle est d'utiliser la fonction linspace du module numpy qui construit un tableau dont les valeurs sont équidistantes.

T=linspace(a,b,n) construit un tableau de n valeurs équidistantes dont la première est a et la dernière b.

195 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

195

Matplotlib

  • >>>import matplotlib.pyplot as plt
  • >>>plt.plot(x,y)

  • >>> plt.show()
  • >>> plt.savefig(‘fichier’)
  • >>> plt.clf()
  • >>> plt.hist(data)
  • >>> plt.legend()

196 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

196

197 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

197

Technique à répéter :

  • On divise l’intervalle [a, b] en deux, et on ne garde que la section qui contient la solution:
  • Pour cela, on examine le signe de f((a+b)/2):
  • Si f(a) et f((a+b)/2) sont de signes contraires, on se place alors sur [a,(a+b)/2] ;
  • sinon, il faudra travailler sur [(a+b)/2,b].
  • Puis on recommence.

198 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

198

Console python

>>> from numpy.linalg import solve

>>> solve ([[1,2],[3,4]], [2,8])

array([ 4., -1.])

Les opérations usuelles (addition, soustraction, multiplication, division) s’appliquent aux tableaux Numpy en opérant coefficient par coefficient.

199 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

199

Console python

Utilisation de np.matrix :

La classe des matrices, permet de faire du calcul matrice

200 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

200

Les fichiers binaires : l' information est stockée en binaire (une suite d'octets). Ils se manipulent octets par octets.

201 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

201

Langage python

202 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

202

Soit le tableau T initialisé comme suit :

T=6*[4*[0]]

Accès aux composantes

203 of 303

203

Saisir les éléments d’un Tableau 2D (Matrice)

Algorithme SaisieMatrice

Variables i , j , n, m : entier

Tableau A[n][m] : réel

Début

Ecrire("Donner le nombre de lignes et de colonnes :")

Lire(n,m)

Pour i allant de 0 à n-1 faire� Pour j allant de 0 à m-1 faire

Ecrire ("Entrez l'élément de la ligne", i + 1,"et de la colonne", j+1)

Lire (A[i][j])

FinPour

FinPour

Fin

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

204 of 303

204

n=int(input('Donner le nombre de lignes  :'))

m=int(input('Donner le nombre de colonnes :‘))

A=n*[m*[0]]

A = [m*[0] for i in range(n)]

for i in range(n):

for j in range(m):

A[i][j]=int(input('Elément de la ligne %d et

de la colonne %d :' % (i+1,j+1)))

Programme python:

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

205 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

205

  • Si X > T[milieu], il suffit de chercher X dans la 2ème moitié de la liste entre (T[milieu+1] et T[N-1]).

206 of 303

Fonction récursives : exemple

Une fonction récursive qui permet d'afficher la valeur binaire d'un entier n

Procédure binaire (n : entier )

Si (n<>0) alors

binaire (n/2)

Ecrire (n mod 2)

Finsi

FinProcédure

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

206

207 of 303

Exponentiation rapide : exercice

La fonction récursive suivante calcule xn pour un entier strictement positif n:

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

207

208 of 303

Exponentiation rapide : exercice

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

208

Fonction puissance ( x : réel, n : entier ) : réel

Variables n : entier, x, tmp : réel

DEBUT

SI (n=0) alors

retourne (1)

SINON

SI (n=1) alors

retourne (x)

SINON

tmp ← puissance( x , n/2 )

SI (n est pair) alors

retourne (tmp * tmp)

SINON

retourne (x * tmp * tmp)

Finsi

Finsi

Finsi

FinFonction

209 of 303

Algorithme d’Euclide : Exercice

Principe :

  • Soient deux entiers naturels a et b, dont on cherche le PGCD. Une suite d'entiers an est définie par récurrence, plus précisément par divisions euclidiennes successives; la suite est initialisée par a0=a, a1=b, puis propagée par la règle de récurrence : tant que an+1 est non nul, an+2 est défini comme le reste de la division euclidienne de an par an+1.

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

209

210 of 303

Algorithme d’Euclide : Exercice

  • On commence donc par calculer le reste de la division de a par b, qu'on note r ; puis on remplace a par b, puis b par r, et on réapplique le procédé depuis le début.

  • On obtient ainsi une suite, qui vaut 0 à un certain rang ; le PGCD cherché est le terme précédent de la suite.

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

210

211 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

211

a et b entiers naturels

non nuls et a>b

Calculer le reste r de la

Division de a par b

a prend la valeur de b

b prend la valeur de r

r=0 ?

Pgcd b

Oui

Non

Organigramme :

Algorithme d’Euclide : Exercice

212 of 303

Algorithme d’Euclide : Exercice

Fonction Pgcd ( a : entier , b : entier ) : entier

Variable a,b : entier

Debut

Si (b=0) alors

retourne (a)

Sinon

retourne (Pgcd (b , a mod b))

Finsi

FinFonction

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

212

213 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

213

214 of 303

214

Ecrire un programme python qui calcule la somme de deux matrices A et B ayant 3 lignes et 3 colonnes.

Le programme doit contenir les fonctions suivantes:

1- SaisirMatrice (n,m) :

qui crée une matrice de n x m, la saisir par clavier puis la retourner.

2- AfficheMatrice (M) :

qui affiche les éléments de la matrice M

3-SommeMatrice(M1,M2) :

qui retourne la somme des matrices M1 et M2

Exercice3 :

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

215 of 303

215

Recherche de la valeur x dans un tableau T de N éléments :

Algorithme recherche_ séquentielle

Variables i : entier

Trouve : booleen

tableau T[N],x: reel

Debut

i←0 , Trouvé ← Faux�TantQue ((i < N) ET (Trouve=Faux))

  si (T[i]=x) alors�     Trouve ← Vrai� sinon

i←i+1

    finSi�FinTantQue

si (Trouve= Vrai) alors

Ecrire ("x appartient au tableau")�sinon

Ecrire ("x n'appartient pas au tableau")�finsi

Fin

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

216 of 303

216

Algorithme :

Algorithme recherche_ dichotomique

Variables i,inf,sup,milieu : entier

Trouve : booleen

tableau T[N],x : reel

Debut

inf←0 , sup←N-1, Trouve ← Faux

TantQue (inf <=sup) ET (Trouve=Faux)� milieu←(inf+sup)div2

si x=T[milieu] alors

Trouve ← Vrai

  sinon

si x>T[milieu] alors�          inf←milieu+1

sinon

sup←milieu-1

    finsi� finsi

finTantQue

si (Trouve=Vrai) alors

Ecrire ("x appartient au tableau")

sinon

Ecrire ("x n'appartient pas au tableau")

finSi

Fin

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

217 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

217

218 of 303

Tri par sélection :

  • Supposons que le tableau est noté T et sa taille N

Pour i allant de 0 à N-2 Faire

Min ← T[i]       

Pour j allant de i+1 à N-1 Faire �        Si T[j] <Min alors�              Min ← T[j]

T[j] ← T[i]

T[i] ← Min �        Finsi�  FinPour 

FinPour

218

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

219 of 303

Tri par insertion

  • Supposons que le tableau est noté T et sa taille N

Pour i allant de 0 à N

Pour j allant de 0 à i-1�        Si (T[i] < T[j] ) alors�              Min ← T[i]

Pour k allant de 0 à i-n-1

T[i-k] ← T[i-k-1]

FinPour

T[j] ← Min �        Finsi�  FinPour 

FinPour

219

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

220 of 303

Tri à bulles

  • Principe : L’algorithme consiste à comparer chaque paire d’éléments consécutifs, si ces éléments sont dans l’ordre, on passe à la paire suivante, sinon on procède à leur échange avant de traiter la paire suivante.

220

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

221 of 303

Tri à bulles : algorithme

  • Supposons que le tableau est noté T et sa taille N

  • Faire
  • k←0
  • Pour i←1 jusqu’à N-1 Faire
  • Si (T[i]<T[i-1]) Alors
  • Min ← T[i]
  • T[i] ← T[i-1]
  • T[i-1] ← Min
  • k ← k+1
  • FinSi
  • Fin Pour
  • TantQue (k≠0)

221

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

222 of 303

222

Donner un programme qui calcul la valeur du polynôme de degré n pour un réel x .

Exercice2 :

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

Le programme doit contenir les fonctions suivantes:

  • Saisirpolynome() : qui demande le degré n puis remplit les coefficients dans l’ordre décroissant an …a0 puis retourne la liste des coefficients
  • Affichepolynome(p) : qui affiche le polynôme p
  • calculeValeur(P,x) : qui retourne la valeur du polynôme P pour le réel x.

223 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

223

def saisirpolynome():

n=int(input('Donner le degré n:'))

P=(n+1)*[0]

i=n

while i>=0:

P[i]=float(input('Donner le coeif numero %.0f: ' % (i) ))

i-=1

return P

def Affichepolynome(P):

n=len(P)

i=n-1

while i>0:

if P[i]!=0:

print (P[i],'*X^',i, end=' ')

if P[i-1]>=0:

print ('+', end=' ')

i-=1

if P[i]!=0: print (P[0])

224 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

224

def calculeValeur(P,x):

s=0

for i in range(0,len(P)):

s=s+P[i]*x**i

return s

#programme principal

pol=saisirpolynome()

Affichepolynome(pol)

x=float(input('Donner x:'))

print('pol(',x,')=', calculeValeur(pol,x))

225 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

225

226 of 303

Ingénierie numérique et simulation

226

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

227 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

227

228 of 303

228

Exemple 1 :

Calcul de la somme de 20 entiers stockés dans un tableau.

# include<stdio.h >

main()

int i, som ;

int T[20] ;

for (i=0; i<20; i++)

{printf("Donner T[%d]=",i) ;

scanf("%d",&T[i]) ;

som+= T[i] ;

}

printf("La somme=%d",som) ;

}

{

som=0 ;

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

229 of 303

229

/* Valeur maximale */

#include< stdio.h >

main()

{

int i;

float Tab[12], Max ;

Max=Tab[0] ;

for i=1; i<11; i++

{

if (Max<Tab[i])

Max=Tab[i] ;

}

printf (“La valeur maximale du tableau est : %f “, Max);

}

Donner la valeur maximale d’un tableau Tab[12].

Exercice1 :

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

230 of 303

230

Algorithme polynôme

Variables n, i, j : Entier

x,Som,Puiss, Coef[n+1] : Réel

Début

Ecrire (" Donner le nombre x et n : ")

Lire (x,n)

Som←Coef[0]

Pour i←1 jusqu’à n

Puiss ← 1

Pour j← 1 jusqu’à i

Puiss ← Puiss*x

Fin Pour

Som ← Puiss*Coef[i]+Som

Fin Pour

Ecrire ("Le polynôme de degre",n,"vaut",Som,"pour x=",x)

Fin

Donner un programme qui calcul la valeur du polynôme de degré n pour un réel x .

Exercice2 :

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

231 of 303

231

/* La somme de deux matrices */

#include< stdio.h >

main()

{

int i,j ;

int A[3][3], B[3][3], C[3][3] ;

/* Lecture de la matrice A et de la matrice B */

for (i=0; i<3; i++)

{

for (j=0; j<3; j++)

{

printf (“Donner A[%d][%d] \n“,i,j);

scanf ("%d",&A[i][j]);

printf (“Donner B[%d][%d] \n“,i,j);

scanf ("%d",& A[i][j]);

}

}

/* Calcul et affichage de la somme */

for (i=0; i<3; i++)

{

for (j=0; j<3; j++)

{

C[i][j]=A[i][j]+B [i][j] ;

printf("C[%d][%d] =%d\n",i,j,C[i][j]) ;

}

}

}

Donner un programme qui calcul la somme de deux matrices A[3][3], B[3][3].

Exercice3 :

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

232 of 303

232

/* Calcul du produit */

#include< stdio.h >

main()

{

int i,j,k ;

int A[3][3], T[3][3] ;

/* Lecture de la matrice A et de la matrice B */

for (i=0; i<3; i++)

{

for (j=0; j<3; j++)

{

printf (“Donner A[%d][%d] \n“,i,j);

scanf ("%d",&A[i][j]);

printf (“Donner B[%d][%d] \n“,i,j);

scanf ("%d",& A[i][j]);

}

}

/* Calcul et affichage du produit */

for (i=0; i<3; i++)

{

for (j=0; j<3; j++)

{

T[i][j]=k*A [i][j] ;

printf(“T[%d][%d] =%d\n",i,j,T[i][j]) ;

}

}

}

Donner un programme qui calcul le Produit k×A[3][3] avec kєN.

Exercice4 :

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

233 of 303

233

/* Calcul du produit de deux matrices */

#include< stdio.h >

main()

{

int i,j,k ;

int A[3][3], B[3][3], C[3][3] ;

/* Lecture de la matrice A et de la matrice B */

for (i=0; i<3; i++)

{for (j=0; j<3; j++)

{printf (“Donner A[%d][%d] \n“,i,j);

scanf ("%d",&A[i][j]);

printf (“Donner B[%d][%d] \n“,i,j);

scanf ("%d",& A[i][j]); }

}

/* Calcul du produit */

for (i=0; i<3; i++)

{ for (j=0; j<3; j++)

{C [i] [j]=0 ;

for (k=0; k<3; k++)

{C[i][j]=C[i][j]+ A[i][k]*B[k][j] ;}

}

}

/* Affichage de la matrice C */

for (i=0; i<3; i++)

{ for (j=0; j<3; j++)

{ printf("C[%d][%d] =%d\n",i,j,C[i][j]) ;}

}

}

Donner un programme qui calcul le Produit de deux matrices A[3][3], B[3][3].

Exercice5 :

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

234 of 303

234

/* Calcul du produit de deux matrices */

#include< stdio.h >

main()

{

int i,j,k ;

int A[3][3], B[3][3], C[3][3] ;

/* Lecture de la matrice A et de la matrice B */

for (i=0; i<3; i++)

{

for (j=0; j<3; j++)

{

printf (“Donner A[%d][%d]\n“,i,j);

scanf ("%d",&A[i][j]);

printf (“Donner B[%d][%d]\n“,i,j);

scanf ("%d",& A[i][j]);

}

}

/* Calcul du produit et Affichage de la matrice C */

for (i=0; i<3; i++)

{

for (j=0; j<3; j++)

{

C [i] [j]=0 ;

for (k=0; k<3; k++)

{

C[i][j]=C[i][j]+ A[i][k]*B[k][j] ;

}

}

printf("C[%d][%d] =%d\n",i,j,C[i][j]) ;

}

}

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

235 of 303

235

#include< stdio.h >

main()

{

int i,j ;

float Mass=0,S=0,X,P[2][4] ;

for (i=0; i<2; i++)

{for (j=0; j<4; j++)

{if(i==0)

{ Printf (“Donner la masse du point%d\n “,j+1);

scanf ("%f",&P[i][j]);

Mass=Mass+P[0][j]; }

else

{ Printf (“Donner l’abscisse du point %d\n “,j+1);

scanf ("%f",&P[i][j]);

S=S+(P[0][j]*P[1][j]);}

}

}

X=S/Mass;

printf("L’abscisse du barycentre est : %f\n",X) ;

}

Donner un programme qui détermine l’abscisse X du centre de masse de quatre points matériels.

Exercice6 :

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

236 of 303

236

Les chaînes de caractères :

  • Chaîne constante :

Char mot ;

mot = "bonjour" ;

Exemple :

  • Tableau de caractères :

Exemple :

Char ch[12] ;

Char ch[12] = "bonjour" ;

Char ch[12] = {‘b’,’o’,’n’,’j’,’o’,’u’,’r’,’\0’ } ;

On pourra aussi faire :

Char ch[] = "bonjour" ;

ch = "bonjour" ;

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

237 of 303

237

Char ch[12] = "bonjour" ;

b

o

n

j

o

u

r

\0

0

0

0

0

Affichage de chaînes de caractères :

printf ("%s",ch ) ;

puts (ch ) ;

Lecture de chaînes de caractères :

scanf ("%s",ch ) ;

gets (ch ) ;

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

238 of 303

238

Fonctions

Opérations

strlen(s)

Longueur de s

strcpy(s,ct)

Copie ct dans s

strncpy(s,ct,n)

Copie jusqu’à n caractères

strcat(s,ct)

Concatène ct après s

strncat(s,ct,n)

Concatène jusqu’à n caractère

memcpy(s,ct,n)

Copie n caractères de ct dans s

Opérations sur les chaînes de caractères : <string.h>

s, t : chaînes de caractères

ct : chaîne de caractères constante

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

239 of 303

Le langage C permet de manipuler les adresses mémoires «&» par l’intermédiaire de variables nommées « pointeurs ».

239

Les pointeurs :

Déclaration :

Exemple :

int *adr ;

int n=20 ;

adr :

* :

*adr :

& :

pointeur sur les entiers (adresse d’un entier)

opérateur qui désigne le contenu de l’adresse qui le suit

désigne le contenu de l’adresse adr

opérateur unaire qui fournit comme résultat l’adresse de son opérande

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

240 of 303

Le nom d’un tableau est un pointeur sur le premier élément du tableau.

240

20

30

n

adr

n

adr

adr= & n

*adr=30

Remarque :

Exemple :

int tab[20] ;

int i;

tab

tab+1

tab+i

&tab[0] ;

&tab[1] ;

&tab[i] ;

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

241 of 303

241

#include< stdio.h >

main()

{

int x,y ;

int *pti, *ptj ; /*Déclaration de 2 pointeurs pti et ptj vers des entiers */

x=123 ;

y=456 ;

/*1 */

pti=&x ; /*Le pointeur pti reçoit l’adresse de x */

ptj=&y ; /*Le pointeur ptj reçoit l’adresse de y */

/*2 */

*pti=789 ; /*L’entier pointé par pti reçoit 789 */

*ptj=(*pti)-123 ; /*L’entier pointé par ptj reçoit la valeur de l’entier pointé par pti, moins 123 */

/*3 */

ptj=pti ; /*Le pointeur pti reçoit la valeur du pointeur ptj, moins 123 */

}

Exemple :

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

242 of 303

242

123

456

x

pti

y

ptj

789

666

x

pti

y

ptj

789

666

x

pti

y

ptj

1

2

3

* pti vaut 123

* ptj vaut 456

x vaut 789

y vaut 666

*pti et *ptj valent 666

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

243 of 303

Ingénierie numérique et simulation

Fonctions et procédures

243

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

244 of 303

Fonctions et procédures

  • Certains problèmes conduisent à des programmes longs, difficiles à écrire et à comprendre. On les découpe en des parties appelées sous-programmes ou modules

  • Les fonctions et les procédures sont des modules (groupe d'instructions) indépendants désignés par un nom. Elles ont plusieurs intérêts :

    • permettent de "factoriser" les programmes, càd de mettre en commun les parties qui se répètent ;

    • permettent une structuration et une meilleure lisibilité des programmes ;

    • facilitent la maintenance du code (il suffit de modifier une seule fois) ;

    • ces procédures et fonctions peuvent éventuellement être réutilisées dans d'autres programmes.

244

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

245 of 303

Fonctions

  • Le rôle d'une fonction en programmation est similaire à celui d'une fonction en mathématique : elle retourne un résultat à partir des valeurs des paramètres ;

  • Une fonction s'écrit en dehors du programme principal sous la forme :

Fonction nom_fonction (paramètres et leurs types) : type_fonction

Instructions constituant le corps de la fonction

retourne (…)

FinFonction

  • Pour le choix d'un nom de fonction il faut respecter les mêmes règles que celles pour les noms de variables ;
  • Type_fonction est le type du résultat retourné ;
  • L'instruction retourne sert à retourner la valeur du résultat.

245

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

246 of 303

Langage C :

  • Le résultat d’une fonction peut ne pas être utilisé

  • Une fonction peut ne pas fournir aucun résultat

  • Une fonction peut fournir un résultat non scalaire

  • Un programme C est un ensemble de fonctions contenant au moins la fonction main (fonction obligatoire). Toutes ces fonctions sont au même niveau(pas d’imbrication de fonctions).

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

246

247 of 303

Fonctions : exemples

  • La fonction SommeCarre suivante calcule la somme des carrées de deux réels x et y :

Fonction SommeCarre (x : réel, y: réel ) : réel

variable z : réel

z ←x^2+y^2

retourne (z)

FinFonction

  • La fonction Pair suivante détermine si un nombre est pair :

Fonction Pair (n : entier ) : booléen

retourne (n mod 2=0)

FinFonction

247

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

248 of 303

Utilisation des fonctions

  • L'utilisation d'une fonction se fera par simple écriture de son nom dans le programme principale. Le résultat étant une valeur, devra être affecté ou être utilisé dans une expression, une écriture, ...

  • Exepmle : Algorithme exepmleAppelFonction

variables z : réel, b : booléen

Début

b ←Pair(3)

z ←5*SommeCarre(7,2)+1

Ecrire("SommeCarre(3,5)= ", SommeCarre(3,5))

Fin

  • Lors de l'appel Pair(3) le paramètre formel n est remplacé par le paramètre effectif 3

248

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

249 of 303

Arguments d'une fonction :

  • Les paramètres servent à échanger des données entre le programme principale (ou la procédure appelante) et la procédure appelée

  • Les argument placés dans la déclaration d'une fonction sont appelés argument formels. Ces paramètres peuvent prendre toutes les valeurs possibles mais ils sont abstraits (n'existent pas réellement)

  • Les argument placés dans l'appel d'une fonction sont appelés argument effectifs.

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

249

250 of 303

Procédures

  • Dans certains cas, on peut avoir besoin de répéter une tâche dans plusieurs endroits du programme, mais que dans cette tâche on ne calcule pas de résultats ou qu'on calcule plusieurs résultats à la fois ;

  • Dans ces cas on ne peut pas utiliser une fonction, on utilise une procédure ;

  • Une procédure est un sous-programme semblable à une fonction mais qui ne retourne rien ;

  • Une procédure s'écrit en dehors du programme principal sous la forme :

Procédure nom_procédure (paramètres et leurs types)

Instructions constituant le corps de la procédure

FinProcédure

  • Remarque : une procédure peut ne pas avoir de paramètres.

250

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

251 of 303

Appel d'une procédure

  • L'appel d'une procédure, se fait dans le programme principale ou dans une autre procédure par une instruction indiquant le nom de la procédure :

Procédure exemple_proc (…)

FinProcédure

Algorithme exepmleAppelProcédure

Début

exemple_proc (…)

Fin

  • Remarque : contrairement à l'appel d'une fonction, on ne peut pas affecter la procédure appelée ou l'utiliser dans une expression. L'appel d'une procédure est une instruction autonome.

251

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

252 of 303

Paramètres d'une procédure

  • Les paramètres servent à échanger des données entre le programme principale (ou la procédure appelante) et la procédure appelée ;

  • Les paramètres placés dans la déclaration d'une procédure sont appelés paramètres formels. Ces paramètres peuvent prendre toutes les valeurs possibles mais ils sont abstraits (n'existent pas réellement) ;

  • Les paramètres placés dans l'appel d'une procédure sont appelés paramètres effectifs. ils contiennent les valeurs pour effectuer le traitement ;

  • Le nombre de paramètres effectifs doit être égal au nombre de paramètres formels. L'ordre et le type des paramètres doivent correspondre.

252

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

253 of 303

Transmission des paramètres

Il existe deux modes de transmission de paramètres dans les langages de programmation :

  • La transmission par valeur : les valeurs des paramètres effectifs sont affectées aux paramètres formels correspondants au moment de l'appel de la procédure. Dans ce mode le paramètre effectif ne subit aucune modification ;

  • La transmission par adresse (ou par référence) : les adresses des paramètres effectifs sont transmises à la procédure appelante. Dans ce mode, le paramètre effectif subit les mêmes modifications que le paramètre formel lors de l'exécution de la procédure ;

    • Remarque : le paramètre effectif doit être une variable (et non une valeur) lorsqu'il s'agit d'une transmission par adresse.

  • En pseudo-code, on va préciser explicitement le mode de transmission dans la déclaration de la procédure ;

253

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

254 of 303

Transmission des paramètres :exemples

Procédure incrementer1 (x : entier par valeur, y : entier par adresse)

x ← x+1

y ← y+1

FinProcédure

Algorithme Test_incrementer1

variables n, m : entier

Début

n ← 3

m ← 3

incrementer1(n, m)

Ecrire (" n= ", n, " et m= ", m)

Fin

Résultat :

n=3 et m=4

Remarque : l'instruction x ← x+1 n'a pas de sens avec un passage par valeur

254

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

255 of 303

Transmission par valeur, par adresse : exemples

Procédure qui échange le contenu de deux variables :

Procédure Echange (x : réel par adresse, y : réel par adresse)

variables z : réel

z ← x

x ← y

y ← z

FinProcédure

255

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

256 of 303

Variables locales et globales (1)

  • On peut manipuler 2 types de variables dans un module (procédure ou fonction) : des variables locales et des variables globales. Elles se distinguent par ce qu'on appelle leur portée (leur "champ de définition", leur "durée de vie") ;

  • Une variable locale n'est connue qu'à l'intérieur du module ou elle a été définie. Elle est créée à l'appel du module et détruite à la fin de son exécution ;

  • Une variable globale est connue par l'ensemble des modules et le programme principale. Elle est définie durant toute l’application et peut être utilisée et modifiée par les différents modules du programme.

256

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

257 of 303

Variables locales et globales (2)

  • La manière de distinguer la déclaration des variables locales et globales diffère selon le langage :

    • En général, les variables déclarées à l'intérieur d'une fonction ou procédure sont considérées comme variables locales

  • En pseudo-code, on va adopter cette règle pour les variables locales et on déclarera les variables globales dans le programme principale ;

  • Conseil : Il faut utiliser autant que possible des variables locales plutôt que des variables globales. Ceci permet d'économiser la mémoire et d'assurer l'indépendance de la procédure ou de la fonction.

257

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

258 of 303

Récursivité

  • Un module (fonction ou procédure) peut s'appeler lui-même: on dit que c'est un module récursif ;

  • Tout module récursif doit posséder un cas limite (cas trivial) qui arrête la récursivité ;

  • Exemple : Calcul du factorielle

Fonction fact (n : entier ) : entier

Si (n=0) alors

retourne (1)

Sinon

retourne (n*fact(n-1))

Finsi

FinFonction

258

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

259 of 303

Fonctions récursives : exercice

  • Ecrivez une fonction récursive qui calcule le terme n de la suite de Fibonacci définie par : U(0)=U(1)=1

U(n)=U(n-1)+U(n-2)

Fonction Fib (n : entier ) : entier

Variable res : entier

Si (n=1 OU n=0) alors

res ←1

Sinon

res ← Fib(n-1)+Fib(n-2)

Finsi

retourne (res)

FinFonction

259

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

260 of 303

Fonctions récursives : exercice (suite)

  • Une fonction itérative pour le calcul de la suite de Fibonacci :

Fonction Fib (n : entier ) : entier

Variables i, AvantDernier, Dernier, Nouveau : entier

Si (n=1 OU n=0) alors

retourne (1)

Finsi

AvantDernier ←1, Dernier ←1

Pour i allant de 2 à n

Nouveau← Dernier+ AvantDernier

AvantDernier ←Dernier

Dernier ←Nouveau

FinPour

retourne (Nouveau)

FinFonction

Remarque: la solution récursive est plus facile à écrire

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

260

261 of 303

Fonction récursives : exemple

Une fonction récursive qui permet d'afficher la valeur binaire d'un entier n

Procédure binaire (n : entier )

Si (n<>0) alors

binaire (n/2)

Ecrire (n mod 2)

Finsi

FinProcédure

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

261

262 of 303

Exponentiation rapide : exercice

La fonction récursive suivante calcule xn pour un entier strictement positif n:

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

262

263 of 303

Exponentiation rapide : exercice

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

263

Fonction puissance ( x : réel, n : entier ) : réel

Variables n : entier, x, tmp : réel

DEBUT

SI (n=0) alors

retourne (1)

SINON

SI (n=1) alors

retourne (x)

SINON

tmp ← puissance( x , n/2 )

SI (n est pair) alors

retourne (tmp * tmp)

SINON

retourne (x * tmp * tmp)

Finsi

Finsi

Finsi

FinFonction

264 of 303

Algorithme d’Euclide : Exercice

Principe :

  • Soient deux entiers naturels a et b, dont on cherche le PGCD. Une suite d'entiers an est définie par récurrence, plus précisément par divisions euclidiennes successives; la suite est initialisée par a0=a, a1=b, puis propagée par la règle de récurrence : tant que an+1 est non nul, an+2 est défini comme le reste de la division euclidienne de an par an+1.

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

264

265 of 303

Algorithme d’Euclide : Exercice

  • On commence donc par calculer le reste de la division de a par b, qu'on note r ; puis on remplace a par b, puis b par r, et on réapplique le procédé depuis le début.

  • On obtient ainsi une suite, qui vaut 0 à un certain rang ; le PGCD cherché est le terme précédent de la suite.

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

265

266 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

266

a et b entiers naturels

non nuls et a>b

Calculer le reste r de la

Division de a par b

a prend la valeur de b

b prend la valeur de r

r=0 ?

Pgcd b

Oui

Non

Organigramme :

Algorithme d’Euclide : Exercice

267 of 303

Algorithme d’Euclide : Exercice

Fonction Pgcd ( a : entier , b : entier ) : entier

Variable a,b : entier

Debut

Si (b=0) alors

retourne (a)

Sinon

retourne (Pgcd (b , a mod b))

Finsi

FinFonction

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

267

268 of 303

Exemples : lecture d'une matrice

  • Procédure qui permet de saisir les éléments d'une matrice :

Procédure SaisieMatrice (n : entier par valeur, m : entier par valeur , tableau A : réel par référence )�Début

variables i,j : entier

Pour i allant de 0 à n-1� Ecrire ("saisie de la ligne ", i + 1)

Pour j allant de 0 à m-1

     Ecrire ("Entrez l'élément de la ligne ", i + 1, " et de la colonne ", j+1)

    Lire (A[i][j])

FinPour

FinPour

FinProcédure

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

268

269 of 303

Exemples : affichage d'une matrice

  • Procédure qui permet d'afficher les éléments d'une matrice :

Procédure AfficheMatrice (n : entier par valeur, m : entier par valeur ,tableau A : réel par valeur )�Début

variables i,j : entier

Pour i allant de 0 à n-1� Pour j allant de 0 à m-1

     Ecrire ("A[",i, "] [",j,"]=", A[i][j])

FinPour

FinPour

FinProcédure

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

269

270 of 303

Exemples : somme de deux matrices

  • Procédure qui calcule la somme de deux matrices :

Procédure SommeMatrices (n, m : entier par valeur,

tableau A, B : réel par valeur , tableau C : réel par référence )�Début

variables i,j : entier

Pour i allant de 0 à n-1� Pour j allant de 0 à m-1

     C[i][j] ← A[i][j]+B[i][j]

FinPour

FinPour

FinProcédure

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

270

271 of 303

Appel des Fonctions définies sur les matrices

Exemple d'algorithme principale où on fait l'appel des Procédures définies précédemment pour la saisie, l'affichage et la somme des matrices :

Algorithme Matrices

variables tableau M1[3][4],M2 [3][4],M3 [3][4] : réel

Début

SaisieMatrice (3, 4, M1)

SaisieMatrice (3, 4, M2)

AfficheMatrice (3,4, M1)

AfficheMatrice (3,4, M2)

SommeMatrice (3, 4, M1,M2,M3)

AfficheMatrice (3,4, M3)

Fin

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

271

272 of 303

Recherche séquentielle :

  • Une fonction Recherche qui retourne un booléen pour indiquer si une valeur x appartient à un tableau T de dimension N.

x , N et T sont des paramètres de la fonction

Fonction Recherche(x : réel, N: entier, tableau T : réel ) : booléen

Variable i: entier

Pour i allant de 0 à N-1�  Si (T[i]=x) alors�          retourne (Vrai)

FinSi� FinPour

retourne (Faux)

FinFonction

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

272

273 of 303

273

Il existe très peu de contraintes dans l’écriture d’un programme C. Aussi existe-t-il un certain nombre de conventions :

  • On n’écrit qu’une seule instruction par ligne : le point virgule d’une instruction ou d’une déclaration est toujours le dernier caractère de la ligne;
  • Les instructions sont disposées de telle façon que la structure modulaire du programme soit mise en évidence. En particulier, une accolade ouvrante marquante début d’un bloc doit être seule sur sa ligne ou placée à la fin d’une ligne. Une accolade fermante est toujours seule sur sa ligne;
  • On laisse un blanc :
  • Entre les mots clefs if, while, switch, for et la parenthèse ouvrante qui suit ;
  • Après une virgule ;
  • De part et d’autre d’une opérateur binaire.
  • On ne met pas de blanc entre un opérateur unaire et son opérande, ni entre les deux caractères d’un opérateur d’affectation composée;
  • Les instructions doivent être indentées afin que toutes les instructions d’un même bloc soient alignées.

Les conventions d’écriture d’un programme C :

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

274 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

274

275 of 303

275

Analyse descendante : Diviser pour régner

Diviser pour régner consiste à décomposer le problème complexe à résoudre en plusieurs sous problèmes moins complexes. A refaire cette décomposition sur les sous problèmes jusqu’à obtenir des sous problèmes faciles à résoudre.

Conclusion :

La solution à un problème bien défini peut être formulée comme une suite des trois énoncés suivants :

    • Séquentiel : suite d’étapes
    • Conditionnel : choix entre deux étapes suivant une condition
    • Répétitif (itératif) : répétition d’une étape

Exemple :

Algorithme de résolution d'équation de second degré :

a x2 + b x + c = 0

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

276 of 303

276

ax2+bx+c=0

bx+c=0

ax2+bx+c=0

c=0

Infinités de solutions

Pas de solutions

x=-c/b

Δ=b2-4ac

Δ=0

x=-b/2a

Δ≠0

Δ<0

Pas de solutions réelles

Δ>0

x1=-b-(Δ)1/2/2a

x2=-b+(Δ)1/2/2a

a=0

a≠0

b=0

c=0

b≠0

c≠0

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

277 of 303

277

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

278 of 303

278

Algorithme Eq_Second_Degré

Réel a, b, c , Delta

Début

Ecrire ("Donner les coefficients : ")

Lire(a,b,c)

Si (a = 0) alors

Si (b = 0) alors

Si (c = 0) alors

Ecrire ("Infinités de solutions")

Sinon

Ecrire ("Pas de solutions")

FSi

Sinon

Ecrire ("Equation de 1er degré, une racine réelle : ",-c/b)

FSi

Sinon

Delta b*b –4*a*c

Si (Delta = 0) Alors

Ecrire ("Une racine réelle double : " , -b/(2*a))

Sinon

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

279 of 303

279

Si (Delta > 0) Alors

Ecrire("Deux racines réelles :  x1 = ", (-b + racine(Delta)) /(2*a) , " x2 = ", (-b + racine(Delta)) /(2*a) )

Sinon

Ecrire("Pas de solutions réelles ")

FSi

FSi

FSi

Fin

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

280 of 303

280

\f

Saut de page

\n

Saut de ligne

\r

Retour chariot

\t

Tabulation horizontale

\v

Tabulation verticale

\ \

\

\"

"

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

281 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

281

282 of 303

282

Algorithme somme2

Variables som, i : entier

Debut

som ← 0

i ← 1

TantQue (som <=100)

     som ← som + i

i ← i+1

FinTantQue

Ecrire ("La valeur cherchée est N= ",i-1)

Fin

#include<stdio.h>

main ()

{

Int i,som ;

som=0;

i=0 ;

while (som <=100)

{ som = som + i ;

i = i+1 ;}

Printf ("La valeur cherchée est N=%d ",i-1);

}

Exercice :

Algorithme :

Langage C :

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

283 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

283

284 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

284

285 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

285

Algorithme

Selon que identificateur vaut

Valeur 1 faire Instructions 1

Valeur 2 faire Instructions 2

 

Valeur n faire Instructions n

Autrement que Instructions n+1

Finselon

Langage C

Switch (Expression)

{ case n1 : action 1;

break;

case n2 : action 2;

break;

case n3 : action 3;

break;

 

default : action n;

}

Algorithme jour_de_travail

Variable jour : chaine de caractères

Debut

Lire (jour)

Selon que jour vaut

Lundi Mardi Mercredi jeudi Vendredi faire Ecrire ("c’est un jour de travail")

Samedi Dimanche faire Ecrire ("c’est weekend")

Autrement que Ecrire ("Le nom du jour invalide")

Finselon

Fin

286 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

286

Opérateurs

Signification

Représentation algorithmique

Exemple

=

égal

=

A=B

Différent de…

<>

A<>B

<

Strictement plus petit que…

<

A<B

>

Strictement plus grand que…

>

A>B

plus petit ou égal à…

<=

A<=B

plus grand ou égal à…

>=

A>=B

Par convention, l’algorithme note certains opérateurs de comparaison différemment :

Remarques :

287 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

287

Opérateurs

Signification

Représentation algorithmique

Exemple

Représentation Langage C

Exemple

=

égal

=

A=B

= =

A= =B

Différent de…

<>

A<>B

!=

A!=B

<

Strictement plus petit que…

<

A<B

<

A<B

>

Strictement plus grand que…

>

A>B

>

A>B

plus petit ou égal à…

<=

A<=B

<=

A<=B

plus grand ou égal à…

>=

A>=B

>=

A>=B

288 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

288

Exemple de langages  :

  • Deux types de langages :
  • Langages procéduraux ;
  • Langages orientés objets.
  • Fortran, Cobol, Pascal, C, … ;
  • C++, Java, ….

289 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

289

LANGAGE DE PROGRAMMATION

I) Définitions :

Un langage de programmation est un langage informatique composé d’un ensemble d’instructions pouvant être traduites et exécutées par un ordinateur.

Exemple :

Basic, Pascal, COBOL, Fortaran, C, C++, LOGO,…

1) Définition d’un langage de programmation :

2) Définition d’un programme :

Un programme est une suite ordonnée d’instructions, compréhensibles par l’ordinateur, appliqué à des données afin d’obtenir des résultats.

290 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

290

1) L’identificateur :

Un identificateur en langage C doit débuter par une lettre suivie par un nombre de lettres ou de chiffres.

x, max, val4

Exemples :

2) Les types de données :

  • Le type entier :

Le langage C distingue plusieurs types d’entiers tels que :

Type

Taille (Octet)

Plage de valeur

int

2

-231 à 231

unsigned int

2

0 à 232

long int

4

-263 à 263

II) Langage de programmation C :

291 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

291

int n ;

unsigned int n ;

long n ;

  • Le type réel :

En langage C les réels sont subdivisés en plusieurs types :

Déclaration :

Type

Taille (Octet)

Plage de valeur

float

4

-3.4 1038 à 3.4 1038

double

8

-1.7 10308 à 3.4 10308

long double

12

-3.4 104932 à 1.1 104932

float x ;

double x ;

long double x ;

Déclaration :

292 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

292

  • Le type caractère :

Ce type sert à manipuler les caractères.

char a ;

Déclaration :

  • Le type booléen :

Ce type prend la valeur 0 pour faux et une valeur différente de 0 (Exemple : 1) pour vrai.

bool p  ;

Déclaration :

Remarques :

Chaque déclaration est obligatoirement suivie d’un point virgule.

Un caractère

Chaîne de caractères

char d[10]  ;

293 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

293

3) Les instructions :

a) l’instruction d’entrée :

L’instruction de lecture est symbolisée par scanf, elle permet le transfert des données vers la mémoire centrale .

Syntaxe :

scanf("code d’entrée", adresse de l’identificateur) ;

Remarques :

Les codes d’entrée pour scanf sont :

Type

Format

Entier

%d

Entier non signé

%u

Entier long

%ld

Réel (Flottant)

%f

Réel double

%lf

Réel long double

%Lf

Caractère

%c

Chaîne de caractères

%s

294 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

294

Exemples :

  • Le type entier :

scanf("%d",&n) ;

scanf("%u",&n) ;

scanf("%ld",&n) ;

  • Le type réel :

scanf("%f",&x) ;

scanf("%lf",&x) ;

scanf("%Lf",&x) ;

  • Le type caractère :

scanf("%c",&c) ;

scanf("%s",ab) ;

295 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

295

b) l’instruction de sortie  :

L’écriture se fait de façon semblable que la lecture à l’aide de l’instruction printf.

Syntaxe :

printf("code de sortie", l’identificateur) ;

Remarque :

Les codes d’entrée pour scanf deviennent les codes d’affichage pour printf.

Exemples :

  • Le type entier :

printf ("%d",n) ;

  • Le type réel :
  • Le type caractère :

printf ("%u",n) ;

printf ("%ld",n) ;

printf ("%f",x) ;

printf ("%lf",x) ;

printf ("%Lf",x) ;

printf ("%c",a) ;

printf ("%s",ab) ;

296 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

296

Important :

Au début d’un programme utilisant les fonctions d’affichage et de saisie il est nécessaire d’écrire # include <stdio.h>, car toutes les fonctions sont déclarées dans ce fichier d’en-tête.

c) l’instruction d’affectation  :

Cette instruction permet de mettre une valeur dans une variable. Le symbole de l’affectation est =

Syntaxe :

variable = valeur ;

Remarques :

  • Toute instruction doit être suivie d’un point virgule « ; » ;
  • printf permet d’afficher un texte qui doit être entre double cotte.

297 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

297

d) les instructions conditionnelles  :

      • Instruction conditionnelle simple (choix unaire) :

Syntaxe :

if (condition) Instruction;

      • Instruction conditionnelle complète (choix binaire) :

Syntaxe :

if (condition)

InstructionA;

else

InstructionB;

298 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

298

      • Instruction conditionnelle imbriquée :

Syntaxe :

if (condition1)

if (condition2)

InstructionA;

else

InstructionB;

else

if (condition3)

InstructionC;

      • Instruction de choix multiple:

Syntaxe :

Switch (Expression)

{ case n1 : action 1;

break;

case n2 : action 2;

break;

case n3 : action 3;

break;

 

default : action n;

}

299 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

299

Si un bloc contient plus qu’une instruction, il doit être délimité par les accolades « {} ».

Remarque :

Opérateurs

Signification

Représentation en langage C

Exemple

=

égal

= =

A= =B

Différent de…

!=

A!=B

<

Strictement plus petit que…

<

A<B

>

Strictement plus grand que…

>

A>B

plus petit ou égal à…

<=

A<=B

plus grand ou égal à…

>=

A>=B

300 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

300

3) Format simple d’un programme en C :

  •  
  •  
  •  
  •  

301 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

301

  • Programme (langage C)  :

/*Programme Temperature_eau*/

#include <stdio.h>

main()

{

int Temperature ;

printf("Entrez la température de l’eau :") ;

scanf("%d",&Temperature) ;

if(Temperature<=0)

printf("C’est de la glace") ;

else

if(Temperature<=100)

printf("C’est du liquide") ;

else

printf("C’est du vapeur") ;

}

Algorithme Temperature_eau

Variable Temperature : Entier

Debut

Ecrire ("Entrez la température de l’eau :")

Lire (Temperature)

Si (Temperature<=0) Alors

Ecrire ("C’est de la glace")

Sinon

Si (Temperature<=100) Alors

Ecrire ("C’est du liquide")

Sinon

Ecrire ("C’est du vapeur")

Finsi

Finsi

Fin

302 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

302

303 of 303

*

Ingénierie numérique et simulation-MPSI/TSI/PCSI

303

Type

Format

Entier

int

%d

Entier non signé

unsigned int

%u

Entier long

long

%ld

Entier long non signé

unsigned long

%lu

Réel (Flottant)

float

%f ou %e

Réel double

double

%lf ou %le

Réel long double

Long double

%Lf

Caractère

char

%c

Chaîne de caractères

char

%s