Initiation Algorithmique L1 Partie2
Initiation Algorithmique L1 Partie2
Initiation Algorithmique L1 Partie2
DONNEES ELEMENTAIRES
INTRODUCTION
Un tableau est une variable qui permet de rassembler sous un même nom un nombre fini
d’éléments ayant tous le même type.
Le type qui caractérise une telle variable est également appelé tableau. Lorsqu’un tableau est
défini, le nombre d’éléments qu’il peut contenir doit être précisé et il ne pourra pas être changé
par la suite. Ce nombre d’éléments est appelé la taille ou la capacité du tableau.
Les éléments du tableau sont accessibles à partir de leur(s) indice(s) : c’est pourquoi on les
appelle aussi de variables indicées. Lorsqu’un élément particulier d’un tableau est désigné en
précisant un seul indice on parle de tableau à une dimension. S’il est nécessaire de préciser
plusieurs indices pour accéder à une donnée, on parlera de tableau à plusieurs dimensions.
1- Déclaration
Un tableau doit être déclaré en précisant le nombre de ses éléments ainsi que le type de ceux-
ci. La syntaxe de déclaration est la suivante :
Variable nom_tableau : tableau [inf… Sup] de Type;
- inf et sup représentent respectivement les bornes inférieurs et supérieurs du tableau ;
- Type représente le type des éléments que va contenir le tableau. Il peut prendre les
valeurs : entier, réel, caractère, chaine, booléen, etc.
Remarque : L’indice qui sert à repérer les éléments du tableau peut être exprimé directement
comme un nombre (valeur littérale) mais aussi comme une variable ou une expression calculée.
La valeur d’un indice doit toujours être un entier compris entre inf et sup.
Exemple : la déclaration d’un tableau de 10 entiers se fera comme suit :
Variable tab : tableau [1..10] de entier ;
Dans cette déclaration, tab est une variable qui pourra contenir 10 entiers.
Remarque : en pratique on choisit souvent inf = 1 comme dans l’exemple ci-dessus.
Si le tableau notes ci-dessus comportait un nombre important d’éléments, par exemple 100,
il serait laborieux pour le programmeur d’utiliser la méthode ci-dessus et le code deviendra
très vite illisible.
Une solution efficace à ce problème passe par l’utilisation des boucles.
Variable i : entier ;
pour i de 1 à 10 faire
Ecrire ("entrer la note", i) ;
Lire (notes[i]) ;
Fin pour
Dans le code ci-dessus, i va successivement prendre les valeurs entre 1 à 10 et à chaque fois,
la valeur saisie sera envoyée dans la case numéro i.
Remarque :
De façon générale, lorsqu’on veut effectuer un traitement global sur un tableau, il faut penser
à l’utilisation d’une boucle (pour, tantque) pour parcourir l’ensemble des éléments du tableau.
Par contre lorsqu’on veut traiter de façon isolé une valeur du tableau, on l’utilise comme une
variable ordinaire en précisant son indice dans le tableau.
Exemple récapitulatif
Algorithme moyenne
Variable notes : tableau [1..10] de réel ;
i : entier ;
somme, moy : réel ;
Début
/*lecture des notes */
Pour i de 1 à 10 faire
Ecrire ("entrer la note", i) ;
Lire (note[i]) ;
Fin pour
/*calcul de la moyenne */
Somme 0;
Pour i de 1 à 10 faire
Somme somme + note[i];
Fin pour
Moy somme / 10 ;
/*affichage de la moyenne calculée */
Ecrire ("moyenne=", moy) ;
Fin
Exercices
1. Compléter le programme ci-dessus afin qu’il affiche aussi la liste des notes plus petites
que la moyenne.
2. Ecrire un programme qui demande à l’utilisateur de saisir les valeurs d’un tableau de 10
entiers. Le programme affiche ensuite le nombre d’éléments pair du tableau.
1- Recherche séquentielle
Principe : Pour vérifier l’existence d’un élément dans un tableau, on effectue le parcours de
celui-ci et on s’arrête dans deux cas :
- dès qu’on a trouvé l’élément recherché ;
- lorsqu’on a traité le dernier élément.
Algorithme
Algorithme recherche_seq1
Variable t : tableau [1..10] de entier ;
val, i : entier ;
trouver : booléen ;
Début
/* lecture des valeurs du tableau */
Pour i de 1 à 10 faire
Ecrire ("entrer la valeur", i) ;
Lire (t[i]) ;
Fin pour
Ecrire ("entrer la valeur recherchée") ;
Lire (val) ;
trouver faux ;
i1;
/* recherche séquentielle */
Tantque ((i <= 10) et (trouver = faux)) faire
Si (t[i] = val) alors
trouve vrai ;
Finsi
i i +1 ;
FinTantque
Si (trouve = vrai) alors
Ecrire ("élément présent") ;
Sinon
Ecrire ("élément non présent") ;
Fin si
Fin
2- Recherche dichotomique
L’algorithme de recherche dichotomique ne fonctionne que sur des tableaux triés.
Principe
On divise le vecteur en 2 parties sensiblement égales, et avec l’aide d’une comparaison
du critère de recherche avec l’élément médian, on élimine la partie du tableau qui ne
peut pas contenir la valeur recherchée
La partie non éliminée est à son tour divisée en deux et ainsi de suite, jusqu’à ce qu’on
obtienne un vecteur à un seul élément. Si cet élément correspond à la valeur
recherchée, on a trouvé l’élément sinon l’élément est absent.
Algorithme
Algorithme dichotomique
Var t : tableau [1..10] de entier ;
i, inf , val, sup, med : entier ;
Début
/* lecture des valeurs du tableau */
Pour i de 1 à 10 faire
Ecrire ("entrer la valeur", i) ;
Lire (t[i]) ;
Fin pour
Ecrire ("entrer la valeur à rechercher") ;
Lire (val) ;
inf 1;
sup 10 ;
Tant que (inf < sup) faire
med (inf + sup) div 2 ;
Si (t[med] < val) alors
inf med +1 ;
Sinon
sup med ;
Finsi
Fin tantque
Remarque : On peut arrêter l’algorithme plutôt dès qu’on a trouvé l’élément recherché.
Exercice : Modifier l’algorithme ci-dessus pour que la recherche s’arrête dès que l’élément
recherché a été trouvé.
Exercice1
Ecrire un algorithme qui permet de saisir les valeurs d’un tableau de 10 entiers. Puis
calcul et affiche la somme de tous les nombres plus petit que 11.
Ecrire un programme qui vérifie si un tableau de 10 entier est trié ou pas par ordre
croissant.
a- Principe
La technique du tri par sélection est la suivante : on met en bonne position l’élément numéro
1, c’est-à-dire le plus petit. Puis en met en bonne position l’élément suivant. Et ainsi de suite
jusqu’au dernier.
b- Illustration
Considérons le tableau suivant :
On commence par rechercher, parmi les 12 valeurs, quel est le plus petit élément, et où il se
trouve. On l’identifie en quatrième position (c’est le nombre 3), et on l’échange alors avec le
premier élément (le nombre 45).
Le tableau devient ainsi :
On recommence à chercher le plus petit élément, mais cette fois, seulement à partir du
deuxième (puisque le premier est maintenant correct, on n’y touche plus). On le trouve en
troisième position (c’est le nombre 12). On échange donc le deuxième avec le troisième :
On recommence à chercher le plus petit élément à partir du troisième (puisque les deux
premiers sont maintenant bien placés), et on le place correctement, en l’échangeant, ce qui
donnera in fine :
Fin
a- Principe
Chaque valeur V[i] du tableau est insérée à la bonne place parmi les valeur déjà ordonnées du
sous vecteur V[1.. I-1]. Au départ le sous vecteur est réduit à V[1] et on a I=2.Chaque insertion
se fait par comparaison et décalage successif et a pour conséquence d’agrandir le sous vecteur
ordonné d’un élément. La dernière insertion est celle de V[n].
b- Algorithme (tri croissant d’un tableau d’entiers)
Algorithme tri_insertion
Variable v : tableau [1..10] de reel ;
val : reel ;
i, k, n : entier ;
Début
/* saisie des valeurs du tableau */
Pour i de 1 à 10 faire
Ecrire ("entrer la valeur", i) ;
Lire (v[i]) ;
Finpour
/* algorithme de tri par insertion */
N 10 ;
Pour i de 2 à n faire
val v[i] ;
k i–1;
Tantque (k ≥ 1) et (v[k] > val) faire
V[k+1] v[k] ;
K k–1;
FinTantque
V[k+1] val ;
Finpour
/* on affiche le tableau trié */
Ecrire ("tableau trié") ;
Pour i de 1 à 10 faire
Ecrire (v[i]) ;
Finpour
Fin
Exercices
Modifier l’algorithme ci-dessus pour que le tri se fasse par ordre décroissant.
Ecrire un programme qui fusionne 2 tableaux triés de 5 entiers en 1 tableau trié de 10
entiers
1. Déclaration
La déclaration d’un tableau à deux dimensions se fait de la façon suivante :
variable nom_tableau : tableau [1..L, 1..C] de type ;
L et C représentent respectivement le nombre de lignes et de colonnes de ce tableau.
Exemple: variable tab: tableau[1..5, 1..6] de entier;
Dans cet exemple, tab est un tableau à deux dimensions de 5 lignes et 6 colonnes.
4. Exercices d’application
1. Modifier le programme ci-dessus de sorte que l’affichage des éléments se fait plutôt
colonne par colonne.
2. Ecrire un programme qui lit les valeurs de deux matrices carrées 4*4 de réels, puis
calcule et affiche la somme de ces deux matrices.
1. Définition et syntaxe
Une chaine de caractère est une séquence finie de caractères.
Chaque caractère de la chaine est accessible à partir de sa position dans la chaine comme dans
le cas des tableaux. En fait, une chaine de caractères peut être considérée comme un tableau
de caractères à une dimension.
Dans le code, les valeurs littérales de type chaine sont représentées entre simple quotte ou
bien entre double quotte. Exemple : ‘bonjour ‘, ‘’bonjour’’
2. Exercices d’applications:
a- Ecrire un programme qui affiche le nombre d’occurrence du caractère 'a' contenu dans
un mot saisie par l’utilisateur.
b- Ecrire un programme qui lit un mot puis affiche toutes les voyelles contenus dans ce
mot.
c- Ecrire un programme qui affiche le nombre de mot contenu dans une phrase saisie par
l’utilisateur (on supposera que les mots sont séparés par des espaces).
d- Ecrire un programme qui demande un mot à l’utilisateur puis le transforme en majuscule
et affiche le résultat.
e- Ecrire un programme qui prend en entrée deux mots (mot1 et mot2) puis affiche le
message « oui » si mot1 est une sous chaine de mot2 et « non » dans le cas contraire.
f- Ecrire un programme qui prend en entrée un mot et dit si ce mot est palindrome ou
pas. Un mot palindrome est un mot qu’on peut lire indifféremment de la gauche vers la
droite ou inversement (aba, anna).
INTRODUCTION
Considérons une application destinée à gérer la scolarité d’un établissement scolaire. Une telle
application doit pouvoir manipuler des entités complexes telles que les étudiants, les filières,
les semestres, …ainsi que les relations entre ces entités. L’utilisation des types de base pour
résoudre ce problème amènera à créer un très grand nombre de variables et introduirait un
plus haut niveau de complexité dans ce système.
En programmation, il est possible pour le programmeur de définir de nouveaux types de
données plus adaptés au problème qu’il cherche à résoudre. Ces nouveaux types, construits
généralement à partir des types de base sont appelés types définis par l’utilisateur, les plus
connus étant les structures et les énumérations.
3. Type intervalle
Un type intervalle est un type dont les variables prennent leurs valeurs dans une portion de
l'intervalle des valeurs d'un autre type (entier, énuméré ou caractère).
Exemples :
Note=0..20 ; // ici on définit une note comme étant un entier compris entre 0 et 20.
JOUR_OUVRABLE=lundi..vendredi ; //un jour ouvrable est compris entre lundi et
vendredi.
Les enregistrements sont des structures de données dont les éléments peuvent être de type
différent se rapportant à une même entité. Les éléments qui composent un enregistrement
sont appelés champs. Le type d’un enregistrement est appelé type structuré, c’est pourquoi
les enregistrements sont aussi parfois appelés structures.
L’intérêt des enregistrements est de pouvoir structurer très proprement les informations qui
vont ensemble, de les recopier facilement, de les passer en paramètre et en valeur de retour
de sous-programmes.
Exemple
Type personne = Enregistrement
nom : chaine ;
age : entier ;
Fin enregistrement
Dans cet exemple on crée le nouveau type de donnée appelé Personne. Une variable de type
Personne aura deux valeurs : une valeur pour le nom et une valeur pour l’âge.
On peut donc déclarer les variables de type personne comme pour tout autre type avec la
syntaxe suivante.
Variable P1, P2 : personne ;
Une variable de type personne contient deux informations un Nom et un Age.
P1 TOTO
17
Remarque :
Il est possible d’effectuer l’affectation entre deux enregistrements : dans ce cas une
affectation entre champs de même nom est effectuée entre les deux enregistrements.
3. Tableau d’enregistrements
Il arrive que l’on veuille faire des traitements sur un ensemble d’enregistrements de même
type. Par exemple pour traiter un groupe de 50 personnes, on ne va pas créer 50 variables de
type Personne mais plutôt un tableau d’enregistrement qui va contenir les 50 personnes.
Exemple
Const NP = 50 ;
Type personne = enregistrement ;
nom : chaine ;
age : entier ;
Fin enregistrement ;
Exemple
Type Date = Enregistrement ;
jour : integer ;
mois : string ;
année : integer ;
FinEnregistrement ;
Personne = Enregistrement ;
nom : string ;
date_naiss: Date;
FinEnregistrement;
Variable p: Personne:
p.nom = ‘toto’; // on affecte la chaine ‘toto’ au champ nom de la variable p
P.date_naiss.jour = 10; //on affecte 10 au champ jour du champ date_naiss de la variable p
1) créer un compte
2) débiter un compte
3) créditer un compte
4) effectuer un virement
5) afficher tous comptes
6) quitter le programme