Search for notes by fellow students, in your own course and all over the country.

Browse our notes for titles which look like what you need, you can preview any of the notes via a sample of the contents. After you're happy these are the notes you're after simply pop them into your shopping cart.

My Basket

You have nothing in your shopping cart yet.

Title: Livre ASD
Description: If you want to study the algorithm and data structure and c language then you are in the right place

Document Preview

Extracts from the notes are below, to see the PDF you'll receive please use the links above


Algorithmique et Programmation C
Cours et exercices corrigés

Dr Maher HENI
Mme Sonia GUERBOUJ





Formation d'ingénieur
Licence
Formation continue
BTS

Mheni & SGarbouje

Liste des ouvrages:
Dr: Maher HENI:
Routage orienté optimisation énergétique dans les réseaux sans
fil: Routage et efficacité énergétique dans les MANETs et les
WSN, Editions universitaires europeennes (Aôut -2013)

Mheni & SGarbouje

Algorithmique et
Programmation C
Cours et exercices corrigés

Dr Maher HENI
Mme Sonia GUERBOUJ

© Tous droits de reproduction, de traduction et d'adaptation
réservés pour tous pays
©Centre de Publication Universitaire, Manouba, 2015
B
...

This makes it hard to plan the day » Elwyn Brooks White

*******

«The world can develop only with the human imagination,
so you must try to imagine an idea that can change the world
or we'll just live and die and will be forgotten » Maher HENI

Mheni & SGarbouje

Avant propos
Cet ouvrage présente les algorithmes et structures de
données de base qu'on rencontre souvant en programmation
...

En effet, de ce langage, nombreux langages en dérivant et
aussi il est à la base de tous les systèmes d'exploitation
populaires
...
Ce livre s'adresse aux étudiants en licence
fondamentale et appliquée en informatique, aux élèves
ingénieurs, et à tous ceux qui souhaitent acquérir des bases
solides en algorithmique et programmation C
...



Le langage de programmation C

Un langage de programmation est l'intermédiaire entre
l'utilisateur humain et l'ordinateur
...
Ainsi, étant
donné qu'il est destiné à l'ordinateur, le langage de
programmation doit respecter une syntaxe stricte
...

Dans notre ouvrage nous présentons la traduction des
algorithmes en langage C
...

Nous avons aussi présenté quelques problèmes de
concours nationaux et des examens semestriels avec des
corrigés détaillés
...
Notion de programmation
Programmation

Un programme est une liste d’instructions bien
structurées qu’on exécute afin de répondre à un problème
...
Dans ce dernier cas, on parle de
programmation informatique
...
Selon la définition
précédente de programmation, on remarque qu’il existe une
grande similitude entre les termes « programme » et «
algorithme »
...
On emploie le terme « algorithme »
lorsque la séquence d’instructions est écrite en langage
algorithmique et fait abstraction d’un ensemble de détails
...


II
...
7

Mheni & SGarbouje

Dans cette étape, on doit spécifier les objectifs attendus
du programme
...

Etape-2: ANALYSE et CONCEPTION
Lors de cette étape, on analyse le problème et on
élabore la méthode de sa résolution
...

Etape-3: CODAGE
L’algorithme obtenu à l’issu de l’étape précédente est
traduit en un langage de programmation bien spécifique
...

Cette étape peut être l’étape la plus longue
...
Et au
fur et à mesure de son exploitation, on continue à le maintenir
c'est-à-dire à corriger les erreurs qui n’ont pas été détectées
auparavant et l’améliorer
...
e: Le mot compilation se traduit en algorithmique et en
programmation par la traduction d'un programme en langage
compréhensible par la machine dans un premier temps, puis
l'éxécuter dans un deuxième temps
...


p
...
Les variables :
Définition
Tous les langages de programmation sont basés sur la
manipulation de variables
...
Elle est identifiée par un nom et une adresse, c'est-àdire une zone mémoire dans laquelle on enregistre sa valeur
...
En plus, les
caractères spéciaux ne sont pas pris en compte sauf le tirait
bas "_"
...
9

Mheni & SGarbouje

Les constantes
Les constantes sont des valeurs de certaines grandeurs
qui ne changent jamais durant l’exécution du programme
...
Par convention, les noms des constantes sont écrits
en majuscule pour les différencier des variables dans le code
...
14
G = 10

const type_const
nom_const =
valeur_const ;

const float PI
= 3
...
Les types simples
Un type spécifie la liste des valeurs que peut prendre
une variable
...
En algorithmique on définit 5
algorithmique,
types de données simples :
- Type entier : les valeurs de l’ensemble « »
(l’ensemble des entiers relatifs) en mathématique
- Type réel : les valeurs de l’ensemble ℝ (l’ensemble
des réels) en mathématique

p
...
)
- Les chaines de caractères : les séquences de
caractères
- Le type logique ou booléen : les valeurs vrai et faux
...

1
...

Les opérations qu’on peut effectuer sur un entier sont :
+ : Addition
- : Soustraction
* : Multiplication
div : Division entière
mod : Modulo, le reste de la division
Et aussi les opérations de comparaison:
≠ : Différence
= : Egalité
< : Inférieur
≤ : Inférieur ou égal
> : Supérieur
≥ : Supérieur ou égal
2
...
En plus des opérations de comparaison, les
opérations qu’on peut effectuer sur un réel sont :

p
...
Le type caractère
Un caractère peut être un chiffre ou une lettre
aphabétique ou un caractère spécial
...
Les opérations qu’on peut
effectuer sur les caractères sont principalement des opérations
de comparaison utilisant le code ASCII (American Standard
Code for Information Interchange) de chaque caractère
...

Les principales opérations qu’on peut effectuer sur les
caractères sont :
≠ : Différence
= : Egalité
< : Inférieur
≤ : Inférieur ou égal
> : Supérieur
≥ : Supérieur ou égal
Le résultat de comparaison entre deux caractères est de
type booléen
...
Le type booléen
Une variable de type booléen peut prendre la valeur
« vrai » ou « faux »
...
Les opérations qu’on peut
effectuer sur les booléen sont :

p
...
Les types en langage C
La notion de type sert à déterminer le nombre d'octets
nécessaire en mémoire pour stocker une variable
...
Ce tableau
résume l’ensemble des types qui existent en langage C
...
13

Mheni & SGarbouje

147 483 647
unsigned
long int

Entier long non
signé

4

float

Flottant (réel)

4

double

Flottant double

8

long
double

Flottant double
long

10

0 à 4 294 967 295
3
...
4*1038
1
...
7*10308
3
...
4*104932

V
...

Elles expriment des calculs arithmétiques ou des relations
logiques
...
Expression arithmétiques :
Priorité
1
2
3
4

Opérateurs
Parenthèses : ( )
Puissance : ^
Multiplication et division : *, /, Div, Mod
Addition et soustraction : + et -

Les opérateurs de calculs sont organisés selon un ordre
de priorité afin d’éviter toute ambiguïté lors de l’évaluation
de toute expression
...


p
...
Expressions logiques :
Ce sont les expressions de comparaison (=, ≠, <, ≤, >,
≥,) pour les types réels, entiers et caractères mais aussi les
opérations logiques (ET, OU, NON) pour les booléens
...
Expressions en langage C :
Les expressions en langage C diffèrent de
l’algorithmique uniquement dans la représentation
symbolique des opérateurs qui les composent
...

Priorité

Classe
d’opérateur

1

Parenthésage

2

Multiplicatifs *, / ,%

Opérateur
()

Sens de
priorité
De gauche à
droite
De gauche à
droite

p
...
Les Instructions Simples
1
...
16

Mheni & SGarbouje

En algorithmique :

En langage C :

Variable ← Valeur

Variable = Valeur ;

Exemple :

Exemple :

a ←3

a=3;

b ←6+a

=> b contiendra 9

b=a+6;

La variable à droite doit avoir une valeur et doit être de
même type que la variable à gauche
...

Remarque
Le langage C, étant très riche, introduit des opérateurs
d’affectation qui ne sont pas utilisés en algorithmique
...

Opérateur

Signification

++

Incrémentation

--

Décrémentation

Exemple
int i=1 ;
i++ ;
int j=5 ;
j-- ;

i = i+1 ;
=> i vaut 2
j = j-1 ;

p
...
14 ;
initialisation
x+=PI ;
x = x+PI ;
=> x vaut 10
...
14

*=

Multiplication et
affectation

x *= PI ;
=> x vaut 21
...
229…

Modulo et
affectation

int j=5, i=2;
initialisation
j %= i ;
=> j vaut 1

%=

2
...
Ce message peut être un texte à
l’utilisateur ou un résultat
...
18

Mheni & SGarbouje

Pour afficher un message de type chaine de caractère
tel qu’il est sans modification, il doit être placé entre deux
guillemets, sans guillemets, la chaine sera interprétée comme
un nom de variable dont on affiche la valeur
...
h"
...
19

Mheni & SGarbouje

Cependant, pour afficher une variable, c’est un peu plus
complexe qu’en algorithmique, car la machine a besoin de
connaître le format d'affichage pour cette variable
...

Pour cela, le langage C possède des indicateurs de
format prédéfinis qui doivent être spécifiés entre guillemets
dans la fonction printf selon la syntaxe suivante :
printf ("format_variable", nom_variable) ;
Exemple :
printf ("Résultat= %f", moyenne);
printf ("Vous avez %i ans", age) ;
L’ensemble des indicateurs de format pour la fonction
prinft sont résumés dans ce tableau
...
20

Mheni & SGarbouje

%x

Hexadécimal

%ld

Long décimal, l'indication "l" est
aussi valable pour les autres
types

%5
...
Toutes ces fonctions ne
nécessitent aucun indicateur de format
...
Instruction de lecture
L'instruction de lecture (Lire) permet de lire une valeur
donnée par l'utilisateur
...

Exemple :
Ecrire ("Donner la valeur de x et y :")
Lire (x,y)

p
...
Cette fonction nécessite, comme la
fonction printf, qu’on lui spécifie entre guillemets le format
de la variable à lire, d’où la syntaxe suivante :
scanf ("format_variable", &nom_variable") ;
Exemple :
printf("Donner la valeur de x et y :") ;
scanf ("%i",&x) ;
scanf ("%f",&y) ;
Remarques
L'ordre d'exécution en algorithmique est
séquentiel instruction par instruction, ce-ci sera traduit en
langage "C" par un "point-vérgule ;"
Il est possible de faire la lecture de plusieurs
variables dans la même ligne, mais cela peut engendrer
des erreurs lors de l’exécution, surtout si l’utilisateur se
trompe
...

Les indicateurs de format pour scanf sont les
mêmes que pour la fonction printf et indiqués dans le
tableau précédent
...
La lecture d'une
valeur permet de la stocker mémoire, d’où le symbole

p
...
Si l’on oublie de mettre le symbole &,
la variable à lire ne sera pas modifiée par la valeur entrée,
et donc cette valeur sera perdue
...

Tout au long de ce livre, nous allons mettre le
point sur d'autres fonctions standards en algorithmique et
en langage C
...


VII
...
Structure d’un algorithme
La structure générale d'un algorithme est comme suit :
on commence par donner un nom à l'algorithme (bien sûr il
doit être significatif) suivi par l’ensemble des déclarations :
les constantes, les types puis les variables
...
), doivent être définis avant la déclaration des
variables (pour être utilisés)
...
Nous

p
...


Algorithme

nom_algorithme

Constantes

Types

Variables

...
24

Mheni & SGarbouje

Début
ch = "intéressant"
Ecrire ("Bonjour tout le monde, ce cours est ", ch)
Fin

2
...
Ces bibliothèques
contiennent les fonctions prédéfinies dans le langage et qui
seront utilisées dans le programme, telles que printf, scanf,
etc
...
Ensuite, le reste du programme est une
séquence de déclarations (types, constantes, variables) puis
d’instructions délimitées entre deux accolades et précédées
par le mot clé main qui signifie qu’il s’agit du programme
principal
...
25

Mheni & SGarbouje

/* inclusion des bibliothèques */
main ( )
{
/* déclarations */
/* instructions */
}

On remarque donc que le nom du programme n’est pas
mis à l’intérieur du code comme en algorithmique
...
c
...
o
...

Exemple :
#include ...
26

Mheni & SGarbouje

/* le caractère \n n’apparaît pas à l’écran il permet
de faire un saut de ligne */
}
Remarque :
Tout texte écrit entre /* et */ est un commentaire, il
n’est pas pris en compte lors de l’exécution
...
Exemple : //un commentaire

VIII
...

Traduire cet algorithme en programme C
...

Traduire cet algorithme en programme C
...

Traduire cet algorithme en programme C
...
27

Mheni & SGarbouje

Exercice 4:
Ecrire un algorithme qui lit les valeurs de a et b puis
affiche a à puissance b (ab)
...

N
...
h>

IX
...
c
#include ...
28

Mheni & SGarbouje

Exercice 2:
Algorithme cercle
Constantes
PI=3,14
Variables
p, s, r : réel
Début
Ecrire ("donner le rayon du cercle: ")
Lire(r)
p ← 2*PI*r
s← PI*r*r
Ecrire ("le périmètre est =", p , " et la surface =",s)
Fin
Programme cercle
...
h>
main(){
float p, s, r;
const float PI=3
...
29

Mheni & SGarbouje

Ecrire ("donner la longueur du rectangle:") lire(lo)
Ecrire ("donner la largeur du rectangle") lire(la)
Ecrire ("le périmètre =",2*(lo+la), "et la surface =",lo*la)
Fin
Programme rectangle
...
h>
main(){
int lo, la;
printf ("donner la longueur du rectangle:");
scanf("%d",&lo);
printf ("donner la largeur du rectangle:");
scanf("%d",&la);
printf ("le périmètre = %d et la surface =%d",2*(lo+la),
lo*la);
}

Exercice 4:
Algorithme Puissance
Variables
a, b: entier
Début
Ecrire ("donner un entier a:")
lire(a)
Ecrire ("donner un entier b:")
lire(b)
Ecrire ("a puissance b =", a^b)
Fin
Programme puissance
...
h>
#include ...
30

Mheni & SGarbouje

printf ("donner un entier a:");
scanf("%d",&a);
printf ("donner un entier b:");
scanf("%d",&b);
printf ("%d puissance %d = %f \n", a, b, pow (a, b));
}

p
...


Introduction

En programmation, on est souvent amené à exécuter
des instructions selon un choix précis d’où le besoin d’utiliser
des blocs conditionnels
...
Ceci est la notion de
traitement conditionnel
...

Exemple : Si l'utilisateur clique sur un bouton fermer,
la fenêtre se ferme et l'exécution s'arrête
...

• Structure conditionnelle multiple : avec laquelle on
peut choisir entre deux ou plusieurs traitements
...


Structure conditionnelle simple
En algorithmique
Si < Condition> Alors

Syntaxe


FinSi

En langage C
if ( Condition )
{

}

p
...


-

En langage C, les parenthèses sont obligatoires
pour délimiter la condition et les accolades peuvent
être omises quand on a une seule instruction
...

Solution:
/** En algorithmique*/
Algorithme Equation
Variables
a, b : réel
Début
Ecrire ("donner la valeur de a:")
Lire (a)
Ecrire ("donner la valeur de b:")

p
...
c
#include ...


Structure conditionnelle multiple

1
...

En algorithmique
Si < Condition> Alors

Syntaxe


Sinon

En langage C
if (Condition)
{

}

p
...

Solution :
/**En algorithmique */
Algorithme ValeurAbsolue
Variables
x : entier
Début
Ecrire ("Entrer un entier:")
Lire (x)
Si (x>0) alors
Ecrire (" la valeur absolue = ", x)
SiNon
Ecrire ("la valeur absolue = ", -x ")

p
...
c
#include ...
Forme imbriquée :
Cette forme est utilisée lorsqu’on a plus qu’une
condition (deux ou plusieurs)
...

En algorithmique

Syntaxe

En langage C

Si Alors
d'instructions>
Sinon Si
Alors
d'instructions>
Sinon Si <

if (Condition1)
{

}
else if (Condition2)
{
}
else if (Condition3)

p
...

Sinon
d'instructions>
FinSi
Si (salaire ≤ 5000) alors
impot 0
...
03
Sinon
impot 0
...

else
{ d'instructions> }

if (salaire <= 5000)
impot = 0
...
03;
else
impot = 0
...
L’algorithme doit
indiquer l'une des 3 réponses possibles (glace, liquide ou
gaz)
...
37

Mheni & SGarbouje

Si (T ≤ 0) Alors
Ecrire ("C’est de la glace")
Sinon
Si (T < 100) Alors
Ecrire ("C’est du liquide")
Sinon
Ecrire ("C’est de la vapeur")
FinSi
Fin

/**En langage C */
Programme EtatEau
...
h>
void main ()
{
int t ;
printf ("Entrer la température") ;
scanf ("%d", &t) ;
if (t<=0)
printf ("C’est de la glace") ;
else if (t<100)
printf ("C’est du liquide") ;
else
printf ("C’est de la vapeur") ;
}

3
...
Dans ce cas, on a recourts à une structure qui
traite les conditions une par une
...
38

Mheni & SGarbouje

des valeurs pouvant prendre le selecteur (variable), on traite
la liste des instructions correspandante:
En algorithmique

Syntaxe

Exemple

Selon faire
: liste 1
d'instructions
: liste 2
d'instructions
: liste 3
d'instructions

...
”)
FinSelon

En langage C
switch (sélecteur)
{
case :
; break ;
case :
; break ;
case :
; break ;

...

case 12 :
printf("Décembre");
break ;
default :
printf ("le numéro
du mois est erroné") ;
}

p
...
Pour un code plus compréhensible on
utilise la structure de choix
...
D’où, généralement cette
forme de choix est utilisée avec les sélecteurs de type
entier ou caractère
...
Si on l’oublie, après l’exécution des
instructions du cas sélectionné, les instructions de
tous les cas suivants sont aussi exécutées ! ceci
semble être une défaillance mais au contraire, elle
peut être utilisée à profit (voir l'exemple suivant)
...

/**En Algorithmique */
Algorithme NombreJours
Variables
mois : entier
Début
Ecrire (”Entrer le numéro du mois : ”)

p
...
h>
void main()
{
int mois ;
printf ("Entrer le mois en chiffre :") ;
scanf ("%i", &mois) ;
switch (mois) {
case 1, case 3, case 5, case 7, case 8, case 10, case 12 :
printf("31 jours") ; break ;
case 2 : printf ("28 ou 29 jours") ; break ;
case 4, case 6, case 9, case 11 : printf("30 jours") ; break ;
default : printf ("le numéro du mois est erroné") ;
}
}

IV
...
41

Mheni & SGarbouje

10 <=Moyenne < 12 passable
12<=Moyenne < 14 Assez Bien
14<=Moyenne < 16 Bien
16<=Moyenne < 18 Très Bien
18<=Moyenne <= 20 Excellent
Exercice 2:
Ecrire l'algorithme (et le programme c) en langage C qui
affiche la résistance équivalente à trois résistances R1, R2,
R3 (de type double) sachant que :
– si les résistances sont branchées en série : Rsérie =
R1+R2+R3
– si les résistances sont branchées en parallèle : Rparal =
R1× R2 × R3
R1× R2 + R1× R3 + R2× R3
Exercice 3:
Ecrire l'algorithme (et le programme c) qui permet de
résoudre dans R l'équation : ax²+bx+c=0
...
h
...


Correction

Exercice 1
/**En algorithmique */
Algorithme Mention
Variables
Moy : réel
Début

p
...
c
#include ...
43

Mheni & SGarbouje

printf ("Redoublant");
else if ((10 <= Moy) && (Moy < 12))
printf ("Passable");
else
if ((12 <= Moy) && (Moy < 14))
printf ("Assez bien");
else
if ((14 <= Moy) && (Moy < 16))
printf ("Bien");
else
if ((16 <= Moy) && (Moy < 18))
printf ("Très bien");
else
if ((18 <= Moy) && (Moy <= 20))
printf ("Excellent");
else
printf ("La valeur de la moyenne n'est pas valide"); }

Exercice 2
/**En algorithmique */
Algorithme Résistance
Variables
R1,R2,R3 : réel
Montage : caractère
Début
Ecrire ("donner R1") lire (R1)
Ecrire ("donner R2") lire (R2)
Ecrire("donner R3") lire(R3)
Ecrire("quel est le type de montage? S
si série et P si parallèle:") lire(Montage)
Si (Montage ='P') Alors
Ecrire ("Résistance parallèle="

p
...
c
#include ...
45

Mheni & SGarbouje

Exercice 3
/**En Algorithmique */
Algorithme Equation
Variables
a,b,c, delta:réel
Début
Ecrire ("donner a:") lire (a)
Ecrire ("donner b:") lire (b)
Ecrire("donner c:") lire(c)
delta←(b*b-4*a*c)
Si (delta =0) Alors
Ecrire (" une seule solution x1=x2=", -b/2*a)
Sinon
Si (delta>0) Alors
Ecrire ("deux solution x1 = ",
-b-sqrt(delta)/2*a,"et x2 = ",-b+sqrt(delta)/2*a)
Sinon
Ecrire ("pas de solution")
FinSi
Fin

/**En langage C */
Programme equation
...
h>
#include ...
46

Mheni & SGarbouje

scanf ("%f",&b);
printf ("donner c:");
scanf ("%f",&c);
delta = b*b - 4*a*c;
if (delta ==0)
printf (" une seule solution x1=x2=%f ", -b/2*a);
else
if (delta>0)
printf ("deux solutions x1 =%f et x2=%f ", -b-sqrt(delta)/2*a, b+sqrt(delta)/2*a);
else
printf ("pas de solution dans R");
}

p
...
Introduction
Prenons un exemple de programme dans lequel on
voudrait lire et traiter les notes de 20 étudiants
...
Ainsi, pour répondre à des
situations où un programmeur veut répéter plusieurs fois la
même liste d'instructions, il existe la notion de boucles
itératives
...
Boucle « pour
...
Le contrôle des itérations
est assuré par un compteur
...


p
...
En langage C, ce n'est pas le cas, on doit
toujours préciser le pas d'incrémentation
...


Syntaxe :
Pour < compteur> de à
[pas = p] Faire

En
algorithmique

Liste d'instructions
FinPour
for (compteur=Valeur_Init ;

En langage C

compteur<=Valeur_Fin;compteur++)

{
Liste d'instructions}

Principe de fonctionnement :
Le compteur prend au début la valeur initiale
...
On répète ce traitement jusqu'à ce que le

p
...
Dans ce cas, on sort de la
boucle sans exécuter les instructions
...

Exemple:
Ecrire un programme qui lit un entier n puis affiche sa
factorielle: n!=1×2×3×4…
...
50

Mheni & SGarbouje

f ←f * i
FinPour
Ecrire (n,”! = ”,f)
Fin
...
c :
#include ...
Boucle « Répéter
...
Sa particularité est que la liste
d’instructions à l’intérieur de la boucle est exécutée au moins
une fois
...
D’où, ce genre de
boucle est souvent utilisé pour les saisies conditionnées au
clavier
...


p
...

En langage C: c’est assez déroutant mais la condition
est inversée
...
Le fonctionnement est le
même, on exécute la liste d’instruction puis on teste
...


p
...
Dans ce cas, il faut faire
attention au nombre d'itérations et faire les bons choix
concernant la valeur d’initialisation, la condition d'arrêt
(choisir entre supérieur, supérieur ou égale, ou égale) et la
position de l’incrémentation du compteur (avant ou après le
traitement à répéter)
...

Exemple : On reprend l’exemple précédent
En algorithmique
i←1
Répéter
Ecrire (i*10)
i←i+1
Jusqu'à (i >5)

En langage C
i=1;
do
{
printf (" %d ", i*10) ;
i++ ;
} while (i <= 5) ;

Remarque :
Si l’on met " Jusqu'à (i=5)", on aura 4 itérations car
le cas où i =5 n'est pas inclus, et l’affichage s’arrêtera à 40
...
Si on se trompe en mettant i<5,
lorsque i=5 on sort de la boucle et l’affichage s’arrêtera à 40
...


p
...
×(n-1) × n
Solution:
/**En algorithmique */
Algorithme Factoriel2
Variables
n, f, i : Entier
Début
Répéter
Ecrire (”Entrer un entier positif : ”)
Lire(n)
Jusqu’à (n>=0)
f← 1
i← 1
Répéter
f← f * i
i← i + 1
Jusqu'à (i > n)
Ecrire (n,”! = ”, f)
Fin
...
c :
#include ...
54

Mheni & SGarbouje

printf ("Entrer un entier positif: ") ;
scanf ("%d", &n) ;
}while ( n<0 ) ;
i=1 ;f=1;
do{
f *= i ;
i++ ;
}while ( i<=n ) ;
printf ("%d ! = %d \n", n, f) ;
}

p
...
Boucle «Tant que…faire »
Cette boucle s’utilise aussi dans les cas où le nombre
d’itérations est inconnu mais elle se différencie de la boucle
"répéter jusqu'à" par le fait qu’aucun traitement ne doit être
effectué si la condition au début est fausse
...
56

Mheni & SGarbouje

Principe de fonctionnement :
La première chose à faire est la vérification de la
condition, lorsqu’elle n’est pas valide, on ne peut accéder à
l’intérieur de la boucle
...
Que ce soit avec ou sans un compteur, il
faut faire attention à ne pas oublier de modifier dans la boucle
toute variable qui figure dans la condition afin d’éviter les
boucles infinies
...
Puisque la vérification se fait au début, la
comparaison doit être non stricte (inférieur ou égale), si l’on
met i<5, lorsque i atteint 5, on sort de la boucle et 50 ne sera

p
...
Par ailleurs, attention à une erreur très
commune : il n’y pas de « ; » après while dans la boucle en
langage C
...
faire», sachant que n!=1×2×3×4…
...


/**En langage C */

p
...
c :
#include ...
Exercices d'application
Exercice 1:
Ecrivez un programme qui lit N nombres entiers au
clavier puis affiche leur somme, leur produit et leur moyenne
...
Le
nombre N est à saisir au clavier
...
faire»,
b) en utilisant la boucle «tant que
...
jusqu'à »
...
59

Mheni & SGarbouje

Exercice 2:
Calculez XN par multiplications successives sachant
que X et N sont deux entiers naturels saisis au clavier
...
+
2 3
N

Exercice 4:
Calculez le Nième terme UN de la suite de
FIBONACCI sachant que :
UN=UN-1 + UN-2 (pour
N>2)
U1=1 et U2=1

Exercice 5:
Ecrire un algorithme (et le programme c) qui
détermine tous les nombres premiers inférieurs à un entier n
donné au clavier
...
60

Mheni & SGarbouje

Commun Diviseur) en utilisant la méthode euclidienne
suivante :
– Si A = B ; PGCD (A, B) = A
– Si A > B ; PGCD (A, B) = PGCD (A–B, B)
– Si B > A ; PGCD (A, B) = PGCD (A, B–A)
Exemple :
PGCD(18,45)=PGCD(18,27)=PGCD(18,9)=PGCD(9,9)=9
Exercice 7:
Ecrire un algorithme (et le programme c) qui calcule
le PPCM (Plus Petit Commun Multiple) de 2 entiers A et B
en utilisant la méthode suivante :
– Permuter, si nécessaire, les données de façon à ranger dans
A le plus grand des 2 entiers ;
– Chercher le plus petit multiple de A qui est aussi multiple
de B
...

Exercice8 : nombres parfaits
Un nombre parfait est un nombre présentant la
particularité d’être égal à la somme de tous ses diviseurs, sauf
lui-même
...

Ecrire un algorithme (et le programme c) qui affiche tous les
nombres parfaits inférieurs à 1000
...
61

Mheni & SGarbouje

VI
...
62

Mheni & SGarbouje

Ecrire ("donner N:")
lire (N)
Tant que (i≤N)faire
Ecrire ("donner un entier")
lire (x)
S←S+x
P←P*x
i←i+1
FinTQ
Ecrire( "la somme est ",S,"le produit est ", P, "la moyenne
est ",S/N)
Fin

/**Algorithme avec boucle Répéter jusqu'à */
Algorithme nbr3
Variables
i,N,x,S,P:entier
Début
S←0
P←1
i←1
Ecrire ("donner N:")
lire (N)
Répéter
Ecrire ("donner un entier")
lire (x)
S←S+x
P←P*x
i←i+1
Jusqu'à(NEcrire( "la somme est ",S,"le produit est ", P, "la moyenne
est ",S/N)
Fin

p
...
c
#include ...
c
#include ...
64

Mheni & SGarbouje

P=P*x;
i++;
}
printf( "la somme est %d le produit est %d la moyenne est
%f\n", S, P, S/N);
}

/**programme C avec boucle do
...
c
#include ...
65

Mheni & SGarbouje

Exercice 2
/**En algorithmique */
Algorithme Puissance
Variables
X, P : Réel
N, i : Entier
Début
Ecrire(”Entrer la valeur de X : ”) lire(X)
Ecrire(”Entrer la valeur de N : ”) lire(N)
P←1
Pour i de 2à N Faire
P←P * X
FinPour
Ecrire(X,” à la puissance ”,N,” = ”,P)
Fin
...
c
#include ...
66

Mheni & SGarbouje

printf ("%f à la puissance %d = %f \n", x, n, p);
}

Exercice 3
/**En algorithmique */
Algorithme Somme_Inverse
Variables
n, i : Entier
s : Réel
Début
Ecrire(”Entrer la valeur de n : ”) Lire(n)
s←0
Pour i de 1 à n Faire
s←s + 1/i
FinPour
Ecrire(”s = ”,s)
Fin

/**En langage C */
Programme Somme_Inverse
...
h>
main(){
float s;
int n,i;
printf ("Entrer la valeur de n :");
scanf("%d",&n);
s=0;
for (i=1;i<=n;i++)
s=s+1/i;
printf ("somme= %f \n", s);
}

p
...


/**En langage C */
Programme Fibonacci
...
h>
main(){
int n,i, u0,u1,u;
printf ("Entrer le nombre de termes à calculer:");
scanf("%d",&n);
U0=1;U1=1;
printf ("U0 = %d U1 = %d ",U0,U1);
for (i=2;i<=n;i++)
{

p
...
c
#include ...
69

Mheni & SGarbouje

main(){
int n,i,j,nb_div;
printf ("Entrer la valeur de n :");
scanf("%d",&n);
for (i=1;i<=n;i++)
{
nb_div=0;
for (j=1;j<=i;j++)
if (i % j ==0)
nb_div++;
if (nb_div<=2)
printf ("%d ", i);
}
}

Exercice 6
/**En algorithmique */
Algorithme PGCD
Var
a, b : Entier
Début
Ecrire(”Entrer la valeur de a : ”) Lire(a)
Ecrire(”Entrer la valeur de b : ”) Lire(b)
Répéter
Si (a > b) Alors
a ←a – b
FinSi
Si (b > a) Alors
b ←b - a
FinSi
Jusqu'à (a = b)
Ecrire(”PGCD = ”, a)

p
...
c
#include ...
71

Mheni & SGarbouje

b←x
FinSi
i ←1
TantQue (((i*a) Mod b) <> 0) Faire
i ←i + 1
FinTQ
Ecrire(”PPCM = ”, i*a)
Fin

/**En langage C */
Programme PPCM
...
h>
main()
{ int a,b,i,x;
printf ("Entrer la valeur de a :");
scanf("%d",&a);
printf ("Entrer la valeur de b :");
scanf("%d",&b);
if (a{ x=a; a=b; b=x; }
i=1;
while (((i*a) % b) !=0)
i++;
printf ("PPCM =%d\n", i*a);
}
Exercice 8

/**En algorithmique */
Algorithme Parfaits
Variables

p
...
c
#include ...
73

Mheni & SGarbouje

Fonctions et procédures
L'idée des fonctions et procédures est de diviser un
programme en petits blocs, tel que chacun fournit un résultat
précis ou effectue une fonctionnalité bien déterminée
...
L'écriture d'un tel
programme dans un seul bloc rend la manipulation et la
maintenance du programme très délicat
...
On peut alors penser à un sous programme auquel
on fournit les 2 ou 3 notes et qui renvoie directement la
valeur de la moyenne, ça minimise la taille du programme et
ça facilite la manipulation
...


I
...


p
...


Algorithme
affichage
Début
Ecrire
("Bonjour
tout le monde")
Fin

Procédure message()
Début
Ecrire ("Bonjour tout le
monde")
Fin
Algorithme affichage
/*programme principale*/
Début
message()
Fin

Le compilateur commence toujours par exécuter le
programme principal (algorithme principal)
...

Dans le cas d'une procédure paramétrée, on doit
fournir dans l’entête de la procédure les paramètres effectifs
(soit des variables contenant des valeurs ou des valeurs) pour

p
...

Paramètre formel

Procédure message (n : entier, ch: chaine)
Variables:
i: entier
Début
Pour i de 1 à n faire
Ecrire (ch)
finPour
Fin
/* le programme suivant affiche le message
"ch" un certain nombre de fois choisi par
l'utilisateur*/
Algorithme affichage
Variables
x: entier
c: chaine
Début
Ecrire ("donner un nombre")
Lire(x)
Ecrire ("donner la chaine que vous
désirez afficher")
Appel de la procédure avec
Lire(c)
paramètre effectif
message(x,c)
Fin

p
...
B: Lors de l'appel il faut respecter l'ordre, le nombre et le
type des paramètres
...
Une variable locale est déclarée dans un sousprogramme (fonction ou procédure) et ne peut être utilisé que
dans ce sous-programme
...

Exemple:
• i : est une variable locale dans la procédure message
...


p
...
Il faut
différencier entre les paramètres donnée, paramètres résultat
et paramètres donnée-résultat
...

Quant aux paramètres résultat, ce sont des variables dans

p
...

N
...

En langage C, il faut placer un * devant les paramètres
formels données-résultat et résultat dans l’entête de la
procédure pour prendre en compte les modifications
...

Exemple:
Procédure produit
entier, var c: entier)
Début
c ←a × b

(a,b: Procédure produit (a,b,c:
entier)
Début
c ←a × b
Fin
Algorithme
résultat
Fin
Algorithme
résultat
Variables:
Variables:
x, y, z: entier
x, y, z: entier
Début
z←1
Début
z←1
Ecrire ("donner les
Ecrire ("donner les
valeurs de x et y)
valeurs de x et y)
Lire(x,y)
Lire(x,y)
Produit(x,y,z)
Produit(x,y,z)
Ecrire ( "le produit

p
...
h>
void produit (int a, int b, int
*c)
{
*c= a*b ;
}
void main()
{ int x, y, z=1 ;
printf ("entrez x et y") ;
scanf("%i",&x) ;
scanf("%i",&y) ;
produit (x, y, &z) ;
printf("le produit de %i et %i =
%i", x, y, z) ;
// z change de valeur et contient
le produit x×y
}

#include ...
80

Mheni & SGarbouje

N
...
Le pointeur est une variable qui
contient l'adresse mémoire dans laquelle est enregistrée la
valeur pointée
...
L'instruction *c= a*b ; permet
de placer dans la zone mémoire dont l'adresse est dans c la
valeur a*b
...
(Voir chapitre les pointeurs)
Exercice:
Ecrire une procédure qui permet de permuter deux entiers a et
b
...
c

p
...
Les fonctions:
Une fonction est une procédure particulière qui permet de
retourner un seul résultat
...
Il faut indiquer aussi le type de
retour pour cette fonction, c'est à dire celui de son résultat
...


p
...
) :
type_résultat
Variables
Debut
Liste des instructions de la
fonction
Nom_de_la_fonction←résultat
Fin
En langage C type_résultat Nom_fonction (param_frml1:
type1, param_frml2:type2…
...
83

Mheni & SGarbouje

/**En algorithmique */
Algorithme Fonction_Max
Variables:
x,y,z:entier

Entête de l'algorithme dans lequel on
déclare les types, les variables et les
constantes en plus du nom de
l'algorithme

Fonction Max (a,b:entier):entier
Début
Si(aMax←b
Sinon
Max←a
FinSi
Fin

Cette partie contient
les déclarations des
fonctions et
procédures à utiliser
par l'algorithme

Début
Ecrire ( " Entrez un entier ") Lire (x)
Ecrire ( " Entrez un entier ") Lire (y)
z←Max(x,y)
Ecrire("le max entre",x,"et",y,"est",z)
/**on peut afficher directement
sans utiliser z:*/
Ecrire("le max entre",x,"et",y,"est",Max(x,y))
Si(Max(x,y)>0) Alors
Ecrire ("le max entre les deux entiers
est positif")
FinSi
Fin

Cette partie est le
corps principal
de l'algorithme
contenant les
instructions entre
autre appels des
fonctions et
procédures

p
...
h>
// fonction maximum
int maximum (int a, int b)
{ if (areturn (b) ;
else
return (a) ;
}
// programme principal
void main()
{
int x, y, z ;
printf ("Entrez un entier") ;
scanf ("%i", &x) ;
printf ("Entrez un entier") ;
scanf ("%i", &x) ;
z = maximum(x,y) ;
printf ("Le maximum entre %i et %i est %i", x, y,
z) ;
// on peut afficher directement sans utiliser z
printf ("Le maximum entre %i et %i est %i", x, y,
maximum(x,y)) ;
if (maximum(x,y)>0)
printf ("le maximum entre les deux entiers est
positif");
}

p
...
Exercices d'application :
Exercice 1 :
a) Ecrire une fonction qui saisit un entier et renvoie VRAI s'il
s'agit d'un numéro de mois
...

c) Ecrire une procédure qui vérifie si le numéro d'un mois et
celui d'une année passés en paramètre sont correctes et
affiche l'âge (année et mois) utilisant la date d'aujourd'hui
...

Exercice 2 :
a) Ecrire une fonction qui retourne le prix final d'un produit
acheté après la remise accordée
...

c) Ecrire un algorithme qui demande à l'utilisateur de fournir
le prix, la remise en pourcentage et aussi la TVA en
pourcentage et affiche le prix à payer en utilisant les
fonctions précédentes
Exercice 3 :
a) Ecrire une procédure "saisie" qui permet de saisir un entier
composé de 3 chiffres
...


p
...

Un entier naturel de trois chiffres est dit cubique s'il égal à la
somme des cubes de ses trois chiffres
...

d) Ecrire un algorithme qui utilise la procédure saisie pour
lire un entier E entre 100 et 999 puis affiche si E est cubique
ou pas
...
Exp
...

Exemple : les nombres sont : 5,11,2,7,4,8,3 ==> moyenne
olympique = (5+7+4+8+3)/5=5,4
Ecrire un algorithme permettant de saisir N réels (5 ≤ N ≤ 20)
distincts et d’afficher leur moyenne olympique en utilisant
une procédure et une fonction
...
Correction
Exercice 1 :
a)

p
...
88

Mheni & SGarbouje

c)
/**En algorithmique */
Procédure age(mm:entier, aa:entier)
Début
Si(verif_mois(mm)ET chiffres_4(aa))alors
Ecrire ("votre age est ", 2014-aa ,"ans et", 12-mm,"mois")
SiNon
Ecrire("l'année de naissance ou le mois est erroné")
FinSi
/**En langage C */
void age (int mm, int aa)
{
if (verif_mois(mm) && chiffres_4(aa))
printf("votre age est %d ans et %d mois \n",2015-aa, 12mm);
else
printf("l'année ou le mois de naissance est incorrecte \n");
}
Exercice 2 :
a)
/**En algorithmique */
Fonction PrixTTC(prixHT: réel, taxe:réel):réel
Début
PrixTTC ←prixHT + (prixHT*taxe)/100

p
...
90

Mheni & SGarbouje

Début
Ecrire ("donner le prix de l'article") lire (prix_i)
Répéter
Ecrire ("donner le pourcentage de taxe")
lire (p_Taxe)
Jusqu'à((1<=p_Taxe ET p_Taxe <=100))
Répéter
Ecrire("donner la remise en pourcentage")
lire(p_remise)
Jusqu'à ((1<=p_remise ET p_remise<=100))
Prix_f← PrixTTC (prix_i,p_Taxe)
Prix_f← Prix_Remise (prix_f,p_remise)
Ecrire("le montant à payer est", Prix_f,"dinars")
Fin
/**En langage C */
Programme PrixFinal
...
h>
main (){
float prix_f,prix_i,taxe,remise ;
printf("donner le prix de l'article");
scanf(%f",&prix_i);
do {
printf("donner le pourcentage de taxe");
scanf(%f",&taxe);
} while (taxe<1 || taxe>100);
do {
printf("Saisir le pourcentage de remise");
scanf(%f",&remise);

p
...
3f DT", prix_f);
}
Exercice 3
/**En algorithmique */
Procédure Saisie (var e : entier)
Début
Répéter
Ecrire ("Entrer un entier à 3 chiffres :")
Lire (e)
Jusqu’à (e< 1000 ET e>99)
Fin
/**En langage C*/
void saisie (int *e)
{
do {
printf("Entrer un entier à 3 chiffres :");
scanf(%d",e);
} while (e>999 || e<100);
}
b)
/**En algorithmique */
Procédure Extraire (e : entier, var u : entier, var d : entier,
var c : entier)

p
...
93

Mheni & SGarbouje

int cubique (int e)
{
extraire (e, &u, &c, &d);
if (e==c*c*c+d*d*d+u*u*u)
return 1;
else
return 0;
}
d)
/**En algorithmique */
Algorithme EntierCubique
Variables
E : entier
Début
Saisie(E)
Si (Cubique (E)) alors
Ecrire ("L’entier est cubique")
SiNon
Ecrire ("L’entier n'est pas cubique")
FinSi
Fin
/**En langage C*/
Programme entierCubique
...
94

Mheni & SGarbouje

if (cubique(n))
printf("L'entier %d est cubique",n);
else
printf("L'entier %d n'est pas cubique",n);
}
Exercice 4 :
/**En algorithmique */
Procédure Saison (M : entier)
Début
Selon (M) faire
12, 1, 2 : Ecrire("Hiver")
3, 4, 5 : Ecrire("Printemps")
6, 7, 8 : Ecrire("Eté")
9, 10, 11 : Ecrire("Automne")
Sinon : Ecrire ("Entrer un entier entre 1 et 12")
FinSelon
Fin
/**En langage C */
void saison (int M)
{
switch (M){
case 12: case 1: case 2: printf ("hiver");
case 6: case 7: case 8: printf ("été");
case 3: case 4: case 5: printf ("automne");
case 19: case 10: case 9: printf ("printemps");
default: printf ("entrer un entier entre 1 et 12");
}}

p
...
96

Mheni & SGarbouje

s←s+x
FinPour
Moy← (s / (n-2))
Fin
Algorithme MoyenneOlympique
Variables
N : entier
Début
Saisie (N)
Ecrire ("La moyenne olympique = ", Moy(N))
Fin
/**En langage C*/
void Saisie(int *n)
{
do {
printf("Entrer le nombre de réel :");
scanf(%d",n);
} while (n<5 ||n>20);
}
float Moy (int n)
{ int i;
float x, s, min, max;
printf("Entrer un réel :");
scanf(%f",&x);
s = x;
max =x;
min = x;
for (i=2;i<=n;i++)

p
...
98

Mheni & SGarbouje

Les chaines de caractères
I
...
z), un chiffre (0
...
etc
...
etc
...

Lorsqu’elle ne contient aucun caractère, elle est appelée
chaine vide
...


II
...

Ainsi ch[i] désigne le caractère numéro i dans la chaine
...
99

Mheni & SGarbouje

III
...
Concaténation
C'est l'assemblage de deux chaînes utilisant l'opérateur "+"
...
100

Mheni & SGarbouje

2
...

La comparaison se fait caractère par caractère de
gauche à droite, selon le rang des caractères dans la liste du
code ASCII
...


IV
...


Procédures standards

En algorithmique nous avons 3 procédures qui
permettent d'effacer une partie de la chaine, insérer une
chaine dans une autre ou convertir un autre type en une
chaîne de caractères
...
101

Mheni & SGarbouje

ch1 contient "AZIZA"
V←5468
convch(V,ch1)
ch1 contient "5468"

Convch(v, ch)

2
...
Fonctions prédéfinies en langage C :

<,<=,>,>=,#,=

Le tableau suivant contient les fonctions prédéfinies
en langage C pour les chaînes à partir du fichier bibliothèque
string
...
102

Mheni & SGarbouje

Fonction
strlen(ch)
strcat (ch1, ch2)
strncat (ch1, ch2, n)

strcmp ( chaîne1,
chaîne2 )

Rôle
Retourne la longueur de la chaine
ch
Recopie la chaine ch2 à la suite de
ch1
Recopie n caractères de ch2 à la
suite de ch1
compare deux chaînes et fournit
une valeur entière:
- positive si chaîne1 > chaîne2
- nulle si chaîne1 = chaîne2,
- négative si chaîne1 < chaîne2
...
103

Mheni & SGarbouje

strncmp ( chaîne1,
chaîne2, lgmax )
stricmp ( chaîne1,
chaîne2 )
strnicmp ( chaîne1,
chaîne2, lgmax )

procède comme strcmp mais elle
limite la comparaison au nombre
maximal de caractères indiqués
par lgmax
...


strncpy ( ch1, ch2,
lgmax )

procède comme strcpy, en
limitant la recopie au nombre de
caractères précisés par lgmax

strncpy (“xxxxxxxxx”,
”bonjour”, 6);
bonjouxxx

recherche, dans chaîne, la
première position où apparaît le
caractère mentionné
...
Elle fournit donc la
dernière occurrence du caractère
mentionné
...
104

Mheni & SGarbouje

Convertit la chaine en nombre de
type int
...

Convertit la chaine en nombre de
type double
...
543”) ;

V
...

Exercice 2 :
Une chaîne de caractère est dite palindrome si elle est
symétrique et donc se lit de la même manière de gauche à
droite et vice versa
...

Ecrire une procédure (en algorithmique et en programmation
C) qui affiche si une chaine donnée en paramètre est un
palindrome ou pas
...


p
...

Exercice 5 :
Ecrire une procédure (en algorithmique et en programmation
C) qui saisit une chaîne formée uniquement par des chiffres
(entre 0 et 9)
...

Exp : 1er mot : pamplemousse
2ème mot : fruit
3ème mot : pfarmupiltemousse
Exercice 7 :
Soit une chaîne de caractères composée de lettres et chiffres
...


p
...
Correction
Exercice 1 :
Algorithme MotPlusLong
Variables
ch1,ch2,ch3:chaine
Début
Ecrire ("Saisir la première
chaine :")
Lire (ch1)
Ecrire
("Saisir
la
deuxième chaine :")
Lire (ch2)
Ecrire
("Saisir
la
troisième chaine :")
Lire (ch3)
Si (long(ch1)>long(ch2)
et long(ch1)>long(ch3))
alors
Ecrire ("Mot plus long =
",ch1)
FinSi
Si (long(ch2)>long(ch3) et
long(ch2)>long(ch1)) alors
Ecrire ("Mot plus long =
",ch2)
FinSi
Si (long(ch3)>long(ch1) et
long(ch3)>long(ch2)) alors
Ecrire ("Mot plus long
=",ch3)

Programme MotPlusLong
...
h>
#include ...
107

Mheni & SGarbouje

FinSi
Fin

Exercice 2 :
Procédure Palindrome
(mot: chaine)
Variables
i,L : entier
Début
L←Long(mot)
i←1
Tant que ((i<= l div
2) et mot[i]=mot[L-i1]) faire
i← i+1
FinTQ
Si (i=(L div 2)+1)
alors
Ecrire(mot,"est
palindrome")
Sinon
Ecrire
(mot,"n'est
pas palindrome")
FinSi
Fin

Programme Palindrome
...
h>
#include ...
108

Mheni & SGarbouje

Exercice 3 :
Algorithme ConcatChaine
Variables
ch1,ch2,ch3:chaine Début
Ecrire ("Saisir la première
chaine :")
Lire (ch1)
Ecrire ("Saisir la deuxième
chaine :")
Lire (ch2)
Ecrire ("Saisir la troisième
chaine :")
Lire (ch3)
ch1←ch1+ch2
ch1←ch1+ch3
Ecrire ("Mot obtenu =", ch1)
Fin

Programme ConcatChaine
...
h>
#include ...
c
#include ...
h>
int occurence(char ch*, char c)
{
int i,nb=0;
for (i=0;iif (ch[i]==c)

p
...
110

Mheni & SGarbouje

Exercice 5 :
Procédure numérique (var
ch: chaine)
Variables
i, nb : entier
Début
répéter
Ecrire ("Saisir une
chaine :")
Lire (ch)
nb←0
Pour i de 0 à Long(ch)-1
faire
Si (ch[i]>= '0' ET ch[i]<= '9')
alors
nb←nb+1;
FinSi
FinPour
jusqu'à (nb=long(ch))
Fin

Programme numérique
...
h>
#include ...
c
chaine, ch2:chaine)
#include ...
h>
Variables
i,j,L1,L2 : entier
void alternance (char ch1[20],
s:chaine
char ch2[20])
{ char s[20];
Début
L1←long(ch1)
int i,j,L1,L2;
L2←long(ch2)
L1 = strlen(ch1);
j←0
L2 = strlen(ch2);
Si (L1>L2) alors
j = -1;

p
...
c
#include ...
h>
void extraire (char ch[20])
{ char s[20];
int i,j,n1,n2;
j=-1;
for (i=0;i
p
...
113

Mheni & SGarbouje

Les Tableaux
I
...
Dans ce cas, il faut utiliser une vingtaine de variables
nommées de x1, à x20 afin de manipuler toutes ces valeurs
L'idée des tableaux est d'attribuer un seul nom à cette
vingtaine de valeurs, Tnotes, par exemple
...
Les indices
des cases commencent (obligatoirement) de 0 et finissent à
nombre des notes moins 1
...

Si nous voulons, maintenant, enregistrer les trois
notes pour les 20 étudiants; note du test, note du DS et note
de l'examen afin de calculer les moyennes de la matière
...
Ce type de tableaux est appelé matrice
...
On peut accéder
à la note de DS(deuxième ligne) du 8èmeétudiant (8ème

p
...

En résumé : On distingue seulement deux types de
tableaux; les tableaux unidimensionnels ou vecteurs (une
seule ligne), dans lequel on enregistre des valeurs accessibles
directement par leurs indices T[i]
...
Les indices sont de type entier
...
Tableau unidimensionnel
1
...
19] de réels
Variables:
Tab1,Tab2: TabNote

Typedef float TabNote[20]
Void main(){

...
}

Remarque:
Pour accéder à l'ième valeur du tableau on place l'indice
(le numéro) de la case entre crochets devant le nom du
tableau Tab1[i]
...
115

Mheni & SGarbouje

Les indices doivent être de type entier
...

2
...


Affichage d'un tableau unidimensionnel
L'affichage des éléments d'un tableau se fait en
parcourant le tableau comme dans la procédure suivante:
En algorithmique
En langage C
Procédure afficher(T : Tab, void afficher (int T[], int n)
n :entier)
{
Variables
int i ;
i : Entier
for (i=0 ;iprintf (" | ",T[i]) ;
Début
Pour i de 0 à n-1 Faire
}
Ecrire(T[i])

p
...


Recherche d'un élément dans un tableau
a
...

b
...
La recherche dichotomique consiste à
découper successivement la structure du tableau en deux, à

p
...
On reproduit le même processus jusqu’à trouver
l’élément ou jusqu’à ce que l’intervalle ne contient qu’une
case
...

Ind
Tab

0
1

1
3

2
5

3
6

4
7

5
8

6
9

7
11

On effectue une comparaison entre l’élément du milieu de la
table d’indice 7 div 2 = 3 et l’élément du milieu, c'est-à-dire
Tab[3]=6
...
2], et on reproduit le même
processus : identification du milieu 3 div 2 = 1, puis
comparaison de x et Tab[1]
...
0], et on reproduit la
recherche 0div 2 = 0, puis on vérifie Tab[0]

p
...

Illustration de la recherche de la valeur x= 10
...

0
1

1
3

2
6

3
6

4
7

5
8

6
9

7
11

La valeur recherchée est plus grande, on poursuit la recherche
dans la partie droite de la table [4
...
Identification du
milieu : (7+ 4) div 2 = 5, puis on vérifie Tab[5] et x=10
...
7]
...

0
1

1
3

2
6

3
6

4
7

5
8

6
9

7
11

La valeur recherchée est plus grande, on poursuit la recherche
dans la partie droite de la table[7
...
Nouveau milieu : (7 +
7) div 2 = 7, puis on vérifie Tab[7] et x=10
...
119

Mheni & SGarbouje

0
1

1
3

2
6

3
6

4
7

5
8

6
9

7
11

Le tableau où l'on doit faire la recherche étant une seule case
qui ne contient pas la valeur recherchée, donc celle-ci
n’existe pas dans la table
...
120

Mheni & SGarbouje

Si (trouve = Vrai) Alors

}

Ecrire(”Indice = ”,mlu)
Sinon
Ecrire(”Elément
introuvable”)
FinSi
Fin

p
...


Les algorithmes de tri

En programmation, il existe divers algorithmes de tri, on peut
citer:
- Algorithme de tri à bulle
- Algorithme de tri par sélection,…
a
...

En algorithmique

En langage C

Procédure Echange(Var a,b void Echange (int *a, int *b)
{
: entier)
int aux = a ;
a=b;
Variables:
b = aux ;
Aux : entier
}
Début
void Tri_Bulle (int T[])
Aux←a
{
a←b
int i, x ;
b←Aux
int permut ;
Fin
do{
Procédure Tri_Bulle (Var T
permut =0;
: Tab)
for (i=0 ; iVariables
if (T[i] > T[i+1])
i, x : Entier
{

p
...
Tri par sélection
C'est le plus direct des algorithmes de tri, il permet de
chercher la valeur minimale dans le tableau, la placer dans la
case numéro 0, puis considérer le reste du tableau (on
écartant la case numéro 0) et on répète la procédure avec le
reste du tableau et ainsi de suite jusqu'à la dernière case
...
123

Mheni & SGarbouje

1

2

3

6

4

7

1

2

3

4

6

7

1

2

3

4

6

7

En algorithmique

En langage C

Procédure Tri_Selection(Var T :
Tab)
Variables
i, j, x, indmin : Entier
Début
Pour i de 0à (n-2) Faire
indmin ← i
Pour j de (i+1) à n-1 Faire
Si (T[j] < T[indmin])
Alors
indmin ← j
FinSi
FinPour
Echange(T[i], T[indmin])
FinPour
Fin

void Tri_Selection (int T[])
{
int i, j, x, indmin ;
for (i=0 ; i{ indmin = i ;
for (j=i ; jif (T[j] < T[indmin])
indmin = j ;
Echange(T[i],
T[indmin]) ;
}
}

III
...
Plus précisément, chaque ligne est un
m colonnes (j ∈ [1, m])

p
...
Pour accéder à une valeur, on doit
indiquer les deux indices de la ligne et de colonne
...
Ainsi T[3,5] désigne l'élément à la 3ème
ligne et 5ème colonne
...
Déclaration d'un Tableau bidimensionnel:
En algorithmique

En langage C

Syntaxe

Types
Mat = tableau [1
...
m] de typedef Mat
[nbLigne][nbColonne] ;
type_valeurs
void main(){
Variables:

...
4][ 0
...

Mat M1,M2;

...
Remplissage d'un tableau bidimensionnel
En algorithmique
En langage C
Procédure remplir(Var M : Mat)

void remplir(int M[][])

p
...
B: les deux tableaux sont supposés être
de même dimension)
...
126

Mheni & SGarbouje

FinPour
Fin
Exercice:
Ecrire un algorithme (et le programme C) qui permet de
calculer le produit de deux tableaux bidimensionnels
...
127

Mheni & SGarbouje

En algorithmique

En langage C

p
...
Exercices d'application
Exercice 1 :
Un ingénieur en météo a enregistré les températures
maximales et minimales dans la région de Nabeul pendant les
12 mois de l’année 2010
...

Ecrire un algorithme (et le programme C) qui saisit au clavier
les deux tableaux Tmax et Tmin puis remplit le tableau Tmoy
à partir des 2 tableaux précédents
...
129

Mheni & SGarbouje

Une société agroalimentaire a demandé l’avis de 100
consommateurs à propos de l’un de ses produits sur le
marché (ils l’aiment ou non)
...

Ecrire une procédure qui permet de saisir le tableau des
réponses par l’utilisateur puis calcule et affiche le
pourcentage voulu
...

Exercice 4 :
24 est un nombre entier divisible par son chiffre de dizaine 2
...

Exercice 5
Soit M1 et M2 deux matrices à n lignes et m colonnes
...

Example:

p
...

1
M1

2
5

6

2
M2

5

3

3

3

4

0

1

Données

3
M3

7

6

7

5

7

résultat

Exercice 6 : Produit de deux matrices
Soit M1 une matrice ayant n lignes et m colonnes
M2 une matrice ayant m lignes et p colonnes
On veut écrire une procédure qui calcule les éléments de la matrice
carrée M3=M1*M2
...

Le produit M3=M1*M2 est défini comme une matrice ayant n
lignes et p colonnes et dont les éléments sont calculés par la
formule :
M3i,j= M1i,1 * M21,j + M1i,2 * M22,j +……+ M1i,m * M2m,j
Soit M 3 i , j =

m

∑ M1
k =1

i,k

* M 2k, j

Où M1i,k , M2k,j et M3i,j sont respectivement les éléments des
matrices M1, M2 et M3
...
131

Mheni & SGarbouje

1
M1

4

2
0

2

3
M2

5

1

3

0

1

11
donnent M3=

13

13

24

4

Exercice 7 : Transposé d’une matrice carrée
Une matrice carrée est une matrice à n lignes et n colonnes
...

On veut écrire une procédure qui calcule la transposition d’une
matrice carrée M
...

i + j −1

p
...
Nmax-1][ 0
...
Nmax][ 1
...
Ecrire une procédure itérative saisie (Var N : Entier) qui
permet la saisie de la taille N avec 2 ≤ N ≤ Nmax
...
Une procédure itérative remplissage (Var A : TAB_1 ; N :
Entier) qui permet le remplissage du tableau A
...
133

Mheni & SGarbouje

3
...

i + j −1

4
...

5
...


Exercice 9
Les points cols d’une matrice M sont les éléments du M qui sont
maximum sur leur ligne et minimum sur leur colonne, ou minimum
sur leur ligne et maximum sur leur colonne
...


Ainsi pour chaque élément M[L][C] on vérifie l’une des deux
conditions indiquées ci-dessous
...
134

Mheni & SGarbouje

Travail demandé :
On utilisera la constante Max et le type MAT définis par :
CONSTANTE MAX=100
TYPE MAT = TABLEAU [0
...
MAX-1] REEL
1) Ecrire une procédure LECTURE (VAR NBL, NBC : entier)
qui permet de lire le nombre de lignes et le nombre de colonnes
avec (10 ≤ NBL ≤ MAX et 10 ≤ NBC ≤ MAX)
...

3) Ecrire une fonction MAX_LIGNE (M : MAT ; L, NBC :
entier) : réel, qui permet de retourner le maximum de la ligne L
...

NBC : le nombre de colonnes
...

6) Ecrire une fonction MIN_ COLONNE (M : MAT ; C, NBL :
entier) : réel, qui permet de retourner le minimum de la colonne
C
...
135

Mheni & SGarbouje

NBC : le nombre de lignes
...

8) Ecrire un algorithme POINTS_COLS qui permet de :
- Saisir deux entiers NBL et NBC (10 ≤ NBL ≤ MAX et
10 ≤ NBC ≤ MAX),
- Remplir la matrice M de dimension (NBL x NBC) par des
réels (NBL : nombre de lignes, NBC : nombre de
colonnes),
- Utiliser la fonction VERIF_POINTCOL pour chercher et
afficher tous les points cols du matrice M
...
Correction
Exercice 1
Algorithme Température
Variables
Tmin, Tmax, Tmoy : tableau
[0
...
c
#include ...
136

Mheni & SGarbouje

minimale :")
Lire (Tmin[i])
Tmoy[i] ← (Tmax[i] + Tmin[i])/2

FinPour
Fin

printf ("Entrer la température
minimale :") ;
scanf ("%f",&Tmin[i]);
Tmoy[i]= (Tmax[i] + Tmin[i])/2;

}
}

Exercice 2
Types:
Tab_booleen: tableau[0
...
137

Mheni & SGarbouje

Fin
Exercice 3
Types
Tab_entier: tableau[0
...
138

Mheni & SGarbouje

Variables
d, i : entier
Début
n←0
Pour i de 0 à 99 faire
d ← i div 10
Si (i mod d=0) alors
n ← n+1
T[n] ← i
FinSi
FinPour
Fin
Exercice 5 :

int d,i;

Constantes
N=50
M=50
Types
mat: tableau [0
...
M]de entier
Procédure somme (m1, m2 :
mat , var m3 :mat)
Variables
i , j:entier
Début
Pour i de 0 à N-1 faire
Pour j de 0 à M-1 faire
m3[i][j]← m1[i][j]+ m2[i][j]
FinPour
FinPour
Fin

void somme (int m1[][], int m2[][],
int m3[][], int n, int m)
{
int i,j;

*n = 0;
for (i=1;i<100;i++)
{
d = i/10;
if (i % d == 0)
{
t[n] = i;
*n ++;
}}
}

for (i=0;ifor (j=0;jm3[i][j] = m1[i][j]+ m2[i][j];
}

p
...
N][0
...
M][0
...
N][0
...
140

Mheni & SGarbouje

Fin
Exercice 7
Constantes
N=50
Types
mat: tableau [0
...
N]de entier

void transpose (int m[][], int
tm[][], int n)
{
int i,j;

Procédure transpose (m:mat ,var tm :mat) for (i=0;ifor (j=0;jVar iables
i , j:entier
tm[i][j] = m[j][i];
}
Début
Pour i de 0 à N-1 faire
Pour j de 0 à N-1 faire
TM [i][j]← M[j][i]
FinPour
FinPour
Fin
Exercice 8
1)
Procédure saisie (var N: entier,
void saisie(int *N, int NMAX)
NMAX:entier)
{
do {
Début
printf ("Entrer un entier entre 2 et
Répéter
Ecrire ("donner un entier N, avec %d :", NMAX);
2=scanf(%d",N);
Lire (N)
} while (N>NMAX || N<2);
Jusqu'à (N>=2) et (N<=Nmax)
}
Fin

p
...
142

Mheni & SGarbouje

Procédure construction (var C :
TAB_2 ; A, B : TAB_1; N: entier)
Variables
i , j:entier
Début
Pour i de 0 à N-1 faire
Pour j de 0 à N-1 faire
C [i][ j]←A[i][ j]
C [i][ j+N]←B[i][ j]
FinPour
FinPour
Fin

void construction (float C[][],
float A[][], float B[][], int N)
{ int i,j;
for (i=0;ifor (j=0;jC[i][j]= A[i][j];
C[i][j+N]=B[i][j];
}

5)
Procédure affiche (var C : TAB_2 ;
N: entier)
Variables
i , j:entier
Début
Pour i de 0 à N-1 faire
Pour j de 0 à 2*N-1 faire
Ecrire (C [i][ j], " ")
// sans retour à la ligne
FinPour
Ecrire ( )
// retour à la ligne
FinPour
Fin

void affiche (float C [][], int
N)
{
int i,j;
for (i=0;i{ for (j=0;j<2*N;j++)
print(" %f ",C[i][j]);
print("\n");
}
}

p
...
144

Mheni & SGarbouje

Ecrire ("donner un réel:")
Lire (M [i][ j])
FinPour
FinPour
Fin
3)

scanf(%f",&M[i][j]);
}
}

Fonction MAX_LIGNE (M :
MAT , L:entier, NBC: entier) : réel
Variables
i:entier
MAX:réel
Début
MAX←M[L][1]
Pour i de 0 à NBC-1 faire
Si (M [L, i]>MAX) alors
MAX← M [L][ i]
FinSi
FinPour
MAX_LIGNE ←(MAX )
Fin

float MAX_LIGNE
M[][], int L, int NBC)
{ int i;
float MAX;
MAX = M[L][0];
for (i=1;iif (M[L][i]>MAX)
MAX = M[L][i];
return (MAX);
}

(float

4)
Fonction MIN_LIGNE (M :
MAT ,L, NBC: entier) :réel
Variables
i:entier
MIN:réel
Début

float MIN_LIGNE(float M[][], int
L, int NBC)
{ int i;
float MIN;
MIN = M[L][0];
for (i=1;i
p
...
146

Mheni & SGarbouje

Variables
i:entier
MIN:réel
Début
MIN←M[0][C]
Pour i de 1 à NBL-1 faire
Si (M [i, C]MIN← M [i][ C]
FinSi
FinPour
MIN_COLONNE ←MIN
Fin
7)

float MIN;
min = M[0][C];
for (i=1;iif (M[i][C]MIN = M[i][C];
return (MIN);
}

Fonction VERIF_POINTCOL
(M : MAT , NBL: entier, NBC:
entier, L: entier, C: entier) :
booléen
Début
Si (((MAX_LIGNE (M, L,
NBC) = MIN_COLONNE (M,C,
NBL)) et ( MAX_LIGNE (M, L,
NBC) = M[L][C]) ) Ou
((MIN_LIGNE (M, L,
NBC) = MAX_COLONNE (M,C,
NBL)) et ( MIN_LIGNE (M, L,
NBC) = M[L][C])))
alors
VERIF_POINTCOL ←Vrai
Sinon

int VERIF_POINTCOL
(float M[][], int NBL, int
NBC, int C), int L
{
if ((max_ligne (M, L,
NBC)== MIN_COLONNE
(M,C, NBL) &&
MAX_LIGNE (M, L,
NBC)== M[L,C]) ||
(MIN_LIGNE (M,
L,NBC)==
MAX_COLONNE (M,C,
NBL) && MIN_LIGNE (M,
L,NBC)) == M[L,C]))
return 1;
else

p
...
MAX,1
...
c
#include ...
148

Mheni & SGarbouje

Les enregistrements
I
...
Prenons un exemple de manipulation de n
étudiants
...
Puisque le
premier objectif d'utiliser l'informatique est de faciliter les
tâches, les développeurs ont pensé à pouvoir déclarer de
nouveaux types composés appelés structures de données
...
Cette
dernière aussi peut être de type composé car la date est
formée de jour, mois et années
...
Déclaration
Un enregistrement est déclaré entre les deux mots clés
enregistrement et finEnregistrement
...


p
...
150

Mheni & SGarbouje

Date_Naissance: Date

On peut aussi intégrer une structure dans une autre,
par exemple on peut remplacer la variable age dans la
structure Etudiant par Date_Naissance
En algorithmique
Etudiant : enregistrement
Id: entier
Nom: chaine
Prenom: chaine
Date_Naiss: Date
finEnregistrement

En langage C
typedef struct
{
int id ;
char nom[20] ;
char prenom[20] ;
Date date_naissance ;
} Etudiant ;

III
...
Le remplissage d'une variable de
type enregistrement se fait champs par champs, ou en lui
affectant directement une autre variable de même type
d’enregistrement (à condition que la deuxième soit remplie)
...
151

Mheni & SGarbouje

E1
...
prénom ←" Bilel"
E1
...
id←455
E2 ←E1
Dans le cas d'un tableau d'enregistrement, chaque case
devient une variable enregistrement et on utilise les indices
...
n] de Etudiant
Variables
T:Tab
Dans ce cas, si on veut modifier le nom du 5ème étudiant du
tableau, on utilise cette instruction:
T[5]
...


p
...
Exercices d'applications
Exercice 1
Creer un enregistrement nomme " Etudiant" qui est
caracterisé par un identifiant, un nom et un prénom
...

Exercice2
On reprend l’exercice précédent mais on rajoute en plus pour
chaque étudiant ses deux notes
...
Creer le nouvel enregistrement nomme "Notes"
caractérisé par NoteCc (Note de controle continu) et
NoteEx (Note d’examen)
...
Modifier l’enregistrement "étudiant" afin qu’il puisse
être en relation avec l’enregistrement "Notes"
...
Une procédure de saisie des étudiants ainsi leurs
notes
...
Une procédure d’afficher des étudiants avec leurs
notes
...
Une fonction qui renvoie l’étudiant qui a eu la
meilleure note d’examen
...
Une fonction qui renvoie la moyenne générale de la
classe
...
Afficher la meilleure note d’examen et la moyenne
générale de la classe sachant que son calcul est fait
comme suit

p
...
3+ NoteEx*0
...
Ecrire le programme principal faisant appel aux
différents sous-programmes
...
154

Mheni & SGarbouje

V
...
9]
Etudiant
Procedure Remplissage (m :
Entier ; var T : TAB)
Variables
i : Entier
Debut
Pour i de 0 à m-1 faire
Ecrire("Etudiant
n°",i," :")
Ecrire("Identifia
nt : ")
Lire(T[i]
...
Nom)

#include ...
id);
printf ("Nom =");
scanf ("%s",T[i]
...
Prenom);
}
}
void affichage (int m,
etudiant t[])

p
...
Preno

printf ("Identifiant | Nom |
Prénom");
for (i=0;iprintf ("%d | %s | %s",
t[i]
...
nom,
t[i]
...
Ident," |
",T[i]
...
Prenom)
Fin Pour
Fin

main ()
{
int n=10;
etudiant t[n];
remplissage (n, t);
affichage (n, t);
}

Algorithme GestionEtudiant
Variables
T : TAB
n : Entier
Debut
n ← 10
Remplissage(n,T)
Affichage(n,T)
Fin

p
...
9]
Etudiant
Procedure SaisieNotes(var E :
Etudiant)
Debut
Repeter
Ecrire("Note controle
contenu : ")
Lire(E
...
NoteCc)
Jusqu'à (E
...
NoteCc ≥
0 ET E
...
NoteCc ≤ 20)
Repeter
Ecrire("Note examen : ")
Lire(E
...
NoteEx)

#include ...
note
...
note
...
note
...
note
...
note
...
157

Mheni & SGarbouje

Jusqu'à (E
...
NoteEx ≥
0 ET E
...
NoteEx ≤ 20)
Fin
Procedure Remplissage(m :
Entier ; var T : TAB)
Variables
i : Entier
Debut
Pour i de 1 à m faire
Ecrire("Etudiant
n°",i," :")
Ecrire("Identifiant :
")
Lire(T[i]
...
Nom)
Ecrire("Prenom : ")
Lire(T[i]
...
note
...
id);
printf ("nom =");
scanf ("%s",t[i]
...
prenom);
saisieNotes (&t[i]);
}
}
void affichage (int m, etudiant
t[])
{ int i;
printf ("Identifiant | Nom |
Prénom | Note controle | Note
Examen");
for (i=0;iprintf ("%d | %s | %s | %
...
2f", t[i]
...
nom,

p
...
Ident," |
",Lire(T[i]
...
Prenom," | ",
E
...
NoteCc,"
|",E
...
NoteEx)
FinPour
Fin

t[i]
...
note
...
note
...
note
...
note
...
note
...
Note
...
Note
...
7*t[i]
...
noteex
T[i]
...
NoteEx
+ 0
...
note
...
159

Mheni & SGarbouje

Variables
i : Entier
som : Reel
Debut
som ←0
Pour i de 1 à m Faire
som ← som + 0
...
Note
...
7 *
T[i]
...
noteEx
Fin Pour
MoyenneGenerale ←som /

remplissage (n, t);
affichage (n, t);
printf ("Meilleure note examen :
%
...
2f", maxNote(n,t),
moyGenerale(n,t));
}

m
Fin
Algorithme GestionEtud
Variables
ET : TAB
n : Entier
Debut
n ←10
Remplissage(n,ET)
Affichage(n,ET)
Ecrire("Meilleur note
examen :", MeilleureNote(n,ET),
" Moyenne generale de la
classe :",
MoyenneGenerale(n,ET))
Fin

p
...
161

Mheni & SGarbouje

Les fichiers
I
...
On distingue deux types de fichiers :
• Les fichiers textes : des fichiers non structurés formés
par des caractères imprimables (codes ASCII)
...
Exemples :
- liste des étudiants d’une faculté
- liste des salariés dans une société
- liste des produits dans un stock de magasin
Pour le système d'exploitation Windows, par exemple, On
attribue à chaque fichier un nom, qui, généralement,
commence par une lettre alphabétique mais peut contenir des
chiffres
...

Exemple: C:\ mes documents\livreAlgo
...
Dans un fichier à
organisation séquentielle (F
...
S); pour atteindre un

p
...

Un fichier possède toujours une zone supplémentaire à la fin
appelée marque de fin de fichier (FDF) permettant de le
borner :
Fichier

FDF
Enregistrement

II
...
Ils sont déclarés de cette façon :
Variables
ftext : Fichier texte

III
...

Exemple :
Types
Employe = Enregistrement
Matricule : Entier
Nom : Chaîne[30]
Prénom : Chaîne[30]
Salaire : Réel
FinEnregistrement
FichEmpl = Fichier de Employe
Variables

p
...
Le type structuré FILE est défini dans le
fichier d'entête ...

Exemples :

FILE * f;
FILE * fprod;

IV
...
Ouverture du fichier :
Ouvrir (NomFichier, mode)
Les modes d'ouverture en algorithmique sont soit en
Lecture "L" ou Ecriture "E"
...

En langage C, l'ouverture d'un fichier se fait avec la
fonction suivante :
fopen (nom_fichier , mode )
fopen renvoie un pointeur sur le début du fichier
...
164

Mheni & SGarbouje

Fichier texte

Fichier binaire

Ouverture en lecture

"r"

"rb"

Ouverture en écriture
Ouverture en écriture
à la fin(ajout)
Ouverture en
lecture/écriture
Ouverture en
lecture/écriture après
la fin

"w"

"wb"

"a"

"ab"

"r+"
"w+"

"r+b"
"w+b"

"a+"

"a+b"

Si l’on ouvre un fichier qui n’existe pas en écriture ou
en ajout, il est créé
...
Il y a erreur si l'on veut lire un fichier
qui n’existe pas et fopen renvoie NULL
...
txt","r+");
2
...
Si on veut lire un enregistrement
précédent à celui pointé, la réouverture du fichier est
obligatoire
...


p
...

N
...


fgetc

Description
Cette fonction retourne un
int : c'est le caractère qui a
été lu
...


Exemple

caractere =
fgetc(fichier);

= fgetc( );

Fichier
textuel

Fichier
binaire

Cette fonction lit une ligne
dans le fichier (elle s'arrête au
premier \n qu'elle rencontre)
...

Cette fonction lit dans un
fichier des données de grande
fread
taille ou ayant un type
structuré (enregistrement)

fgets("bonjour",
sizeof(liste
...
txt");

fscanf(fichier,
"%d %d %s", &a,
&b, ch);

fread (&prod,
sizeof(produit),
1, fp)

p
...
Ecriture dans un fichier
Ecrire(NomFichier, fenêtre)
Il faut noter que l'ajout (l'Ecriture) se fait toujours
après le dernier élément
En langage C, il y a diverses fonctions pour écrire
dans un fichier, les principales sont : fputc, fputs, fprintf et
fwrite
...

fputc( ,
);

Cette fonction écrit une
chaine dans le fichier
...

Cette fonction écrit dans
un fichier des données
structurées

Exemple

fputc('A',
fichier);

fputs(ch,ftxt);

fprintf(fichier,
"%s a %d ans",
nom, age);
fwrite (&emp,
sizeof(employe),
1, fich) ;

p
...
Fermeture du fichier :
Fermer (NomFichier) en algorithmique
...
Exemple : fclose(fp);
5
...
Elle retourne un résultat de type
booléen
...


V
...
168

Mheni & SGarbouje

repeter
Ecrire (”Entrer le matricule de l'employé : ”)
Lire (emp
...
Nom)
Ecrire (”Entrer le prénom de Employé : ”)
Lire (emp
...
Salaire)
Ecrire (fe,emp)
repeter
Ecrire ("Voulez vous saisir un autre employé?
[O/N]")
Lire (rep)
Jusqu'à(majus(rep)< >'O' OU majus(rep)<
>'N')
Jusqu'à (majus(rep)='N')
Fermer(fe)
Fin
void creation (char nomf[30])
{
FILE * fe;
employe emp;
char rep;
fe = fopen(nomf,"wb");
do {
printf ("Entrez le matricule de l'employé :");
scanf ("%d",&emp
...
169

Mheni & SGarbouje

printf ("Entrez le nom de l'employé :");
scanf ("%s",emp
...
prenom);
printf ("Entrez le salaire de l'employé :");
scanf ("%f",&emp
...
Parcours d'un fichier
a
...
La
fin du fichier est repérée utilisant FDF, il faut tester si la fin
est atteinte avant de commencer à lire le fichier, au cas où le
fichier est vide
...
170

Mheni & SGarbouje

Ouvrir(fe,L)
Lire(fe,et)
Tant que (FDF(fe)) faire
Ecrire("Matricule:",
emp
...
Nom,"Prenom:",
emp
...
Salaire)
Fin Tq
Fermer(fe)
Fin
void parcourirFichier (char nomf[30])
{
FILE * fe;
employe emp;
fe = fopen (nomf, "rb");
while (fread (&emp, sizeof(employe), 1, fe) ,
!feof(fe))
{
printf ("Matricule %d de l'employé %s %s,
salaire =%f DT",
emp
...
nom,
emp
...
sal);
}
fclose (fe);
}
b
...
171

Mheni & SGarbouje

La procédure suivante permet de lire et afficher le
contenu d’un fichier texte
...
172

Mheni & SGarbouje

VII
...
dat "
...

2) Une procédure d’affichage des noms de personnes
...

4) Une procédure qui copie les noms sans compter le
nom passe en parametre
...

Exercice 2
1) Ecrire une procédure permettant de créer et remplir un
fichier « Fp » qui contient des informations sur le personnel
d’une entreprise (matricule, nom, prénom, grade, salaire)
...

3) Ecrire une procédure qui recherche un employé dans le
fichier Fp à partir de son matricule
...
173

Mheni & SGarbouje

- Sinon, il affiche le message ”ce matricule ne figure pas dans
le fichier…”
Exercice 3
On souhaite mémoriser les étudiants d'une faculté ainsi que
leurs notes dans un fichier nommé "fetud
...
Un étudiant
est caracterisé par un identifiant, un nom et un prénom et
possède deux notes : une note de contrôle continu et une note
d'examen
...

2) Écrire une procédure permettant de saisir les notes
associees à un &tudiant donné en paramètre
...

4) Écrire une procédure qui permet de copier les
etudiants qui ont eu une moyenne supérieure ou égale
à 10 du fichier "fetud
...

5) Écrire une procedure qui permet de trier un tableau
d'étudiants dans l'ordre décroissant selon leurs
moyennes
...
dat" qui contiendra les étudiants qui
sont réussit, triés dans l'ordre décroissant de leurs
moyennes
...
dat"
...
174

Mheni & SGarbouje

8) Écrire le programme principal qui fait appel aux
différents sous-programmes
...
Correction
Exercice 1:

Type
Nom : chaine[30]
FichNoms : Fichier
de Nom
Procedure Creation(Var fn
: FichNoms)
Variables
n : Nom
rep : caractere
Debut
//ouverture du fichier
en écriture
Ouvrir(fn,E)
Répéter
Ecrire(”No
m : ”), Lire(n)
Ecrire(fn,n)
Ecrire(”Vou
lez-vous ajouter un
autre nom [O/N] :
”)
Lire(rep)
Jusqu'à

#include ...
h>
typedef struct {char nom[30];
} Nom;
void creation (char nf[20])
{
char n[30], rep='O';
FILE * f;
f = fopen (nf,"w");
while (toupper(rep)=='O')
{
printf ("Nom :");
scanf ("%s",n);
fwrite (n,sizeof(Nom),1,f);
printf ("Voulez vous ajouter
un autre nom? [O/N]:");
scanf ("%c",&rep);scanf
("%c",&rep);
}
fclose (f);
}

p
...
176

Mheni & SGarbouje

Tant que
(Trouve=faux ET
NON(FinDeFichier(fn))
Faire
Lire(fn,n)
Trouve ← (n
= x)
Fin Tant que
Recherche
←(Trouve)
Fermer(fn)
Fin

void copier (char ch[30],char
nfsrc[20],char nfdest[20])
{
char n[30];
FILE * fe;
FILE * fs;

fe = fopen (nfsrc,"r");
fs = fopen (nfdest,"w");
while ( fread (&n,
sizeof(Nom), 1, fe), ! feof(fe)
)
Procedure Copier(x : Nom ; {
fn : FichNoms ; var ft :
if (strcmp(n,ch)!=0)
FichNoms)
fwrite (&n, sizeof(Nom), 1,
Variables
fs);
n : Nom
}
Debut
fclose (fe);
Ouvrir(fn,L)
fclose (fs);
Ouvrir(ft,E)
}
Tant que
(NON(FinDeFichier(fn))
main()
Faire
{
Lire(fn,n)
char ch[30],
Si (n ≠ x)
nomfich[30],nomfich2[30];
Ecrire(ft,n)
printf ("\nnom du fichier à
FinSi
créer : ") ;
Fin Tant que
scanf ("%20s", nomfich) ;
Fermer(fn)

p
...
178

Mheni & SGarbouje

Types
Employe = Enregistrement
Matricule : Entier
Nom : Chaîne
Prenom : Chaîne
Grade : Caractère
Sal : Réel
FinEmploye
Fpers = Fichier de Employé
Procédure Création(Var f : Fpers)
Variables
rep : caractère
emp: Employe
Début
Ouvrir(f,E)
Répéter
Ecrire(”Matricule : ”)
Lire(emp
...
Nom)
Ecrire(”Prénom : ”)
Lire(emp
...
Grade)
Ecrire(”Salaire : ”)
Lire(emp
...
mat);
printf ("Nom :");
scanf
("%s",&emp
...
prenom);
printf ("Grade :");
scanf
("%c",&emp
...
sal);
fwrite (&emp,

p
...
Sal>=500)
ET (emp
...
M
atricule, emp
...
Sal)
FinSi
Lire(f,emp)
FinTant Que
Fermer(f)
Fin
3)
Procédure Recherche(Fp : Fpers ; x
: Entier)
Variables
emp : Employé
Trouve : booléen
Début
Ouvrir (Fp,L)
Trouve ← faux
TantQue (trouve = Faux) ET
NON(FDF(Fp)) Faire

sizeof(employe),1,f);
}while
(toupper(rep)!='O');
}
2) void consultation
(char nf[20])
{
FILE * fe;
employe emp;
fe = fopen (nf, "rb");
while (fread (&emp,
sizeof(employe), 1,
fe) , !feof(fe))
{
if (emp
...
sal<=700)
printf ("Matricule %d
de l'employé %s %s,
salaire =%f DT",
emp
...
nom,
emp
...
sal);
}
fclose (fe);
}
3) void recherche
(char nf[20], int x)

p
...
Matricule = x)
FinTantQue
Si FDF(Fp) Alors
Ecrire(”Ce matricule
ne figure pas dans le
fichier…”)
Sinon
Ecrire(emp
...
Prénom, emp
...
mat==x)
trouve=1;
}
fclose (f);
if (trouve)
printf ("%s %s grade
%c", emp
...
prenom,
emp
...
181

Mheni & SGarbouje

Type
Notes :
Enregistrement
noteCc :
Reel
noteEx :
Reel
Fin Notes
Etudiant :
Enregistrement
Ident :
Entier
Nom :
chaine[30]
Prenom :
chaine[20]
Note : Notes
Fin Etudiant
TAB : Tableau de
100 Etudiant
FichEtud : Fichier
de Etudiant
Procedure SaisiNotes(var
E : Etudiant)
Variables
noteEntrer : Reel
Debut
Repeter
Ecrire("Not

#include ...
h>
typedef struct {
float notecc, noteex;
} notes;
typedef struct {
int id,
char nom[20], prenom[20] ;
notes note;
} etudiant;
void saisieNotes (etudiant *E)
{
do {
printf ("Note controle
continu : ");
scanf
("%f",E
...
notecc);
} while (*E
...
notecc
≥ 0 && *E
...
notecc ≤ 20);
do {
printf ("Note examen :
");
scanf
("%f",E
...
noteex);
} while (*E
...
noteex
≥ 0 && *E
...
noteex ≤ 20);
}

p
...
Note
...
Note
...
Iden
t)

void creation (char
nomfich[30])
{ char rep ;
etudiant E;
FILE *f;
f = fopen(nomfich,"wb");
do
{
printf ("Identifiant =");
scanf ("%d",&E
...
nom);
printf ("prénom =");
scanf ("%s",E
...
183

Mheni & SGarbouje

Ecrire("No
m : ")

f = fopen(nomfich,"rb");
*n=0;
m)
while (fread (&E,
Ecrire("Pren sizeof(etudiant), 1, f) , !feof(fe))
om : ")
{
Lire(Et
...
7 * E
...
noteex +
om)
0
...
note
...
7*t[i]
...
noteex +
;var T : TAB )
0
...
note
...
7*t[i+1]
...
noteex
Et : Etudiant
+ 0
...
note
...
No

p
...
3
* Et
...
noteCc +
0
...
Note
...
185

Mheni & SGarbouje

echange : Booleen
moy 1,moy2: Reel

FILE *f;
float moy;

Repeter
echange ← faux
Pour i de 1 à n

f = fopen(nomfich,"wb");

Debut

while (fread (&E,
Faire
sizeof(etudiant), 1, f) , !feof(fe))
moy1 ← 0
...
Note
...
7 *
moy = 0
...
note
...
Note
...
3*E
...
notecc;
moy2 ← 0
...
2f ",
T[i+1]
...
noteCc + 0
...
id, E
...
prenom, moy);
T[i+1]
...
noteEx
}
Si(moy1 < moy2) fclose(f);
Alors
}
aux ← T[i]
T[i] ←
T[i+1]
main ()
T[i+1]←aux {
echange ← char fentree[30]="fetud
...
dat";
Fin Si
Fin Pour
creation (fentree);
n←n-1
affichage (fentree);
Jusqu'à (echange = resultat (fentree, fsortie);
faux OU n =1)
affichage (fsortie);
}
Fin
Procédure
:FichEtud;

Résultat(fn
var
fr
:

p
...
187

Mheni & SGarbouje

Tant
que
NON(FDF(fr)) Faire
Moy ← 0
...
Note
...
7
*
Et
...
noteEx
Ecrire(Et
...
Nom,

″,Et
...
188

Mheni & SGarbouje

La récursivité
I
...
Dans la programmation,
on parle de récursivité lorsqu'un programme s’appelle luimême
...
Les appels récursifs prennent fin lorsqu’on atteint
la condition d’arrêt
...
Les critères de choix d'un
programmeur sont : espace mémoire, facilité de codage,
minimiser le nombre de variables, maintenance du code…

II
...
Cette condition est généralement placée dans une
structure conditionnelle
...
189

Mheni & SGarbouje

Fonction Facto ( n : Entier) : Entier
Début
Si (n = 0) Alors
Facto ← 1
Sinon
Facto← n * Facto(n-1)
FinSi
Fin

Appel récursif avec de
nouveaux paramètres

Fonctionnement
Facto(4) = 4* Facto(3)
1er appel

Renvoie 4*6=24
retourne 6

Facto(3)= 3* Facto(2)
2ème appel

retourne 2
Facto(2)= 2* Facto(1)
3ème appel

retourne 1
Facto(1)= 1* Facto(0)

=1 (selon la co

p
...
Choix entre structure
récursivité

itérative

et

la

L'exécution d'une version récursive d'un algorithme
est généralement un peu moins rapide que celle de la version
itérative, même si le nombre d'instructions est le même (à
cause de la gestion des appels de fonction)
...
Pour la fonction factorielle la
différence entre la version itérative et récursive ne se voit pas
clairement, nous prenons l'exemple de la suite de Fibonacci
pour mieux montrer cette différence
...
191

Mheni & SGarbouje

1))
FinSi
Fin
Le schéma d'exécution d'une telle fonction est présenté sur la
figure suivante:

Fibo(1)
Fibo(0)
Fibo(3)
Fibo(2)
Fibo(4)

Fibo(1)
Fibo(1)
Fibo(2)
Fibo(0)

A partir de cette figure, on remarque la répétition
inutile du calcul de Fibo(2), Fibo(1) et Fibo(0)
...
Dans ce cas, la version itérative
est plus simple que la version récursive:

En algorithmique
Fonction FiboIterative (n : Entier) : int

En langage C
FiboIterative

p
...
Récursivité indirecte ou croisée
On parle de la récursivité indirecte, si une fonction X
fait appelle à une autre fonction Y et celle-ci fait appelle à X
suivant la figure suivante:

Fonction X ( param formels) : type
Début

...

X(param effectifs)
Fin…

p
...
Exercices d'applications:
Exercice 1 :
Ecrire un programme qui permet d’afficher xy, avec x et y
saisis au clavier
...
L'algorithme d'Euclide, consiste à
effectuer une suite de divisions euclidiennes :
1
...

2
...
on recommence les étapes 1 et 2 jusqu'à ce qu'une division
donne un reste égal à 0
...

Exercice 3 :

p
...

Exercice 4:
Soit V ( n ) n∈IN une suites réelle définie par :
*

V0 = −2

V n = 3V n −1 + n
Si n est

5

2V + n
Si n est paire
Vn = n −1
5

impaire
Ecrire une fonction récursive qui calcule le nième terme de la
suite V
...
195

Mheni & SGarbouje

Ecrire une fonction récursive qui cherche une valeur dans un
tableau trié de réels et retourne sa position par la méthode de
recherche dichotomique
...
On
répète jusqu’à trouver x ou que la partie du tableau devient un
seul élément
...

• si T[mil] >x alors rechercher dans la partie gauche T
[1
...

• si T[mil] < x alors rechercher dans la partie droite T
[mil+1
...
On considère la fonction suivante :
Fonction Toto (m,n : entier) : entier
Début
si m=0 alors Toto ← 0
sinon Toto ←(Toto(m-1,n)+n)
fin si

p
...

2
...

4
...
Modifier cette fonction récursive pour qu'elle
retourne un résultat quelque soit les valeurs des
entiers m et n
...
Exemples : radar, azza
...


VI
...
197

Mheni & SGarbouje

exp(x:entier,y:entier):entier
Début
Si (x=0 et y=0) alors
Ecrire("operation impossible")
Si (x=0 ou y=0) alors
exp ←(1)
Sinon
exp ←(x*exp(x,y-1))
Fin Si
Fin

if (x==0 && y==0)
printf
("operation
impossible");
if (x==0 || y==0)
return 1;
else
return (x*exp(x,y-1));
}

Exercice 2:
Fonction PGCD (a:entier, int PGCD (int a, int b)
{
b:entier)
if(b!=0);
return(PGCD(b,a mod b);
Début
else
Si(b≠0);
return (a);
PGCD ←(PGCD(b,a mod }
b);
Sinon
PGCD ←(a);
FinSi
Fin

p
...
199

Mheni & SGarbouje

Si (n mod 2 =0) alors
else
suite
←((3*suite(nreturn
1)+n)/5)
1)+n)/5);
Sinon
}
suite
←((2*suite(n- }
1)+n)/5)
Fin Si
Fin Si
Fin

((2*suite(n-

Exercice 5:
Fonction ack(n:entier , m:entier) : entier
Début
Si (n=0) alors
ack ←(m+1)
Sinon
Si (m=0) alors
ack ←(ack(n-1,1))
Sinon
ack ←(ack(n-1,ack(n,m-1)))
Fin Si
Fin Si

int ack (int n, int m)
{
if (n==0)
return (m+1);
else
if (m==0)
{ return (ack(n-1,1);
else
return (ack(n-1,ack(n,m-1)));
}
}

Fin
Exercice 6:
Fonction rechercheDicho (x : réel, int

rechercheDicho

p
...

3) Cette fonction boucle à l'infini

p
...
202

Mheni & SGarbouje

r(ch)-2)))
Sinon
palind ←(faux)
Fin

}

p
...


Introduction

Le langage de programmation C, présente l'avantage
de laisser l'utilisateur manipuler lui-même les adresses
mémoires
...
Avec la notion de pointeur, on parle de
manipulation par adresse (allocation dynamique)
...


Une variable dynamique

Les variables que nous utilisons jusqu'à maintenant
sont des variables statiques
...
La libération de l'espace
mémoire occupé par cette variable ne se fait qu'à la fin
d'exécution de ce bloc
...

Dans cette leçon nous étudions la variable dynamique
...
L'accès au contenu de cet espace mémoire se fait
par l'adresse de la case mémoire (pointeur)
...
204

Mheni & SGarbouje

En résumé, un pointeur P est une variable statique qui
contient l'adresse mémoire dans laquelle est enregistré la
valeur pointée P^
...


III
...
Déclaration:
En algorithmique

En langage C

Syntaxe

Variables:
Nom_var : ^Nom_type

nom_type *nom_var ;

Exemple

Variables:
Ptr1,Ptr2 :^entier
r=^réel

int *Ptr1, *Ptr2 ;
float *r ;

Pour déclarer une variable pointeur, on doit indiquer
son nom et le type, de la case mémoire pointée, précédé de ^

p
...
En langage C, pour indiquer qu’une
variable est un pointeur, il suffit de précéder son nom par le
symbole ‘*’
...

Remarque :
Après sa déclaration, un pointeur est une case mémoire
qui peut contenir n’importe quelle adresse et donc pointer sur
n’importe quoi
...
Si l’on veut
que le pointeur pointe sur le vide, il suffit de l’initialiser à
NULL (ou nil) : ptr ← null
...
En effet, la création d’un pointeur signifie
l’allocation effective de l’espace mémoire
...
206

Mheni & SGarbouje

2
...


P

P^

@213

Q

Q^

@217

p
...

P^

P

@213

"Tunis"

Q^

Q
@217

"El Kef"

L'instruction 5 permet d’écraser le contenu de P^ et le
remplacer par celui de Q^
...
Suite à l'instruction 5, si on change le contenu de
P^, Q^ ne sera pas changé au contraire de l'instruction 7 qui
suit
...
208

Mheni & SGarbouje

P
@213

Q
@217

P^
"Nabeul"

Q^
"El Kef"

L'instruction 7 permet de changer l'adresse P par celle de Q
...
Par
conséquent, le contenu du pointeur P^ devient identique à
celui de Q^, comme il est montré par la figure suivante
...
Or, P et Q pointent
sur la même adresse, ainsi, tout changement du contenu de
P^, signifie le changement du contenu de Q^ :
P
@217

Q
@217

Q

P^

"Beja"

p
...


Exercices

Exercice 1 :
Remplir le tableau suivant par le contenu de chaque variable
après chaque instruction :
A, B, C : entier
P1, P2 : ^entier
A←1
B←2
C←3
P1←&A
P2←&C
P1^ ←P2^+C

A

B

C

P1^

P2^

P1

P2

P2 ← &B
B←P2^ - P1^
P1 ← P2

p
...


V
...
211

Mheni & SGarbouje

P1 ← P2

6

-4

3

-4

-4

&B &B

P1^← P2^*A*(- 6
1/3)

8

3

8

8

&B &B

P2 ← &C

6

8

3

8

3

&B &C

C ← A div B

6

8

0

8

0

&B &C

Exercice 2 :
Procédure positif (T : tabEntier, var POS : void positif (int T[], int POS[])
tabEntier)
{ int *p, i=0;
Variables
for (p=T;p<&T[20];p++)
i: entier
if (*p>=0) {
p: pointeur sur entier;
POS[i]=*p;
i++; }

Début
i ←0
Pour p de &T à &T[20] faire
Si (^p >= 0)
POS[i] ← ^p;
i ← i+1
Fin Si
Fin Pour

}

Fin

p
...
213

Mheni & SGarbouje

Les listes chaînées
I
...
Ces derniers sont des structures
statiques dont la taille, fixée dès le début, ne varie pas
...


-a-

-b-

p
...
Structure de la mémoire vive d'un ordinateur

Les listes chainées sont des structures composées de
cellules
...
De cette façon,
on peut enregistrer les cellules dans n'importe quelle case
mémoire entier (les cases en bleu dans la figure b)
...
Ainsi,
puisque chaque cellule a un lien vers son successeur
(l'adresse de la cellule qui suit), on peut trouver tout le reste
de la liste
...
Ces cases peuvent êtres éparpillées dans toute la
mémoire ce qui constitue un gain considérable
...


Liste simplement chainée

Les listes chainées sont formées par une ou plusieurs
cellules
...
Le premier champ peut être
de différents types, soit simple (entier, réel, caractères ou
chaînes de caractères) soit composé (structure de donnée)
...
Donc la liste chaînée est accessible par l'adresse de
la tête
...


p
...
Structure d’une liste chaînée
En supposant que les éléments de la liste sont des
entiers, celle-ci se déclare de la façon suivante :
En algorithmique

En langage C

typedef struct
Type
Cellule
= cellule
{
Enregistrement
int
Elem :
elem ;
entier
struct
Suiv=Liste
cellule
*suiv ;
FinEnregistrement
} cellule ;
Liste =^Cellule

Variables
L : Liste

cellule *L ;

1
...
En paramètre entrée-sortie, on a L une

p
...
Ce pointeur contiendra
l'adresse de la première cellule de laquelle on accèdera à la liste
...
Elem)
P^
...
217

Mheni & SGarbouje



Il est très important lors de la création d’une liste
chaînée, de penser à initialiser la tête de la liste à null,
sinon la liste n’aura jamais de fin et son parcours sera
impossible
...
Ainsi, à l’intérieur de toute la procédure,
il faut utiliser *L à chaque fois où l’on veut mentionner
ce paramètre
...
En algorithmique, nous
avons gardé la syntaxe utilisée pour les enregistrements en y
ajoutant la notion de pointeur, d'où on écrit : p^
...
suiv
...


2
...
Parcours itérative d'une liste chainée

En algorithmique

Procedure Affiche_liste_Iter(L :Liste)
Variables

p
...
Elem)
P←P^
...
Parcours récursif d'une liste chainée

En algorithmique

Procedure Affiche_liste_Réc(L :Liste)
Debut
Si (L ǂNull) alors
Ecrire (L^
...
Suiv)
Fin si
Fin

p
...
Longueur d'une liste chaînée
La fonction récursive suivante permet de calculer le
nombre de cellules dans une liste chaînée

En algorithmique

En langage C

Fonction Longueur (L : Liste) :entier
Début
Si (L= Null) alors
Longueur ←(0)
Sinon
Longueur ←(1+ Longueur (L^
...
220

Mheni & SGarbouje

return (1+ Longueur( (L suiv)) ;
}

4
...
Insertion en tête de liste
Tête
c1

E1

@

@c2

E2

E3

null

Null

E3

@c3

null

Null

a – Etat initial
Tête
c0

E1

@

E0

@c2

E2

@c3

c1

@

b- Etat final
Figure 3
...


En algorithmique

Procédure Insert_Tete (Var L : Liste)
Variables
P : Liste
Debut
Allouer (P)
Ecrire ("Donner un entier"), Lire (P^
...
Suiv←L
L← P
Fin

p
...
Insertion d'un élément dans une position précise
Tête
c1

E1

@

@c2

E3

@c3

E2

null

Null

a – Etat initial
Tête
c0

@c2

E1

@

Q

@c2

E2=X

@c4

E3

@c4

E4

c3

@

P

b- Etat final
Figure 4
...
222

null

Null

Mheni & SGarbouje

En algorithmique

En langage C

Procédure Insert_Liste (Var L : Liste, x:entier)
Variables
P ,Q: Liste
Debut
Q L
Tant que ((Q ǂ Null) et (Q^
...
Suiv
Fin Tant que
Si (Q ǂ Null)
Allouer (P)
Ecrire ("Donner un entier"), Lire (P^
...
Suiv← Q^
...
Suiv←P
Si non
Ecrire(x, "est introuvable")
Fin
void Insert_Liste (cellule **L, int x)
{
cellule *p, *q ;
q = *L ;
while (q !=NULL && q elem !=x)
q = q↑suiv ;
if (q !=NULL)
{
p = (cellule*) malloc (sizeof (cellule)) ;
printf ("Donner un élément ") ;
scanf ("%d", p elem) ;
p suiv = q suiv ;
q suiv = p ;

p
...

Dans la première partie, on cherche l'élément x
...

5
...

A
...
Elem==x) Alors
Trouve ← Vrai

p
...
Suiv
Fin Tant que
recherche ←(Trouve)
Fin

En langage C

boolean recherche (cellule *L, int x)
{
cellule *p ;
boolean trouve=false ;
p=L;
while (p !=NULL && trouve==false)
{
if (p elem==x) Alors
trouve = true ;
p = p suiv ;
}
return (trouve) ;
}

B
...
Elem=x) alors
rechercheRec ←(Vrai)

p
...
Suiv))
Fin si
Fin si
Fin

En langage C

boolean rechercheRec (cellule *L, int x)
{
if (L==NULL)
return false ;
else
if (L elem==x)
return true ;
else
return (rechercheRec (L suiv, x)) ;
}
}

6
...
Supprimer le premier élément d'une liste
La procédure suivante permet de supprimer la cellule
Tête d'une liste chaînée
...
226

null

Null

Mheni & SGarbouje

a – Etat initial

Tête
c1

@

E1

@c2

E2

@c3

E3

b – Etat final
Figure 4
...
Suiv
Libérer ( P)
Fin
void supprimerDeb (cellule **L)
{
cellule *p ;
p = *L ;
*L = *L suiv;

p
...
Supprimer un élément intermédiaire d'une liste

Tête
c1

@

E1

@c2

@c3

E2

E3

null

Null

a – Etat initial

Tête
c1

@

E1

@c2

E2

@c3

E3

b – Etat final
Figure 5
...
228

null

Null

Mheni & SGarbouje

En langage C

Si (L ǂ Null) alors
P←L
Si (L^
...
Suiv
Libérer ( P)
Sinon
Q←P^
...
Elemǂx) faire
P←Q
Q←Q^
...
Suiv←Q^
...
229

Mheni & SGarbouje

q = p suiv ;
while (q !=NULL && q elem !=x)
{
p=q;
q = p suiv ;
}
if (q !=NULL)
{
p suiv = q suiv ;
free (p) ;
}
else
printf("cet élément n’existe pas dans la liste") ;
}
else
printf ("La liste est vide") ;
}

III
...
Elles sont accessibles par
la tête et par la queue
...


1
...
230

Mheni & SGarbouje

Tête

c3

@

Q
c1

@

Null

null

E1

@c2

@c1

E3

@c3

@c2

Chaque cellule est composée en plus du champ
information par deux champs pointeurs : le premier pointe sur
l’élément précédent et le second pointe vers l’élément
suivant
...
231

E3

null

Mheni & SGarbouje

2
...
Elem)
P^
...
Suiv ← L
L^Pred← P
L←P
Si (i=1)
Queue← P
FinPour
Fin
void Creation_listeD (celluleD **L, celluleD **Q, int n)
{
celluleD *p ;
int i ;
*L = *Q = NULL ;

p
...


Les Files et les Piles

Les files sont des listes chaînées qui ressemblent
beaucoup aux files d'attentes
...
Tandis que les piles sont des listes chaînées particulières
dont l'accès est selon la règle dernier arrivé premier servi ou
encore Last In First Out
...


1
...
233

Mheni & SGarbouje

fait de la tête
...
Déclaration d'une file
En algorithmique
Type
File =^CelluleF
CelluleF
Enregistrement
Elem : entier
Suiv :File
FinEnregistrement
Variables
F : File

En langage C
typedef struct celluleF
{
=
int elem ;
struct
celluleF
*pred ;
struct celluleF *suiv ;
} celluleF ;
celluleF *F ;

b
...
234

Mheni & SGarbouje

Début
F Null
Fin
void Initialiser (celluleF **F)
{
*F = NULL ;
}
c
...


En langage C

En algorithmique

En langage C

Procédure Ajouter (Var F: File, x: entier)
Variables
P,Q: File
Début
Q F
Tant que (Q^
...
Suiv
Fin Tant que
Allouer (P)
P^
...
Suiv Null
Q^
...
235

Mheni & SGarbouje

while (q !=NULL)
{
q = q suiv ;
}
p = (celluleF*) malloc (sizeof (celluleF)) ;
p elem = x ;
p suiv = NULL ;
q suiv = p ;
}
d
...


En algorithmique

En langage C

Procédure Extraire (Var F: File, Var x: entier)
Variables
P:File
Début
Q F
F F^
...
Elem
Liberer(Q)
Fin
void Extraire (celluleF **F, int *x)
{
cellule *p ;
q = *F ;
*x = F elem ;
F = F suiv ;
free (q) ;

p
...
Les Piles
La pile est une liste chaînée dont l'ajout et la
suppression se font tous les deux de la tête
...
Déclaration d'une file
En algorithmique

En langage C

Type
typedef
struct
celluleP
Pile =^CelluleP
CelluleF
= {
Enregistrement
int elem ;
Elem : entier
struct
Suiv : Pile
celluleP
FinEnregistrement
*pred ;
struct
Variables
celluleP

p
...
Procédure d'initialisation d'une pile

En algorithmique

En langage C

Procédure Initialiser (Var P: Pile)
Début
P Null
Fin
void Initialiser (celluleP **P)
{
*P = NULL ;
}

c
...
238

Mheni & SGarbouje

return(*P ==NULL) ;
}
d
...

Procédure Empiler (Var P: Pile, x: entier)
Variables
Q:Pile
Début
En algorithmique Allouer (Q)
Q^
...
Suiv←P
P←Q
Fin
void Empiler (celluleP **P, int x)
{
cellule *q ;
q = (celluleP*) malloc (sizeof (celluleP)) ;
En langage C
q elem = x ;
q suiv = *P ;
*P = q ;
}
e
...


En algorithmique

Procédure Depiler (Var P: File, Var x: entier)
Variables
Q:Pile
Début

p
...
Suiv
x←Q^
...


Exercices d'applications

Exercice 1
On désire créer une file formée par n éléments de type
réel :
1
...


p
...
Ecrire la procédure Enfiler (var F : File) qui ajoute à
la fin de la file un élément saisi au clavier
...
Fonction Taille (F : File) qui calcule et retourne le nombre
d’éléments dans la file
...
Pour chaque véhicule on enregistre la date de
mise en circulation, la puissance, la marque et
l’immatriculation
1- Déclarer le type enregistrement Véhicule qui
comporte les champs dateMC, Puissance_CV,
Marque, IMMAT
...

3- Ecrire une procédure Creat_LV, qui prend en
paramètre le nombre de cellules et la tête L et
permet de remplir la liste par n véhicules
...

5- Ecrire une procédure qui permet de supprimer de la
liste les véhicules dont la date de mise en
circulation est avant 2001
...
241

Mheni & SGarbouje

6- Ecrire une fonction Nb_Vehicule qui retourne le
nombre total de véhicules
...

1- Déclarez un enregistrement t_plat qui contient les
champs : numero (entier), nom (chaine),
composition (chaine) et prix (réel)
...

3- Ecrire une procédure creerMenu qui prend comme
paramètre la tète de la liste chaînée et permet de
créer une liste de 20 plats
...

4- Le patron du restaurant désire faire une remise de
1DT sur certains plats
...

5- Ecrire une procédure copierMenu qui a pour
paramètres la tête de la liste chaînée et un tableau T
...
242

Mheni & SGarbouje

Ce sous programme permet de copier dans le
tableau T les plats qui ont un numéro impaire
seulement
...
Déclarez son type avant d’écrire le sous
programme copieMenu()
...

Appelez les sous programmes précédents
respectivement pour créer la liste, effectuer la
remise, puis copier une partie de la liste dans le
tableau Tmenu
...


Exercice 4
Une société agroalimentaire, veut informatiser la liste
de ses produits
...

1- Déclarer le type enregistrement produit qui
comporte
les
champs dateEXP,
Libellé,Prix_U,Quantité
...
243

Mheni & SGarbouje

2- Déclarer un type cellule, qui comporte deux
champs, l’une contient la structure produit et l’autre
contient un pointeur sur la cellule suivante
...

4- Ecrire une fonction Nb_ Prix_2_Dinars qui retourne
le nombre de produits dont le prix est supérieur à 2
dinars
5- Ecrire une procédure qui permet de supprimer de la
liste les produits dont la date a expiré (date
d'expiration avant la date actuelle)
6- Ecrire une fonction Nb_Produits qui retourne le
nombre total de produits
...


Correction

Exercice 1

p
...
suivǂ Null) faire
Q Q^
...
Elem)
P^
...
Suiv P
Fin

Fonction Taille( F :
File):Entier
Variables
P : Liste
Nb:entier
Début
P ← F
...
Suiv
nb←nb+1
FinTQ
Taille ←(nb)
Fin

p
...
246

Mheni & SGarbouje

fin Enregistrement
2)
Types
Cellule = Enregistrement
Elem : Vehicule
Suiv : Liste
Fin Enregistrement
Liste = ^Cellule

typedef struct cellule{
vehicule elem;
struct cellule *suiv;
} cellule;

3)
Procédure Creat_LV (n :
Entier, Var L : Liste)
Variables
P : Liste
i : Entier
Début
L← null
Pour i de 1 à n Faire
Allouer(P)
Ecrire(”Entrer le
jour de MC du
vehicule ”)
L
ire(P^
...
DateM
C
...
dateM
C
...
247

Mheni & SGarbouje

mois de MC du
vehicule ”)
L
ire(P^
...
DateM
C
...
Elem
...
année)
Ecrire(”Entrer la
puissance du
vehicule ”)
L
ire(P^
...
Puissan
ce)
Ecrire(”Entrer la
Marque du vehicule
”)
L
ire(P^
...
Marque
)
Ecrire(”Entrer
l'Immatriculation du
vehicule ”)
L
ire(P^
...
IMMA
T)
P^
...
dateM
C
...
dateM
C
...
puissa
nce);
printf(”Entrer la Marque du
vehicule ”) ;
scanf("%s",P elem
...
immat);
P suiv = *L;
*L = P;
}
}

p
...
Elem
...
puissance>5)
nb++;
return(nb);
}

5)
Procédure supprimer (Var L
: Liste)

void supprimer (cellule **L)

p
...
Elem
...
annee<20
11) Alors
Q←P
Si (Q=L) Alors
L ← L^
...
Suiv
Libérer(Q)
Sinon
P←P^
...
dateMC
...
250

Mheni & SGarbouje

nb : Entier

int nb=0;

Début
P←L
nb ←0
TantQue(P#Null)
nb ←nb+1
FinTQ
Nb_vehicule ←(nb)
Fin

p = *L;
while (p!=NULL)
nb++;
return(nb);
}

Exercice 3:
1°/
t_plat
=
enregistrement
numero :
entier
nom :
chaine
composit
ion : chaine
prix :
réel
Fin
enregistrement

1) typedef struct {
int numero;
char
composition[50];
float prix;
} t_plat;

nom[30],

2) typedef struct element{
t_plat plat;
struct element *suiv;
} cellule;

3) void creerMenu(element **tete)
2°/
element
= {
enregistrement
int i;
element * aux;
plat :
t_plat
suiv : *tete = NULL;

p
...
numero = i;
creerMenu (var tete : printf("Saisir le nom du plat);
^element)
scanf("%s",aux plat
...
composition)
Début
;
printf("Saisir le prix du plat);
tete ← nil
Pour i de 1 à 20 scanf("%f",&aux plat
...
numero ← i }
Ecrire ("Saisir
4) void remisePlat (element **tete)
le nom du plat")
{
Lire
element *cour;
(aux↑plat
...
prix >7)
(aux↑plat
...
prix -= 7;
Ecrire ("Saisir
cour = cour suiv;
le prix du plat")
}
Lire
}
(aux↑plat
...
252

Mheni & SGarbouje

aux↑suiv
tete
tete ← aux
Fin Pour
Fin


5)
void
copierMenu(element
**tete, t_plat t[])
{
int i=0;
element *cour;

4°/
Procédure
remisePlat(var
tete : cour =*tete;
while (cour!=NULL)
^element)
{
Variables
if (cour plat
...
prix > 7)
}
alors
cour↑plat
...
prix–7
Fin Si
cour
cour↑suiv
FinTQ
Fin

← 7) programme menu
...
10] de t_plat
}
Procédure copierMenu

p
...
numero % 2
= 1) alors
i
← i+1
T
[i]

cour↑pla
t
FinSi
cour

cour↑suiv
FinTQ
Fin
7°/ Algorithme Menu
Variables
LP : ^element
Tmenu :
tabelem
Début

p
...
255

Mheni & SGarbouje

3)
Procédure
Creat_LProduit (n :
Entier, Var L : Liste)
Variables
P : Liste
i : Entier
Début
L← null
Pour i de 1 à n Faire
Allouer(P)
Ecrire(”Entrer le
jour d'expiration du
produit ”)
L
ire(P^
...
DateM
C
...
Elem
...
mois)
Ecrire(”Entrer
l'année d'expiration
du produit ”)
L
ire(P^
...
DateM

void creat_LProduit (int n,
cellule **L)
{
cellule *P;
int i;
*L=NULL;
for (i=1;i<=n;i++)
{
p = (cellule*) malloc (sizeof
(cellule)) ;
printf(”Entrer le jour
d'expiration du produit : ”) ;
scanf("%d",&P elem
...
jour);
printf(”Entrer le mois
d'expiration du produit : ”) ;
scanf("%d",&P elem
...
mois);
printf(”Entrer l'année
d'expiration du produit : ”) ;
scanf("%d",&P elem
...
annee);
printf(”Entrer le libelle du
produit ”) ;
scanf("%s",P elem
...
256

Mheni & SGarbouje

C
...
Elem
...
Elem
...
Elem
...
Suiv ← L
L← P
FinPour
Fin

produit”) ;
scanf("%f",&P elem
...

quantite);
P suiv = *L;
*L = P;
}

4)

Fonction Nb_ Prix_2_Dinars
(L : Liste) : Entier
Variables
P : Liste
nb : Entier
Début
P←L
nb ←0
TantQue(P#Null)

int Nb_ Prix_2_Dinars
(cellule **L)
{
cellule *p;
int nb=0;
p = *L;
while (p!=NULL)

p
...
Elem
...
prix>2)
nb++;
return(nb);
}

FinTQ
Nb_ Prix_2_Dinars
←(nb)
Fin
5)

Procédure supprimer (Var L
: Liste)
Variables
P, Q : Liste
Début
Si (L = Nil) Alors
Ecrire ("liste vide")
Sinon
P←L
Tant que (P ≠ null) faire
Si
(P^
...
DateEXP
...
Elem
...
mois<=06
) ET
P^
...
DateEXP
...
Suiv

void supprimer (cellule **L)
{
if (*L==NULL)
printf ("liste vide");
else
{
p=*L;
while (p!=NULL)
{
if
((p elem
...
annee<=
2015) &&
(p elem
...
mois<=06
) &&
p elem
...
jour<=15))
{
aux =p;
if (aux==*L)
*L=L suiv;

p
...
Suiv
Libérer(Q)
Sinon
P←P^
...
259

Mheni & SGarbouje

Les arbres binaires
Certaines données informatiques sont représentées de
manière hiérarchique, telle que l'organisation interne des
fichiers en mémoire
...
Ces deux raison font des
arbres une des notions fondamentales en informatiques
...
Définition:
Un arbre est un ensemble de nœuds organisés sous
forme d'arborescence, de façon à ce que chaque nœud
possède un ascendant unique sauf le nœud racine qui n'en a
aucun
...

Un arbre est caractérisé par :
• une racine : un noeud qui n'a aucun parent
...
260

Mheni & SGarbouje

Chaque nœud possède une étiquette, qui peut être une
valeur ou bien un enregistrement, et deux pointeurs l'un sur le
fils gauche et l'autre sur le fils droite
...
261

Mheni & SGarbouje

II
...

En algorithmique
Type
Nœud = enregistrement
valeur : entier
filsG : ^Noeud
filsD : ^Noeud
Fin Enregsitrement
Arbre : ^Nœud

En langage C
typedef struct arbre
{
int val ;
struct arbre *filG ;
struct arbre *filD ;
} arbre ;

p
...
Création d'un arbre binaire de recherche
Pour créer un arbre binaire trié, il suffit d'ajouter les
noeuds un à un à leur emplacement en faisait appel à la
procédure récursive ajouterNoeud qui doit comparer la valeur
à insérer avec celle du noeud actuel
...

En algorithmique
Procédure ajouterNoeud (x : Entier , Var B :
Arbre)
Variables
aux : Arbre
Début
Si (B = Nil) Alors
Allouer (aux)
aux^
...
filsG ← Nil
aux^
...
valeur) Alors
ajouterNoeud (x,
B^
...
filsD)
FinSi

En langage C
void ajoutNoeud (int x, arbre **B)
{
if (*B==NULL)
{
aux = (arbre*) malloc(sizeof(arbre));
aux val = x;
aux filG = NULL;
aux filD = NULL;
}
else
{
if (x<= *B x)
ajoutNoeud(x, *B filG);
else;
ajoutNoeud(x, *B filD);
}
} arbre ;

p
...


En langage C
main()
{
arbre *racine=NULL;
int e;
do
{
printf ("Entrer un entier :");
scanf("%d",&e);
ajoutNoeud(e, &racine);
} while (e!=0);
}

IV
...
On utilise
souvent une procédure récursive mais il est possible de le
faire de manière itérative
...
264

Mheni & SGarbouje



méthode préfixe : le noeud est traité en premier
ensuite le fils gauche puis le fils droite
...

L'affichage 91 1 67 12 7 82 61 est appelé parcourt infixe ou
symétrique
...

Voici la description algorithmique des trois procédures de
parcours
...
265

Mheni & SGarbouje

Procédure Affichage_prefixe (a : Arbre)
Début
Si (a ≠ nil)alors
Ecrire (a^
...
filG)
Affichage_prefixe (a^
...
filG)
Ecrire (a^
...
filsD)
FinSi
Fin
Procédure Affichage_postfixe (a : Arbre)
Début
Si (a ≠ nil)alors
Affichage_postfixe (a^
...
filsD)
Ecrire (a^
...
266

Mheni & SGarbouje

V
...
La recherche consiste à parcourir l'arbre en
commençant par la racine
...
La recherche s'arrête dès que la valeur est trouvée
ou lorsqu'on atteint toutes les feuilles
...
Recherche itérative

En algorithmique
Fonction rechercheIter (a : Arbre , n: entier) :
booléen
Variables
trouvee : booléen
Début
trouvee ← faux
Tant que (a ≠ nil ET trouvee = faux)
faire
Si (n = a^
...
valeur) alors
a ← a^
...
filsD
FinSi
FinSi

En langage C
int rechercheIter (arbre *a, int n)
{
int trouvee=0;
while (a != NULL && trouvee==0)
{
if (n == a val )
trouvee = 1;
else
if (n < a val)
a = a filsG;
else
a = a filsD;
}
return (trouvee);
}

p
...

b
...
valeur) alors
rechercheRec ←(vrai)
Sinon
Si (n < a^
...
filsG,n))
Sinon
rechercheRec ←(rechercheRec(a^
...


En langage C
int rechercheRec (arbre *a, int n)
{
if (a == NULL)
return 0;
else
{
if (n == a val )
return 1;
else
if (n < a val)
return(rechercheRec(a filsG, n);
else
return(rechercheRec(a filsD, n);
}
}

VI
...
D'abord, il faut identifier

p
...
Ensuite, nous avons
trois possibilités :


1er cas : il ne possède aucun fils (c'est une feuille) : le
noeud est supprimé directement



2ème cas : il possède un seul fils, ce fils prendra la place
du noeud à supprimer,



3 ème cas : il possède deux fils non nil, dans ce cas, il
faudra chercher dans le sous arbre gauche, le fils qui a la
valeur la plus grande pour prendre la place du noeud à
supprimer
...
269

Mheni & SGarbouje

Voici les procédures et fonctions qui effectuent cette
suppression :
En algorithmique
Procédure suppression (Var a : Arbre ,
n:entier)
Début
Si (a = nil) alors
Ecrire ("Erreur : Arbre vide !")
Sinon
// arbre non vide
Si (n = a^
...
valeur) alors
suppression (a^
...
filsD, n)
FinSi
FinSi
FinSi
Fin
...
270

Mheni & SGarbouje

*a = *a filsD
free(aux);

Début
Si (a^
...
filsD
liberer (aux)
Sinon
Si (a^
...
filsD
liberer (aux)
Sinon
f ← chercherFils (a^
...
valeur = f^
...
filsG, f^
...

Fonction chercherFils (a : Arbre) : Arbre

}

Début
Si (a^
...
filsD)
FinSi
Fin
...
271

Mheni & SGarbouje

VII
...

2) Ecrire une fonction récursive hauteur qui prend en
paramètre la racine d'un arbre et retourne la hauteur de cet
arbre
...

Exercice 2 :
Soit un arbre binaire composé d’expressions arithmétiques
(voir figure)
...

2) Ecrire une procédure equation qui permet d’afficher
l’arbre à l’écran de la manière suivante : 5 * 3 % 4 + 2

Exercice 3 :
1) Ecrire une fonction existe qui retourne vrai si x (un réel)
est dans l'arbre donné en paramètre
...
272

Mheni & SGarbouje

2) Ecrire une procédure insérer qui vérifie si un réel est
dans l'arbre donné en paramètre sinon il l'insère dans le
sous arbre qui possède le moins de noeuds
...
12 sera inséré à
gauche
...

3) Ecrire une fonction somme qui retourne la somme des
valeurs de tous les noeuds
4) Ecrire un algorithme ArbreRéel qui crée un arbre
composé de 20 éléments puis affiche la somme de leurs
valeurs
...
Correction exercices
Exercice 1 :

1) typedef struct t_arbre
{
t_arbre
=
float val ;
Enregistrement
struct t_arbre *filG ;
val : réel
struct t_arbre *filD ;
filsG
:
} t_arbre ;
^t_arbre
filsD
:
^t_arbre
2) int hauteur (t_arbre *A)
{
Fin Enregistrement
if (A==NULL)
2) Fonction hauteur (A :
return 0;
1) Type

p
...
filsG), {
if (a>b)
hauteur(A^
...
274

Mheni & SGarbouje

nbNoeuds
(A^
...
filsD))
FinSi
Fin

+

Exercice 2 :

1) Type
t_char = Enregistrement
val : char
filsG : ^t_char
filsD : ^t_char
Fin Enregistrement
2) Procédure equation (A :
^t_char)
Début
Si (A ≠ nil) alors
equation (A^
...
val)
equation (A^
...
275

Mheni & SGarbouje

On définit Arbre = ^t_arbre
Fonction existe (A : Arbre, x :
réel) : booléen

if (A == NULL) alors
return 0;
else
{ if (A val == x)
return 1;
else
return
(
existe
(A filsG,
x)
||
existe(A filsD, x));
}

Début
Si (A = nil) alors
existe ←(faux)
Sinon
Si (A^
...
filsG,
x)
OU
existe(A^
...
276

Mheni & SGarbouje

aux^
...
filsG ← nil
aux filsD = nil;
aux^
...
filsG)<
{
nbNoeuds(A^
...
filsG, x)
*A filsG
)
<
Sinon
nbNoeuds(*A filsD))
inserer (A^
...
val
somme
(A^
...
filsD))
FinSi

3) int somme (t_arbre *A)
{
if (A==NULL)
return 0;
else
return ( A val + somme
(A filsG)
+
+ somme(A filsD));
+ }

p
...
278

Mheni & SGarbouje

éléments de l'arbre = ",
somme (racine))
Fin

Problèmes
Dans cette section nous avons choisit un ensemble de
problèmes pris des devoirs de contrôle et des examens durant
toute l'année universitaire
...
Enoncés
Problème n°1

Thèmes : fonction et procédure, chaîne de caratère
Type : Examen du 1er semestre

Un entier strictement positif K est dit nombre de Kaprekar si
lorsqu'on élève K au carré (C=K2, C est composé de n
chiffres), la somme du nombre composé des m chiffres de
droite de C au nombre composé des n-m chiffres de gauche
de C redonne le nombre d'origine K
...
279

Mheni & SGarbouje

Exemples : 9, 45 et 297 sont des nombres de Kaprekar :
K=9

C= 92 = 81 et 1+8=9

=>

K=45 =>
possibles :
m=1
m=2
m=3

C= 452 =2025 => n=4 Les

combinaisons

5 + 202 ≠ 45
25 + 20 = 45
025 + 2 ≠ 45

L’une des combinaisons vérifie la propriété donc 45 est
un nombre Kaprekar
K=297 => C= 2972 =88209 => n=5 Les
combinaisons possibles :
m=1
m=2
m=3
m=4

9 + 8820 ≠ 297
09 + 882 ≠ 297
209 + 88 = 297
8209 + 8 ≠ 297

L’une des combinaisons vérifie la propriété => donc 297
est un nombre Kaprekar
Travail demandé :
On vous demande d‘écrire les algorithmes des procédures et
des fonctions suivantes :

p
...
Procédure lecture (var K: entier) qui permet de lire un
entier strictement positif K
...
Fonction longueur (C : entier) : entier qui, étant donné
un entier C, détermine le nombre de ses chiffres
...
Procédure décompose (C, m : entier, var CD : entier,
var CG : entier)
Qui, étant donné 2 entiers C et m, détermine deux entiers
CD et CG comme suit :
- CD est composé des m chiffres de droite de C
...

Exemple :
Si C=1234, m=3
C1=234, C2=1
4
...

5
...

Problème n°2

Thèmes : fonction et procédure, chaîne de caratère
Type : Examen du 1er semestre

p
...
Pour ceci, il
vous demande de lui développer l’algorithme d’un
programme permettant d’évaluer les élèves de la classe
...

Soient les déclarations suivantes :
CONST NMAX=100
tabc : tableau (1
...
NMAX) entier
tabpf : tableau (1
...
26*NMAX) caractère
Exemple :
N : nombre d’élèves de la classe
...
282

Mheni & SGarbouje

1
REPONSE

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

A

B

C

D

E

F

G

H

I

J

K

L

M

N

O

P

Q

R

S

T

U

V

W

L’élève n° 3 a rempli le tableau REPONSE comme suit :
1
REPONSE

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

A

B

C

D

A

F

G

H

I

J

K

L

M

N

O

P

Q

S

R

T

U

V

W

X

Y

Z

L’élève n° 4 a rempli le tableau REPONSE comme suit :
1
REPONSE

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

A

B

C

D

A

F

G

H

I

J

K

L

M

N

O

P

Q

R

S

T

U

V

W

X

Y

Z

Le programme produit les tableaux suivants :
1

3

4

4

FAUTE

2
0

3

0

Les fautes de l’élève n°1

TF

Les fautes de l’élève n°3

E

C

N

M

A

S

R

1

2

3

4

5

6

7

p
...
Procédure lecture (Var N : entier) qui permet de saisir
le nombre d’élèves N
...

2
...
Les lettres doivent être
majuscules
...
Fonction TESTFAUTE (l : caractère, pos : entier) :
booléen qui permet de vérifier si une lettre donnée en
paramètre est bien placée étant donnée sa position dans le
tableau
...

Exemple :
Pour l’élève n°1 :
TESTFAUTE ("E", 3) retourne faux car le rang de la
lettre "E" dans l’alphabet est 5≠3
...
284

Mheni & SGarbouje

TESTFAUTE ("J", 10) retourne vrai car le rang de la
lettre "J" dans l’alphabet est 10
...
Fonction NBFAUTE (REPONSE: tabc) : entier qui
permet de retourner le nombre de fautes présentes dans le
tableau REPONSE
...

5
...

Exemple :
1
FAUTE

2

3

4

4

0

3

0

La fonction devra retourner 7
...
Procédure AFFICHE (FAUTE :tabe, N :entier) qui
affiche les numéros des élèves qui ont bien récités
l’alphabet
...


p
...
Procédure AJOUTERTFPF (REPONSE :tabc,Var
TF :tabf, Var PF : tabpf, Var j :entier)
Qui permet d’ajouter dans le tableau TF et PF à partir de la
position j pour un élève les fautes commis ainsi que leurs
positions dans le tableau REPONSE
...
286

Mheni & SGarbouje

TP

3

5

13

14

Pour l’élève n°3 :
1
REPONSE

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

A

B

C

D

A

F

G

H

I

J

K

L

M

N

O

P

Q

S

R

T

U

V

W

j=5
TF

E

C

N

M

A

S

R

1

2

3

4

5

6

7
26*NMAX

TP

3

5

13

14

5

18

19

8
...
(Respecter le format d’affichage cidessous)
...

"C" dans la position 5
...

"M" dans la position 14
...


p
...
Ecrire l’algorithme principal qui, en faisant appel aux
modules développés ci- dessus, permet de :
- Saisir le nombre N des élèves de la classe
...

- Calculer puis afficher le nombre total de fautes des
élèves
...

- Afficher le nombre de fautes pour chaque élève, ainsi
que la liste de toutes les fautes et leurs positions
respectives
...
L’algorithme à
écrire va afficher un menu, lire le choix de l’utilisateur et
réaliser l’action demandée
...
288

Mheni & SGarbouje

Cet algorithme est composé d’un menu qui exécute le choix
de l’utilisateur par le biais d’un caractère, celui-ci doit être
compris entre ′A′ et ′H′
...
faire
...
Après
chaque action l’affichage du menu apparaît de nouveau pour
que l’utilisateur demande une nouvelle action
...

Le menu affiche sur l’écran :
[A] – Création du tableau
[B] – Affichage du tableau
[C] – Modification d’un élément du tableau
[D] – Ajout d’un élément à la fin du tableau
[E] – Suppression d’un élément du tableau
[F] – Insertion d’un élément dans le tableau
[G] – Affichage de l’élément le plus fréquent dans le
tableau

p
...
La question finale [I] est de
regrouper les appels à ces fonctions et procédures afin de
créer un algorithme, qui traite les choix (ci-dessus d'un
utilisateur utilisant la structure selon)
Objectifs :
L’algorithme répète l’affichage du menu et selon le choix de
l’utilisateur exécute le traitement correspondant jusqu'à ce
que le choix soit ‘I’
...

On utilisera la constante Max et le type tab définis par :
CONSTANTE Max=25
TYPE tab = TABLEAU (1
...
290

Mheni & SGarbouje

Explication du menu :
[A] – Création du tableau :
Si l’utilisateur tape la lettre ′A′, le message affiché sera
« Création du tableau » : lecture de la taille du tableau
(10≤N≤Max), et remplissage du tableau T par des entiers
...

-

devront appartenir à l’intervalle

Ecrire cette procédure de remplissage

[B] – Affichage du tableau
Si l’utilisateur tape la lettre ′B′, le message affiché sera
« Affichage du tableau» : Affichage des éléments de T
précédés de leur rang
...


p
...

Exemple :
N=11, val=601
L’état de tableau T1 avant l’ajout de val

p
...

Exemple :
N=11, ps=8

l’élément à supprimer occupe la position 8

L’état de tableau T avant la suppression de l’élément
numéro 8
T

822

904

256

82

134

609

789

710

p
...

Exemple :
N=11, pi=7, val= 833
L’état de tableau T avant l’insertion de val

p
...
(tabocc[i] contient le nombre d’occurrence de
T[i] dans T)
...
295

12
3

16
8

Mheni & SGarbouje

1

2

3

4

5

6

7

8

9

tabocc

1
3
3
3
1
3
2
1
3
1
2
3
4
5
6
7
8
9
Pour déterminer le premier élément le plus fréquent, on
cherche ‘’l’indice du premier élément qui a le plus grand
nombre d’occurrence’’ (dans notre exemple l’indice qui
vérifie cette propriété est 2 puisque tabocc[2]=3 donc on
affiche T[2])
...

[H] – Quitter
Si l’utilisateur tape la lettre ′I′, le message affiché sera
« Quitter» :
L’algorithme s’arrête
...

[I]écrire l'algorithme principal contenant la liste des choix
et l'appel des fonctions et procédures précédentes dans la
structure selon
...

Problème n°4

Thèmes : fonction et procédure, tableau d'enregistrement
Type : Examen du 2nd semestre

p
...
Pour cela, on vous demande de réaliser un programme
qui permet de résoudre ce problème
...
Ainsi, le Ministère de
l’Enseignement Supérieur met à la disposition des candidats
les fiches de choix
...
Les candidats orientés recevront une fiche
d'affectation; les autres, une fiche de choix de couleur verte et
la capacité restante pour le 2ème tour
...
297

Mheni & SGarbouje

Un prénom,
Et une formule globale FG
...

Exemple :
N=100
CIN

NOM

PRENOM

FG

1

"SASSI"

"RIM"

132
...
3655

3

"05933178"

"HASSEN"

"YASSINE"

136
...
2478





















99

"05674856"

"LARIBI"

"RANIM"

97
...
3572

- La liste des filières :
Chaque filière est identifiée par :
Un nom de filière,
Un score,
Et un nombre de places offertes
...

Exemple :

p
...
2147

10

2 "MEDECINE
TUNIS"

188
...
2547

14

4 "PHARMACIE"

172
...
2314

50

… …





… …





39 "BG1 PREP SFAX"

146
...
2522

10

- Classement des candidats par ordre de mérite (selon la
Formule Globale):

p
...

CIN

NOM

PRENOM

FG

1 "05847147" "KNISSI"

"HAZAR"

189
...
3572

3 "05933178" "HASSEN"

"YASSINE" 136
...
5689

… …







… …







"RANIM"

97
...
2478

99 "05674856" "LARIBI"

- Orientation des candidats :
L’orientation des candidats se fait un par un et par ordre, le
1er candidat orienté est celui qui a la meilleure FG, puis le
2ème candidat orienté est celui qui a la 2ème meilleure FG et
ainsi de suite jusqu’au dernier candidat
...


p
...
FG) est
supérieure ou égale au score de la filière CHOIX[i] et
aussi le nombre de places offertes NB_PL de CHOIX[i]
est supérieur stricte à 0 »
...

Sinon ORIENTATION[j]

"Deuxième Tour"

N’oubliez pas :
- D’utilisez la méthode de recherche séquentielle,
- Et de décrémenter le nombre de places offertes NB_PL
de CHOIX[i] dans le cas où la condition est vraie
...
FG= 189
...
301

Mheni & SGarbouje

L’indice de ce choix dans le tableau F est 2
...
SCORE=188
...


La formule globale de candidat numéro 1 est supérieure
au score de choix numéro 1 et le nombre de places offertes
de choix est supérieur stricte à 0
...

Et le nombre de places offertes NB_PL de "MEDECINE
TUNIS" est diminué de 1
...
FG= 156
...
302

Mheni & SGarbouje

CHOIX

"PHARMAC
IE"

"BG1 PREP
SFAX"

1

"INFO ISET
KEBILI "
2



"INFO GEST
SFAX "

3

10

CHOIX [1]= "PHARMACIE"
L’indice de ce choix dans le tableau F est 4
...
SCORE=172
...

NB_PL=15
La formule globale de candidat numéro 2 est inférieure
au score de choix numéro 1 et le nombre de places
disponible de choix est supérieur stricte à 0
...

CHOIX [2]="BG1 PREP SFAX"
L’indice de ce choix dans le tableau F est 39
...
FG=146
...

NB_PL=25
La formule globale de candidat numéro 2 est supérieure
au score de choix numéro 2 et le nombre de places offertes
de choix est supérieur stricte à 0
...

Et le nombre de places offertes NB_PL de "BG1 PREP
SFAX" est diminué de 1
...
303

100

Mheni & SGarbouje

Et ainsi de suite jusqu’au dernier candidat
...
3665
ORIENTATION : MEDECINE TUNIS
-------------------------------------------------------------Ministère de l'enseignement supérieur, de la recherche
scientifique et de la technologie
Tunis le 21/07/2011
CIN: 05793871
NOM : FKIH HAMED
FG : 156
...
304

Mheni & SGarbouje

Structure CANDIDAT
CIN : Chaîne
NOM : Chaîne
PRENOM : Chaîne
FG : Réel
FinStruct
Structure FILIERE
NOM : Chaîne
SCORE : Réel
NB_PL : Entier
FinStruct
TABC=tableau (1
...
MMAX) FILIERE
TABCH=tableau (1
...
NMAX) de chaîne
1
...

2
...

N
...

On suppose que les numéros CIN saisis sont corrects
...

3
...


p
...
B :
- On suppose que les noms des filières sont tous distincts
...

- Le nombre de places offertes pour chaque filière est dans
[1
...

4
...

N
...

5
...

N
...

6
...

(Recherche séquentielle par nom)
...
B : On suppose que nom_filiere existe dans le tableau F
...
Ecrire une fonction Premiere_Pos_Filiere(F : TABF;
CHOIX :TABCH; C : TABC; j :entier) :entier, qui permet
de retourner pour un candidat numéro j, la position i de la
première filière CHOIX[i] qui a un score inférieur ou égal à
C[j]
...
Sinon cette
fonction doit retourner 0
...
306

Mheni & SGarbouje

8
...

(ORIENTATION[j]
contient
l’orientation de candidat numéro j)
...
Ecrire une procédure Affiche_Orientation_Candidat (C:
TABC; ORIENTATION:TABO; j:entier), qui permet
d’afficher l’orientation de candidat numéro j selon le format
indiqué dans l’exemple
...
Ecrire l’algorithme principal ORIENATATION_UNIV
qui permet de :
Saisir le nombre des candidats N ainsi que le nombre de
filières M,
Remplir la liste des candidats,
Remplir la liste des filières,
Classer les candidats par ordre de mérite (selon la
Formule Globale),
Pour chaque candidat :
• Saisir ses 10 choix,
• Affecter ce candidat selon ses choix et la
disponibilité de filières
...


p
...
Différents algorithmes de tri peuvent être utilisés
parmi lesquels la méthode de Tri de distribution dite aussi tri
postal que nous proposons d’écrire :
A
...
308

1

Mheni & SGarbouje

1

2

3

4

5

6

7

8

9

10

……
...


Le tableau TB associé au tableau T donné dans
l’exemple présenté ci-dessus est :

TB :

0

1

0

0

0

1

0

1

0

0

……

1

1

2

3

4

5

6

7

8

9

10

……
...
309

99

Mheni & SGarbouje

• Finalement, on trie le tableau T en utilisant les
transformations effectuées sur le tableau TB, selon le
principe suivant :
T[j]← i
si (TB[i]=0) avec i=1,…
...
310

Mheni & SGarbouje

TYPE TAB = TABLEAU [1
...

2) Ecrire une procédure algorithmique, appelée
SAISIE_VECT qui permet de remplir N cases d’un
tableau T avec des valeurs entières compris entre 1 et
NMAX
...

Les paramètres de cette procédure sont :
N : entier

paramètre donné passé par

T : TAB

paramètre résultat passé par

valeur
...

3) Ecrire une procédure algorithmique, appelée
INIT_VECT qui permet d‘initialiser un tableau TB
de taille 99 à 1
...

4) Ecrire une fonction algorithmique, appelée
MAX_VECT qui permet de retourner la valeur

p
...
Les
paramètres de cette procédure sont :
N : entier paramètre donné passé par
valeur
...

5) Ecrire une procédure algorithmique, appelée
REMP_VECT qui permet de remplir un tableau TB
en utilisant un tableau T selon le principe présenté
dans la partie A
...
Les paramètres de cette procédure sont :
N : entier
paramètre donné passé par
valeur
...

TB : TAB paramètre résultat passé par
variable
...
cette procédure faits appel à la
fonction MAX_VECT pour déterminer la plus grande
élément du tableau T
...
312

Mheni & SGarbouje

TB : TAB paramètre donné passé par
valeur
...

7) Ecrire une procédure algorithmique, appelée
AFFICH_VECT qui permet d’afficher les éléments
d’un tableau T de dimension N
...

T : TAB

paramètre donné passé par

valeur
8) En utilisant les procédures et les fonctions
précédemment définies, écrire un algorithme intitulé
Tri_Postal qui permet de :
• Saisir un entier N à partir du clavier
...

• Remplir le tableau T, par N entier, dont les
valeurs varient entre 1 et 99, et chaque élément
saisi de T ne doit pas être répété
...

• Remplir le tableau TB en parcourant le tableau
T
...
313

Mheni & SGarbouje

• Transformer le tableau T en se basant sur le
tableau TB
...


II
...
h>
entier) : entier
int longueur(int k)
{
Variables
ch :chaîne
char ch[100];
sprintf(ch, "%d", k);
Début
Convch (k, ch)
return(strlen(ch));
longueur ←(long(ch))
}
Fin
3)
Procédure décompose
void decompose (int c, int
(C:entier, m : entier , var CD : m, int *cd, int *cg)
entier, var CG : entier)
{

p
...
315

Mheni & SGarbouje

5)
Algorithme principal
Var iables
k :entier
Début
Lecture (k)
Si verif_kaprekar (k)=
vrai alors
Écrire (k,’’est un
nombre kaprekar’’)
Sinon
Écrire (k,’’n’est pas
un nombre kaprekar’’)
Fin si
Fin

main ()
{ int k;
lecture (k);
if (verif_kaprekar(k))
printf ("%d est un nombre
kaprekar", k);
else
printf("%d n'est pas un
nombre kaprekar", k);
}

Correction Problème 2:

1)
Procédure lecture (Var N :
entier)
Début
Répéter
Ecrire ("donner le nombre
des élèves 3≤N≤NMAX")
Lire (N)
Jusqu'à (3≤N et N≤NMAX)
Fin

void lecture (int *n, int
NMAX)
{
do {
printf ("Donnez le nombre
des élèves compris entre 3 et
%d :", NMAX);
scanf ("%d",n);
}while (*n<3 || *n>NMAX);
}

2)
Procédure REMPLIR (VAR REPONSE: tabc)

void remplir (char reponse[])

p
...
’’Z’’])
Fin pour
Fin
3)
Fonction TESTFAUTE (l : caractère, pos :
int testFaute(char l,
entier) : booléen
int pos)
{
Début
if (l-65+1==pos)
Si (ord(L) -65+1=pos)
return 1;
Alors
Ou TESTFAUTE
else
TESTFAUTE
←( (ord(L)return 0;
←(vrai)
65+1=pos)
}
Sinon
TESTFAUTE←(faux)
Fin si
Fin
4)
Fonction NBFAUTE
(REPONSE: tabc) :
entier
Variables
i,Nbf : entier
Début

int nbFaute(char reponse[])
{ int i,nbf=0;
for (i=0;i<26;i++)
if (testFaute(reponse[i],i)==0)
nbf++;
return nbf;

p
...
318

Mheni & SGarbouje

Pour i de 1 à N répéter
printf ("L'élève n°%i a
Si (FAUTE[i]=0) alors
bien récité l'alphabet", i+1);
Ecrire ("l’élève numéro }
",i , "a bien récité l’alphabet")
Fin si
Fin pour
Fin
7)
void ajouterTFPF (char
Procédure
AJOUTERTFPF
reponse[], char tf[], int pf[], int
(REPONSE :tabc ,Var
*j)
TF :tabf , Var PF : tabpf , { int i;
Var j :entier)
*j=-1;
for (i=0;i<26;i++)
Variables
i :entier
if
(testFaute(reponse[i],i)==false)
Début
j 0
{
Pour i de 1 à 26 répéter
*j++;
Si (TESTFAUTE
tf[*j] = reponse[*j];
(REPONSE [i], i)=faux)
pf[*j] = i;
alors
}
j j+1
}
TF[j]
REPONSE [i]
PF[j] i
Fin si
Fin pour
Fin
8)
void afficheResultat (int n,
Procédure

p
...
c
#include ...
320

Mheni & SGarbouje

tabc : tableau (1
...
NMAX) entier
tabpf : tableau (1
...
26*NMAX)
caractère
Variables
N,j,i ;entier
REPONSE :tabc
FAUTE :tabe
TF :tabf ; PF : tabpf
Début
Lecture (N)
j 0
Pour i de 1 à N répéter
REMPLIR (REPONSE)
FAUTE[i] NBFAUTE(REPONSE
)
AJOUTERTFPF(REPONSE,TF,PF,
j)
Fin pour
Ecrire
(NBTOTALFAUTE(FAUTE,N))
AFFICHE(FAUTE,N)
AFFICHRESULTAT
(N,FAUTE,PF,TF)
Fin

main()
{
const int
NMAX=100;
int i,j,n,
faute[NMAX],
pf[26*NMAX];
char reponse[26],
tf[NMAX*26];
lecture (&n);
j=0;
for (i=0;i{ remplir
(reponse);
faute[i] =
nbFaute(reponse);
ajouterTFPF
(reponse, tf, pf,& j);
}
printf ("nombre
total de faute = %d",
nbTotalFaute(faute,n))
;
affiche(faute,n);
afficheResultat ( n,
faute, pf, tf);
}

p
...
322

Mheni & SGarbouje

Début
T[pm]←val
Fin
4)
TabN : Tableau [1
...
323

Mheni & SGarbouje

FinSi
Fin
6)
TabN : Tableau [1
...
324

Mheni & SGarbouje

Pour j de 1 à N faire
{
Si (T[i]=T[j]) alors
if (t[i] == t[j])
Nb←Nb+1
nb++;
FinSi
}
FinPour
tocc[i] = nb;
Tocc[i]←Nb
}
FinPour
max = tocc[0];
Max←Tocc[1]
for (i=0 ; iPour i de 1 à N faire
if (tocc[i]>max)
Si(Max {
Max←Tocc[i]
max = tocc[i];
pos←i
pos = i;
finSi
}
FinPour
printf ("L'élément le plus
Ecrire( "L'élement le plus
fréquent est %d",t[pos]);
fréquent est ",T[pos])
}
Fin
8)
Algorithme Menu
main ()
CONSTANTE N=25
{
const int N=25;
TYPE
tab = TABLEAU [1
...
N+1] entier int t[N], t2[N+1];
int pm, val, pos;
Variables
Choix:caractère
T:tab,
do
T2:tab2
{
Pm,val,pos:entier
printf ("Donnez votre
choix [tapez un
Début
Répeter
caractère]");

p
...
326

Mheni & SGarbouje

cas 'D' : Ecrire("Ajout d’un
élément à la fin du tableau")
Ecrire("donner l'élement à ajouter
à la fin") lire(val)
AjoutVal(T,T2,val,N)
cas 'E' : Ecrire("Suppression d’un
élément du tableau ")
Ecrire("donner la position de
l"élement à supprimer") lire(pos)
suppression(T,pos,N)
cas 'F' : Ecrire("Insertion d’un
élément dans le tableau")
Ecrire ("donner la position de la
valeur à insérer et la nouvelle
valeur")
Lire(pos) Lire (val)
InsertionVal(T,T2,pos,val)
cas 'G' : Ecrire("Affichage de
l’élément le plus fréquent dans le
tableau")
MaxOcc(T, T2,N)
cas 'H' : Ecrire("Vous avez choisit
de Quitter")
FinSelon
Jusqu'à (choix='H')
Fin

case 'C' : printf
("Modification d'un
élément du tableau");
printf
("Donnez la position de
la case à modifier et la
nouvelle valeur");
scanf
("%d",&pm);
scanf
("%d",&val):
modif_tablea
u (t, N, pm, val);
case 'D' : printf
("Ajout d'un élément à
la fin du tableau");
printf
("Donnez l'entier à
ajouter");
scanf("%d",
&val);
ajoutVal (t,
N, t2,val);
case 'E' : printf
("Suppression d'un
élément du tableau");
printf
("Donnez la position de
l'élément à supprimer");
suppression

p
...


p
...

Procédure
Remplir_Liste_Candidats (var
C : TABC , N: entier)
Var iables
i :entier
Début
Pour i de 1 à N répéter
Ecrire ("Donner le numéro CIN de
candidat N°", i)
Lire (C[i]
...
NOM)
Jusqu'à (long (C[i]
...
329

Mheni & SGarbouje

Répéter
Ecrire ("Donner le prénom de
candidat N°", i)
Lire (C[i]
...
PRENOM)>2)
Répéter
Ecrire ("Donner la formule
globale de candidat N°", i)
Lire (C[i]
...
FG>50) et (C[i]
...

Procédure
Remplir_Liste_Filieres(VAR F :
TABF ; M: entier)
Var iables
i :entier
Début
Pour i de 1 à M répéter
Répéter
Ecrire ("Donner le nom de la
filière N°", i)
Lire (F[i]
...
NOM)>2)
Répéter
Ecrire ("Donner le score de la
filière N°", i)

do {
printf ("Donnez le
nombre des filières");
scanf ("%d",m);
} while (m<10 ||
m>MMAX);
}
2) void
remplirListeCandidat
s (candidat C[], int n)
{
for (i=0; iprintf ("Donnez le
numéro de CIN du
candidat n°%d", i);
scanf ("%s", C[i]
...
nom);
} while
(strlen(C[i]
...
prenom);

p
...
SCORE)
Jusqu'à (F[i]
...

SCORE<200)
Répéter
Ecrire ("Donner le nombre de
places offertes pour la filière N°",
i)
Lire (F[i]
...
NB_PL>=1) et (F[i]
...

Procédure Tri_Candidats (VAR
C : TABC ; N: entier)
Var iables
Pos ,i, j :entier
C1 : candidat
Début
Pour i de 1 à N-1 répéter
Pos i
Pour j de i+1 à N répéter
Si (C[j]
...
FG) alors
Pos j
Fin si
Fin pour
Si (Pos≠i) alors
C1 C[i]
C[i] C[Pos]
C[Pos] C1

} while
(strlen(C[i]
...
fg);
} while (C[i]
...
fg>=200);
}
}
3) void
remplirListeFilieres
(filiere F[], int m)
{
for (i=0; ido {
printf ("Donnez le
nom de la filière :");
scanf ("%s",
F[i]
...
nom) <= 2);
do {
printf ("Donnez le
score de la filière :");
scanf ("%f",
&F[i]
...
331

Mheni & SGarbouje

Fin pour
Fin
5
...
score <=
50 || F[i]
...
nb_pl);
} while (F[i]
...
nb_pl>50);
}
}

4) void TriCandidats
(candidat C[], int n)
{ int pos, i, j;
candidat c1;
for (i=0; ipos = i;
6
...
fg >
Var
C[pos]
...
NOM= nom_filiere)
}
Pos_Filiere ←(i)
}
Fin
}

p
...

Fonction
Premiere_Pos_Filiere(F : TABF;
CHOIX :TABCH; C : TABC;
j :entier) :entier
Var
i ,p:entier
Début
i 0
Répéter
i i+1
p Pos_Filiere(F, CHOIX[i])
Jusqu’à ( (F[p]
...
FG)
et (F[p]
...

Procédure
Affecte_Orientation_Candidat(V
AR ORIENTATION :TABO; VAR
F : TABF; CHOIX:TABCH; C
:TABC; j:entier)
Var
k : entier

5) void
SaisirChoixCandidat
(char* choix[], int j)
{ int i;
printf ("Donnez les 10
choix du candidat
n°%d", j);
for (i=0; i<10 ; i++) {
printf ("Donnez les 10
choix du candidat
n°%d", i);
scanf ("%s",choix[i]);
}
}
6) int posFiliere
(filiere F[], char
nomFiliere[30])
{ int i;
i=-1;
do {
i++;
} while
(strcmp(F[i]
...
333

Mheni & SGarbouje

Début
k
Premiere_Pos_Filiere(F ,CHOIX ,
C, j )
Si (k ≠0) alors
ORIENTATION[j] F[k]
...
NB_PL F[k]
...
score
>C[j]
...
nb_pl
9
...
CIN)
{ int k;
Ecrire (" NOM :", C[j]
...

k = premierePosFiliere

p
...
FG)
Ecrire (" ORIENTATION : ",
ORIENTATION [j])
Ecrire ("- - - - - - - - - - - - - - - - - - ---------------------")
Fin
10
...
NMAX]
CANDIDAT
TABF=tableau [1
...
10] de chaîne

(F, choix, C, j);
if (k!=0) {
orientation[j] =
F[k]
...
nb_pl =
F[k]
...
335

Mheni & SGarbouje

TABO=tableau [1
...
cin, C[j]
...
prenom, C[j]
...
336

Mheni & SGarbouje

idat (C, orientation, j);
}
}

p
...
338

Mheni & SGarbouje

Algorithmique :
1)
Fonction TAIL_VECT ():
entier
Var
N: entier
Début
Répéter
Ecrire (‘’donner un entier
N’’), lire (N)
Jusqu'à (N >1 ET
N<=NMAX])
TAIL_VECT ←(N)
Fin
2)
Procédure SAISIE_VECT
(var T : VECTE, N: entier)
Var
I : entier
Début
Pour i de 1 à N répéter
Répéter
Ecrire (‘’donner l’élément
numéro ’’,i)
Lire (T [i])
Jusqu'à (T [i] >=1 ET T[i]<=
NMAX]) et (RECHERCHE
(T, i-1, T[i])=faux)
Fin pour
Fin

Langage C
#define NMAX 99
1) int tailleVecteur ()
{ int n;
do {
printf ("saisir un entier : ");
scanf ("%d",&n);
} while (n<=1 || n>99);
return (n);
}
2) void saisieVecteur (int t[],
int n)
{ int i;
for (i=0 ; ido {
printf ("saisir l'élément
n°%d : ",i);
scanf ("%d",&t[i]);
} while (t[i]<1 || t[i]>99 ||
recherche(t,i-1, t[i]));
}
3) void initVecteur (int tb[])
{ int i;
for (i=0 ; itb[i] = 1;
}
4) int maxVecteur (int t[], int

p
...
340

Mheni & SGarbouje

INIT_VECT (TB)
Pour i de 1 à N répéter
TB[T[i]] 0
Fin pour
Fin

}
8) main ()
{ int n, t[NMAX],
tb[NMAX];
n = tailleVecteur ();
saisieVecteur-t,n);
6) Procédure TRI_VECT (var remplirVecteur(tb,t,n);
T :VECTE ;TB :VECTE ;
triVecteur(t,tb,n);
N :entier)
afficheVecteur(t,n);
}
Var
J ,i :entier
Début
J 0
Pour i de 1 à MAX_VECT (T,
N) répéter
Si (TB[i]=0) alors
J J+1
T[J] i
Fin si
Fin pour
Fin
7) Procédure AFFICH_VECT
(T : VECTE ; N : entier)
Var
I : entier
Début
Pour i de 1 à N répéter
Ecrire (T[i], " ")
Fin pour

p
...
NMAX] d'entier
Var
N : entier ; T, TB : VECTE
Début
N TAIL_VECT()
SAISIE_VECT (T, N)
REMP_VECT (TB, T, N)
TRI_VECT (T, TB, N)
AFFICH_VECT (T, N)
Fin

p
...
C av
Innov'COM Lab à SUP'COM)
...
Systèmes
communication à l'ENIT (E
...
Maî
Assistant à l'institut Supérieur d’Informatique du KEF, été précédemment assista
universitaire à la faculté des sciences de Gabes
...
Elle est enseignante Technologue à l'Institut
Supérieur des Etudes Technologiques de Siliana depuis 2010
...
Là bas, elle a participé à la
réalisation et la mise en place de divers projets logiciels et
technologiques, mais sa passion pour l'enseignement a pris le
dessus
...
343

Mheni & SGarbouje

systèmes électroniques et réseaux de communication à l'Ecole
Polytechnique de Tunis
...
264 encoder on a VLIW processor" dans le journal
de TIGERA en 2009
...
344


Title: Livre ASD
Description: If you want to study the algorithm and data structure and c language then you are in the right place