Suport1 Algo LDA
Suport1 Algo LDA
Contents
Chapitre 1 Notions d’algorithmes .............................................................................................. 5
I. Généralités ...................................................................................................................... 5
II. Résolution de problème et structure d’un algorithme .......................................... 6
III. Le LDA (langage de description algorithmique) ................................................... 8
a. Définition ....................................................................................................................... 8
b. Syntaxe .......................................................................................................................... 8
c. Description des Ressources Données .......................................................................... 9
d. Quelques types .............................................................................................................. 9
e. Quelques primitives.................................................................................................... 11
f. Les structures de contrôles fondamentales .............................................................. 13
Chapitre 2 : Procédure et Fonction ........................................................................................... 19
I. Généralités .................................................................................................................. 19
II. Procédures ............................................................................................................... 19
a. Procédure sans paramètre ......................................................................................... 19
b. Procédure avec paramètres ....................................................................................... 20
III. Fonctions ................................................................................................................. 20
Chapitre 3 Types complémentaires ......................................................................................... 22
I. Le type simple construit par énumération ............................................................... 22
II. Les types simples construits par intervalle .......................................................... 22
I. Le type ensemble ........................................................................................................ 22
II. Le type string .......................................................................................................... 23
III. Le type Fichier ........................................................................................................ 24
Chapitre 4 Introduction à la récursivité et à la programmation récursive ................................ 26
I. Notion de récursivité .................................................................................................. 26
II. Récursivité des actions ........................................................................................... 28
1. Réalisation algorithmique ........................................................................................ 28
2. Visibilité des objets d’une procédure (ou fonction) ................................................. 29
3. Exemple de procédures récursives ........................................................................... 29
4. Programmation récursive ......................................................................................... 29
Chapitre 5 Initiation au langage et à la programmation en C ................................................... 32
I. Introduction ................................................................................................................ 32
I. Structure générale d’un programme ............................................................................. 33
II. Variables et identificateurs ........................................................................................... 33
III. Variable global, variable locale ................................................................................ 34
IV. Affectation, saisie, affichage .................................................................................... 34
VI. Les types classiques ................................................................................................. 35
2
VII. Type enregistrement ................................................................................................. 37
VIII. Procédures et fonction en C ..................................................................................... 37
3
Partie 1 : Initiation à la programmation
4
Chapitre 1 Notions d’algorithmes
I. Généralités
L’informatique a pour objet le traitement automatique de l’information considérée comme
support des connaissances du monde réel. Le traitement dont il est question ici se fait par un
ordinateur1 ou calculateur. Ce dernier ne peut effectuer des traitements sur des données que
parce qu’il reçoit de la part du (des) programmeur (s) des instructions (liste des actions à
exécuter) lui indiquant comment effectuer ces traitements. Ces instructions écrient en langage
machine (Pascal, langage C, etc.) sont d’abord décrites de façon claire (sans ambiguïtés) à l’aide
d’algorithmes. L’algorithme sert donc au (x) programmeur (s) à décomposer un problème en
sous-problèmes (problèmes plus simples) afin d’en faciliter la résolution. On pourrait le définir
comme l’énoncé d’une suite d’opérations permettant de donner la réponse à un problème. Voici
une autre définition est la suivante : « un algorithme est une procédure de calcul bien définie,
qui prend en entrée une valeur, ou un ensemble de valeurs, et qui produit en sortie, une valeur
ou un ensemble de valeurs ». Un algorithme est donc une séquence d’étapes de calcul
permettant de passer de la valeur d’entrée à la valeur de sortie.
Plus formellement, un algorithme A est une multi-application de l’ensemble des données en
entrées vers l’ensemble des données résultats tel que pour tout E données d’entrée et R résultat
d’un problème, 𝐴(𝐸) = 𝑅
La programmation consiste à se donner un E et un R et à fournir A (éventuellement exploitable
sur une machine donnée).
L’algorithme A est spécifié sur la base d’une décomposition en un nombre fini d’opérations
𝑂𝑘 , 𝑘 = 1, … , 𝑛 avec 𝐴 = 𝑂𝑛 ∘ 𝑂𝑛−1 ∘ … ∘ 𝑂1
𝐸1 = 𝐸
𝑂𝑘−1 (𝐸𝑘−1 ) = 𝐸𝑘 , 𝑘 = 2, … , 𝑛 − 1
𝑂𝑛 (𝐸𝑛 ) = 𝑅
L’état de sortie (ou prédicat de sortie) d’une opération est l’état d’entrée (prédicat d’entrée) de
l’opération suivante.
Une fois un algorithme d’un problème trouvé, il faut le transcrire dans un langage de
programmation (plus simple que le français dans sa syntaxe). L’algorithme transcrit en langage
de programmation est appelé code. Celui-ci est compiler (pour le rendre compréhensible par la
1
Machine automatique qui permet d’effectuer dans le cadre de la programmation des ensembles d’opérations
arithmétiques et logiques à des fins scientifiques, administratives ou comptable
5
machine) et exécuté par un compilateur (celui du langage : compilateur Pascal, compilateur C,
etc.) pour donner la réponse au problème.
Apprendre l’algorithmique, c’est apprendre à manier la structure logique des programmes.
Dans ce chapitre nous avons fait le tour de toutes les étapes importantes à la résolution d’un
problème avec un ordinateur. La figure suivante résume ces différentes étapes.
6
L’Enoncé du problème ou cahier des charges doit préciser les données en entrées au
problème, les besoins en traitement et les résultats souhaités. Ainsi, l’étape Enoncé-
programme va se décomposer en deux :
• Enoncé- algorithme : à ce niveau la question de l’analyse et de la conception d’une
solution informatique du problème spécifié par son énoncé est posée. Ce travail devra
aboutir à une description algorithmique de ce traitement que l’on appelle algorithme.
• Algorithme-programme : la question de l’obtention d’un programme (avec toutes les
préoccupations techniques qui sont légitimes) est ramenée à une phase de production
par traduction en un langage cible choisi
2. Moyen à mettre en œuvre pour passer d’une étape à l’autre
• Passage de l’algorithme au programme : C’est la transition qui doit être la plus facile
dans la mesure où l’algorithme est un automate décrivant rigoureusement la suite finie
des opérations permettant de faire passer les données d’un état d’entré à un état de
résultat : solution du problème demandé. Il s’agira essentiellement d’une réécriture de
l’algorithme dans un langage cible de programmation sur une machine cible. C’est une
phase qui doit être indépendante de toute l’activité d’analyse et de conception.
• Passage de l’énoncé à l’énoncé explicite : l’énoncé fournit une propriété générale du
résultat et ne permet pas toujours d’obtenir la solution algorithmique. En revanche
l’énoncé explicite doit spécifier le procédée de calcul permettant d’obtenir
l’algorithme. Il s’agit essentiellement d’une analyse de l’énoncé de manière à :
o Identifier les informations fondamentales manipulées (reconnaissance)
o Classer ces informations en entrée (hypothèse du problème), sortir (résultat ou
conclusion du problème) et de définir leur organisation (compréhension)
o Proposer une solution explicite des procédés de calcul et de mise en œuvre qui
permettent d’obtenir ces résultats (modélisation)
Les outils utilisés dans cette description dépendent évidemment de la nature du
problème. Ils peuvent être graphique, de type texte, algébrique, etc.
• Passage de l’énoncé explicite à l’algorithme : l’algorithme sera obtenu par réécriture
de l’énoncé explicite en incluant un ordre dans le procédé de traitement. Cela nécessite
un langage adapté à la reformulation que l’on appelle Langage de Description (ou
notation) Algorithmique ou LDA. Comme tout langage, ce langage se définit au mois
par deux ensembles : Un ensemble formé du vocabulaire général du lange et un autre
décrivant sa grammaire.
7
Nous allons développer ce dernier point.
a. Définition
b. Syntaxe
8
Pour construire des identificateurs pertinents, on pourra se référer aux indications suivantes :
• Choisir des identificateurs facilement prononçables
• Eviter les abréviations non courantes
• Choisir des constructions de préférences courtes et dans le cas des compositions de
mots utiliser un caractère de concaténation (comme le sous tiret _) pour marquer la
suite des sens véhiculés par l’identificateur. Exemple : bourse_etudiant_inphb
• Identifier distinctement les informations, chaque fois que cela est possible.
L’identificateur bourse_etudiant_inphb est plus évocateur que bourse.
Par ailleurs, le texte algorithmique est constitué de phrases logiques séparées par le point
virgule. Par conséquent, il n’y’a pas forcément une phrase par ligne (de notre feuille), seules
des considérations de lisibilité et de clarté peuvent nous amener à ne pas effectivement trop la
surcharger. Comme exemple, la première phrase de notre LDA présenté ci-dessus sous sa
forme générale est ALGORITHME identificateur ;
Toute données, quelle soit d’entrée ou de sortie ou intermédiaire de calcul, manipulée dans la
partie description des ressources d’un algorithme est caractérisée par la double indication de
Contenu
Contenan
t
son contenant, représenté par le nom de la donnée ou identificateur et son contenu, valeur de
la constante prise par la donnée.
Remarque
- Le contenu d’une donnée peut varier d’un instant à l’autre mais seul le dernier est
évidemment conservé et le contenant lui à priori ne change jamais.
- Une donnée est souvent appelée variable, ce qu’il faut accepter avec la description ci-
dessus (seules les contenus peuvent varier …)
d. Quelques types
Concernant les types, certains sont bien sûr prédéfinis, ce sont ceux qui seront considérés
comme de base et permettront par construction d’obtenir des types plus sophistiqués.
Dans la classification simplifiée des types on distingue les types simples dont les constantes
atomiques (constituées d’un seul tenant ou indécomposable) et les types organisés dont les
constantes sont composées d’autres constantes.
9
- Quelques types simples : les entiers relatifs, les nombres réels, les constantes logiques
et l’ensemble de tous les caractères du LDA sont désignés respectivement par les mots
clés ENTIER, REEL, LOGIQUE et CARACTERE.
Type Description Exemple
ENTIER est décrit en décimal signée, le On a les exemples suivants. 1969,
signe + pouvant être omis s’il est -56.
positif.
REEL Est aussi écrit en décimale signée 651.48, -5,07.
avec le point (ou la virgule) pour
séparer la partie entière de la partie
réelle
LOGIQUE est formé des deux constantes
VRAI et FAUX.
CARACTERES Représente l’ensemble de tous les On a les exemples suivants. ‘a’,
caractères (en d’autres termes son ‘A’, ‘1’
alphabet). Les constantes caractères
sont mises entre quotte.
- Le type organisé : On dit qu’une information est organisée ou structurée si elle est une
collection finie et dénombrable d’autres informations. Elle est alors dite composite et
chacune des informations qui la composent (ou composantes) peut être aussi structurée
de la même manière. Il apparait une ‘’récursivité’’ au niveau de la définition de l’objet
structuré du fait qu’il se définit par lui-même, la condition d’arrêt de reproduction de la
définition est qu’au dernier niveau les objets soient de types simples : entier, réel,
logique, etc.).
Le type TABLEAU est un cas particulier ou l’objet est une collection d’objets de même
type et en nombre fixe. Chaque élément du tableau est appelé composante et le domaine
de valeurs est le produit cartésien des domaines de valeurs de chaque composante.
La syntaxe de désignation du type est : TABLEAU[indice de début .. indice de fin] DE
type d’une composante. Indice de début et indice de fin sont des constantes d’un type
simple quelconque mais ordonné totalement. Ils permettront de fixer le nombre de
composantes et de pouvoir identifier chaque composante par un indice dont le contenu
est compris dans l’intervalle [indice de début ; indice de fin].
La syntaxe d’une description de ressources données est la suivante :
10
i, j : ENTIER ;
catégorie : CARACTERE ;
Dans le cadre de notre LDA, nous avons la possibilité d’identifier des types. Un intérêt
possible est le cas où une description de types est utilisée à plusieurs endroits de l’algorithme
(nous y reviendrons) mais aussi pour apporter de la clarté dans les descriptions de type
organisés :
Identificateur d’un type=type
Identificateur de type est le nom donné au type et type est la description du type. Comme
exemple, on a :
occupe=LOGIQUE ;
siege=occupe ;
compartiment=TABLEAU[1..6] DE siège ;
wagon=TABLEAU[1 .. 12] DE compartiment ;
train=TABLEAU[1 .. 10] DE wagon ;
untrain : train
Occupe, siège, compartiment, wagon et train sont des noms de type. Ils doivent servir de
descripteurs de données. Dans notre cas seul la donnée untrain est créée (instanciation) et
décrite comme de type train. L’accès à une composante se fait par l’intermédiaire d’une
variable de type simple correspondant au type de l’intervalle.
Ainsi si i, j, k : ENTIER ; est une déclaration alors untrain[i,j,k] est un logique indiquant l’état
d’occupation du siège k du compartiment J du wagon i du train.
e. Quelques primitives
Ce sont des facilités d’écriture qui permettent une action spécifique comme l’affectation, les
expressions arithmétiques et logiques et les entrées-sortie.
- L’affectation : le symbole utilisé est la flèche renversée ⟵. On a donc la syntaxe
suivante :
identificateur⟵ expression du même type.
11
opérateurs et des opérandes. Elle est évaluée de la gauche vers la droite en respectant
les ordres de priorité prédéfinis.
- Les expressions arithmétiques : les opérandes sont des données de type ENTIER ou
REEL, et les opérateurs concernés sont :
Opérateurs Noms
+ Addition
- Soustraction
* Multiplication
/ Division réelle
DIV Division entière
MOD Reste de la division
entière
L’ordre de priorité est le même qu’habituellement, c'est-à-dire dans décroissant :
Règle de priorité
() Le parenthésage pour forcer la priorité
∗ / mod div Même priorité
+- Même priorité
Comme exemple on a :
x1, x2 : ENTIER
I : LOGIQUE
L’action suivante est correcte L⟵ x1=x2
- Les ENTREE/SORTIE : les primitives d’entrée/sortie vont permettre d’assurer le
transfert de constantes entre l’algorithme et une unité périphérique quelconque. Pour
12
l’instant nous nous limiterons au cas où l’unité périphérique est l’écran-clavier.
En entrée le verbe utilisé est LIRE. Sa syntaxe est
LIRE(liste d’expression de type simple)
13
réalisés pour les mêmes contenus, il peut être intéressant de rendre l’algorithme plus
général en remplaçant les instructions d’initialisations par une instruction LIRE. Soit :
ALGORITHME identificateur ;
A, B, C, D : ENTIER;
{
LIRE(A,B) ;
C⟵A+B ; D⟵A-B ;
A⟵C+2*B ; B⟵C+B ;
C⟵A*B ; D⟵ B+D;
A⟵ D*C
ECRIRE(A,B,C,D)
}.
Cette organisation des traitements est une bonne structure de calcul : en effet chaque
fois qu’il est possible de rassembler toutes les initialisations au début, de terminer par
toutes les opérations d’affichage et entre les deux la partie calcul vous créez une
disposition qui peut apporter de la clarté et de la lisibilité à votre algorithme.
- L’alternative : Supposons qu’on ait deux actions : action1 et action2. On voudrait à
partir de l’évaluation d’une expression logique condition exécuter exclusivement l’une
ou l’autre. La syntaxe est :
SI (condition) ALORS action1 SINON action2
Une illustration est donnée par l’exemple qui suit.
SI (𝑥 <= 𝑦) ALORS
𝑥 ⟵𝑥+𝑦
SINON
𝑥 ⟵𝑥−𝑦
Une variante alternative au cas où action2 est vide, en d’autres termes, on voudrait juste
exécuter une action si une condition était réalisée. La syntaxe suivante est admise et
s’appelle la conditionnelle :
SI (condition) ALORS action1
Remarquons que, dans le cas où action1 ou action 2 est composé de plusieurs actions,
un problème de syntaxe peut se poser. Cependant, si nous avons besoin de faire
considérer syntaxiquement un groupe d’action comme une seule, cela peut être réalisée
14
par la primitive dite de blocage d’actions (on met toutes les actions concernées entre
accolade) :
SI (condition) ALORS
{ action11 ;
action12 ;
action13
}
SINON
{ action21 ;
action22
}
A pour effet d’exécuter action autant de fois que nécessaire et de ne s’arrêter que si
condition bascule à FAUX. Action peut n’être exécuté aucune fois (si dès le départ
condition est FAUX) ou plusieurs fois, ce qui implique que dans action des opérations
sont prévues pour faire basculer à un moment donné condition à FAUX sinon on aurait
un traitement infini ce qui n’est pas algorithmique. Une variante de l’itérative : LA
REPETITIVE : supposons qu’on veuille que action soit faite au moins une fois avant de
rentrer dans une itérative, situation qui est courante. On peut écrire :
Action ;
TANTQUE (condition) FAIRE action
Une syntaxe est prévue pour ce cas
REPETER
action
JUSQUA (condition)
Action est exécutée au moins une fois ensuite condition est évaluée. Si condition est
VRAI le processus est arrêté sinon l’itération est reprise. On remarquera que le sens
du test d’arrêt est contraire à celui de l’itérative et par construction action est faite au
moins une fois. Si action est composée de plusieurs il n’est pas utile de le bloquer
puisque REPETER JUSQUA joue déjà ce rôle : formellement il n’y’a pas
15
d’ambiguïté. Une caractéristique de ces deux ordres d’itération est qu’on ne connait
pas à priori le nombre de fois qu’i faut exécuter action. Lorsque ce nombre est connu,
on utilise la variante : BOUCLE :
POUR identificateur←expression initiale JUSQUA expression finale FAIRE action
Identificateur va jouer le rôle de compteur, il doit donc être d’un type simple énumérable
et ordonné, d’où pour le moment ENTIER, CARACTERES, et LOGIQUE ; traduisons
cette variante en utilisant TANT QUE avec la convention suivante succ(identificateur)
dépend du type de identificateur est la constante successeur dans l’ordre correspondant
au type de l’identificateur.
identificateur←expression initiale ;
TANTQUE (identificateur→expression finale) FAIRE
{ action ;
identificateur←succ(identificateur)
}
Début
a, b, c
𝐷 = 𝑏 2 − 4𝑎𝑐
NON
𝐷
>0
OUI
NON
𝐷
−𝑏 + ξ𝐷
=0 𝑥1 =
2𝑎
OUI
−𝑏
affiché pas solution 𝑥0 = −𝑏 − ξ𝐷
2𝑎 𝑥2 =
2𝑎
Affiché 𝑥0
Affiché 𝑥1 et 𝑥2
Fin
16
Application
Ecrire l’algorithme (en utilisant un organigramme) de la résolution d’un système linéaire de
deux équations à deux inconnues par la méthode de Cramer (ou des déterminant)
Pseudo-code
Notre pseudo-code pour la résolution de l’équation du second degré se présente sous la forme
d’une procédure appelé POLY2-SOLVE. Elle prend comme paramètre un tableau ….qui
contient les coefficients d’une équation du second degré à résoudre
- Analyse des données en entrées et sortie, méthode de résolution, écriture de
l’algorithme
- Traduction dans pseudo-code ou langage de description des algorithmique (LDA)
IV. Les langages de programmation
1. Le langage machine
Un ordinateur ne ‘’comprend’’ qu’un seul langage dit langage machine (de première
génération) que son unité de contrôle est capable d’analyser et d’exécuter. C’est le langage
qui se situe au niveau le plus bas et ses caractéristiques sont celles vue précédemment.
2. Le langage d’assemblage
Vue la complexité des langages machines, les constructeurs ont développé un autre type de
langage dit langage d’assemblage (deuxième génération) moins ésotérique et plus facile à
utiliser. Il est constitué de la manière suivante :
• Toute instruction machine est représentée par une et une seule instruction en langage
d’assemblage.
• Les codes opérations qui étaient binaires dans le langage machine deviennent
mnémonique, exemple : ADD au lieu du code binaire de l’addition
• Les adresse des opérandes ne sont plus gérer par leur valeur numérique mais par des
symboles qui les représentent qu’on appelle identificateurs.
Par exemple pour réaliser l’instruction 𝑋 = 𝐴 + 𝐵 on pourrait avoir : 𝐴𝐷𝐷 𝐴, 𝐵, 𝑋 ce qui est
plus parlant. Ce programme ne sera pas directement exécutable car il nécessite une phase de
traduction en langage machine. L’utilitaire chargé de cette traduction est appelé assembleur.
Programme Programme
en ASSEMBLEUR en
langage langage
d’assemblage d’assemblage
17
• Les langages de quatrième génération : environnement logiciel offrant des outils prêt à
l’emploi que l’on peut aisément utiliser pour concevoir une application, un projet, etc.
La programmation reste bien sûr algorithmique mais elle s’élève à des niveaux
d’abstraction plus proches des méthodes naturelles de résolution qu’un utilisateur
adopte face à un problème. Un programme n’est plus uniquement un processus
(composition d’instruction) permettant de faire passer les données (manipulées par ces
instructions) d’un état d’hypothèse (entrée) à un état de conclusion (résultat) mais plutôt
abstrait à être une collection d’objets (entité représentant une catégorie quelconque
d’informations caractérisé par son état (ses données) et son comportement (les
traitements spécifiques qu’elle peut réaliser) s’envoyant des messages (demande
d’informations) en vue d’amener le système à un état désiré.
EXERCICES
1. Calculer le salaire d’un fonctionnaire ou auxiliaire, sachant que s’il est fonctionnaire
il cotise 6% de son salaire de base pour sa retraite 2.75 % du salaire de base pour sa
protection sociale si son salaire est plus petit que le plafond fixé par l’organisme de
gestion de la protection sociale, dans le cas contraire il cotise pour 2.75% du même
plafond.
S’il est auxiliaire il ne cotise pas pour la retraite, par contre il cotise pour la
protection sociale au taux de 5% de son salaire de base si ce dernier est inférieur ou
égal au plafond sinon il cotise pour 6.75% du plafond augmenté de 1.5% de la
différence entre le salaire de base et le plafond.
2. Résoudre dans R une équation du second degré
3. Afficher dans l’ordre trois nombres entiers et distincts.
4. On considère un texte formé de caractères et terminé par un caractère unique : ‘#’, on
voudrait connaitre :
a. Le nombre de ‘a’
b. Le nombre de voyelle
c. Le nombre de ‘le’
d. Le nombre de mots
5. On considère la suite de FIBONACCI :
𝑢0 = 𝑢1 = 1
𝑢𝑛 = 𝑢𝑛−1 + 𝑢𝑛−2
Calculer la somme des q premiers termes.
La structure d’un algorithme comporte 3 étapes : la présentation du traitement, le
traitement et l’édition des résultats.
6. Ecrire un algorithme qui détermine tous les couples (𝑚; 𝑛) avec 1 ≤ 𝑚, 𝑛 ≤ 2014 et
vérifiant la relation (𝑛2 + 𝑚𝑛 − 𝑚2 )2 = 1
18
Chapitre 2 : Procédure et Fonction
I. Généralités
Si un problème apparait difficile, il faut éviter la recherche directe de la solution ce qui
amènerait à penser à plusieurs choses à la fois et à rentrer trop vite dans le détail des actions.
Bien au contraire il s’agit :
1. D’apprécier le problème dans sa totalité ensuite de le morceler (… de le décomposer,
de le factoriser ou de le raffiner) en des sous-problèmes maitrisables (représentent une
fonction du problème analysé) et indépendants (chacun doit représenter une difficulté
dans la résolution du problème de départ) dans leurs fonctions liées dans l’ordre de leur
exécution.
2. De spécifier les sous problèmes identifiés, de décrire leur utilisation dans la solution du
problème et de procéder à une validation à cette étape.
3. Reprendre chacun de ces sous problèmes spécifiés par un énoncé en leur appliquant le
même principe.
Quoique les sous problèmes soient indépendants ils doivent être liés par un enchaînement
particulier : la solution du problème. Par exemple, si le problème posé est la résolution d’un
système linéaire par la méthode de Gauss, on peut le factoriser en les sous-problèmes suivants :
- Lecture de la matrice
- Lecture du second membre
- Triangularisation de la matrice
- Résolution d’un système linéaire
- Affichage des solutions
Au concept de sous-programme point de départ d’une étape de factorisation nous allons faire
correspondre celui de ressources actions. Syntaxiquement une ressource action va avoir la
même structure qu’un algorithme. Elle contient ses propres ressources (données et actions) et
son traitement mais sera activé dans la partie action de la ressource père. Comme toute
ressource, les ressources actions sont décrites formellement dans la partie description des
ressources et sont utilisées dans la partie description des actions.
II. Procédures
Elles ont plusieurs formes : les procédures sans paramètre et les procédures avec paramètres.
a. Procédure sans paramètre
La syntaxe d’une procédure (ressource action) est la suivante.
PROCEDURE identificateur de la
ressource ;
corps d’un algorithme
Ainsi, une ressource action est nommée par un identificateur et la structure d’un
algorithme devient :
19
ALGORITHME identificateur ;
Liste des identificateurs : type
PROCEDURE identificateur ;
Description des ressources propres (données et actions)
{ description du processus opératoire de la ressource action
};
{ description du processus opératoire de l’algorithme
}.
20
Corps d’un algorithme
Ainsi, on assimile le résultat de la fonction à son nom. Par conséquent dans la
description formelle de la fonction il doit y avoir au moins une action lui donnant le
contenu résultat du traitement. L’appel d’une fonction se fait en invoquant directement
son nom dans une expression utilisant le résultat de manière correcte et en passant
éventuellement tous les paramètres réels. En d’autres termes la fonction rendra une
valeur qui peut être utilisée pour initialiser une autre variable ou dans une expression de
même type.
EXERCICES
1. Ecrire une fonction qui donne le maximum de trois nombres réels
2. Ecrire une fonction qui prend un tableau de 5 entiers, puis retourne la valeur Vraie ou
Faux selon que le tableau est trié par ordre croissant ou non
3. Ecrire une fonction qui calcule le nombre de combinaison
4. Soit 𝑓 une application de l’ensemble des entiers strictement positifs dans l’ensemble
des entiers positifs ou nul, vérifiant les propriétés suivantes :
a. Pour tout (𝑚; 𝑛), 𝑓(𝑚 + 𝑛) − 𝑓(𝑚) − 𝑓(𝑛) l’une des valeurs 0 ou 1
b. 𝑓(2) = 0 ; 𝑓(3) 𝑒𝑡 𝑓(999) = 3333
Déterminer 𝑓(2014)
5. L’ensemble des entiers naturels strictement positifs est la réunion de deux sous
ensemble disjoints
{𝑓(1), 𝑓(2), ⋯ , 𝑓(𝑛), ⋯ } 𝑒𝑡 {𝑔(1), 𝑔(2), ⋯ , 𝑔(𝑛), ⋯ }
Vérifiant les conditions :
a. Les suites 𝑓 et 𝑔 sont croissantes
b. 𝑔(𝑛) = 𝑓(𝑓(𝑛)) + 1 pour tout 𝑛 ≥ 1
Déterminer 𝑓(2014)
21
Chapitre 3 Types complémentaires
I. Le type simple construit par énumération
En plus des quatre types simples déjà vu, nous avons la possibilité de construire des types
simples propres en énumérant les différentes constantes créées dites constantes scalaires par la
syntaxe suivante
,
Constante
( scalaire )
Exemple
J1 :=J2 ;
etc.
II. Les types simples construits par intervalle
Dans ce cas l’ensemble des valeurs du type est défini comme partie d’un autre ensemble de
type simple et énumérable. Ainsi, l’intervalle est une partie fermée d’un type simple et
énumérable de base.
Exemple
Type
INT=-10..15 ;
JOUROUVRABLE=
LUNDI..VENDREDI ;
Var
I : INT ;
Jour : JOUROUVRABLE
I. Le type ensemble
A partir d’un type simple de base on peut définir une structure d’ensemble comme étant un
ensemble un ensemble au sens mathématique d’objets de ce type.
Une déclaration (instanciation) d’une variable de type ensemble a donc une structure
d’ensemble.
22
SET OF
Type de base
Exemple
S : SET OF JOUR
Les opérations suivantes sont possibles :
Opération Syntaxe Exemple
L’affectation := S :=[lundi, mercredi,
jeudi] ;
s :=[] (…)
L’intersection * [1..56]*[34..76] vaut
[34..56]
L’union + [11..34]+[1..34] vaut [1 ..
34]
La différence -
L’égalité = S1=s2
L’inclusion < S1<s2
<= s1<=s2
L’appartenance IN IF (reponse IN [‘o’, ‘n’])
THEN ..
C’est une variante du type tableau pour nous permettre de travailler sur les chaînes de
caractères, c’est donc l’équivalent d’une description en tableau de caractères
Exemple :
A : STRING [30] ;
Déclare une chaîne A de 30 caractères commençant à partir de 1.
o A peut être manipulé comme un tableau, mais en outre il peut être traité
globalement : toutes les opérations relationnelles deviennent valables. (l’ordre
considéré est l’ordre lexicographique induit à partir de l’ordre des codes ASCII
des caractères).
o Pour déterminer la longueur de la chaine contenue dans une variable de type
string, le principe suivant est adopté : la position 0 de la variable string codé sur
un octet contiendra la longueur de la chaîne courante de caractères contenue
dans A. La longueur maximale d’une chaîne de caractères est donc de 255.
Plusieurs fonctions et procédure prédéfinies sur les chaînes de caractères existent dans
turbo Pascal.
- Le type enregistrement: Le type enregistrement correspond à une collection d’objets
de types différents qu’on appelle champs
RECOR
D Liste des champs EN
D
23
Exemple 1
Type
Datenaiss=RECORD
Jour : 1..31 ;
Mois : 1..12 ;
Annee : 1950..200
END ;
Employe=RECORD
Nom : STRING[30] ;
sexe: (MASCULIN, FEMININ);
Date : datenais ;
d :date ;
Les champs jour, mois et année seront référencés par d.jour, d.mois et d.annee.
Remarque : on peut utiliser l’accès avec WITH s’il n’y’a pas d’ambigüité ce qui évite de
répéter le nom de l’enregistrement :
Syntaxe
,
Identificateur O Identificateur
WIT
F
H
Exemple :
WITH d DO
BEGIN
Jour :=12 ;
mois:=1;
annee:=2O14
END
III. Le type Fichier
Un fichier est un objet de type FILE est définie comme une suite d’objets de même type sauf
le type fichier et en nombre indéterminé
syntaxe
FILE
OF Def de type
24
Si les composantes d’une variable de type fichier sont traitées de manière séquentielle on dit
que le fichier est à accès séquentiel.
Cependant si nous accédons à n’importe quelle composante par l’intermédiaire de son rang le
fichier est à accès direct.
Exemple
Femploye=FILE OF employé
Fich : femploye ;
Pour pouvoir travailler avec les fichiers il faut obligatoirement passer par les trois phases
suivantes :
- Etablir la liaison entre la variable interne de type fichier et son nom externe tel qu’il
est connu par le système d’exploitation.
- Ouvrir ce fichier soit en lecture soit en écriture
- Après les traitements sur ce fichier réaliser une fermeture logique.
Des procédures prédéfinies ont été écrites et permettent de réaliser ces trois objectifs.
25
Chapitre 4 Introduction à la récursivité et à la programmation
récursive
I. Notion de récursivité
Bien que tous les chapitres précédents soient axés principalement sur les techniques de
programmation (dite itératives), nous avons été confrontés à plusieurs reprises à la récursivité
surtout dans les tentatives de décrire formellement la syntaxe d’un langage
Dans le cadre de ce chapitre, charnière entre cette première partie et la deuxième relative aux
techniques d’analyse des algorithmes et des structures de données.
Les objectifs sont :
• Illustrer la récursivité en apportant des précisions sur sa définition, sa représentation
algorithmique et son mode de fonctionnement
• Donner des indications sur son utilisation dans la conception des algorithmes dans le
cadre de ce qu’il est souvent convenu d’appeler la programmation récursive.
• Le chapitre suivant nous donnera l’occasion de porter quelques réflexions sur d’une
part les possibilités de passer d’une version récursive à une version itérative
(dérécursivation) et d’autre part sur la portée des deux techniques de programmation.
1. Définition générale
Une notion est récursive si elle se contient elle-même en partie ou si elle est partiellement
définie à partir d’elle-même. Elle est dite auto-référencée.
Pour retourner l’écran : ALT+ ↑
Quelques commentaires sur cette définition
1. La récursivité est un concept que l’on rencontre fréquemment :
a. Dans la vie courante (des histoires à l’intérieur d’histoires, des représentations
à l’intérieur de représentation, des objets à l’intérieur d’objets, …)
b. En mathématiques : les suites récurrentes, méthodes itératives ; etc.
c. En théorie des langages etc.
2. Ce processus d’auto-référencement doit être fini ! en effet il ne s’agit pas d’une
référence à l’exacte elle-même ce qui serait circulaire mais à une copie de la version
précédente. La terminaison est assurée par le fait que cette suite de versions doit
converger vers un état connu
3. Une fois cet état atteint, il faut retourner à la version précédente afin de la terminer
pour reprendre la version encore précédente, la terminer etc.
𝑆 = ∑ 𝑢𝑘
𝑘=0
Règle i/ 𝑆(0) = 𝑢0
Règle ii/ 𝑆(𝑛) = 𝑢𝑛 + 𝑆(𝑛 − 1)
26
2. Factorielle 𝑛!
a. Règle i/ 0! = 1
b. Règle ii/ 𝑛! = 𝑛. (𝑛 − 1)!
- PGCD de deux nombre entiers u et v
a. 𝑝𝑔𝑐𝑑(𝑢, 0) = 𝑢
b. 𝑝𝑔𝑐𝑑(𝑢, 𝑣) = 𝑝𝑔𝑐𝑑(𝑢, 𝑢 𝑚𝑜𝑑𝑢𝑙𝑜 𝑣)
- Les informations relevées sur chaque individu sont :
a. Son nom
b. Sa date de naissance
c. Et celle de son père (qui est un individu) etc.
PPERS=↑ PERSONNE ;
PERSONNE= RECORD
Nom : STRING[30]
Date_naiss : RECORD jour : 1 ..31 MOIS/ 1..12 ;
année : 2000..2013 END ;
Père : PPERS
END
27
Et une instanciation par individu : PPERS ; donnerait :
Vers le père de
nom date pere l’individu
indivudu
{ {
P(B(D)) ; F(B(D)) ;
} }
Récursivité directe
PROCEDURE P(D : TD) ; FONCTION Q( D : TD) : RD ;
{ {
Q(B(D)) ; P(C(D)) ;
} }
Nous parlerons aussi de procédure (ou fonction) récursive primitive si les paramètres ne
s’expriment pas par appel de la procédure (ou de la fonction) autrement elle est dite générale.
Exemple de fonction générale (non primitive) :
FONCTION ack (m,n : ENTIER) : ENTIER ;
Dans tout ce qui suit, nous parlerons généralement des procédures, l’adaptation aux fonctions
sera laissée aux soins du lecteur, sauf dans le cas contraire ou une différenciation s’impose.
28
2. Visibilité des objets d’une procédure (ou fonction)
i. Récursivité et mécanisme de fonctionnement
A chaque procédure est associée un ensemble d’objets accessibles qui sont :
- Ses objets locaux
- Ses objets paramètres
- Ses objets plus globaux
L’ensemble des objets propres (locaux et paramètres passés par valeur) a une certaine existence
(durée de vie) pendant l’exécution de la procédure.
Nous dirons qu’un appel de la procédure entraine la création d’un environnement formé d’un
exemplaire particulier de cet ensemble d’objets qui ne cesse d’exister que quand cet appel se
termine (cette existence continuant au-delà pour les objets plus globaux ou les objets paramètres
passés par adresse) en d’autres termes, Si une procédure est appelée récursivement, cela signifie
qu’un nouvel environnement va naître sous celui du précédent (celui qui l’a appelé). Il va donc
exister plusieurs environnements différents pour la même procédure et par conséquent plusieurs
incarnations différentes pour un même objet dans chaque environnement sans qu’il n’y ait
aucun rapport ni aucune communication entre ces différents environnements et la désignation
d’un objet local à une procédure n’est pas ambiguë puisqu’elle se réfère toujours au dernier
environnement créé et encore en cours d’existence. Quand un appel récursif se termine, les
objets de l’environnement correspondant à l’appel précédent redeviennent accessibles parce
qu’ils n’ont pas cessé d’exister entre temps
3. Exemple de procédures récursives
i. Calcul de n !
FONCTION fact (n : ENTIER) : ENTIER
𝑓𝑎𝑐𝑡 ⟵ 𝑓𝑎𝑐𝑡(1) × 2
𝑓𝑎𝑐𝑡 ⟵ 𝑓𝑎𝑐𝑡(0)
×1
𝑓𝑎𝑐𝑡 ⟵ 1
4. Programmation récursive
Les exemples traités permettent de mettre en évidence les idées fortes dans la conception en
programmation récursive.
29
La première est de transformer (de manière équivalente) l’énoncé du problème en un autre
dont les spécifications sont récursives
Exemple 1
On considère deux chaînes de caractères w1 et w2 et on désire savoir si w1 est anagramme de
w2, c'est-à-dire que w1 est égale à w2 à une permutation près de caractères
Eléments d’analyse
1- Sur quelles données faut-il porter la récursivité ?
2- Toute définition récursive doit avoir un état connu (point de sortie) qui permet de ne
plus appliquer la règle récursive
30
Partie 2 : Langage C et programmation
31
Chapitre 5 Initiation au langage et à la programmation en C
I. Introduction
Le langage Pascal est un langage procédural2 qui a été crée en 1975 par Niklaus Wirth.
L’ancêtre du langage Pascal, comme d’ailleurs tous les langages de sa catégorie est le Fortran
(voir figure suivante).
2
Dans un langage procédural, l’affectation (transfert d’une valeur dans une mémoire) est la base des actions.
32
• Le traduire en langage machine (c'est-à-dire en codes binaires compréhensibles par
l'ordinateur) : c'est la compilation et éventuellement l'édition de liens (Link);
• L'exécuter.
I. Structure générale d’un programme
#include <stdio.h>
#include <conio.h>
main()
{ <déclaration de variable>
<instruction à exécuter>
}
Exemple
Ouvrons notre éditeur de texte préféré et saisissons le programme suivant
# include<stdio.h
#include<conio.h
int main()
{
print(‘’Salut le Monde\n’’ ;
getch()
return 0 ;
}
Sauvegardez ce fichier sous le nom salutMonde. Dans le menu Exécuter, cliquez sur
Compiler. Remarquez que la compilation a produit un fichier salutMonde.exe. Vous avez
deux façons de l’exécuter :
- Double-cliquez directement sur salutMonde.exe
- Dans le menu exécuter, cliquez sur exécuter
33
Il faudra éviter l’’utilisation de caractère de soulignement _ en début ou fin d’un
identificateur, cette notation est habituellement réservée aux mécanismes internes des
compilateurs.
III. Variable global, variable locale
- On appelle déclaration globale toute déclaration effectuée à l’extérieur des corps de
fonction, donc au niveau 0 du code source. Un identificateur global est valide (on dit
aussi ‘’visible’’) pour tous les modules fonctions d’un même fichier source. De même
la définition d’une fonction a valeur de déclaration globale
- On appelle déclaration locale, toute déclaration effectuée dans un corps de fonction.
Un identificateur local n’est utilisable que dans le corps de fonction auquel il
appartient
Remarque
- Les déclarations des arguments d’appel d’une fonction sont des identificateurs locaux
- En cas d’homonymie, c’est la déclaration locale qui est prioritaire
IV. Affectation, saisie, affichage
Syntaxe Commentaire
While
(tant que)
do ..While
for
34
VI. Les types classiques
- Entiers non signés entiers signés : Par défaut ; les entiers permettent de stocker des
valeurs de signe quelconque. Si on préfixe un type entier par unsigned, on le restreint à
des valeurs uniquement positives.
Entier
nom Taille Nombre de Plus petite Plus grande
valeurs valeur valeur
Unsigned 1 octet 28 0 28 − 1
short 2 octets 216 0 216 − 1
Unsigned int 4 octets 232 0 232 − 1
Unsigned
long
Entiers signés
nom Taille Nombre de Plus petite Plus grande
valeurs valeur valeur
Unsigned 1 octet 28 −27 27 − 1
short 2 octets 216 −215 215 − 1
Unsigned int 4 octets 232 −231 231 − 1
Unsigned
long
Il est conventionnel d'écrire des littéraux flottants avec un point, par exemple
l'approximation à 10−2 près de 𝜋 s'écrit 3.14. Il est aussi possible d'utiliser la notation
scientifique, par exemple le décimal 1 000 s'écrit 1e3, à savoir 1.10−3.Nous nous
limiterons à la description du type float, les autres types obéissent à des règles similaires.
Le codage d’un nombre de type float (32 bits) est découpé en trois parties :
Bit de signe L’exposant La mantisse
Taille 1 8 23
Le nombre est positif si le bit de signe est 0, négatif si le bit de signe est 1. La
mantisse et l’exposant.
Les connecteurs logiques
Connecteur Syntaxe en C Commentaires
logique
𝑒𝑡 && A et B vérifié simultanément
𝑜𝑢 ∥ L’un au moins de A ou B est
réalisé
35
- Un tableau est regroupement de variables de même type, il est identifié par un nom.
Chacune des variables du tableau est numérotée, ce numéro s’appelle un indice.
Chaque variable du tableau est donc caractérisée par le nom du tableau et son indice.
Ecrire en C un programme qui affiche la position du nombre saisit par l’utilisateur dans la
liste.
Applications 1
36
Application 2
Etant donné le programme dont l’exécution est tracée ci-dessous :
Saisissez une phrase : Il y’ a l’internet à l’école.
Vous avez saisi :
Il y’ a l’internet à l’école.
Cette phrase commence par une majuscule.
Cette phrase se termine par une majuscule.
Cette phrase se termine par un point.
Ecrire en C un programme qui affiche la position du nombre saisit par l’utilisateur dans la
liste.
VII. Type enregistrement
Nous avons utilisé des tableaux pour désigner, avec un nom unique, un ensemble de variables.
Par exemple, un tableau T _a n éléments est un ensemble n de variables désignées par la lettre
T. Dans un tableau, les variables doivent être de type homogène, cela signifiant qu'il n'est pas
possible de juxtaposer des char et des int dans un tableau. Lorsque l'on souhaite faire cohabiter
dans une variable non scalaire des types hétérogènes, on utilise des structures.
Une structure, appelée enregistrement dans d'autres langages, est une variable contenant
plusieurs variables, appelées champs. Si une structure t contient un char et un int, chacun de ces
champs portera un nom, par exemple i et c. Dans ce cas, 𝑡: 𝑐 désignera le char de t et 𝑡: 𝑖 l'int de
t.
Syntaxe Exemple Commentaire
Déclaration struct point p ; Ce type permet de représenter un
{ point dans ℝ2 , avec une abscisse et
double abs ; une ordonnée. Struct point est
double ord ; maintenant un type, il devient
} possible de déclarer un point p
comme tout autre variable
37
Void nomprocedure ()
{
/∗
Instruction
/∗
}
Une procédure est une nouvelle instruction, il suffit pour l’exécuter d’utiliser son nom.
Par exemple pour exécuter (on dit aussi appeler ou invoquer) une procédure appelé pr,
il suffit d’écrire pr(). L’exemple suivant en donne une illustration
38
L’instruction servant à retourner une valeur est return. Cette instruction interrompt
l’exécution de la fonction et retourne la valeur placée immédiatement après.
39
INP-HB Yamoussoukro Année académique 2012-2013
GMP1
TP : Algo et programmation
Du problème posé à la solution informatique (programme) par l’exemple
Activité 1
1. Ecrire les algorithmes qui permettent de calculer le minimum de 2 entiers : on
commencera par une analyse du problème (variables d’entrée, de sortie, etc.)
2. Ajouter des instructions à l’algorithme précédent de sorte :
1. A demander à l’utilisateur d’entrer les valeurs de a et b
2. A lire les valeurs de a et b entrées par l’utilisateur
3. A afficher à l’écran la solution.
3. Traduire en Pascal l’algorithme final
Application : Même question avec le maximum
Programme, procédure
Activité 2
Ecrire l’algorithme des procédures suivantes :
1. Min de 2 entiers
2. Max de 2 entiers
Puis l’algorithme du programme qui lit 2 entiers, appelle les procédures Min et Max et affiche
les résultats.
Traduire en Pascal l’algorithme du programme.
Application : utiliser les procédures Min et Max pour déterminer le minimum de 3 entiers.
Activité 3
Fonction
Activité 4
Ecrire une fonction ayant en paramètre un entier représentant une année et retournant un 1 si
l’année est bissextile et 0 sinon.
Prototype : bissextile(annee : integer) : integer;
Activité 5
Ecrire une fonction qui retourne le plus grand commun diviseur (pgcd) de deux nombres
entiers positifs.
40
INP-HB Yamoussoukro Année académique 2012-2013
TP : Algo et programmation
Programme, procédure
Exercice 1
Ecrire les procédures suivantes :
1. Min de 2 entiers
2. Max de 2 entiers
Puis le programme qui lit 2 entiers, appelle les procédures Min et Max et affiche les résultats.
Exercice 2 (trier des entiers n )
Procédure Echange2 sur 2 réels a et b qui échange éventuellement a et b pour que l’état de
sortie soit 𝑎 ≤ 𝑏. Ecrire un programme d’appel.
Exercice 3
Fonction
Exercice 4 (calendrier)
Exercice 5
Ecrire une fonction ayant en paramètre un entier représentant une année et retournant un 1 si
l’année est bissextile et 0 sinon.
Exercice 6
Ecrire une fonction ayant en paramètre trois entiers représentant un jour, un mois et une année
et retournant un 1 si l’année est bissextile et 0 sinon.
Exercice 7
Ecrire une fonction qui retourne le plus grand commun diviseur (pgcd) de deux nombres
entiers positifs.
41
Les caractères, type enregistrement
Exercice 10 (
Exercice 11
Ecrire une fonction calc_ns(t) qui renvoie le nombre de secondes ns écoulées depuis 0 :0 :0
Exercice 12
Exercice 13
42
Exercice 9 (caractère minuscule)
Ecrire la fonction RechercheMot (nomf, m : ligne_t) : boolean ; qui renvoie TRUE si le mot
m (reçu en minuscule) est présent dans le fichier nomf
43
INPHB DE YAMOUSSOKRO
1ème ANNEE GMP 2011-2012
TD N° 2 INFO. GENE.
Exercice 1
Résoudre dans R une équation du second degré
Exercice 2
Calculer le salaire d’un fonctionnaire ou auxiliaire,
sachant que s’il est fonctionnaire il cotise
6% de son salaire de base pour sa retraite
2.75 % du salaire de base pour sa protection sociale si son salaire est plus petit que le plafond
fixé par l’organisme de gestion de la protection sociale, dans le cas contraire il cotise pour
2.75% du même plafond.
S’il est auxiliaire il ne cotise pas pour la retraite, par contre il cotise pour la protection sociale
au taux de 5% de son salaire de base si ce dernier est inférieur ou égal au plafond sinon il
cotise pour 6.75% du plafond augmenté de 1.5% de la différence entre le salaire de base et le
plafond.
Exercice 3
1. Afficher dans l’ordre trois nombres entiers et distincts.
2. Afficher le maximum de trois entiers
Exercice 4
On considère un texte formé de caractères et terminé par un caractère unique : ‘#’, on voudrait
connaitre :
a. Le nombre de ‘a’
b. Le nombre de voyelle
c. Le nombre de ‘le’
d. Le nombre de mots
Exercice 5
On considère la suite de FIBONACCI :
𝑢0 = 𝑢1 = 1
𝑢𝑛 = 𝑢𝑛−1 + 𝑢𝑛−2
1. Ecrire un algorithme qui calcul le nième terme de la suite Fibonacci
2. Calculer la somme des q premiers termes.
44
Exercice 6
ALGORITHME algo;
X, MY: REEL;
I: ENTIER;
MY=0;
{
POUR I⟵1 JUSQUA 10 FAIRE
{ LIRE(X);
MY⟵MY+X/10 ;
}
ECRIRE (MY)
}.
Exercice 7
ALGORITHME algo1 ;
X, Y, S : ENTIER ;
{ LIRE(X, Y) ;
SI (X>0) ALORS S⟵1
SINON
{SI (Y<0) ALORS S⟵1
SINON S⟵O
}
ECRIRE (S) ;
}.
45
1. Que fait algo1 ?
2. Ecrire le programme turbo pascal correspondant
3. Remplir le tableau suivant
X Y Z
Exercice 8
ANGUI donne l’algorithme suivant
ALGORITHME Angui_algo ;
X, Y, Z, SAUVER : ENTIER ;
{ LIRE(X, Y, Z) ;
SAUVE⟵X ;
X⟵Z ;
Z⟵Y ;
Y⟵SAUVE ;
ECRIRE(X, Y, Z)
}.
Exercice 9
1. Ecrire un algorithme qui permet de calculer la moyenne d’une série de 6 entiers
2. Ecrire le programme turbo pascal correspondant
3. Faire l’exécution pour la série suivante : 19 524 1291 2301 99 201
46