Algorithm e 1
Algorithm e 1
Filière: Programmation
Licence 1 - Semestre 1
Système: LMD
Amen Verdier M. 1
SOMMAIRE
1- Introduction Générale
6- Les enregistrements
Amen Verdier M. 1
1 Introduction générale
L’informatique est la science du traitement automatique de l’information. A l’ère du
numérique et des technologies de l’information et des communications, les applications
mobiles ou les objets autonomes ou robotisés, dits connectés, font appel aux
algorithmes. Cela fait plusieurs millénaires que l’on résout des algorithmes à la main. Au
quotidien dans la vie moderne, chacun de nous utilise un algorithme pour mener une vie
satisfaisante en dépensant la moindre énergie.
L’information est une séquence de données relatives à un objet informatique, elle
représente un élément de connaissances pouvant être transmis sous différentes formes.
Elle est vendue très chère et constitue une source d’enrichissements de ses grands
manipulateurs. Les systèmes d’information gèrent actuellement tous les processus qui
nécessitent une automatisation de certaines tâches.
L’ordinateur Est un appareil informatique dédié au traitement automatique de
l’information. Il est donc le moyen de mettre en œuvre nos algorithmes, il est en
particulier capable de : Acquérir des informations, Conserver des informations, Effectuer
des traitements sur des informations, et enfin Restituer des informations.
Aujourd’hui, l’ordinateur est capable d’apprendre et donc ne traite pas uniquement de
l’information mais aussi des connaissances. Même en limitant à un domaine technique
comme les sciences de données, on peut trouver toute sorte d’algorithmes de quoi
remplir plusieurs ouvrages.
1.3 Introduction à l’algorithmique
Pour se déplacer dans un espace donné, pour installer un logiciel, ou tout simplement la
suite des actions que l’on exécute chaque matin sont des exemples d’algorithme. Un
algorithme est une suite d’instructions pour résoudre un problème ou faire un calcul. Ce
problème est destiné à être traité par un programme informatique. Par conséquent
l’algorithmique est la base et le fondement de l’informatique dans son aspect software
(ou logiciel). L’algorithme est alors vu comme l’ensemble des méthodes qui permettent
d’étudier ces algorithmes. Depuis la pascaline au 16ième siècle, la transformation des
problèmes et sa décomposition en une série d’instructions n’a cessé d’évoluer.
Un programme informatique : lit des données en entrée, effectue des calculs à partir des
données en entrée et en dernier affiche des résultats, pour cela le programmeur doit
suivre une méthodologie pour expliquer à l’ordinateur dans un langage de
programmation le problème à résoudre. Cette résolution d’un problème par ordinateur
peut être schématisée en 6 étapes figure1.1.
Le premier programme qui s’exécute quand on démarre une machine est son système
d’exploitation (windows, Linux,..) ; il a pour rôle de faire fonctionner le matériel et les
périphériques (hardware) et offrir des interfaces homme/machine à l’utilisateur. Le virus
informatique est aussi un programme, il a été écrit délibérément pour nuire à la machine
ou à l’environnement. Un algorithme doit vérifier certaines propriétés mathématiques et
logiques.
1
Amen Verdier M.
Problème posé
Méthode de résolution
Programmation
Traitement Machine
Interprétations
Amen Verdier M. 2
était celle de traduire du Cobol (langage des anciens systèmes bancaires) vers du java (pour un cout
de 750milions de dollars)
Certains langages ont une orientation particulière (comme SQL: Structured Query Langage)
pour la manipulation des données (ou bases de données).
La notion même d’algorithme a changé. Ce déterminisme qui le caractérisait n’est plus une
condition indispensable ; il est maintenant bio-inspiré, heuristique ou probabiliste, laissant à la
machine le choix de meilleure façon de résoudre un problème, encore faut-il lui apprendre.
Aujourd’hui, informatique et algorithmes sont indispensables à toutes les sciences et tous les
domaines, et s’en passer signifierait vivre dans une ère préhistorique.
Dans cet ouvrage, un algorithme sera écrit en langage algorithmique (et parfois en C) qui est
aussi appelé un pseudo-code, afin de laisser le choix au programmeur du langage d’implémentation
sur machine.
Parfois, il y a confusion avec le concept de protocole. En général ce dernier terme est utilisé quand
plusieurs acteurs exécutent séparément des actions (protocole de communication).
Amen Verdier M. 3
2.1.1 Exemples pour choisir un algorithme
Exemple 1 : pour trouver un passage dans un livre ?
Exemple 3 : Classer une liste de nombres du plus petit au plus grand (liste ordonnée), plusieurs
algorithmes de tri existent.
Amen Verdier M. 4
Algorithme nom_algorithme
Constantes
Variables
Début
Instruction 1;
….
Fin
Remarquer d’abord que le ‘ ;’ sépare les instructions (comme en lange C ou Pascal, par contre
en python, un simple retour de ligne les sépare). Tous les langages de programmation n’ont pas
forcément cette structure. C’est pour cela que nous distinguons entre langage algorithmique et
langage de programmation. D’abord nous décrivons la résolution du problème en langage
algorithmique avant de la transcrire ou de le « coder » dans un langage donnée. Les langages objets
par exemple ne séparent pas données et programmes, l’objet contient les propriétés et les méthodes
appliquées sur ces données (principe d’encapsulation). Pourquoi déclarer les variables (et les
constantes) ? Puisque l’ordinateur réserve de l’espace mémoire à chaque variable déclarée (du moins
pour les langages où la déclaration est obligatoire comme le C), cette place servira à stocker les
valeurs de cette variable. En outre le type va déterminer la taille en octets à réserver. Donc le nom
servira à identifier la variable pour la localiser en mémoire et son type l’espace que les valeurs
occuperont. Les opérations possibles avec un type ne sont pas possibles avec d’autres. On ne peut
diviser des caractères par exemple. Certains langages permettent de changer de type (Transtypage)
pour faire des opérations.
Exemple : distinguer le nombre 12 de la chaine de caractères ‘12’.
Amen Verdier M. 5
• Le code (password, sortie décodeur, Qr-code, signature numérique, Pass
Sanitaire,..).
• L’Historique (statistiques, archives, le temps –date heure-….).
• Du contenu numérisé (e-gouvernance, suivi, e-commerce, transactions bancaires, …).
• Des Méta-données (informations sur un site, mots clés, index). Ces dernières expriment des
données sur d’autres données ou information.
La donnée actuellement vaut de l’or. Les géants de la donnée (Gafam : google, facebook, amzone et
microsoft) aspirent nos données personnelles pour les revendre aux enchères aux institutions
étatiques et commerciales.
2.3.2 Variable
Une variable est une référence sur une cellule mémoire qui possède une adresse, identifiée par un
nom « identificateur » et destiné à stocker une valeur pouvant être modifiée durant tout l’algorithme.
Astuce : choisir toujours un nom de variable qui a un sens, ne pas utiliser d’accent ou chapeau, utiliser
toujours l’inderscore _ au lieu du ‘tiret de 6’ – qui peut être confondu avec le signe moins.
Syntaxe algorithmique
<Identificateur> : <type>
En langage C
<type> <identificateur>
l’identificateur : nom que le programmeur donne à une constante, une variable ou à une
fonction est une suite de caractères alphanumériques commençant par une lettre et pouvant contenir
un trait d’union. Le choix de noms mnémoniques (ayant un sens) est important en programmation pour
une bonne lisibilité du code par un autre programmeur.
Le type : il décrit le contenu de la variable ou de l’entité à manipuler. Le type peut
En langage algorithmique En C
Variables Rayon, racine, périmètre, surface réel ; float Rayon, racine, périmètre, surface;
Variables Compteur, X, i, N : entier ; int Compteur, X, i, N ; char C ;
Variable C : caractère ;
Exemples :
Le nombre d’octets réservés dépend donc du type de la variable. Pour un float par exemple, on le met
sur 4 octets, un caractère dans un octet, ..etc.
les réels sont aussi représentés par le type qui veut dire double précision, qui se traduit également par
le double de l’espace réservé pour un float.
2.3.3 Constante
Une constante est une case mémoire elle aussi possédant une adresse mémoire identifiée par un
nom « identificateur » et contenant une valeur qui ne change pas du début jusqu’à la fin de
l’algorithme. L’écriture langage algorithmique est la suivante :
Constante Nom_Constante = Valeur
Amen Verdier M. 6
Exemples :
En langage algorithmique En C
Constante PI = 3.141592653589 Constante #define PI 3.141592653589
TVA = 19 #define TVA 19
Remarquer que la constante en informatique n’est pas une constante universelle, comme la gravité
ou la constante de Plank, mais une manière de laisser pour une certaine durée une valeur fixée à
l’avance. L’exemple de la TVA indique que cette valeur est fixée au moins pour une année. L’avantage
de la déclarer comme constante dans le programme est de ne pas avoir à changer toutes les valeurs
de la TVA à chaque fois que cette valeur change. Il suffit de revenir à la constante et la changer. Tout
cela pour dire qu’elle n’est constante que ne le suggère son adjectif.
Exemples :
x<y et z=0 expression comportant une conjonction.
99<100 expression qui fournit vrai.
99=100 expression qui fournit faux.
En langage C, la valeur « faux » est représentée par 0 et la valeur « vrai » est représentée par 1.
Valeur numérique entière pouvant être signée ou non signée (codée sur un ou plusieurs octets).
Exemples :
Constante g = 10 ;
Variables x,y : entier ;
Les opérations possibles sur les entiers sont :
Les opérations mathématiques : +,-,*, div (division entière ou euclidienne), mod (reste de la
division entière).
En C, le type entier peut être représenté par int ou short (sur 2 octets) ou long (sur 4 octets). De
plus ‘signed’ désigne les entiers relatifs.
Les valeurs numériques du type réel sont codées avec une mantisse (23 bits qui permet une
précision) et un exposant pour une variable réelle de type simple.
Constante g =9.8
Variables rayon , surface : réel ;
➢ Les opérations possibles sur les réels sont :
- Les operateurs: +, -, *,/
Amen Verdier M. 7
➢ Quelques fonctions prédéfinis sur les entiers/réels en langage algorithmique.
power (x, n) : x à la puissance n ; pour le carré , x * x est plus simple.
abs (n) : valeur absolue d’un entier n. sqrt (n) : racine carrée d’un nombre. trunc (n) :
la partie entière d’un nombre. round (x) : donne l’entier le plus proche (arrondi) d’un
nombre réel. sin(x) : sinus de x.
cos(x) : cosinus de x.
Expression arithmétique
L’ordinateur fait le calcul d’une expression dite arithmétique avant de faire l’affectation. Celle ci doit
suivre les règles (selon le langage) logiques de manipulation des nombres, les priorités sont données
aux parenthèses, puis les opérateurs eux même ont des règles de priorité entre eux. ‘/’ et ‘*’ sont
prioritaires par rapport aux ‘+’ et ‘-‘.
En C, nous retrouvons la fonction modulo %, ** est l’opérateur de puissance, si les deux valeurs sont
entières, la división / le será également. Inclure la bibliothèque math.h pour les fonctions
mathématiques usuelles.
Une chaine est une suite arbitraire de caractères du code ASCII, elle peut être formée de plusieurs
mots.
Constante université= ‘benbella’
Espace= ‘ ’
Variables Nom, prénom : chaine de caractères.
➢ Les fonctions prédéfinis sur les chaines :
- Long (chaine) : retourne la taille de la chaine.
- Concat (chaine1, chaine2): fournit une chaine obtenue par concaténation de la chaine c1 et c2,
c'est-à-dire rajouter à la fin de la chaine C1 la chaine C2. -Efface (ch,p,n) : efface n caractères
de ch à partir de la position p.
Amen Verdier M. 8
Important : En C, les chaînes sont implémentées par des tableaux de caractères se terminant
par le caractère spécial \0.
2.4.6 Types énumérés (non standard)
En plus des types standards, l’utilisateur a la possibilité de créer ses propres types pour les objets
qu’ils manipulent, ces types sont appelés types énumérés. Les types énumérés concernent des objets
pouvant prendre leur valeur dans une liste finie et ordonnée.
- Les mois de l’année (janvier, février...).
- Les couleurs (bleu,……..). - Les jours de la semaine.
- Les notes de musique.
- Les noms de cartes à jouer (as, roi, dame...). - Les marques de voiture.
- Les indications d’état civil (célibataire, marié, divorcé...).
Déclaration d’un type énuméré : On commence par le mot clé enum, suivi d’un identificateur qui
représente le nom du type.
Exemple :
enum nationalité ={Algérienne, Tunisienne, Nigérienne ,Chinoise } Variables N1, N2 : nationalité ;
enum couleur ={bleu, violet, rose ,vert }
Variables C1,C2 :couleur ;
Le langage C permet de faire une conversion forcée, mais elle est rarement utilisée.
<type> : expression ;
Exemples char A=16; int
B=4; float C;
C = (float)A/B; /* conversion forcée */
printf (" %f\n",C); } //le %f indique le type float, voir manuel de référence C
Amen Verdier M. 9
A ←A+1 ( également A =A +1 est accepté);
En C
En C nous écrivons A = A+1. Pour un mathématicien, cette écriture est impossible parce que
cela signifie que 0=1 ; l’égalité en informatique signifie qu’on évalue d’abord l’expression située à
droite de l’égalité, puis on affecte le résultat à gauche du signe ‘=’. C’est pour cette raison que des
langages tels que Pascal utilisent ‘:=’ pour l’affectation. Quant au test logique de l’égalité dans le vrai
sens mathématique, le langage C le représente par ‘==’.
Par conséquent, l’instruction a = (b==c) en ‘C’ a tout son sens, ‘a’ est une variable logique qui
reçoit le résultat d’un test logique (b = c ?).
Exemple 2 :
x←sin(x)+sin(y) ; delta←b*b-4*a*c ;
Q←k*(S/d)*(T1-T2) ;
Amen Verdier M. 10
Remarque : le %d, signifie qu’un entier sous forme décimal est saisi, on peut même préciser la taille
%4d sur 4 positions. Un %s signifie chaine de caractères On peut trouver sur le net ou dans les
manuels du langage C, l’ensemble des formats d’entrée sortie disponibles.
Voici un exemple de calcul séquentiel qui calcule les puissances d’un entier N
Exemple : Ecrire un algorithme qui Calcule et affiche N3, N6, N9
Astuce : transformer les puissances de N en noms de variables
Algorithme puissance
Variables N, N3, N6, N9 : entier ;
Debut
Ecrire ("donnez la valeur de N") ;
Lire (N) ;
N3 N*N*N ;
N6 N3*N3 ;
N9 N3*N6 ;
Ecrire (N," à la puissance 3 =", N3,N," à la puissance 6 = ", N6, N ," à la puissance 9 =" N9)
; Fin.
Dans cet exemple, remarquer l’utilisation des variables déjà calculées au fur et mesure pour ne pas
reprendre le calcul à zéro.
Un deuxième exemple concerne les instructions de lecture écriture :
Algorithme lecture
Variables nom, password : chaine ; Debut
Ecrire (‘introduisez votre nom’) ; Lire (nom) ;
Ecrire (‘Bonjour ’, nom) ;
Ecrire (‘introduisez votre mot de passe : ’) ;
Lire (password) ;
Si length (password) < 8 alors (‘ecrire mot de passe incorrect’) ; Fin.
Amen Verdier M. 11
2.7 La représentation d’un algorithme par un organigramme
Un organigramme est un schéma qui représente le séquencement logique des instructions
représentées par des rectangles. Un bloc d’instructions est donc une suite de rectangles superposés
et exécutés en série. Le test ou l’expression booléenne (que nous verrons au chapitre suivant) est
représenté par un losange. L’organigramme permet de visualiser le schéma du déroulement du
programme, cependant quand celui-ci est de grande taille, ce schéma devient vite complexe à
dessiner, c’est pour cette raison, il n’est utilisé que pour les débutants.
d é but
I =1
yes
I == 5
No
I = I+1
fin
ecrire ( « Bonjour »)
Dans cet exemple, la notion de boucle développée au chapitre 4 est bien visible, c’est un chemin
fermé dans l’organigramme.
2.8 La Traduction en langage C
Par la suite, à chaque fois qu’il y aura un code langage algorithmique nous donnerons sa transcription
en langage C dans un tableau à deux colonnes. La traduction est simple et repose sur la connaissance
de quelques bribes en anglais.
Le bloc « debut- fin » d’instructions sera délimité par des accolades { }. Les commentaires sont
introduits par les //, ou bien encadrés par /* commentaire */
Nous verrons également pour chaque instruction ou bloc, son équivalent en C. Le C étant un langage
compilé, il n’acceptera aucune erreur de syntaxe (oubli d’une accolade par exemple). Le programmeur
se conforme au template, c’est-à-dire au modèle type d’un programme pour qu’il soit exécuté,
notamment la présence de la fonction main ( ) ou programme principal, ainsi que des pré-directives de
compilations (les instructions # include).
Enfin pour terminer le chapitre donnons les étapes de construction d’un exécutable en utilisant
le compilateur C, disponible gratuitement sur le net (avec linux notamment). Le compilateur C produit
un programme en langage machine, donc exécutable sans passer par un interpréteur. Le processus
de compilation en C est la conversion d’un code compréhensible par l'homme (programme C) en un
code compréhensible par une machine (code binaire).
• Mettre un fichier contenant le code des fonctions (par exemple Fonct.c), un fichier contenant
l'entête des fonctions et les déclarations (Fonct.h) et un fichier contenant la fonction main
(Prog.c).
• Faire une compilation séparée avec option –c : gcc -c Prog.c Fonct.c, puis l'édition de liens avec
gcc Prog.o Fonct.o -o pp. (pp sera le fichier exécutable c’est-à-dire qu’il aura l’extension .exe
capable de s’exécuter directement)
Amen Verdier M. 12
• Sous windows, les boutons compiler, construire, exécuter .. du compilateur adopté font le travail
de manière automatique. La touche de raccourci Ctrl + F9 permet d’éxécuter un programme
C. Certains langages objets ne génèrent pas directement de l’exécutable mais du code objet ;
cela permet d’inclure et de construire des programmes plus complexes avec l’option ‘make
project’, puis le bouton Run.
Ecrire un algorithme qui calcule le volume V d’une sphère étant donné son rayon R , V = 4 R3.
Exercice 2.2
Ecrire un algorithme qui calcule et affiche la somme des n premiers entiers naturels, la somme est
égale à la division entière de n*(n+1) par 2.
Exercice 2.3
Ecrire un algorithme qui saisit le prix hors taxe d’une imprimante, le prix TVA et affiche le prix total.
Exercice 2.4
Exercice 2.5
Ecrire un programme C qui calcule la résistance équivalente à trois résistances R1, R2, R3 , dans les
cas suivants :
Exercice 2.6
Ecrire un programme C qui demande la saisie d’un entier et affiche sa valeur en base 8 et en base
16.
Exercice 2.7
Donner le type des informations suivantes : la marque d’un ordinateur, la capacité du disque dur, les
composants d’un ordinateur, la marque et les unités.
Corrigés
2.1
Algorithme sphère
Variables R, V : réel ;
Début
Ecrire (" Entrez la valeur du rayon de la sphère ") ;
Lire( R) ;
V ←4*3 .14*R*R*R ;
Ecrire(" Le volume de la sphère est " ,V ) ; Fin.
Amen Verdier M. 13
2.2
Algorithme somme
Variables n, S : entier;
Début
Ecrire ("introduisez une valeur :") ; lire(n);
S ← n*(n+1) div 2;
Ecrire (’La somme =’, S ) ; Fin.
2.3
Algorithme prix
Variables pht, TVA ,P : réels;
Début
Ecrire ("introduisez le prix hors taxe :") ;
Lire (pht);
Ecrire ("introduisez la TVA:") ;
Lire (TVA);
P←pht*(1+TVA) ;
Ecrire (’Le prix de l’imprimante =’, P ) ; Fin.
2.4
#include<stdio.h> /* ceci est appelée directive de pré-compilation, elle inclut la bibliothèque
stdio.h pour exécuter les fonctions de lecture écriture scanf et printf */
main()
{ int a, b, temp; printf("Donnez les 2
valeurs"); scanf("%d",&a); scanf("%d",&b);
temp=a; a=b; b=temp; printf("la nouvelle
valeur de a est : %d\n, la nouvelle valeur de
b est %d\n",a,b);
}
2.5
main() { double R1, R2, R3; printf("Introduisez les valeurs pour
R1, R2 et R3 :
"); scanf("%lf %lf %lf", &R1, &R2, &R3); printf("Résistance
en série : %f\n", R1+R2+R3); printf("Résistance parallèle :
%f\n", (R1*R2*R3)/(R1*R2+R1*R3+R2*R3)); return 0; }
2.6
int main(void)
{ int A ; printf("Introduisez un entier :"); scanf("%d
", &A); printf ("le nombre en base 8 :%o .\n", A);
printf("le nombre en base 16 :%x .\n", A); return 0;
}
2.7 : la marque d’un ordinateur : chaine de caractères, la capacité du disque dur :
en Go ou To (entier), les composants d’un ordinateur : de type énuméré ou liste,
la marque d’un produit : chaine de caractères
Amen Verdier M. 14
3 Les structures conditionnelles
3.1 Introduction
Tout d’abord, nous rappelons que les algorithmes sont répartis en 3 grandes parties : La séquence, la
sélection et l’itération.
Structures de contrôle
Dans le chapitre précédant, nous avons vu la séquence, ou les blocs d’instructions, dans ce chapitre
nous allons développer les instructions conditionnelles ou la sélection.
« Si tu réussis ton bac, tu pourras t’inscrire à l’Université », c’est pour cela que tu peux lire cet
ouvrage. L’exécution conditionnelle permet de faire deux choses différentes selon le cas qui se
produit. L’instruction ne sera exécutée que sous condition. Le programme teste une condition, si la
condition est satisfaite le programme traite le bloc concerné, dans le cas contraire, le programme
traitera un autre bloc ou pas. On distingue l’alternative réduite, complète et imbriquée (choix multiple).
On dit souvent à un enfant : si tu termines ta soupe, tu peux regarder la télé. Nuance, on ne lui dit
rien sur le cas contraire. De manière un peu plus méchante :
si tu termines ta soupe, tu peux regarder la télé, sinon….. Il existe trois classes
d’alternatives schématisées comme suit :
Sélection
Langage algorithmique En C
Amen Verdier M. 15
Exemple : algorithme qui calcule la racine d’un nombre en utilisant la fonction prédéfinie racine
carrée ( ).
Algorithme racine
Variable x : entier ;
Debut
Ecrire ("Saisir le nombre x :") ;
lire (x) ;
Si (x > 0) Alors r <-- racine
carrée(x) ;
Ecrire ("la racine de", x, " est", r) ; Fin si ;
Fin.
Langage algorithmique En C
Si condition Alors if condition
Bloc 1 d’instructions ; {
Sinon Bloc 1 d'instructions;
Bloc 2 d’instructions ; }
Fin s i E lse {
Bloc2 d'instructions;}
Vrai faux
Condition
Remarquer qu’avec trois cas ou situations possibles, deux ‘si’ sont suffisants pour les traiter, le
dernier cas est naturellement celui qui reste.
Exemple 2 :
Transformons l’algorithme de l’exemple précédent sur la racine carrée en rajoutant que l’algorithme
doit afficher un message « erreur réessayez » s’il y a erreur, on va utiliser la fonction prédéfinie
racine_carrée().
Algorithme racine
Variables x,r : entier ;
Amen Verdier M. 16
Debut
écrire ("donnez la valeur de x :") ; lire (x) ;
Si (x > 0) Alors r <-- racine
carrée (x) ;
écrire ("la racine de", x, " est", r) ; Sinon
écrire ("Erreur réessayez") ; // ici réessayer nécessite de ré exécuter Fin Si Fin.
Remarque : Le nombre de cas en choix simple est de deux, true et false selon la condition. C’est la raison
pour laquelle, on l’appelle condition booléenne ou logique. Il est donc clair que cette condition peut
prendre la forme d’une expression logique complexe combinant des OU et des ET, et dont la valeur finale
vaut true ou false.
On verra que dans ce cas, il vaut mieux utiliser les instructions de type ‘case’ ou switch, dites à choix
multiples. Exemple :
Cet algorithme affiche l’état de l’eau selon la température.
Algorithme température
Variable T: Entier ;
Début
Ecrire ("Entrez la température de l’eau :")
Lire(T) ;
Si (T<=0) Alors
Amen Verdier M. 17
Ecrire ("C'est de la glace") ;
Sinon
Si (T < 100) Alors
Ecrire ("C’est du liquide") ; Sinon
Ecrire ("C’est de la vapeur") ; Fin si ;
Fin si; Fin.
3.5 L’Instruction sélective le Si généralisé
On peut remplacer le Si généralisé par l’instruction selon Que (le case ou le switch).
Utiliser cette instruction lorsque le nombre de cas dépasse trois afin de ne pas s’embrouiller avec les
if ….else if…
En Langage algorithmique En C
Explication
Si condition 1 est vrai alors le bloc d’instructions 1 est exécuté et on quitte le selon.
Si condition 1 est fausse alors on passe alors à l’évaluation de Condition 2 et Ainsi de suite.
Certaines valeurs peuvent être oubliées, elles sont donc regroupées dans la dernière rubrique «
default ».
Le langage C offre l’instruction switch qui représente le « if généralisé », l’instruction default est
optionnelle. Exemple 1 :
Algorithme qui donne les jours d’un mois donné de l’année 2022
Algorithme nombre jours
Variables mois, nbrj : entier ;
Debut
Ecrire ("donnez un mois") ;
Lire (mois) ;
Selon mois vaut
2: nbrj28 ; 4,6,9,11:
nbrj30 ; default :
nbrj31; Fin selon
Ecrire (‘le nombre de jours est :’, nbrj) ; Fin.
Exemple 2 :
Amen Verdier M. 18
{ case algerienne : printf("Algérie" ) ; break ; case
tunisienne :printf("Tunisie" ) ; break ; case anglaise
:printf("Angleterre" ) ; break ;
Default : Exit (0);
}
}
On l’utilise souvent pour dialoguer avec l’user :
#include <stdio.h> main() { char c;
printf("entrez votre choix \n") ; printf("entrez
A, B ou C \n"); while ( c!='A' && c!='B' && c !=
‘C’) c=getchar(); // switch (c)
{ case 'A' : /* traitement dans le cas A */ break; case
'B' :/*traitement dans le cas B*/ break ; case 'C' :/*traitement
dans le cas C*/ break ;
}
L’instruction break en langage C permet de quitter un switch. Elle est également utilisée dans une
boucle afin de sortir de la boucle (ne plus aller jusqu’à la fin si une condition est vérifiée) et de passer
à l’instruction qui suit le bloc.
Astuce : pour une meilleure lisibilité de l’algorithme, décaler vers la droite l’écriture d’un nouveau bloc ou
un nouveau sinon de façon à mettre les ‘fin si’ sur la ligne en dessous du ‘si’ correspondant.
Ecrire un algorithme qui permet de résoudre une équation du 2 ème ordre en utilisant la structure à
choix multiples « Selon expressions ».
Exercice 3.2
Ecrire un algorithme qui détermine la valeur la plus grande de 3 réels. Exercice 3.3
Un magasin de matériels informatiques vend des Ardouino avec une TVA à 5% et des CPU Intel i7-
9700K à 6.5%. Écrire un programme qui introduit le prix hors taxe du matériel, saisit au clavier le type
Amen Verdier M. 19
du matériel et affiche le taux de TVA et le prix TTC du matériel, pour faciliter le programme, le
Ardouino se représente par le caractère « A », et le CPU par le caractère « C ».
Exercice 3.4
Écrire un programme en C qui lit deux nombres entiers a et b et donne le choix à l’utilisateur :
1. de savoir si la somme a + b est paire.
2. de savoir si le produit a*b est pair.
3. de connaître le signe de la somme a + b.
4. de connaître le signe du produit a*b.
Exercice 3.5
Les années bissextiles sont les années qui sont :
- Soit divisibles par 4 mais non divisibles par 100.
- Soit divisibles par 400.
Écrire un programme en C qui montre si une année donnée est bissextile.
Exercice 3.6
Écrire un programme en C demandant à l’utilisateur de simuler une calculatrice
Corrigés
3.1
Algorithme équation
Variables a, b, c, delta : entier ;
Début
Ecrire (‘introduisez les valeurs des coefficients : ‘) ;
Lire (a, b, c ) ;
Si a≠0
Alors delta ← b*b – 4 *a *c ;
Selon delta vaut
0 : Ecrire (‘la solution est :’,-b/ 2a ) ;
> 0 : Ecrire (‘les solutions sont:’,-b - √delta)/2a, -b + √delta)/2a ) ;
default : Ecrire (‘pas de solution ‘) ; Fin selon
Fin.
3.2
Algorithme maximun
Variables: x,y,z, max :réel ;
Debut
Ecrire("Tapez le 1er nombre:") ;
Lire(x) ;
Ecrire("Tapez le 2ème nombre:") ;
Lire(y) ;
Ecrire("Tapez le 3ème nombre:") ;
Lire(z) ;
Si (x>y) alors
max←x ;
Sinon max←y
;
Fin si
Si z> max
Amen Verdier M. 20
Alors max←z ;
Fin si
Ecrire ("Le plus grand nombre est:", max) ;
Fin.
3.3
int main(void)
{ float p, tva, ttc; char materiel; printf("Entrez le prix :
"); scanf("%f", &p); printf("matériel de type Ardouino ou
CPU ? "); getchar(); materiel = (char) getchar(); if
(materiel == ’A’) { tva = 2.5; } else
{ tva = 16.5; } ttc = prix * (1.0 + tva / 100.0); printf("Prix TTC :
%f et TVA vaut %.1f\n", ttc, tva); return 0; }
3.4
Programme C
#include<stdio.h>
#include<conio.h> int
main(void)
{ int a, b; char choix; printf("Entrez 2 valeurs :
"); scanf("%d %d", &a, &b); printf("Tapez\n");
printf("1 si la somme est paire\n"); printf("2
si le produit est pair\n"); printf("3 le signe de
la somme\n"); printf("4 le signe du produit\n");
getchar();
choix = (char) getchar(); switch (choix)
{ case '1':
if ((a + b) % 2 == 0) printf("La somme
est paire\n"); else printf("La somme est
impaire\n"); break; case '2':
if ((a * b) % 2 == 0) printf("Le produit
est pair\n"); else printf("Le produit est
impair\n"); break; case '3':
if (a + b >= 0) printf("La somme est
positive\n"); else printf("La somme est
négative\n"); break; case '4':
if (a * b >= 0) printf("Le produit est
positif\n"); else printf("Le produit est
négatif\n"); break; default:
printf("erreur...\n");
} return
0; }
3.5
main()
{ unsigned short annee; printf(”Saisissez une annee\n”);
scanf(”%hu”,&annee); if(annee % 400 == 0 || annee % 4 == 0 &&annee
% 100
!= 0 )
Amen Verdier M. 21
printf(”L'annee %hu est bissextile”,annee); else
printf(”L'annee %hu est non bissextile”,annee);
printf(”\n”);
}
3.6
#include<stdio.h>
#include<stdlib.h> #include<math.h>
main(){ float G, D, resultat; int
e=0; char operateur;
printf("Operande gauche:");
scanf("%f",&G); getchar();
printf("Operateur:");
scanf("%c",&operateur);
printf("Operande droit:");
scanf("%f",&D); getchar();
switch(operateur)
{ case '+' : resultat=G + D; break;
case'-' : resultat=G - D; break; case'/'
:resultat=G / D; break; case '*':
resultat=G * D; break; default: e=1;
} ; if(e) printf("erreur" ); else printf("%.2f %c
%.2f=%f\n",G,operateur, D);
}
Le nombre d’itération doit être fini : soit par une condition, soit par un compteur. Il existe trois
types de structures d’itérations : répéter, tant que, pour.
Amen Verdier M. 22
Itération s
Langage algorithmique En C
Répéter Do
/* instructions */ {
/* instructions */
Jusqu'à Condition } while (Condition)
Instructions
faux vrai
Condition
Instructions
Remarque : la vérification de la condition s’effectue après les actions. Celles-ci sont donc exécutées
au moins une fois.
Exemple :
Algorithme qui demande un nombre de départ, et qui calcule la somme des entiers jusqu’à ce nombre
(pour N>1). On souhaite afficher uniquement le résultat final, on va utiliser la boucle répéter par deux
fois.
Algorithme somme
Variables N, i, S: Entier ;
Debut
Ecrire ( "Entrez un nombre : ") ;
Répeter Lire (N) jusqu’à N>1; // précaution en cas de mauvaise saisie S← 0 ; i ←1 ;
repeter
Amen Verdier M. 23
S←S+i; i
← i+1;
jusqu’a (i=N) /* condition*/ fin
Ecrire ( "La somme est : ", S) ; Fin.
4.3 La boucle Tant que
Lorsque l’ordinateur rencontre cette structure :
• La condition est testée.
• Si la condition est fausse, l’instruction ou les instructions du bloc ne sont pas exécutées et on passe
aux instructions suivantes (après la structure de contrôle). • Si la condition est vraie, l’instruction ou
les instructions du bloc sont exécutées, répétitivement tout le temps où une condition est vraie. Il doit y
avoir un lien entre la condition et les instructions afin de changer la condition à un certain moment.
Remarques :
• La vérification de la condition s’effectue avant les actions. Celles-ci peuvent donc ne jamais
être exécutées.
• On déduit donc que le corps de la boucle « répeter » est executé au moins une fois
• Pour transformer une boucle while en do while, la condition est remplacée par sa négation.
En Langage algorithmique En C
Vrai Faux
Condition
Instructions
Suite Instructions
Amen Verdier M. 25
C’est équivalent à écrire : while (true) { }
Il faut faire en sorte que la condition change dans le corps de la boucle, sinon la condition restera
toujours vraie, et la boucle est dite infinie. Le programme ne s’arrête qu’après une interruption forcée
(Ctrl+Alt+Suppr).
Remarque :
En fait le nombre d’itérations dans une boucle pour n’est pas forcément connu pour le programmeur,
mais il l’est pour le compilateur. On peut par exemple
(voir tome2) faire un travail pour l’ensemble des arguments d’une fonction sans connaitre leur
nombre, ou bien comme dans l’exemple ci-dessous en python, faire pour un ensemble ou une liste :
for v1, v2 in zip( listA, litB) :
……………….
Compteur= vi
Faux
Compteur < Vf
Vrai
Instructions et
compteur =compteur+1
Langage algorithmique En C
Astuce : Les boucles ‘Pour’ sont très utilisées avec les tableaux à une ou deux dimensions, car l’indice sera
celui du tableau. Le parcours du tableau est fini et le traitement concerne tous les éléments.
Exemple : On reprend l’algorithme qui demande un nombre de départ, et qui calcule la somme des
entiers en utilisant la boucle pour.
Algorithme somme
Variables N, i, S : entier ;
Debut
Ecrire ( "Entrez un nombre : ") ;
Amen Verdier M. 26
Lire (N) ;
S←0;
Pour i de 1 à N faire
S← S + i ; fin pour
Ecrire ( "La somme est : ", S) ; Fin.
Pour i de 1 à n faire
Instructions ; Pour j de
1 à m faire
…………..
L’exercice le mieux indiqué pour comprendre les boucles imbriquées est celui du produit matriciel.
Si C (nxp) -de dimension n lignes et p colonnes- est la matrice résultat du produit des deux matrices
A(nxm) et B(mxp), trois boucles imbriquées sont comme suit dans le morceau de code suivant:
Pour i de 1 à n Faire
Pour j de 1 à p Faire
C[i,j] = 0 ;
Pour k de 1 à m Faire
C[i,j] = C[i,j] + A[i,k] * B[k,j];
Fpour ;
Fpour ;
Fpour ;
Enfin un bon exercice en langage C qui génére l’affichage suivant
1 ! = 1 x1 =1
2 ! = 1x2 =2
3 ! = 1 x2 x3 = 6
4 ! = 1 x2 x3 x4 = 24
……………………………
9 ! = 1 x2x 3 x……………..x 9 = 362880
# include <stdio.h>
main()
{ int i,j,f;
for(i=1;i<=9;i++)
Amen Verdier M. 27
{ f=1;
printf("%d!=1x",i); for
(j=2;j<=i;j++)
{
f=f*j;
if (j<i) printf("%dx",j);
}
printf("%d =%d \n",i,f); }
Exercice 4.1
Exercice 4.2
Deux entiers N, M sont dits amicaux si la somme des diviseurs de N (N non compris) vaut M et si la
somme des diviseurs de M (M non compris) vaut N.
Par exemple, 220 et 284 sont amicaux car :
220 est divisible par 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 et par 110
1+2+4+5+10+11+20+22+44+55+110=284
284 est divisible par 1, 2, 4, 71 et par 142, leur somme vaut 220, c’est à dire
1+2+4+71+142=220
Exercice 4.3
S= -
Exercice 4.4
Exercice 4.5
Exercice 4.6
Amen Verdier M. 28
Exercice 4.7
Exemple dans [1, 26], on élimine d’abord tous les entiers pairs, multiples de 2, au 2 ième passage les
multiples de 3 qui seront 9, 15, et 21 (car 6, 12 et 18 sont éliminés au premier passage), …etc.
Deux joueurs lancent un dé, le joueur qui a le plus grand résultat marque un point.
On arrête le jeu lorsque l’un des joueurs (le gagnant) atteint la valeur 12. Simuler ce jeu (par simple
lecture des valeurs à chaque itération) que l’on connait aussi sous le nom de jeu de l’oie.
Corrigés
4.1
Algorithme puissance
Variables p, x : reel ;
Début
p ←1 ; Pour i de 1 à n
faire p ←p*x ;
fin pour ;
4. 2
Algorithme nombres_amicaux
Variables i, N, M , S1, S2 : entiers ;
Début
Ecrire ( Entrez le 1er entier : ) ;
Lire(N) ;
Ecrire ( Entrez le 2ème entier : ) ;
Lire(M) ;
S1 0 ;
S2 0 ;
Pour i de 1 a N-1 faire
Si (N mod i) =0
Amen Verdier M. 29
Alors S1 S1+i;
Fin si ;
Fin pour ;
Pour i de 1 a M-1 faire
Si (M mod i) =0 Alors
S2 S2+i;
Fin si
Fin pour
Si (S1=M) et (S2=N) alors
Ecrire ( (N, M) sont des nombres amicaux )
Sinon
Ecrire ( (N, M) ne sont pas des nombres amicaux ) Fin Si ; Fin.
4.3
Algorithme suite
Variable S: réel ; i, n : entier ;
Début
Ecrire (‘donnez la valeur de n’) ;
Lire (n) ;
S0 ;
Pour i de 1 à n faire
Si i mod 2= 0 Alors SS+ 1/i;
Sinon SS- 1/i ;
Finsi ;
Fin pour ;
Ecrire(‘la somme est :‘ ,S) ; Fin.
Astuce: une meilleure solution est de prendre un entier j initialisé à 1, et devient de signe opposé à chaque
itération ( -j), cela évite de tester i mod 2 à chaque itération (ce qui est un appel de la fonction modulo à
chaque fois).
Amen Verdier M. 30
Répéter
Ecrire ("Entrez un chiffre");
Lire (X);
Si (X<0 ou X>9) alors
Ecrire ("erreur ") ; Sinon
Si (X>0 et X≤ 9) alors
NINV NINV+VD*X;
NN+1;
VD VD*10;
Fin si ;
Fin si ; jusqu’à
(X=0)
Ecrire ("La valeur du nombre renversé est : ", NINV) Fin.
4.5
Algorithme PGCD
Variable A, B : entier ;
Debut Répéter
Ecrire ("Entrer l'entier A ≠0 : ") ;
Lire (A) ;
Jusqu’à (A≠0)
Répéter
Ecrire ("Entrer l'entier B≠0: "); lire(B) ;
jusqu’à (B≠0)
Tant que (A≠ B) faire Si
(A>B) alors AA-B
;
Sinon BB-A ;
Fin si
Fin Tant que
Ecrire ("Le PGCD = " ,A) ; Fin.
4.6
include<stdio.h> main () { int i, pas, n, x ; double
puiss, fact, F, prod ; printf (“ donnez la valeur de x”) ;
scanf (“ %d”, &x) ; printf (“ donnez le degré ”) ; scanf (“
%d”, &n) ; for (F=1, prod=n, fact=1, puiss=1, pas=n, i=1 ;
i<=n ; i++)
{ puiss=puiss*x;
F= F + prod ∗ puiss/fact;
pas=pas-1 ; prod=prod*pas ;
fact=fact* (i+1);
}
printf (“ Le résultat de la fonction = %lf”, F) ;
}
Amen Verdier M. 31
Corrigé 4.7
Algorithme somme _p ;
Var i, j, S, S1, N : entier ;
Début
Lire (N);
S =0;
Pour i = 1 à N faire
S1 = i ;
Pour j 1 à i faire
S1 = S1 * S1 ;
Fpour;
S = S + S1 ;
Fpour ;
Écrire (“ la somme est =”, S);
Fin.
Corrigé 4.9
Algorithme jeu ;
S1 =0 ;
S2 =0 ;
Repéter
Sinon
fsi ;
Amen Verdier M. 32
5. Tableaux & chaines de caractères
5.1 Introduction
Si le nombre de variables -de même type- à traiter est important, il n’est pas adéquat de les
nommer X1, X2, ….Xn. Il serait intéressant de les rassembler dans une seule structure où chaque
variable sera accessible par son indice. Cette variable est un tableau unidimensionnel ou tableau
linéaire qui est une variable indicée permettant de stocker n valeurs de même type. Le nombre
maximal d'éléments précisé à la déclaration représente la dimension du tableau. Le type du tableau
est le type de ses éléments.
Dans un tableau tous les éléments sont homogènes de même type, La position d'un élément du
tableau s'appelle indice ou rang de l'élément. La dimension est le nombre d’éléments du tableau.
T
20 i=1→T[1]=20
12
i=2→T[2]=12
5
i=3→T[3]=5
T[1] …
………….
Exemple :
Type T=Tableau [1..10] de entier ;
Variable Tab :T ;/* T et Tab de même type*/
Syntaxe 2
nom [taille] : type des elements ;
T[n] : type des éléments;
Avec T: nom du tableau et n le nombre des éléments.
C’est la syntaxe 2 qui sera élaborée dans ce cours
Amen Verdier M. 33
Exemples :
Langage algorithmique En C
Tab[200] : Réel ; Float Tab[200] ;
Astuce : define est une macro de précompilation « # » elle servira à remplacer max par la valeur déclarée
dans toutes les occurrences de celle-ci avant la compilation du programme .
Les éléments d’un tableau sont des cases rangées successivement dans la RAM. Les éléments d’un
tableau sont numérotés par des indices. Par exemple, les éléments du tableau Tab déclarés ci-
dessous, qui comporte 10 éléments. Les indices sont schématisés en dessous du tableau : 1, 2, ... ,
10. Les éléments sont du tableau sont donc les valeurs 20, 30, …i.e le contenu de tab[1], tab[2],
tab[3]...
20 30 40 90 60 70 80 99 100 50
1 2 3 4 5 6 7 8 9 10
Tab désigne le nom du tableau (qui sera aussi l’adresse du premier élément).
L’élément d’indice 3 dans le tableau Tab est noté Tab [3].
Plus généralement, l’élément d’indice i dans le tableau tab est noté tab[i]. L’indice i doit
impérativement être un nombre entier positif ou nul, il peut aussi être représenté par une expression
arithmétique qui une fois calculée donne un entier.
Exemple 2 : Algorithme qui remplit les valeurs (2, 4, 6, 8, 10, 12, 14, 16, 18, 20) dans un tableau Tab.
Algorithme tableau
Début
Tab [10], i : entier; pour i de 1
à 10 faire
Tab [i] ← 2*i; // on pouvait sans boucle écrire tab[10] = {2,4,6,…} fin pour; Fin.
En langage C, nous avons signalé que les indices des éléments d’un tableau commencent à 0 et
non pas à 1. On verra par la suite que ceci est dû au fait que le nom du tableau désigne aussi
l’adresse du premier élément.
Amen Verdier M. 34
5.2.2 Saisie et affichage d’un tableau
Lecture
La lecture (saisie) d’un tableau, c’est le remplir, ceci nécessite l’utilisation d’une boucle. Pour un
tableau en général, il est préférable d’utiliser une boucle « pour » qui porte sur l’indice.
Lire (T[1]) →c’est introduire par le clavier la valeur 20 Lire (T[2]) →c’est
………
20 30 40 90 60 70 80 99 100 50
1 2 3 4 5 6 7 8 9 10
En Mémoire centrale, les adresses des cases du tableau se suivent (du moins pour les caractères ou
entiers).
Adresse mémoire valeur
T[0] 00001100 10
00001101 20
T[1]
00001010 30
00001011 40
……….
Ecriture :
L’écriture signifie l’affichage des valeurs qui ont été introduites à l’écran
En Algorithmique Implémentation en C
Pour i de 1 à 10 faire for (i=0; i<10; i++)
Ecrire (« la case »,i, « contient la printf ("la case %d contient la valeur
valeur », T[i]) Fin pour %d ", i, T [i]);
Amen Verdier M. 35
L’affichage à l’écran donnera (en exécution C)
La case 0 contient la valeur 20→T[0]
La case 1 contient la valeur 30→T[1]
La case 2 contient la valeur 40→T[2]
……………………………
Remarquer l’obligation de ‘<’ et non ‘<=’ car l’indice commence à 0.
4.3 Les Matrices ou tableaux à deux dimensions
Un calendrier, une table de multiplication, un bulletin de notes sont des exemples de tableaux à
deux dimensions. Vous avez peut être joué à la bataille navale ou utilisé Excel qui est un tableur. Le
principe est le même, nous avons besoin de deux indices pour accéder à l’information, celle-ci se
trouve à l’intersection d’une ligne et d’une colonne.
4.3.1 Définition
Une matrice est tableau à deux dimensions avec n lignes et m colonnes ; on parlera
de matrice carrée si n=m .
Colonnes 1,m
a 11 a 12 a 13 a a 1m
14 …..
Lignes 1, n
a 21 a 22 a 23 a a 2m
24 …..
a n1 a n2 a n3 a a
n4 ….. nm
On note généralement aij l’élément qui se trouve à la ième ligne et jème colonne où 0<i< =n et 0<j < =m.
Dans la figure précédente n représentera le nombre de lignes, m le nombre de colonnes, i est l’indice
pour les lignes et j l’indice pour les colonnes.
De la même façon, nous pouvons imaginer des tableaux à plusieurs dimensions (> 2), c’est le nombre
d’indices utilisés qui déterminera la dimension de celle-ci.
Syntaxe 1
On déclare une matrice à deux dimensions de la façon suivante :
Type Nom_Matrice = Tableau [nombre_lignes, nombre_colonnes ] de nom_type Variable nom Variable:
Nom_Matrice ;
Amen Verdier M. 36
Exemple
Langage algorithmique En C
Exemple :
Soit la matrice M [4,6] avec 4 lignes et 6 colonnes contenant des entiers naturels.
1 2 3 4 5 6
1 12 30 20 90 100 62
2 5 5 3 4 5 20
3 200 45 89 52 5 10
90 12 1 3 2 12
4
Amen Verdier M. 37
Ecriture Syntaxe
Pour i de 1 à n faire Pour j de 1 à
m faire
Ecrire (“la ligne“,i, “et la colonne “,j, “contient la valeur“, M[i,j]) ; Fin pour ;
Fin pour // on peut écrire aussi par abus fpour, fait, ou fpr Exemple :
Amen Verdier M. 38
4.4 Les Tableaux et chaines de caractères
Nom
b e n b e l l a \0 Nom[9] :caractère ;
Généralement, les tableaux de type caractère sont initialisés une
liste d’éléments du tableau fournis entre accolades.
Exemple :
Algorithme nom
Début
nom[20] : caractère; nom[] = { ‘I’, ‘G’, ‘M’ ,’O’ , ‘\0’ } ; /*
initialisation*/ Fin.
Amen Verdier M. 39
4.4.3 Tableaux de chaines
On peut définir des tableaux de caractères à plusieurs dimensions qui peuvent contenir des chaines
de caractères.
Exemple :
Algorithme jour Début
jour [7,9] : caractères ; jour [7, 9] = {”dimanche”, “lundi” , ”mardi” , ”mercredi” , ”jeudi” , ”vendredi”,
”samedi”, };
Ecrire (“Aujourd’hui c’est : ”, jour[2]);
Fin
Soit la matrice jour[7,9] j=1 j=2 j=3j=1 j=2
j=3 j=4 j=4 j=5 j=5 j=6j=6 j=7 j=8j=7 j=8 j=9j=9
i=1i=1 dd II mm aa nn cc hh ee \0\0 i=2 ll uu nn dd i i
\0\0 i=2i=3i=3 mm aa rr dd i i \0\0
i=4i=4 mm ee rr cc rr ee dd i i \0\0 i=5
jj ee
uu dd i i \0\0
i=5i=6 vv ee nn dd rr ee dd i i \0\0 i=6i=7 ss aa
mm ee dd i i \0\0 Enfin, on dit qu’un tableau
est trié si ses éléments sont classés par ordre
croissant (ou décroissant) ; cela facilite la
recherche d’un élément. Implémentation en C
#include<stdio.h> main()
{ char JOUR[7][9]= {"dimanche"}, "lundi", "mardi", "mercredi",
"jeudi", "vendredi", "samedi"} int i = 2; printf ("Aujourd'hui,
c'est %s !\n", JOUR[i]);
}
Les tableaux et matrices sont très utilisés en calcul numérique. Par exemple en exercice vous
pouvez calculer la valeur d’un polynôme de degré n en représentant ses coefficients dans un tableau
de même dimension. Des langages comme Matlab possèdent des fonctions intégrées qui manipulent
ces structures de données (produit scalaire, produit matriciel, inverse de matrice …)
Remarques
Les tableaux de chaînes sont mémorisés ligne par ligne. La variable JOUR aura donc besoin de 7*9*1
= 63 octets en mémoire. Il est possible d'accéder aux différentes chaînes de caractères d'un tableau,
en indiquant simplement la ligne correspondante.
Soit float t[]= {.6, .8, 9.8 }, on aura 3 flottants sachant que la taille d’un float simple en C est de 4
octets ce qui donne 3*4 octets .
Amen Verdier M. 40
4.5 Enoncés des exercices d’application
Exercice 5.1
Soit un tableau de n cases entières, écrire un algorithme qui somme les valeurs positives et négatives
de ce tableau. Exercice 5.2
Ecrire un algorithme qui affiche l’indice de la première occurrence d’une valeur x si elle existe sinon il
affiche -1.
Exercice 5.3
Ecrire un algorithme qui tri un tableau par ordre croissant.
Exercice 5.4
Ecrire un programme C qui inverse les éléments d’un tableau.
Option (non corrigé) permuter les éléments des deux diagonales en utilisant un seul indice. Exercice
5.5
Ecrire un programme en C qui sépare un tableau T en deux tableaux contenant respectivement les
éléments positifs et négatifs de T.
Exercice 5.6
Ecrire un programme C qui déclare une matrice, saisit les éléments de la matrice et additionne les
éléments de la matrice.
Exercice 5.7
Ecrire un programme C qui met à zéro les éléments de la diagonale principale d'une matrice carrée.
Exercice 5.8
Ecrire un algorithme qui fait la fusion de deux tableaux d’entiers triés par ordre croissant
Exercice 5.9
Soit une matrice M (nxm) de réels. On voudra créer un tableau T de n éléments où chaque élément est
la somme des éléments d’une ligne correspondante de la matrice : T[i] est la somme de la ligne i, pour
i allant de 1 à n. (Faire de même pour les colonnes dans un autre tableau P).
Corrigés
5.1
Algorithme tableau
T [50] : entier ;
Variables i, n, SP, SN :entier ;
Debut
Ecrire (“donnez la dimension du tableau<50“) ;
Lire (n) ;
SP0 ;
SN0 ;
Pour i de 1 à n faire
Ecrire (“donnez la valeur de la case [“,i, “]“)
Lire (T [i]) ;
Si (T [i]>=0) alors SPSP+T [i] ;
Sinon SNSN+T [i] ;
Ecrire (“La somme des valeurs positives est “, SP, “et la somme des valeurs
négatives est “, SN ) ; // en fait les valeurs nulles seront ajoutées avec les valeurs négatives
fpour ; Fin.
Amen Verdier M. 41
5.2
Algorithme recherche
Variables N, i, X, V[100]: entier
Début
Ecrire (‘donnez la dimension du tableau<100’) ;
Lire (N) ;
Pour i de 1 à N faire
Lire (V[i]) ;
Fin pour
Lire (X) ; /* saisie par le clavier de la valeur à chercher */ i←0 ;
Répéter
i=i+1 ;
jusqu'à i>N ou V[i]=X
/* on sort de la boucle soit la valeur a été trouvée soit le tableau a été parcouru jusqu’à la fin */
Si i=N+1 ;
Alors ecrire (-1) ; /* élément non trouvé */
Sinon ecrire (i) ; /* élément trouvé à la position i */ Fin si Fin.
Astuce : ici la boucle répéter ou tant que est mieux indiquée ; elle est utilisée pour arrêter la boucle dès
que l’élément est trouvé.
5.3
Algorithme tri T [100] :réel ;
variables N ,i,j: entiers ;
variable temp: réel ; Debut
Ecrire (‘donnez la dimension du tableau<100’) ;
Lire (N) ;
Pour i de 1 à N-1 Faire
Pour j de i+1 à N Faire
Si T[i] > T[j] alors temp←
T[i] ;
T[i]← T[j] ;
T[j] ← temp ;
Fin si ;
Fin pour; Fin
pour; Fin.
5.4
#include<stdio.h> main() { int T[50]; int N; int I,J; /* indices
courants */ int tmp; /* variable temporaire pour l’échange */
/* Saisie des données */
printf ("Donnez la dimension du tableau<50: "); scanf("%d", &N
); for (I=0; I<N; I++)
{ printf("%d : ", I);
scanf("%d", &T[I]);} /*
Affichage du tableau */
printf("affichage : \n"); for
(I=0; I<N; I++) printf("%d ",
T[I]); printf("\n"); /*
Inverser le tableau */ for (I=0,
J=N-1 ; I<J ; I++,J--)
Amen Verdier M. 42
/* Echange de T[I] et T[J] */
{ tmp =
T[I]; T[I] =
T[J];
T[J] = tmp;
} /* affichage */
printf("Tableau résultat :\n"); for
(I=0; I<N; I++) printf("%d ", T[I]);
printf("\n"); return 0;
}
Astuce : on pouvait aussi se passer de la variable j et faire l’échange de T[i] avec T[N-i+1]. 5 .5
#include<stdio.h> main() { int
T[50], P [50], N [50]; int N, NP,
NN; int I ;
/* Saisie des données */
printf("Dimension du tableau (<50) : "); scanf("%d",
&N ); for (I=0; I<N; I++)
{ printf("%d : ", I);
scanf("%d", &T[I]);
}
/* Affichage du tableau */
printf("Tableau donné :\n"); for (I=0;
I<N; I++) printf("%d ", T[I]);
printf("\n");
NP=0;
NN=0;
/* Transfer des données à partir de T*/ for (I=0; I<N;
I++)
{ if (T[I]>0) {
P [NP]=T[I];
NP++;
} if (T[I]<0) {
N [NN]=T[I];
NN++;
}
}//remarquer que les valeurs nulles sont ignorées
return 0; }
5.6
#include<stdio.h> main()
{
/* Déclarations */ Int M[50][50]; int L, C; /* dimensions
de la matrice */ int I, J; /* indices lignes et colonnes
*/ long SOM; /* somme des éléments */ /* Saisie des données
*/ printf("Nombre de lignes (<50) : "); scanf("%d", &L );
printf("Nombre de colonnes (<50) : "); scanf("%d",
&C ); for (I=0; I<L; I++) for (J=0; J<C; J++)
{ printf("[%d][%d] :
",I,J); scanf("%d", &M[I][J]);
}
Amen Verdier M. 43
/* Affichage du tableau */
printf("Tableau donné :\n"); for (I=0;
I<L; I++)
{ for (J=0; J<C; J++)
printf("%7d", M[I][J]);
printf("\n");
}
/* Calcul de la somme */ for (SOM=0, I=0; I<L; I++)
for (J=0; J<C; J++) SOM += M[I][J]; /*
affichage de la somme */ printf("Somme des éléments :
%ld\n", SOM); return 0;
}
5.7
#include<stdio.h> main()
{ int M[100][100];
int N; int I, J;
printf("donnez la dimension : ");
scanf("%d", &N); for (I=0; I<N; I++)
for (J=0; J<N; J++) { printf("[%d][%d] :
",I,J); scanf("%d", &M[I][J]);
} printf("affichage :\n");
for (I=0; I<N; I++)
{ for (J=0; J<N; J++) printf("%7d", M[I][J]); printf("\n");
} for (I=0; I<N; I++) M[I][I]=0; printf("affichage :\n");
for (I=0; I<N; I++) { for (J=0; J<N; J++) printf("%7d",
M[I][J]); printf("\n"); // on écrit new line fin de ligne
} return
(0);
}
5.8 L’hypothèse de tableaux triés est importante pour réaliser la fusion autrement cela aurait été
impossible. La méthode consiste à piocher les éléments dans le tableau qui contient les plus petits
éléments puis d’aller sur l’autre tableau et ainsi de suite. Le tableau T résultat contiendra la fusion
des deux de taille N1 et N2, les indices i, i1, et i2 pour les trois tableaux respectivement.
Début
i1 = 0; i2 = 0; i = 0 tant que i1 < N1 et
i2 < N2 faire si T1[i1] < T2[i2] alors
T[i] = T1[i1] ; i++; i1++ sinon
T[i] = T2[i2]; i++; i2++
Finsi ; fin
tant que
si i1 < N1 alors // fin du premier tableau, on prend tous les éléments du 2ième tant que i1 <
N1 faire T[i] = T1[i1]; i++; i1++ fin tant que sinon tant que i2 < N2 faire T[i]
= T2[i2]; i++; i2++ fin tant que
fin si Fin.
Amen Verdier M. 44
5.9
Algorithme calcul_somme_ligne
Const M=20, M=10 ;
Variables M[N,M], T[N], i, j : entier ;
Debut
Pour i = 1 à N faire
T[i]= 0 ;
Pour j= 1 à M faire
T[i] = T[i] + M[i,j] ;
Fpour ;
Fpour ;
Pour i= 1 à N //affichage du résultat
Ecrire (‘T[‘, i, ‘]= ‘, T[i]) ; Fpour ;
Fin.
Remarque : pour le vecteur P, faire la boucle sur j au lieu de i.
5 Les Enregistrements
5.1 Introduction
Les types vus jusqu’à présents sont dits standards car ils sont offerts dans la librairie du
langage de programmation. Qu’en est-il si on veut créer son propre type ? Ce nouveau type est
structuré, et composé alors de types standards ou de types déjà définis par l’utilisateur. On les appelle
aussi types personnalisés.
Ce type abstrait décrit en général en entité (telle que vue par les systèmes d’information). Un
étudiant par exemple est caractérisé par son nom, prénom, âge, Num_inscription, …Par opposition
aux tableaux, les composants des enregistrements ne sont pas nécessairement de même type. Ces
éléments qui composent un enregistrement sont appelés champs. On retrouve cette notion aussi en
bases de données, un enregistrement est une ligne de la table, et les champs sont les attributs. Les
enregistrements sont appelés structures, en analogie avec le langage C. Plus tard, ils seront à la base
de la construction des fichiers.
Quant à la structuration des données, XML est un bon exemple pour voir la hiérarchisation dans la
description des données. On doit comprendre aussi qu’un fichier de données est aussi un moyen de
communication entre deux programmes, où le premier programme génère des données qui seront
exploitées par le second.
5.2 Enumérations
Ce type a déjà été abordé au chapitre deux avec les types standards. Il permet d’éviter les erreurs de
saisie, notamment d’une chaine de caractères. Une énumération est un ensemble statique de valeurs
prédéfinies et ordonnées.
Nous écrivons :
Enum chiffre ={ zero =0, un, deux, trois, quatre, cinq, six sept, huit, neuf}
Dans ce cas les autres, constantes d’énumération prendront automatiquement les valeurs, 1, 2, …etc.
En langage algorithmique, on considère l’introduction d’un nouveau type Type enum {Dimanche,
Lundi, Mardi, Mercredi, Jeudi, Vendredi} semaine; Puis son utilisation en déclarant une variable de
ce type (ici jour).
Amen Verdier M. 45
semaine jour;
Nous pouvons utiliser classiquement cette variable dans une instruction switch pour voir ce que
l’on fait chaque jour de la semaine Switch (jour)
{ case dimanche : ….. ;
Case lundi : …
}
Nous verrons son utilisation dans la section suivante, celle des structures.
Contrairement aux tableaux où tous les éléments sont de même type, les enregistrements regroupent
des données pouvant être de types différents. Un enregistrement est un ensemble de paires
(nom_champ, type_champ) qui regroupe les données relatives à une même entité ou structure.
Déclarer un enregistrement nécessite de :
• Définir son nom.
• Définir les champs et leur type.
Langage algorithmique En C
Amen Verdier M. 46
Exemple 1
Type Etudiant = structure { Nom : chaîne ;
prénom : chaîne ;
âge : Entier ;
Champs
Email : chaine } ;
Etudiant
Exemple 2
En langage algorithmique En C
Exemple 4
Amen Verdier M. 47
5.3.2 Accès à un champ d’enregistrement
On accède à un champ d’enregistrement par un sélecteur de champ.
Le sélecteur d’un champ élémentaire de type simple champ d’un enregistrement nommé
Enregistrement est noté : [Link] (Le point indique le chemin d’accès) par Exemple : «
point.X « sélecteur du champ X dans la structure point de l’exemple précédent.
Des champs appartenant à des structures différentes, peuvent être homonymes c'est-à-dire, avoir le
même identificateur. Par exemple [Link] de l’exemple 1 et [Link] de
l’exemple 4 aucune confusion n’est possible entre les sélecteurs de champs. Dans certains langages,
le sélecteur est une flèche → (en C par exemple). Nous retrouvons aussi le sélecteur dans les
langages objet, c’est un moyen d’accéder aux propriétés ou méthodes de l’objet, c’est aussi un
facilitateur lors de l’écriture du programme, le compilateur nous affiche la liste des champs (ou
propriétés) disponibles une fois le sélecteur saisi.
Un enregistrement peut être imbriqué dans une autre structure, les champs d’un enregistrement
peuvent être de type enregistrement.
Amen Verdier M. 48
Nom Prénom date_naiss Notes
9 10 8 12.5 15 7 4 9.5 11 13
1 2 3 4 5 6 7 8 9 10
[Link] [2] =10. La valeur 10 est contenue dans la 2èmecase du tableau « Notes »qui représente le
4ème champ de la structure Etudiant.
Ainsi si on veut accéder au mois de naissance d’un étudiant, on utilise le sélecteur ( ‘.’) de manière
hiérarchique : E.date_naiss.m.
Amen Verdier M. 49
Il est à noter que les types présentés ici ne sont pas les seuls disponibles dans les langages. Chaque
langage présente ses propres types mais la plupart manipulent les types standards. Certains langages
offrent des types qui facilitent les manipulations de données. Ainsi le type intervalle qui précise les
bornes inférieures et supérieures ; Nous en donnons quelques-uns en python :
Le type ensemble set A = set ([‘vert’, ‘blanc’, ‘rouge’]).
Des fonctions prédéfinies permettent de savoir si un élément appartient à une liste (‘in’), de même
que des opérations ensemblistes peuvent être utilisées (union, intersection, différence, ..)
Le type liste qui est vu comme séquence dans laquelle on rassemble plusieurs éléments de données
dans une même unité. Comme en prolog, on reconnaitra la liste par les [ ]. Ces crochets sont réservés
aux tableaux dans les langages C et java. En Prolog, il n’y a pas de déclaration explicite de liste, le fait
d’écrire les [ ] signifie automatiquement qu’il s’agit d’une liste. Liste A = [ 1, 2, 3, 4, 5].
On pourra tester si un élément est dans une liste par la fonction ‘in’
De manière plus hiérarchisée, les tuples peuvent représenter des données complexes ( à l’image de
Xml)
Un_tuple = ( a,b, c, ( d, e), f ( g, ( h, i, j, k)))
Les dictionnaires sont aussi une structure de données intéressante formés d’une liste de paires
clé/valeur (comme un mot et sa définition). On peut par la suite rechercher une valeur particulière par
le nom et un index.
Mon_dico = {‘vert’ :1, ‘blanc’ :2, ‘rouge’ :3} Donc
mon_dico[‘blanc’] donnera la valeur 2.
Nous verrons dans les chapitres suivants les types structurés tableaux et enregistrements qui
permettent de regrouper plusieurs données de même ou différents types respectivement.
Amen Verdier M. 50
6.5
Type client=structure
{ nom : chaine ;
Prénom : chaine ;
Adresse : chaine ;
NC : chaine ;
e: chaine ; tel :
chaine ; S : réel }
B[200] :client ;
Algorithme banque
Variable n : entier ;
Variable ST,M :réel ;
Ecrire (‘donnez le nombre de clients :’) ;
Lire (n) ;
Pour i de 1 à n faire
Lire (B[i].nom, B[i]. Prénom, B[i]. Adresse, B[i].NC, B[i].e, B[i].tel, B[i].S) ;
Finpour ;
ST←0.0 ;
Pour i de 1 à n faire
ST ← ST+ E[i].S ;
Finpour;
Ecrire (‘le solde total est :’,ST)
M←ST/n ;
Ecrire (‘la moyenne du solde par client est :’,M) Finpour ; Fin.
Amen Verdier M. 51