Cours - Informatique II
Cours - Informatique II
Informatique II
2023-2024
Présentation
du module
Objectif
les compétences à acquérir visées par ce module sont :
• Organisations:
• Cours
• TDs
• TPs
4
Présentation du module
• Notes
• Examen: 70%
• TPs: 30 %
5
Introduction
C’est quoi un algorithme?
Pour résoudre un problème informatique, on crée un programme.
7
Algorithme vis-à-vis langages de
programmation
Donc, l’algorithme:
- est une suite des instructions ordonnées pour résoudre un
problème
8
Représentation
• Organigramme
• Pseudo-code
9
Représentation
En tête
Nom programme
Déclaration
Programme
Constantes
principale
Variables
Sous programme
Corps du programme
Lecture/Ecriture
Affectation
Structures de contrôle
Appel du sous programme
10
01
Résolution d'un
problème
algorithmique
Résolution de problème
Compréhension de
problème
Analyse
Conception
Résolution
Optimisation
12
Résolution de problème
Compréhension de Problème
Formulation et reformulation du texte qui décrit le problème à
résoudre
Analyse
Données en entrée
Résultat attendu
Traitement
Conception
- décomposition du problème en sous problème (Top down design)
- spécification du problème ou de chaque sous-problème
Représentation
- algorithme logique du problème ou de chaque sous problème
- algorithme de programmation du problème
13
14
15
Structure d’un algorithme
Début
Lire rayon
Calculer surface
PI*rayon*rayon
Calculer circonférence
PI*2*rayon
Fin 16
Résolution de problème
Compréhension de
problème
Analyse
Conception
Résolution
Optimisation
17
Conception: Décomposer pour
simplifier
18
Résolution d’un problème
Problème
Formulation et reformulation du texte qui décrit le problème à
résoudre
Analyse
Données en entrée
Résultat attendu
Traitement
Conception: Décomposer pour simplifier
- décomposition du problème en sous problème
- spécification du problème ou de chaque sous-problème
Représentation
- algorithme logique du problème ou de chaque sous problème
- algorithme de programmation du problème
19
Top down design technique:
Problème complexe
Sous problème 1 Sous problème 2
A2 = A1 + 2πr²
=> A2 = 2πr x h + 2πr²
=> A2 = 2πr (h + r)
21
Top down design technique
• Calculer la surface totale d’un cylindre
22
Top down design technique
23
Top down design technique
• Cette décomposition permet:
24
25
26
DÉPARTEMENT MATH ET INFORMATIQUE
Informatique II
2023-2024
Exemple
• Calculer la surface totale d’un cylindre.
• 1- comprendre le problème:
A2 = A1 + 2πr²
=> A2 = 2πr x h + 2πr²
=> A2 = 2πr (h + r)
28
Structure d’un algorithme
algorithme cylindre
Variables:
Déclarations des
A1,A2,A3,r,h: réel variables
Début :
Ecrire (‘saisir rayon’)
Lire (r ) Le corps de
Ecrire (‘saisir hauteur’) l’algorithme
Lire (h ) (Instructions)
A1Surface (r)
A2Circonférence ( r )
A3 2*A1+h*A2
Ecrire (“ la surface d’un cylindre est:”, A3)
Fin
29
Fonctions
et
procédures
Fonctions
Numérique et
procédures
Fonctions et procédures
32
• Solution ?
33
Top down design technique:
Problème
Sous problème 1 Sous problème 2
35
Top down design technique
• Cette décomposition permet:
36
Algorithme et sous algorithmes
Déclaration
Séquences Appel
Sous programme d’instructions
(traitement )
Donnée de sortie
(paramètres)
38
Algorithme et sous algorithmes
En tête
Nom programme
Déclaration
Programme
Constantes
principale
Variables
(Appelant)
Sous programme
Corps du programme
Lecture/Ecriture
Affectation
Structures de contrôle
Appel du sous programme
39
Algorithme et sous algorithmes
En tête
Déclaration
Constantes
Variables
Sous
Sous programme un sous-algorithme peut en
Programme appeler un autre.
Corps du programme
Lecture/Ecriture
Affectation
Structures de contrôle
Appel du sous programme 40
L’appel des sous algorithmes
algorithme cercle
Variables:
r: réel
Début :
Lire (r) Surface (a)
2) exécution
Constante:
Surface (r) PI=3,14
Début
Circonférence (r) Ecrire (la surface est: ‘, PI*a*a)
Fin Fin
Circonférence (a)
Constante:
PI=3,14
Début
Ecrire (la circonférence est: ‘, PI*2*a)
La syntaxe des sous problèmes est donnée à titre
Fin
explicatif , on détaillera dans la suite du cours
l’écriture exacte d’un sous algorithme.
41
L’appel des sous algorithmes
• Un sous algorithme est obligatoirement caractérisé par un
nom (un identifiant) unique.
42
Fonctions et procédures:
paramètres et arguments
43
Fonctions et procédures:
paramètres et arguments
Programme appelant Paramètres
effectifs
algorithme cercle
Variables:
Rayon: réel
Début :
Ecrire (‘saisir rayon’)
Lire (Rayon )
Paramètres
Surface (Rayon) formels
Circonférence (Rayon )
Fin
Circonférence (a)
Constante:
PI=3,14
Début
Ecrire (la circonférence est: ‘, PI*2*a)
Fin
44
Fonctions et procédures:
paramètres et arguments
45
Fonctions et procédures: paramètres formels
47
L’appel des sous algorithmes
algorithme cercle
Surface (a)
Variables: Constante:
r: réel Début
PI=3,14
48
Types de sous-algorithme
• En algorithmique il existe deux types de sous-
programmes :
– Les fonctions,
– Les procédures.
49
Procédure
Une procédure est introduite par un en-tête, appelé
aussi signature ou prototype, qui spécifie :
– le nom de la procédure,
– les paramètres donnés et leur type,
La liste des paramètres peut contenir (optionnel)
le mode de passage de chaque paramètre (E, S, E/S).
50
Procédure
51
Procédure
Procèdure nomProcédure (paramètre1: type1, paramètre:
type 2,…)
Variable
Variable 1: type1
Variable 2 : type2
…..
Debut
Traitement voulu
Fin
52
Programme appelant
algorithme cercle
Variables:
r: réel
Début :
Ecrire (‘saisir rayon’)
Lire (r ) Appel de la procédure
Surface (r) Paramètre effectif
Circonférence ( r )
Fin
53
Procédure rappelant une autre en
python
# donne le tableau de multiplication#
def tableau_de_multplication():
print("tableau de 7:")
for i in range(11):
p=7*i
print("7*",i,"=",p)
def triple_tableau_de_multplication():
for i in range(3):
tableau_de_multplication()
#Programme appelant#
triple_tableau_de_multplication()
54
Procédure avec un seul paramètre en
python
def tableau_de_multplication(n):
""" donne le tableau de multiplication"""
print("tableau de",n,"est:")
for i in range(11):
p=n*i
print(n,"*",i,"=",p)
def triple_tableau_de_multplication(n):
for i in range(3):
tableau_de_multplication(n)
#Programme appelant#
triple_tableau_de_multplication(7)
55
Procédure avec un seul paramètre en
python
def mult(m):
n=0
print("tableau de",m,":")
while n<11:
p=m*n
print(m,"*",n,"=",p)
n=n+1
#Programme appelant#
mult(3)
56
Procédure:
Utilisation d’une variable comme
def tableau_de_multplication(n): argument
""" donne le tableau de multiplication"""
print("tableau de",n,"est:")
for i in range(11):
p=n*i
print(n,"*",i,"=",p)
def triple_tableau_de_multplication(n):
for i in range(3):
tableau_de_multplication(n)
#Programme appelant#
def mult(n,m,s):
#Programme appelant#
mult(3,5,12)
58
Procédure avec plusieurs paramètres
def tableau_de_multplication(n,m):
""" donne le tableau de multiplication"""
print("tableau de",n,"est:")
for i in range(11):
p=n*i
if p%m==0:
print(n,"*",i,"=",p)
print("le rste de la division de",p,"par",m, "est nul")
else:
print(n,"*",i,"=",p)
print("le rste de la division de" ,p,"par",m, "n'est pas nul")
#Programme appelant#
tableau_de_multplication(3,2)
59
DÉPARTEMENT MATH ET
INFORMATIQUE
Informatique II
2023-2024
Fonctions
Numérique et
procédures
3
Fonctions en python
#Programme appelant#
y=cube()
print(y)
5
#Programme appelant#
y=cube(3)
print(y)
6
def volumes_sphere(r):
return 4*3.14*cube(r)/3
# proggramme principal#
a=int(input("la valeur du rayon r est: "))
print("le volume de la sphere de rayon",a,"est:"
, volumes_sphere(a))
7
Fonctions
Tableau de multiplication(return une liste)
def tableau_de_multplication(n): # n: parametre#
""" donne le tableau de multiplication"""
print("tableau de",n,"est:")
R=[]
for i in range(11):
p=n*i # p,n,i: variable locales#
R=R+[p]
return R
#programme principal#
a=int(input(" le tableau du valeur :"))# a:variable globale#
y=tableau_de_multplication(a) # a:argument de la fonction#
print(y)
print(y[3])
print(y[3:])
print(y[:3])
print(y[3:7])
8
#Fonction cube
def cube(x):
return x**3
#Programme appelant#
y=int(input("entrer une valeur :"))
print("le cube de",y,"est :",cube(y))
11
Variables
Variables
13
Algorithme Variable_globale_locale
Variables:
a, x: entier
fonction F (b:entier)
Variables:
c: entier Portée de la
Début variable
locale b
c b+10 Portée de la
yc*x variable
locale c
Portée de la
variable
retourner (y) globale x
Fin
Début
x5
a5
aF(a)
Ecrire (‘x=‘, x)
Fin
16
Algorithme Variable_globale_locale
Variables:
a, x: entier
fonction F (b:entier):entier
Variables:
y: entier Variable Variable
Début algorithme fonction
x b+10
yb*x a x b y
retourner (y) 5 3
Fin 5
Début
x3 15
a5 75
aF(a)
75
Ecrire (‘x=‘, x)
Fin
Affichage: x=15
17
x= 5 x=3 Erreur
18
Variable locale
• Une variable locale est une variable déclarée a
l’intérieur d’une fonction :
▫ Par défaut, elles sont visibles uniquement a
l’intérieur de la fonction dans laquelle elles sont
déclarées ;
▫ A la sortie de la fonction, les variables locales sont
détruites et leur valeur perdues.
20
Variable globale
• Avantages:
si plusieurs fonctions d'un programme ont besoin du même
ensemble de variables. Ce serait alors trop encombrant de passer
toutes les variables comme paramètres d'une fonction à l'autre.
• Inconvénient:
• mémoire saturée
• Des sous programmes qui dépendent du programme principale
Variables
• La manière de distinguer la déclaration des variables
locales et globales diffère selon le langage.
python python
Affichage: Affichage:
x= 5 Erreur
23
En python
Fonction en python
3. Fonction avec chaine de caractère en python :
Les chaînes de caractères constituent un type de donnée composite. Nous entendons par là une
entité bien définie qui est faite elle-même d’un ensemble d’entités plus petites, en
l’occurrence : les caractères.
Les chaînes de caractères font partie d’une catégorie d’objets Python que l’on appelle des
séquences. On peut effectuer sur les séquences tout un ensemble d’opérations. Vous en
connaissez déjà quelques unes, et nous allons en décrire quelques autres dans les paragraphes
suivants.
ch=input(text) ouvre une fenêtre avec le texte text, et transforme toute saisie en
chaîne.
len(ch) revoie le nombre de caractères de la chaîne ch.
ch[ i ] renvoie le caractère d'indice i de la chaîne ch :
Il arrive très souvent que l’on doive traiter l’intégralité d’une chaîne caractère par caractère,
du premier jusqu’au dernier, pour effectuer à partir de chacun d’eux une opération
quelconque. Nous appellerons cette opération un parcours. En nous limitant aux outils Python
que nous connaissons déjà, nous pouvons envisager d’encoder un tel parcours à l’aide d’une
boucle, articulée sur le couple d’instructions for ... in ... :
def articulation(ch):
for i in range(len(ch)):
articulation(ch)
Exemple2 : Écrire une fonction qui prend en entrée une chaîne de caractères et un caractère, et
def f(ch,x):
Module : Algorithmique et Python
MIP/S2
n=0
for i in ch:
if x==i:
n=n+1
return n
1. Écrire un programme Python qui demande un mot à l’utilisateur puis qui l’écrit
à l’envers.
2. En utilisant la fonction précédente écrire une fonction palindrome pour savoir si
un mot est ou non un palindrome.
Exemple 5 :
On souhaite écrire une fonction anagramme(ch1,ch2)qui teste si le ch2 est un anagramme du
cht1.
Voici un exemple de structure que peu avoir votre programme :
On va d’abord créer une fonction occurrences qui renverra un tableau contenant le
nombre d’occurrences de toutes lettres. Pour ce faire :
1. On convertit la chaîne en minuscule.
2. On crée un tableau constitué de 26 zéros correspondant aux
occurrences de chaque lettre.
3. On parcourt la chaîne et on met à jour le tableau, c’est à dire par
exemple quand on rencontre un t on rajoute +1 à l’endroit
correspondant à t dans le tableau.
On pourra par exemple écrire quelque chose comme :
for lettre in chaine:
if 97<=ord(lettre)<=122:
tab [ord(lettre)-97]+=1
Numérique Récursivité
Notion de récursivité
2
Dans la vie de tous les jours :
3
En mathématiques
4
En informatique
Définition: On appelle récursive toute fonction ou procédure qui
s’appelle elle même.
Comment ?
5
Exemple : Calcul de la somme des N premiers naturels:
la fonction Addition (N)
6
Conception d’une solution récursive
7
Conception d’une solution récursive
• Etape 1: quel est l’entrée la plus simple possible pour la fonction, c’est-à-
dire le cas où la fonction peut nous donner une réponse explicite.
•
exemple: le cas de la fonction Addition (N):
N=1 on a un seul entier qui vaut 1 donc:
Addition (1)1
cas de base
8
Conception d’une solution récursive
N=1
1 1+2 1+2+3
1+2+3+4
9
Conception d’une solution récursive
• Etape 3: essayer de trouver la relation entre les
exemples Est-ce
les qu’on
pluspeut
grands avec les exemples
relier Addition(4) avec Addition (3)
petits
Est-ce qu’on peut relier Addition(3) avec Addition (2)
Est-ce qu’on peut relier Addition(2) avec Addition (1)
N=1 N=2 N=3 N=4
1+2
1+2+3
1+2+3+4
10
Conception d’une solution récursive
+
=
k
11
Addition (k) Addition (k-1)
Conception d’une solution récursive
Etape 5: combiner le modèle récursif avec le cas de base
1 Si N=1
Addition (2)
Addition (1)
2+Addition (1) 1
2+ =3 13
Cas d’arrêt
14
La condition d’arrêt
Comme dans le cas d’une boucle, il faut un cas d’arrêt où l’on ne fait pas
d’appel récursif.
procédure récursive(paramètres)
si TEST_D’ARRET alors
instructions du point d’arrêt
sinon
instructions récursive(paramètres changés) // appel récursif
15
La condition d’arrêt
Fonction Addition (N : entier) : entier
Début
Si (N = 1) Alors La condition d’arrêt
Retourne (1)
Sinon
Retourne (N + Addition(N - 1)) Appel récursif
Fin Si
Fin
16
Algorithme récursif
• Un algorithme est dit récursif quand sa mise en œuvre
utilise ce même algorithme.
Savoir exprimer le problème de taille n en
fonction du même problème de taille inférieur.
• Pour être validé, cet algorithme doit impérativement
vérifier les 2 contraintes de terminaison :
existence d’un ou plusieurs cas de base (condition d’arrêt)
où l’algorithme est directement effectif ;
assurance qu’il n’y aura qu’un nombre fini d’appels
récursifs avant de déboucher sur un cas de base. Cette
assurance est fournie par une variable de contrôle
17
Comment fonctionne la récursivité ?
Lorsqu'une fonction s'appelle
elle-même, cela crée une
séquence d'appels récursifs,
et chaque nouvel appel crée
une nouvelle instance de la
fonction, généralement avec
des paramètres différents.
l’exécution de chaque
fonction est imbriquée de
plus en plus profondément à
chaque appel.
18
Comment fonctionne la récursivité ?
Addition (5) Addition (4) Addition (3)
Addition (2)
Addition (1)
Comment la machine comprend et
gère ce concept d’imbrication
d'exécution de fonction ?
2+Addition (1) 1 Comment elle garde le bon ordre
d’exécution de tout ça ?
2+ ?= 19
Comment fonctionne la récursivité?
Notion de pile d’exécution
Définition (Pile d’exécution)
La Pile d’exécution du programme en cours est un
emplacement mémoire destiner à mémoriser les
paramètres, les variables locales ainsi que
l’adresse de retour de chaque fonction en cours
d’exécution.
20
Comment fonctionne la récursivité ?Notion de
pile d’exécution
21
Comment fonctionne la récursivité ?Notion de
pile d’exécution
22
Comment fonctionne la récursivité?
Notion de pile d’exécution
23
Evolution d’un appel récursif
Fonction Addition (3) : entier
Début
Si (N = 1) Alors
6
Retourne (1)
Sinon
Retourne (3 + Addition(2))
Fin Si
3
Fin
24
Evolution d’un appel récursif
Fonction Addition (N : entier) : entier
Si (N <= 1) Alors
Retourne (1)
Sinon
Retourne (N + Addition(N - 1))
Fin Si
Fin
Dépilement: Phase de la
Empilement: Phase de
remontée
descente
Addition(1) = 1
Addition(2)
Addition(2)
= 2+ Addition(1)
= 2+ 1
Addition(3)
Addition(3)
= 3 + =Addition(2)
3+ 3
Addition(4)
Addition(4)
= 4 + =Addition(3)
4+ 6
25
Evolution d’un appel récursif
Fonction Addition (N : entier) : entier
Si (N <= 1) Alors
Retourne (1)
Sinon
Retourne (N + Addition(N - 1))
Fin Si
Fin
26
Evolution d’un appel récursif
L’exécution d’un appel récursif passe par deux phases:
27
DÉPARTEMENT MATH ET
INFORMATIQUE
Informatique II
2023-2024
Numérique Récursivité
En mathématiques
3
Evolution d’un appel récursif
Fonction Addition (N : entier) : entier
def Addition(N):
Si (N == 1) Alors:
if N == 1:
Retourne 1
return 1
Sinon
else:
Retourne N + Addition(N - 1)
return N+Addition(N-1)
Fin Si
Fin
print(Addition(4))
Pour N = 4, calculons Addition(4)
Addition(4) = 4 + Addition(3) = 10
Addition(3) = 3 + Addition(2) =6
Addition(2) = 2 + Addition(1) =3
Addition(1) =1
4
Exercice
def puissance(x,n):
if n==0:
return 1
else:
return x*puissance(x,n-1)
Type de récursivité
6
Type de récursivité: récursivité terminale
7
Type de récursivité: récursivité
terminale
• Exemple: Algorithme reste de la division
A = Bq + r où (q, r) ∈ N2 et r < B
• Cas de base:
Si A < B alors le reste de la division
euclidienne c'est A
9
Type de récursivité: récursivité
terminale
• Exemple: Algorithme reste de la division
• A=13 et B=4
– A=A-B Reste =1
A=9 et B=4
A=5 et B=4
A=1 et B=4
Reste =1
10
Type de récursivité: récursivité
terminale
• Définition récursive de la fonction reste par
des équations:
• (1) reste(A, B) = A quand A < B
• (2) reste(A,B) = reste(A − B, B) quand A ≥ B
Fonction Rest (A : entier, B: entier) : entier
Debut
Si (A<B) Alors
Retourne (A)
Sinon
Retourne (Rest (A-B), B)
Fin Si
Fin 11
Type de récursivité: la récursivité terminale
Fonction Rest (A : entier, B: entier) : entier
Debut
Si (A<B) Alors
Retourne (A)
Sinon
Retourne (Rest (A-B), B)
Fin Si
Fin
calculons Rest(13,4)
Rest(13,4)
def Rest(A,B):
Rest(9,4) if A<B:
return A
Rest(5,4) else:
return Rest(A-B,B)
Rest(1,4) = 1
print(f(13,4))
12
Type de récursivité: récursivité terminale
13
Type de récursivité: la récursivité
non terminale
• Un module récursif est dit non terminal si le
résultat de l’appel récursif est utilisé pour
réaliser un traitement (en plus du retour du
module).
14
Evolution d’un appel récursif
Fonction Addition (N : entier) : entier
def Addition(N):
Si (N == 1) Alors:
if N == 1:
Retourne 1
return 1
Sinon
else:
Retourne N + Addition(N - 1)
return N+Addition(N-1)
Fin Si
Fin
print(Addition(4))
Pour N = 4, calculons Addition(4)
Addition(4) = 4 + Addition(3) = 10
Addition(3) = 3 + Addition(2) =6
Addition(2) = 2 + Addition(1) =3
Addition(1) =1
15
la récursivité non terminale récursivité terminale
Type de récursivité: la récursivité terminale
SI N=0 ALORS:
retourner S
Avantages:
• L’avantage principal de la récursivité est la
simplicité de programmation. Pour écrire un
programme récursif, il suffit de :
– trouver comment réduire le problème de taille n à
un ou plusieurs problèmes de taille plus petite;
– traduire simplement la relation trouvée;
– vérifier la terminaison de l’algorithme.
18
Avantages et inconvénients
• Les inconvénients sont :
19
Remarques
• A l’opposé de la récursion, l’itération utilise les
structures de contrôle répétitives comme
POUR, TANT QUE, REPETER JUSQU'À
20
Exemple : Calcul de la somme des N premiers naturels:
Algorithme itératif: Cette version est dite itérative car utilise une boucle pour
Exemple : Calcul de la somme des N premiers naturels:
Algorithme itératif: Cette version est dite itérative car utilise une boucle
22
Exemple : Calcul de la somme des N premiers naturels en python:
def f(n):
s=0
for i in range(1,n+1):
s=s+i
return s
print(f(4))
DÉPARTEMENT MATH ET
INFORMATIQUE
Informatique II
2023-2024
Récursivité :
EXEMPLES
Fonction puissance: récursive non
terminale
• Cas de base simple.
Début
Si (n=0)
retourne 1
Sinon
retourne puissance x*(n – 1,x)
Fin
3
Fonction puissance:
• Cas de base multiples.
Début
Si (n=0)
retourne 1
Si (n=1)
retourne x
Sinon
retourne puissance x*(n – 1,x)
Fin
4
Fonction puissance:
• Cas récursifs multiples.
5
Fonction puissance:
• Cas récursifs multiples.
Début
Si (n=0):
retourne 1
FinSi
y=puissance(n//2,x)
Si n%2==0:
retourne y*y
Sinon :
retourne x*y*y
FinSi
Fin
6
Fonction fibonacci: double récursion
la suite de Fibonacci, définie par :
fib(0) = 0 ;
fib(1) = 1 ;
fib (n) =
∀n ≥ 2 , fib(n) = fib(n − 1) + fib(n − 2) ;
C’est une définition récursive : chaque calcul de fib(n) génère 2 appels de fib(n) . Ce qui assure
la validité de cette définition est :
— la présence des cas de base qui ne générant pas d’appel récursif ;
— la certitude qu’il n’y aura qu’un nombre fini d’appels récursifs avant de
tomber sur un cas de base certitude qui est fournie par la variable n, qui décroît strictement
à chaque appel, et donc finit par valoir 0 ou 1.
7
Fonction fibonaccie: version
récursive
Version récursive
Si (n<=1) La condition
fib(0) = 0 ; d’arrêt
fib(1) = 1 ; retourne (n)
fib (n) = ∀n ≥ 2 , fib(n) = fib(n − 1) + fib(n − 2) ; Sinon
retourne (fib (n-1)+ fib(n – 2))
Appel récursif
Fin
8
Evolution de la pile d’appel pour fib(4)
9
Analyse de la fonction fibonacci
récursive
À la racine, vous calculez:
• fib (n) dépend de fib (n-1) et fib
(n-2)
• fib (n-1) dépend à nouveau de fib
(n-2) et de fib (n-3)
• fib (n-2) dépend à nouveau de fib
(n-3) et de fib (n-4)
des appels récursifs qui gaspillent
beaucoup de données dans le
calcul car on refait beaucoup de
fois les mêmes calculs.
10
Fonction f91(n) : Récursion imbriquée
11
Fonction f91(n) : Récursion imbriquée
n: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, . . .
a(n) : 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, . . .
b(n) : 0, 0, 1, 2, 2, 3, 4, 4, 5, 6, . …
13
Fonction : Récursion mutuelle.
def a(n):
if n==0:
return 1
else:
return n-b(a(n-1))
def b(n):
if n==0:
return 0
else:
return n-a(b(n-1))
14
Chaine de caractère Récursivité
Opérations sur les chaine de caractères
en python
Soit une chaine de caractères,
def long(ch):
if ch=="":
return 0
else: return 1+long(ch[1:])
print(long("sadiq"))
Opérations sur les chaine de caractères
Un mot est un palindrome si on peut le lire dans les deux sans de gauche à droite et
de droite à gauche.
Exemple : KAYAK est un palindrome.
def palindrome(ch):
if len(ch)==1 or len(ch)==0:
return True
if ch[0]==ch[-1]:
return palindrome(ch[1:len(ch)-1])
else:
return False
print(palindrome("amma"))
print(palindrome("kayak"))
Listes Récursivité
Opérations sur les listes
def f(L):
def f(n):
n=len(L)
if n==0:
if(n==0):
return [ ]
return(0)
else: return [n%2]+ f(n//2)
else:
return(L[0]*2**(n-1)+f(L[1:n]))
Les enregistrements et les
fichiers
Les enregistrements
3
Introduction
Introduction
Introduction
• La solution est d’utiliser 5 variables de type
tableau
Objet Type
N°apogée Tableau des entiers
Nom Tableau des chaines de
caractère
prenom Tableau des chaines de
caractère
Cin Tableau des chaines de
caractère
Filière Tableau des chaines de
caractère
6
Introduction
Définition et déclaration
• Définition: Un enregistrement est un type de
données défini par l’utilisateur et qui permet de
regrouper dans une même structure des données
de différents types.
Les variables de type structuré sont appelées enregistrements.
8
Définition et déclaration
Déclaration:
il faut déclarer un nouveau type, fondé sur
d’autres types existants. Après l’avoir défini, on
peut alors utiliser ce type structuré comme tout
autre type normal en déclarant une ou plusieurs
variables de ce type.
9
Définition et déclaration
Type structuré:
Etudiant
Variable d’enregistrement
E1: Etudiant
10
Définition et déclaration
La déclaration des types structurés se fait, dans les
algorithmes, avant la déclaration des variables.
11
Définition et déclaration
• Exemple :
Etudiant : enregistrement
code_apogee: entier
nom:chaine
prenom:chaine
CIN:chaine
Filiere: chaine
Fin enregistrement
12
Etudiant={
"code_apogee":0 ,
"nom":"" ,
"prenom":"",
"CIN":"",
"Filiere": "",
}
13
Définition et déclaration
• Une fois qu’on a défini un type structuré, on
peut déclarer des variables enregistrements
exactement de la même façon que l’on déclare
des variables d’un type primitif.
Syntaxe Exemple :
Nom Var : Nom Enregistrement E1 : Etudiant
14
Affectation
Consiste à affecter des valeurs aux différents
champs d’une variable enregistrement.
[Link] valeur
16
Lecture
Lire ([Link])
Écriture
Ecrire ([Link])
20
Enregistrements en algorithmique :
Cas particuliers
1. Un champ de type structuré : Un type
structuré peut être utilisé comme type pour
des champs d’un autre type structuré.
date={
"jour":0 ,
"mois":0,
"année":0,
}
Personne={
"nom":"" ,
« nationalité":"",
"date_Naissance":date,
}
26
date={
"jour":0 ,
"mois":0,
"année":0,
}
Personne={
"nom":"" ,
"nationalité":"",
"date_Naissance":date,
}
p1=Personne
p1["date_Naissance"]["année"]=input("Entrer l'année de naissance de la Personne 1 :")
print ("l'année de naissance de la Personne 1 :", p1["date_Naissance"]["année"])
DÉPARTEMENT MATH ET
INFORMATIQUE
Informatique II
2023-2024
Les enregistrements et les
fichiers
Les enregistrements
4
algo_structure_exo
Fournisseur: enregistrement
Code: entier
Raison_sociale: chaine
Num_tel: chaine
Fin enregistrement
Produit: enregistrement
Code: entier
Libellé: chaine
prix: réel
F:Fournisseur
Fin enregistrement
Variable P:produit
Début
Ecrire ( « donner les infos du produit »)
Lire (p.F.Num_Tel);
Ecrire (p.F.Num_Tel);
Fin
6
Fournisseur={
"Code": 0,
"Raison_sociale": "",
"Num_tel": "",
}
Produit={
"Code": 0,
"Libellé": "",
"prix": 0.0,
"F":Fournisseur,
}
p1=Produit
p1["F"]["Num_tel"]=input("Entrer le Num de tel de Fournisseur de Produit 1 :")
print ("le Num de tel de Fournisseur de Produit 1 :", p1["F"]["Num_tel"])
7
def fournisseur():
fournisseur={}
fournisseur["code"] = int(input("Entrez le code fournisseur: "))
fournisseur["Raison_sociale"] = input("Entrez Raison_sociale : ")
fournisseur["Num_tel"] = int(input("Entrez Num_tel: "))
return fournisseur
def saisir_produit(p):
p["code"] = int(input("Entrez le code de produit : "))
p["Libellé"] = input("Entrez Libellé: ")
p["prix"] = int(input("Entrez prix: "))
p["fournisseur"]=fournisseur()
p1={}
saisir_produit(p1)
print(p1)
print ("le Num de tel de Fournisseur de Produit 1 :", p1["fournisseur"]["Num_tel"])
8
Définition et déclaration
Type structuré:
Etudiant
def tableau():
tab=[]
for i in range(5):
x=float( input(f"Entrez la moyenne de module {i+1}: "))
[Link](x)
return tab
def date_naissance():
etu={}
etu["jour"] = input("Entrez le jour : ")
etu["mois"] = input("Entrez le mois : ")
etu["année"] = input("Entrez le année : ")
return etu
def saisir_etu(n):
tabl=[]
for i in range(n):
e={}
e["NE"] = int(input("Entrez le NE : "))
e["nom"] = input("Entrez nom: ")
e["prénom"] = input("Entrez prénom: ")
e["date naissance"]=date_naissance()
e["tableau_moy"]=tableau()
[Link](e)
return tabl
Objectif du chapitre :
Comprendre la notion de fichiers en informatique.
Manipuler des fichiers en Python pour lire, écrire et modifier des
données.
Stocker et récupérer des données structurées dans des fichiers.
.
Sur un support de mémoire de masse, il y a deux types de structures : les fichiers et les
répertoires (encore appelés dossiers) :
Un fichier est comme une feuille de papier sur laquelle vous écrivez et vous lisez des
données. Ces données peuvent être des chaînes de caractères, des données numériques,
des objets, etc... Naturellement, cette feuille peut être très longue si le fichier est
volumineux. Un fichier est caractérisé par son nom et par son extension : d’une façon
générale, il s’appelle :nom_fichier.extension.
Les extensions renseignent sur la nature du fichier et surtout sur le logiciel capable de
lire les données de ce fichier. Vous connaissez bien sûr un certain nombre
d’extensions : .doc (ou .docx) pour les fichiers Word, .jpg pour un fichier image ou
encore .py pour un fichier python.
Un répertoire aussi appelé dossier permet de regrouper plusieurs fichiers : c’est donc
comme une grande pochette dans laquelle on dépose les fichiers. Un répertoire peut
aussi contenir d’autres répertoires qui contiennent eux-même des fichiers et encore
d’autres répertoires...
Lorsqu’un dossier A contient un dossier B : on dit que B est un dossier fils de A (on
dit aussi que c’est un sous-répertoire de A) et que A est le dossier parent de B.
Dans un support de mémoire de masse, il y a toujours un répertoire qui contient tous les autres
répertoires et les fichiers présents sur le disque : on l’appelle le répertoire racine (ou, plus
simplement, la racine)
Par exemple, dans le système d’exploitation Windows, ce
répertoire racine a pour nom C : ou D : ou encore E : , F : ,
etc... (par exemple, le répertoire racine d’une clé USB
insérée dans l’ordinateur va couramment s’appeler E : , F :
ou G : ).
Ainsi, l’organisation des dossiers et fichier sur une support
de mémoire de masse a l’allure d’ un arbre , Voici ce à quoi
ressemble un arbre des dossiers et fichier pour le systèmes
d’exploitation Windows :
Tout part du répertoire racine. : C:\
De chaque répertoire ( Users\, Windows\) sont issues des branches qui aboutissent à
des sous-répertoires ( Admin\ , hpastor\, Documents\ )ou à des fichiers ([Link]).
Aucune branche ne part d’un fichier. C’est ce qu’on appelle une feuille de l’arbre.
Python. Le module os est fait pour cela (os =operating system c’est à dire système
d’exploitation).
Prenons un exemple : supposez que le répertoire de travail courant soit C :\Users\Mounir et
que vous avez créé un dossier nommé travail sur le Bureau de votre ordinateur, lui même
situé dans le dossier Mounir.
Vous pouvez écrire dans l’interpréteur ou dans votre fichier de programme les lignes
suivantes :
Remarque :
Windows utilise des anti-slash " \" comme caractère séparateur. Si vous voulez utiliser
la fonction [Link], il faut absolument mettre des double anti-slash " \\" dans le
chemin absolu et donc bien écrire "C :\\Users\\Mounir\\Desktop\\travail", sinon
Python ne comprend pas et génère une erreur de syntaxe.
Desktop est le nom du bureau dans le langage de la machine.
2. Lire et écrire du texte dans un fichier :
Nous allons commencer par nous intéresser à l’écriture et à la lecture d’un fichier texte. Ce
type de fichier ne contient qu’une suite de caractères, regroupés dans une seule chaîne de
caractères qui représente tout le texte.
Pour étudier cela , vous allez commencer par créer un dossier test que vous allez placer sur le
Bureau.
2.1. Ouvrir un fichier :
Pour commencer à lire ou à écrire dans un fichier, il faut d’abord l’ouvrir : cela se fait avec la
fonction open. par exemple pour ouvrir en écriture un fichier appelé [Link] dans le
répertoire de travail courant, avec un encodage utf-8 :
Open("[Link]", "w", encoding = "utf-8")
La fonction open qui prend trois paramètres :
Pour commencer, vous aller créer un fichier qui contient la chaîne de caractères : "ma
phrase". Voici l’exemple :
1. f = open( "[Link]","w", encoding = "utf-8")
2. ch =" ma phrase "
3. [Link](ch)
4. [Link]()
À la ligne 1 la fonction open crée un objet de la classe TextIOWrapper que nous récupérons
dans la variable f. À la ligne 3 nous utilisons la méthode write de f pour écrire la chaîne ch
dans le fichier. On finit le programme en fermant le fichier par la méthode close c’est à dire :
[Link]().
Vous pouvez aller voir dans le dossier test et vous constaterez que le fichier [Link] y a
bien été créé !
Nous allons maintenant lire le fichier que nous venons de créer. Pour cela, il faut commencer
par l’ouvrir en lecture grâce au paramètre "r", sans oublier d’indiquer à Python le type
d’encodage pour qu’il puisse s’y retrouver. Voici ce que cela donne :
Nous avons utilisé ici la méthode read de l’objet f : cette méthode renvoie tout le contenu du
fichier sous la forme d’une seule chaîne de caractères que nous stockons dans a. Nous
demandons ensuite d’afficher a à l’aide de la fonction print.
lorsque vous lisez un fichier au moyen de la méthode read, il y a un curseur qui se déplace
dans le fichier et se positionne après le dernier caractère lu. Un nouvel appel de read démarre
la lecture à partir de cette position. Si la position du curseur est à la fin du fichier (plus aucun
caractère à lire), read renvoie une chaîne vide.
Voila un exemple :
De même on peut ne lire que les N premiers caractères d’un fichier texte en passant N en
paramètre à read. Cela donne la syntaxe suivante :
La première lecture renvoie les 2 premiers caractères. La seconde lecture renvoie les 4
caractère suivants (le curseur s’est déplacé).
2.4. Écrire plusieurs lignes de texte dans un fichier :
Ecrivons une seconde phrase dans le fichier [Link]. Afin de ne pas l’effacer, nous
allons l’ouvrir dans le mode ’a’ (append) et y écrire : " ma seconde phrase".
1. #Écriture d’une seconde phrase
2. f = open( "[Link]","a", encoding = "utf-8")
3. ch =" ma seconde phrase "
4. [Link](ch)
5. [Link]()
6.
7. #On ouvre maintenant le fichier en lecture
8. f = open( "[Link]","r", encoding = "utf-8")
9. a =f .read()
[Link](a)
[Link]()
Le résultat : Les deux phrases ont été collées bout à bout, sans espace et sans saut de ligne !
Quand vous écrivez des instructions write les unes à la suite des autres, Python va venir coller
les chaînes de caractères bout à bout dans le fichier. Une instruction read renverra toute la
chaîne obtenue sans aucune séparation, ni aucun saut de ligne.
Si vous voulez quand même des séparations ou des sauts de lignes, il faudra les insérer :
Pour une séparation, vous tapez un espace " " en fin ou en début de chaîne ou encore
un caractère de tabulation "\t".
Pour imposer un saut de ligne, il faut taper le caractère saut de ligne "\n" à la fin de la
chaîne. Ce caractère est interprété par Python comme un saut de ligne.
Voila un exemple :
1. #Écriture d’une seconde phrase
2. f = open( "[Link]","w", encoding = "utf-8")
3. ch =" ma phrase\nma seconde phrase\nFin programme "
4. [Link](ch)
5. [Link]()
6.
7. #On ouvre maintenant le fichier en lecture
8. f = open( "[Link]","r", encoding = "utf-8")
9. a =f .read()
[Link](a)
[Link]()
Le résultat :
Informatique II
2023-2024
Fichiers
3
Introduction
Définition
• Définition:
Le type d‟accès c‟est la manière dont la machine va pouvoir
aller rechercher les informations contenues dans le fichier.
• On distingue :
▫ 1- L‟accès séquentiel
▫ 2- L‟accès direct (ou aléatoire)
7
1- L‟accès séquentiel :
• Dans le cas d‟un fichier texte: lecture de fichier ligne par ligne
(enregistrement par enregistrement).
1-Ouverture:
• Lors de l‟ouverture du fichier il faut préciser
pour quelle opération celui-ci sera utilisé:
Lecture, Ecriture ou Ajout.
• On indiquera aussi par un n° le buffer qui sera la
représentation du fichier en mémoire.
Syntaxe :
OUVRIR “NomFichier” sur numCanal : mode
Python :
fichier=open(" NomFichier ", "mode")
11
Python :
f=open(" [Link] ", " r")
Syntaxe :
LireFichier numCanal, nomVariable
Python :
a= [Link]()
16
Variables ch : chaine
Début
• EXEMPLE:
f=open("[Link]","w")
[Link]("bonjour\n"+"sadiq mounir\n")
[Link]()
f=open("[Link]","r")
a=[Link]()#line#lines
print(a)
a=[Link]()#line#lines
print(a)
[Link]()
19
Python :
ch="bonjour "
[Link](ch)
20
• EXEMPLE:
f=open("[Link]","w")
Ch1= "bonjour\n"
Ch2= "sadiq mounir\n"
[Link](Ch1 + Ch2)
[Link]()
f=open("[Link]","r")
a=[Link]()#line#lines
print(a)
a=[Link]()#line#lines
print(a)
[Link]()
22
Exercice :
def saisir():
n=int(input("donner le nombre de noms à saisir :"))
f=open("[Link]","w")
for i in range(n):
x=input(f"donner le {i+1}nom :")
[Link](x+"\n")
[Link]()
def afficher():
saisir()
f=open("[Link]","r")
a=[Link]()
print(a)
[Link]()
25
Algo_exercice
Variables:
nom: chaine
n: entier
Début
Lire (n)
Ouvrir „[Link]‟ sur 1: Ecriture // on peut utiliser aussi ajout
Pour i de 0 à n-1
Ecrire (« saisir nom »)
Lire (nom)
EcrireFichier 1,nom
Fin Pour
Fermer (1)
26
Algo_exercice
Variables:
nom: chaine
Début
Ouvrir „ [Link]‟ sur 1: Lecture
Tant que non EOF(1)
lireFichier 1,nom
Lecture (nom)
FinTantque
Fermer (1)
27
Algo_exercice
Variables:
Nom, ch: chaine
n: entier
Début
Lire (n)
Ouvrir „[Link]‟ sur 1: Lecture
Ouvrir „[Link]‟ sur 2: Ecritrure
Tant que non EOF(1)
LireFichier 1, nom
Si ch!=nom
EcrireFichier 2, nom
FinTantQue
Fermer (1)
Fermer (2)
Supprimer („[Link]‟)
Renommer („[Link]‟, „[Link]‟)
Fin
DÉPARTEMENT MATH ET
INFORMATIQUE
Informatique II
2023-2024
Analyse des
algorithmes et
complexité
3
Problématique
« Un bon algorithme est comme un
couteau tranchant, il fait exactement
ce que l’on attend de lui, avec un
minimum d’efforts. L’emploi d’un
mauvais algorithme pour résoudre un
problème revient à essayer de couper
un steak avec un tournevis : vous
finirez sans doute par obtenir un
résultat digeste, mais vous
accomplirez beaucoup plus d’efforts
que nécessaire, et le résultat aura peu
de chances d’être esthétiquement
satisfaisant»
Introduction à l’algorithmique. Dunod,
1994
La complexité intervient
alors pour étudier l’efficacité de
deux algorithmes correctes
répondant au même problème.
6
Complexité temporelle
• Complexité asymptotique
14
X=5
5 4 12 18 13 6 7 84 78 15
6 4 12 18 13 5 7 84 78 15
15 4 12 18 13 6 7 84 78 5
C) L’élément X figure dans le dernier élément ou bien n’existe pas dans le tableau:
notre algorithme exécutera le plus grand nombre d’opérations sur un jeu de données
de taille n.
Ce cas est appelé le pire cas
On s’intéresse, essentiellement, au pire cas c’est à dire le scenario durant lequel notre
algorithme recevra les données qui montreront ses pires performances.
17
Complexité:
• Définition: La complexité d’un algorithme est
une mesure de sa performance asymptotique
dans le pire cas.
le pire cas : évaluer le temps d’exécution pour une donnée d’entrée
de difficulté maximum
L'objectif n'est alors pas de connaître les variations intermédiaires mais de déterminer
le comportement stable, à l'infini du phénomène mesuré.
19
Complexité (théorique)
h(n)
f(n) est en O(h(n)) s’il existe un seuil à partir duquel la fonction f(.) est
toujours dominée par h(.), à une constante multiplicative fixée près.
n2
(1)
Pour calculer la complexité en
tant qu’approximation de la
fonction du temps, on utilise: la
n2 notation asymptotique
(1) grand-O
25
f1(n)+f2(n)+…..+fk(n)
- On s’intéresse à de grandes tailles qui tendent vers l’infini. Donc, seuls les termes
dominants de la formule de la complexité nous importent:
Propriétés
P1: la complexité d’une instruction élémentaire
(opération de base): Une instruction dont le temps
d’exécution est indépendant de la taille n des données tel que:
Opération arithmétique ou logique (+, *, /, -, et, ou, …)
Opération d’affectation (x 10)
Vérification d’une condition (x>10)
Opération d’entrée/sortie ( Lire/Ecrire)
Propriétés (suite)
P2: pour une constante O(k)=O(1)
Propriétés (suite)
• P6: la complexité d’une instruction conditionnelle
le temps d’exécution est déterminé aussi par la règle de la somme.
Propriétés (suite)
• P7: la complexité d’une boucle
▫ On multiplie la complexité du corps de la boucle par le nombre
d’itérations. Exemple pour la boucle la complexité se calcule comme
suit:
Propriétés (suite)
O(5n)
La complexité est:
O(5n)=O(n)
O(2n)
33
Récapitulation
Complexité (théorique)
O(1)
O(1)
O(1)
O(1)
Max {(O(1), O(1), O(1)}
=> O(1)
O(1)
O(1)
O(1)
O(1)
i n+1: O(1)
10 *O(2)=O(20)
O (1)
39
O(1)
O(1)
O(1)
i 0 : O(1)
O(1) n* O(2)= O(2n)
O(1)
O(1)
O(1) n*O(1)=
Max= O(1)
O(1) O(2n)
O(1)
40
matrice
La complexité de cet algorithme est:
Max( O(1), O(1), O(2 n2), O(2 n2))
O(2 n2 )=O(n2)
O(1)
O(1)
O(1)
i 0 : O(1) O(n*(2n+1))=
j0: O(1) O(2n2+n)=
O(2n)
O(1) O(2n2 )
O(1)
i 0 : O(1)
O(n*(2n+1))=
j0: O(1)
O(2 n2+n)=
Ecrire O(1) O(2n)
O(2n2 )