Professional Documents
Culture Documents
Définition
nom masculin (d'Al-Khârezmi, médecin arabe).
Suite de raisonnements ou d'opérations qui fournit la
solution de certains problèmes.
Objectifs
Un algorithme sert à transmettre un savoir faire.
Il décrit les étapes à suivre pour réaliser un travail.
Il permet d'expliciter clairement les idées de solution
d'un problème indépendamment d'un langage de
programmation.
L'utilisateur d'un algorithme n'aura qu'à suivre toutes
les instructions, dans l'ordre pour arriver au résultat
que doit donner l'algorithme.
1
Algorithme
Le "langage algorithmique" que nous utilisons est un
compromis entre un langage naturel et un langage de
programmation.
Il doit donc suivre des règles. Il est composé d'une entête et d'un
corps.
L'entête comprend :
début
cĸa+b
fin
Lexique :
a : entier ý
b : entier
c : entier
Les variables
Une variable est une entité qui contient une information, elle
possède :
un nom, on parle d¶identifiant
une valeur
ù
Opérateur, opérande et expression
Un R érateur est un symbole d¶opération qui permet d¶agir
sur des variables ou de faire des ³calculs´
]
Opérateur, opérande et expression
Exemple dans a + b :
a est l¶opérande gauche
+ est l¶opérateur
b est l¶opérande droite
a + b est appelé une expression
Non
Et
13
Les opérateurs booléens
Ou
Ou exclusif
1m
Les opérateurs booléens
1ý
Les opérateurs booléens
Distributivité des opérateurs et et ou
a ou (b et c) = (a ou b) et (a ou c)
a et (b ou c) = (a et b) ou (a et c)
Loi de Morgan
non (a ou b) = non a et non b
non (a et b) = non a ou non b 1
Les opérateurs sur les numériques
par exemple :
11 div ß vaut ý
11 mod ß vaut 1
1â
Les opérateurs sur les numériques
L¶opérateur d¶égalité :
C¶est l¶opérateur que l¶on retrouve chez tous les types
simples qui permet de savoir si les deux opérandes sont
égales
Il est représenté par le caractère =
Le résultat d'une expression contenant cet opérateur est un
booléen
écrire(liste d'expressions)
Nom : DécompSomme.
Rôle : Décomposition d'une somme
Données : la somme à décomposée.
Résultat : les nombres de billets et de pièces.
Principe : on commence par lire sur l'entrée standard l'entier qui représente la
somme d'argent et affecte la valeur à
une variable somme.
Pour obtenir la décomposition en nombre de billets
et de pièces de la somme d'argent, on procède par
ßý
divisions successives en conservant chaque fois le reste.
Les entrées / sorties
début
somme <- lire()
billet100 <- somme div 100
reste100 <- somme mod 100
billetý0 <- reste100 div ý0;
resteý0 <- reste100 mod ý0
billet10 <- resteý0 div 10
reste10 <- resteý0 mod 10
pieceß <- reste10 div ß
resteß <- reste10 mod ß
piece1 <- resteß
écrire (billet100, billetý0, billet10, pieceß, piece1)
ß
fin
Les entrées / sorties
Lexique
- somme : entier, la somme d'argent à décomposer
- billet100 : entier, le nombre de billets de 100 Euros
- billetý0 : entier, le nombre de billets de ý0 Euros
- billet10 : entier, le nombre de billets de 10 Euros
- pieceß : entier, le nombre de pièces de ß Euros
- piece1 : entier, le nombre de pièces de 1 Euro
- reste100 : entier, reste de la division entière de
somme par 100
- resteý0 : entier, reste de la division entière de
reste100 par ý0
- reste10 : entier, reste de la division entière de resteý0 ßâ
par 10
- resteß : entier, reste de la division entière de reste10 par ß
Instruction conditionnelle
L¶instruction si alors sinon permet de conditionner
l¶exécution d¶un algorithme à la valeur d¶une expression
booléenne. Syntaxe :
si
alRrs
j j j
sinRn
j j j
j
finsi ßù
Instruction conditionnelle
La deuxième partie de l¶instruction est optionnelle, on peut
avoir la syntaxe suivante :
si
alRrs
j j j
finsi
ß]
Instruction conditionnelle
Exemple
Nom : ValeurAbs
Rôle : Calcule la valeur absolue d¶un entier
Données : La valeur à calculer
Résultat : La valeur Absolue
Principe : Si valeur < 0, on la multiplie par -1
début
si valeur 0 alors
valeur absolue ĸ valeur
sinon
valeur absolue ĸ valeur * -1
finsi
fin
Lexique
30
- valeur : entier, la valeur à tester
- valeurabsolue : la valeur absolue
L'instruction cas
Lorsque l¶on doit comparer une même variable avec plusieurs
valeurs, comme par exemple :
si a=1 alRrs
faire une chose
sinRn
si a=ß alRrs
faire une autre chose
sinRn
si a=m alRrs
faire une autre chose
sinRn
...
finsi
finsi
finsi
31
On peut remplacer cette suite de si par l¶instruction cas
L'instruction cas
Sa syntaxe est :
cas R v vaut
v1 : action1
vß : actionß
...
: actionn
j: action autre
fincas
3ý
Répétitions inconditionnelles
Autre forme de la boucle Pour :
si condition
alors liste d'instructions
si condition
alors liste d'instructions
si condition
alors liste d'instructions 3ù
...
Les répétitions conditionnelles
Etant donné que la condition est évaluée avant l'exécution des
instructions à répéter, il est possible que celles-ci ne soient
jamais exécutées.
Exemple
début
écrire ("indiquez la largeur du rectangle :")
largeur <- lire()
tant que largeur < 1 faire
écrire ("erreur : indiquez une valeur strictement positive")
écrire ("indiquez la largeur du rectangle :")
largeur <- lire()
ftant
fin
m0
Lexique
- largeur : entier, largeur courante saisie
Les répétitions conditionnelles
Syntaxe de la boucle Répéter jusqu'à :
Répéter
liste d'instructions
jusqu'à condition
m1
Les répétitions conditionnelles
Nom : saisirLargeurRectangle
Rôle : Vérification validité largeur saisie
Données : La largeur
Résultat :
Principe : Tant que la largeur est < 1, on demande de resaisir la largeur
début
Répéter
écrire ("indiquez la largeur du rectangle :")
largeur <- lire()
si largeur < 1 alors
écrire ("erreur : indiquez une valeur strictement positive")
fin si
jusqu'à largeur >= 1
fin
Lexique mß
- largeur : entier, largeur courante saisie
Les répétitions conditionnelles
?
fonction longueur(ch:chaîne):entier
K
fonction sousChaîne(ch:chaîne, i:entier, l:entier):chaîne
$%
$% !
&
'
!
$%
! !"
$% "
$% !
!
( ) % )
%
)
%
)
Les tableaux
Lorsque les données sont nombreuses et de même type,
afin d'éviter de multiplier le nombre des variables, on les
regroupe dans un tableau
Syntaxe :
tableau type_des_éléments[borne_inf ... borne_sup]
0 1 ß 3 m ý â ù ]
mý ým 1 -ý ßß 13m m] 1ß ]0 -ß
Chacun des dix nombres du tableau est repéré par son rang,
appelé indice
x ĸ Tab[0]
Tab[] ĸ m3
mâ
Les tableaux
Dans l'exemple suivant, le programme initialise un à un tous les éléments
d'un tableau de n éléments :
InitTableau
début
pour i de 0 à n-1 faire
tab[i] ĸ 0
fpour
fin
Lexique :
- i : entier, indice d'itération
- n : entier, taille du tableau
- tab : tableau entier[0..n-1]
mù
Les tableaux
Les tableaux à deux dimensions ou matrices
0 1 ß 3 m ý
0 1ß ßù mm ß â ââ 3ß
1 ß3 3 ý1 11 3ù ým ßý
ß m3 ß1 ýý â ù3 m1 ]
Ce tableau a 3 lignes et â colonnes. Les éléments du tableau sont
repérés par leur numéro de ligne et leur numéro de colonne.
m]
Tab[1, m] = 3ù
Les tableaux
La variable T[L, C] s'appelle l'élément d'indice L et C du
tableau T.
T[0 T[0, T[0, T[0, T[0, m]
, 0] 1] ß] 3]
2 DécRm Rser
"...diviser chacune des difficultés que j¶examinerai en
autant de parties qu¶il se pourrait et qu¶il serait requis
pour les mieux résoudre." Descartes
3 CRmbiner
Résoudre le problème par combinaison d¶abstractions ý1
Les procédures et les fonctions
Par exemple, résoudre le problème suivant :
Ecrire un programme qui affiche en ordre croissant les notes
d¶une promotion suivies de la note la plus faible, de la note la
plus élevée et de la moyenne, revient à résoudre les problèmes
suivants :
- Remplir un tableau de naturels avec des notes saisies
par l¶utilisateur
- Afficher un tableau de naturels
- Trier un tableau de naturel en ordre croissant
- Trouver le plus petit naturel d¶un tableau
- Trouver le plus grand naturel d¶un tableau
- Calculer la moyenne d¶un tableau de naturels
ýß<
Les procédures et les fonctions
Chacun de ces sous-problèmes devient un nouveau problème à
résoudre.
(
-.#()
*
(
-.#/)
*
0
12
3
% *
)
4/53V/ .#(
-
-6
.#/
-
-!
*
3V
1
71&
4
#
-.#/ *
+
-.#( * *
4/53V/<
.#(5#/
.#(& 1/
ý3
.#/ #(#V5#/
=>#?5#/@!
& 1/;
3V
Passage de paramètre
Ò
Lorsque nous souhaitons que la valeur d¶une variable du programme appelant ne soit pas modifiée, elle devra alors être passée par valeur.
La procédure ou la fonction qui la manipule recevra cette valeur en entrée du programme mais il s¶agira de la copie en mémoire de la valeur de la variable
d¶origine. Dans notre pseudo, le passage par valeur est indiqué par le mot clé *
Ò
Lorsque nous utilisons le passage d¶une valeur par référence, nous indiquons non sa valeur mais la référence en mémoire de celle-ci. Ainsi, la procédure ou
fonction manipule donc le même espace de mémoire. Toute modification apportée à la variable manipulée par la fonction ou procédure touchera donc la
variable d¶origine. Attention donc au choix effectué lors de la transmission des paramètres à une procédure !
Dans notre pseudo, le passage par référence est indiqué par le mot clé *
ý3
Fonction
Vne
est une procédure dont le but est de déterminer une valeur et de la retourner au programme appelant.
Dans notre pseudo-langage, elle se déclare de la manière suivante :
.#(
-
-.#/
-
-!)
*
3V
/ V/&*
71&
i <-- valeur_absolue(i);
limite <-- valeur_absolue(-120);
ý3
Portée des variables
L¶introduction des fonctions et procédures nous permet d¶aborder un nouvel aspect de la programmation, celui de la portée des variables.
Lorsqu¶une variable est déclarée à l¶intérieur d¶une fonction ou procédure, elle est dite car elle n¶est accessible qu¶à l¶intérieur de la fonction ou de
la procédure et sa durée de vie se limite le plus souvent à celle-ci.
Ainsi, vous ne pouvez faire référence et manipuler une variable locale en dehors de la fonction ou de la procédure où a été déclarée celle-ci.
Par extension, une variable déclarée dans l¶entête du programme sera déclarée , car accessible depuis l¶ensemble du programme et sa durée de
vie, celle du temps d¶exécution du programme.
O
O O
O
O O
O
O
O
O
O
O O
ý3
Les fonctions récursives
Une fonction récursive est une fonction qui pour fournir un
résultat, s¶appelle elle-même un certain nombre de fois.
n!=1xßx3x«xn
ým
Les fonctions récursives
Une autre manière de voir les choses, serait de dire que :
n ! = n x (n-1) !
ýâ
Les fonctions récursives
Pour conclure sur la récursivité, trois remarques fondamentales.
- la programmation récursive, pour traiter certains
problèmes, peut être très économique, elle permet de faire
les choses correctement, en très peu de lignes de
programmation.
Le tri à bulle
C¶est un des algorithmes le plus connu. Bien qu¶il soit
rarement efficace en terme de temps de calcul, il est
néanmoins correcte.
1
Les algorithmes de tri
Le tri par sélection
m
Les algorithmes de tri
Le tri rapide (Quick Sort)
Ce tri est récursif. On cherche à trier une partie du
tableau, délimitée par les indices gauche et droite.
La recherche dichotomique
La recherche dichotomique recherche un élément dans un
tableau trié et retourne l¶indice d¶une occurrence de cet
élément.
On compare l¶élément cherché à celui qui se trouve au
milieu du tableau. Si l¶élément cherché est plus petit, on
continu la recherche dans la première moitié du tableau,
sinon dans la seconde moitié.
On recommence ce processus sur la moitié. On s¶arrête
lorsque l¶on a trouvé l¶élément, ou lorsque l¶intervalle de
recherche est nul.
ù
Les algorithmes de recherche
(
%
!V
0
&
* *
ù
Les algorithmes de recherche
ù
Les algorithmes de recherche
( )
- )
- )
-
)
= %@
-
)
G
- )
G
-
*)
*
- )
G
- )
%
*
ù
â
Dans de nombreux applications, on a besoin de regrouper plusieurs
données qui ne sont pas du même type dans une seule variable .
Mais le type différent .
Considéreront l¶exemple suivant :
Dans une banque . Chaque client est caractérisé par un ensemble de
renseignement : (nom.prénom.adresse.téléphone.n° de la carte
identité nationale.numéro de compte et solde)
Chacun de ces renseignements peut constituer une variable séparée.
Mais vu qu¶ils désignent tous un même client
Et que tous les clients possèdent les mêmes caractéristiques on peut
les regrouper dans un seul type qu'on appellera client et qui sera
constitué des composantes suivantes :
nom .Prénom.adresse.telephone.n° de carte identité nationale.n°
de compte et solde.
objet Type
*Client *Enregistrement
_ Nom _ chaine de caractères
_ Prénom _ chaine de caractères
_ Adresse _ chaine de caractères
_ Tel _ entiers
_ CIN _ chaines de caractères
_ N_cpt _ chaine de caractères
_ solde _ réels
Exemple:
Contenu de l¶enregistrement client
(« abidar », « rachida », « 25 sidi maarouf casa ». 064746912« jb306835 ».
« 000423580 ». 10000)
Rq:
Vn camp fait partie d¶un enregistrement, peut aussi être a son tour un
enregistrement .
L¶adresse du client peut aussi être un enregistrement qui regroupe un
numéro.rue.ville. dans ce cas on aura le schéma suivant
Objet Type
* Client * Enregistrement
_ Nom _chaine de caractère
_ Prénom _« »
_ adresse _enregistrement
*N° * entier
*Rue * chaine de caractères
*ville * chaine de caractères
_tel _ entier
_CIN _chaine de caractères
1_déclaration
1.1_syntaxe:
Type
identificateur_de_type = Enregistrement
champ1 = type 1;
champ n = type n;
fin enregistrement
Dans l¶exemple ci-dessous la déclaration sera faite de la manière
Suivante.
type
client = Enregistrement
nom : chaine de caractères ;
prénom : chaine de caractères ;
Adresse : enregistrement
n° : entier;
rue :chaine de caractères;
ville : chaine de caractères ;
fin enregistrement
tel : entier;
cin : chaine de caractères ;
n_cpt : chaine de caractères ;
solde : réel ;
fin enregistrement
Rq:
_ si plusieurs champs sont de même type,ils sont alors regroupés en les séparent par des virgules.
_lorsque il s¶agit d¶un enregistrement a l¶intérieur d¶un autre . La déclaration pourra se faire d¶une autre manière :
On définit d¶abord le type d¶enregistrement intérieur puis en l¶utilise après dans le type enregistrement général:
type
domicile = enregistrement
n° : entier ;
rue : chaine de caractères;
ville : chaines de caractères;
fin enregistrement
client = enregistrement
nom : chaine de caractères ;
prénom : chaine de caractères;
adresse : domicile;
tel : entier;
cin : chaine de caractères;
N_cpt : chaine de caractères ;
solde : réel ;
fin enregistrement
Vne fois le type client est déclaré, on peut l¶utiliser pour déclarer des variables
d¶enregistrement .
Exemple :
var
e : client ;
banque : tableau (1 1000) de client ;
candidat = enregistrement
Pour i = 1 à NE faire
S T[i].note_examen+S ;
FinPour
M S/NE ;
Pour i = 1 à NE faire
Pour j = i+1 à NE faire
Si T[i].note_examen < T[j].note_examen alors
Aux T [i].note_examen ;
T[i].note_examen < T[j].note_examen ;
T[j].note_examen aux ;
FINSI
Finpourj
Finpouri
Pour i = 1 à NE faire
Ecrire ( T [i].E) ;
Finpouri
Ecrire (" La note Maximal est : ",T[1].note_examen) ;
Ecrire (" La note minimal est :»,T[NE].note_examen) ;
Ecrire (" La Somme de notes est : ",S) ;
Ecrire (" La moyenne de la classe est : ",M) ;
Fin
Correction :
Algorithme : Entreprise
Type employé = enregistrement
Nom : Chaîne de caractère ;
Prénom : Chaîne de caractère ;
Mat..: Chaîne de caractère ;
Sb : réel ;
Sn : réel ;
Finenregistremment
Var
T=Tableau [1 ... 100] de employées ;
I = Entier ;
T,P : réels ;
Début
Pour i allant de 1 à 100 faire
Ecrire (" Entrez Le nom " ) ;
Lire (T[i].nom) ;
Ecrire (" Entrez Le prénom " ) ;
Lire (T[i]. prénom) ;
Ecrire (" Entrez La matricule " ) ;
Lire (T[i].mat) ;
Ecrire (" Entrez Le Salaire brute " ) ;
Lire (T[i].Sb) ;
FinPour
Pour i allant de 1 à 100 faire
Si T[i].Sb <= 500 alors
P T[i].Sb *0.20 ;
T[i].Sn <= T[i].Sb+P
Finsi
Si T[i].Sb > = 500 alors et T[i].Sb <= 3000 alors
T T[i].Sb*0.17 ;
P T[i].Sb*0.30 ;
T[i].Sn <= T[i].Sn-T+P ;
Finsi
Si T[i].Sb > = 3001 alors
T T[i].Sb*0.35 ;
P T[i].Sb*0.40 ;
T[i].Sn <= T[i].Sn-T+P ;
Finsi
FinPour
Pour i allant de 1 à 100 faire
Ecrire (" Le nom est : ",T[i].nom) ;
Ecrire (" Le prénom est : ",T[i].prénom) ;
Ecrire (" Le Matricule : ",T[i].mat) ;
Ecrire (" Le Salaire brute: ",T[i].Sb) ;
Ecrire (" Le Salaire net : ", T[i].Sn) ;
Finpour
Fin
Les Fichiers
V
ù
Les Fichiers
à
V
V
ù
Les Fichiers
m
V
V
ù
Les Fichiers
p!
ù
Les Fichiers
%!
ù
Les Fichiers
'
) *
+ * !
m , & -
'V
.
È
È
//
+È
//0
V
ù
Les Fichiers
'
) * * !
à
12
12 +12 * !
m , & -
à " (mV
3
4
.
12
4
12
4
+12
'V
.
12
5
12
///
+12
/0
ù
V à "
V
Les Fichiers
'
, -
) * * !
à
12
12 +12 * !
m , & -
È
à " (mV
È3
4
.
12
4
12
4
+12
'V
V
5 3 & -
V
5 3 & -
ù
+12È
3
V
) *
+ * !
m , & - /
p , $
-
' .
+
È .
3
3+
(V /
V
/
ù
Les Fichiers
+
à 5+
.
5
p
V
) 512 5
5
+
)
:
$
p , $
-
'
4
512
5
p , (
-
' 512&
V
m , & -
512&
(V 512
V
V
m , & -
'V
È
à " (mV
512&
È
512&
È
/
ù
512&È
///
È3
V à "
V
V
Les Fichiers
à
Vne ecole qui voudra gerer l¶ensemble des formateurs et modules enseigne dans celle-ci
Les modules de formation sont caracterise par nom-module(8 caracteres),masse horaire(3
caracteres).
Formateur caracterise par nom(10 caracteres) , cin(5cara) et salaire(8 cara)
1-créer les structures formateur et module
2-créer les deux fichiers textes a acces sequentiel « module.txt » et « formateur.txt »
3- dans le but de gérer les deux fichiers, on veut réaliser les traitements suivants :
Ajouter un module.
Supprimer un module.
ù
Les Fichiers
:
à V
+
V
à
+
;
<
$
nomod : chaine de caractere
Rpter
Ecrire ("----------------------- Menu ---------------------------")
Ecrire ("1- Ajouter module ")
Ecrire ("2- Modifier module ")
Ecrire ("3- Supprimer module ")
Ecrire ("4- trier formateur ")
Ecrire ("5- Quitter")
Ecrire ("-----------------------------------------------------------")
Ecrire ("Veuillez entrer votre choix :")
Lire (choix)
Cas choix
1 : ajout-module();Sortir cas
2 : crire ("Entrer le nom du module a modifier")
Lire(nomod)
modifier-module(nomod);Sortir cas
3 : crire ("Entrer le nom du module a modifier")
Lire(nomod);supprimer-module(nomod);Sortir cas
4 : trierformateur();Sortir cas
5 : crire ("Vous avez choisi de quitter le programme");Sortir cas
Sinon : crire ("Votre choix est incorrect. Veuillez choisir entre 1 et 5")
Sortir cas
Fin cas
Jusqu%A choix=5
Fin