Vous êtes sur la page 1sur 26

02/03/2015

Algorithmique & Programmation :


Langage C

Les directives au préprocesseur

Algorithmique & Programmation § Le préprocesseur est la première étape de la compilation en C.


Langage C Plus exactement le préprocesseur s’exécute avant le
compilateur.

§ Le préprocesseur s’occupe seulement d’effectuer des


remplacements de valeurs ou des inclusions de fichier.

Pr Abdellah AZMANI § Le préprocesseur permet également de créer des constantes. Il


n’est en aucun cas capable de détecter les erreurs qu’elle soit
logiques ou syntaxiques.

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 2

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C

Les directives au préprocesseur Les directives au préprocesseur


Exemple:
§ les directives d’inclusion
#include <stdio.h>
L’inclusion peut se faire de deux façons différentes :
#define FONCTION_PRINCIPALE void main ()
#include <nom_de_fichier>
#include "nom_de_fichier " #define BEGIN {
#define END }
Exemple:
#define DEBUT_AFFICHAGE printf(
#include <stdio.h>
#include < math.h> #define FIN_AFFICHAGE );

FONCTION_PRINCIPALE
§ Les directives de définition de variables
BEGIN
On définit une variable avec le préprocesseur de la façon suivante :
#define NOM valeur de remplacement. DEBUT_AFFICHAGE "define c'est bien !!! "
FIN_AFFICHAGE
Ainsi pour l’exemple précédent on a :
#define PI 3.14159265358979 END

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 3 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 4

1
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C

Les tableaux Les tableaux


§ Les tableaux à une dimension § Les tableaux à plusieurs dimensions :
Déclaration: type nom[dim]; Exemples: int compteur[10]; Déclaration d’un tableau à deux dimensions :
float nombre[20];
type nom[dim1][dim2]; Exemples: int compteur[4][5];
Utilisation: float nombre[2][10];
Utilisation:
Un élément du tableau est repéré par son indice. En langage C les tableaux
commencent à l'indice 0. L'indice maximum est donc dim-1. Un élément du tableau est repéré par ses indices. En langage C les tableaux
commencent aux indices 0. Les indices maximum sont donc dim1-1, dim2-1.
Appel: nom[indice]
Appel : nom[indice1][indice2]
Exemples: compteur[2] = 5;
nombre[i] = 6.789; Exemples : compteur[2][4] = 5;
printf("%d",compteur[i]); nombre[i][j] = 6.789;
scanf("%f",&nombre[i]); printf("%d",compteur[i][j]);
scanf("%f",&nombre[i][j]);
FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 5 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 6

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C

Les tableaux Les tableaux : Exercices


Exercice 1:
Initialisation des tableaux Ecrire un programme qui permet de chercher le maximum et l’indice de n
éléments d’un tableau.
On peut initialiser les tableaux au moment de leur déclaration:
Exercice 2 :
Ecrire un programme qui permet de calculer la somme de n éléments d’un
Exemples:
tableau
int liste[10] = {1,2,4,8,16,32,64,128,256,528};
float nombre[4] = {2.67,5.98,-8,0.09}; Exercice 3:
int x[2][3] = {{1,5,7},{8,4,3}}; /* 2 lignes et 3 colonnes * Ecrire un programme qui permet de compter le nombre d’occurance d’un
élément dans un tableau de n éléments.
Exercice 4:
Ecrire un programme permettant de saisir et d’afficher les éléments d’une
matrice de n colonnes et m lignes.
Exercice 5:
Ecrire un programme permettant de calculer le déterminant d’une matrice
(2X2)
FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 7 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 8

2
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C

Les chaines de caractères Manipulation des chaines


§ Les chaînes de caractères sont des tableaux de § Strcmp
caractères dont le dernier élément est \0. cette fonction compare lexicographiquement deux chaînes
de caractères.

§ On peut les déclarer comme :


Exemple:
char mot[80] ;
char *mot1, *mot2 ;
il faudra dans ce cas s'assurer que la longueur du mot ne
dépasse pas 80 caractères. ...
char *mot ; if (strcmp(mot1, mot2) < 0) then printf("mot1 < mot2") ;
il faudra réserver dynamiquement la mémoire : on abordera else if (strcmp(mot1, mot2) > 0) then printf("mot1> mot2") ;
plus loin ce sujet. else printf("mot1 = mot2") ;

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 9 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 10

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C

Manipulation des chaines Manipulation des chaines : Exercices


§ strcpy Exercice 1 :
Ecrire un programme qui lit une ligne de texte (ne dépassant pas 200 caractères) la
strcpy(mot1,mot2); // copie la chaîne mot2 dans mot1. mémorise dans une variable chaine et affiche ensuite:
a) la longueur L de la chaîne.
§ strlen b) le nombre de 'e' contenus dans le texte.
int longueur_mot ; c) toute la phrase à rebours, sans changer le contenu de la variable TXT
longueur_mot = strlen(mot); Exercice 2 :
Ecrire un programme qui lit un texte TXT (de moins de 200 caractères) et qui enlève
§ strcat toutes les apparitions du charactère ‘a' en tassant les éléments restants. Les
mot3 = strcat(mot1, mot2); //mot3 est la concaténation de mot1 et mot2. modifications se feront dans la même variable TXT.

§ strncat Exercice 3 :
Ecrire un programme qui lit deux chaînes de caractères CH1 et CH2, les compare
strcnat(mot1,mot2,n) // ajouter au moins n caractères du mot2 à lexicographiquement et affiche le résultat:
mot1
Exercice 4 :
§ strncpy Ecrire un programme qui lit deux chaînes de caractères CH1 et CH2 et qui copie la
première moitié de CH1 et la première moitié de CH2 dans une troisième chaîne
mot3=strcncpy(mot1,mot2,n) // copier au moins n caractères du mot2 a
CH3. Afficher le résultat.
mot1
FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 11 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 12

3
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Les types composés
Les structures
typedef int entier ; /* on définit un nouveau type "entier" synonyme de "int" */
typedef int vecteur[3]; /* on définit un nouveau type "vecteur" synonyme */ Une structure est un ensemble de données de même type ou
/* de "tableau de 3 entiers" */ non.
Exemple :
Déclaration:
include <stdio.h>
typedef int entier;
Struct nom_structure typedef struct nom_structure
typedef float point[2];
{ {
void main()
Type var1 type var1;
{ entier n = 6;
Type var2 type var2;
point xy;
: :
xy[0] = 8.6;
}; } nouveau_nom;
xy[1] = -9.45;
etc ...
} N.B: une structure peut contenir une autre structure

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 13 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 14

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C

Les structures Les structures


Exemple : Utilisation:

On déclare des variables par exemple: fiche f1,f2;


struct point Typedef struct Typedef struct puis, par exemple:
{ { {
char nom[10]; strcpy(f1.nom,"DUPONT");
int x; int x; strcpy(f1.prenom,"JEAN");
char prenom[10];
int y; int y; int age; f1.age = 20;
int z; float note; f1.note = 11.5;
int z;
} point; }fiche;
}; L'affectation globale est possible avec les structures: on peut écrire: f2 = f1;

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 15 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 16

4
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C

Les structures et les tableaux Les structures : exercices


Un tableau peut contenir des structures Exercice 1:
Créer la structure suivante
point
Déclaration: {
int num;
fiche f[10]; /* on déclare un tableau de 10 fiches */ float x;
float y;
Utilisation: }

strcpy(f[i].nom,"DUPONT") Saisir 4 points, les ranger dans un tableau puis les afficher.
strcpy(f[i].prenom,"JEAN");
f[i].age = 20; Exercice 2 :
Ecrire un programme qui permet de définir une structure de données regroupant toutes
f[i].note = 11.5; les informations (nom, prenom, CIN, moy sur plusieurs étudiants. Et ajouter une fonction
qui permet de trouver l’étudiant qui a la plus faible note.

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 17 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 18

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Les fonctions
Les fonctions
Déclaration :
type_de_la_fonction nom_de_fonction(type arg1, type arg2, ...)
{ Remarques:
déclarations
instructions § On peut avoir des fonctions sans arguments, comme on peut
return(valeur_de_la_fonction) ; avoir une fonction qui ne retourne rien; à ce moment , on écrit
} :
Exemple : void nom_fct (void) ou bien void nom_fct ()
int max(int x, y )
{ int m ; § Le type d'une fonction est implicitement entier.
if (x > y) then m=x ;
else m=y ; § Le passage des arguments se fait toujours par valeur : on
return (m) ; verra plus loin comment modifier les arguments d'une
} fonction.

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 19 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 20

5
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Les tableaux : algorithmes de Tri
Les fonctions : Exercices
Les méthodes de tri qui seront traités dans ce module sont :

§ Tri par sélection


Exercice 1: § Tri d’insertion
Ecrire une fonction qui permet de calculer le carré d’un § Tri à bulle
entier.
§ Tri rapide
Exercice 2 : § Tri par fusion
Ecrire une fonction qui permet de calculer la moyenne d’un
tableau. Fonction echanger()

echanger(tableau T, entier i, entier j)


debut
entier M
M<-T(i)
T(i)<-T(j)
T(j)<-M
fin

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 21 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 22

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Les tableaux : algorithmes de Tri Les tableaux : algorithmes de Tri
tri_selection(tableau T)
Tri par sélection : debut
Le tri par sélection est l’un des tris les plus instinctifs, le principe est que entier longueur, maxi, i
longueur<-taille(T)
pour classer N valeurs, il faut rechercher la plus grande valeur et la
placer à la fin de la liste puis la plus grande valeur dans les valeurs tantque(longueur>1) faire
restantes et la placer an avant dernière position et ainsi de suite… //recherche de la position du plus grand élément dans le tableau non encore
trié
maxi<-0;
Exemple :
pour i=1 à (longueur-1) faire
si T(i)>T(maxi) alors
5 3 4 1 2 maxi<-i
fin si
2 3 4 1 5 fin pour

2 3 1 4 5 //echange du plus grand élément avec le dernier


echanger(T,maxi,longueur-1)
2 1 3 4 5
//traitement du reste du tableau
1 2 3 4 5 longueur<-longueur-1
fin tantque
fin

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 23 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 24

6
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C

Les tableaux : algorithmes de Tri Les tableaux : algorithmes de Tri


Tri à Bulle tri_bulle(tableau T)
} Le tri à bulle (buble sort) consiste à comparer les éléments consécutifs et à debut
entier longueur, i, M
les échanger si l'ordre recherché est violé (les bulles légéres remontent booleen inversion
vers le haut).
longueur<-taille(T)
} Le tri peut se faire sur place, et la fin du tri survient quand plus aucun
échange n’a eu lieu au cours d’une traversée de la liste. faire
inversion=faux
i=0 5 2 2 2 2 1 pour i=0 à (longueur-1)
si T(i)>T(i+1)
i=1 2 5 1 1 1 2 {
M<-T(i)
i=2 1 1 5 3 3 3 T(i)<-T(j)
T(j)<-M
i=3 3 3 3 5 4 4 }
inversion<-vrai
i=4 4 4 4 4 5 5 fin si
fin pour
tantque inversion
Permuter i : 0 & 1 1&2 2&3 3&4 0&1 fin

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 25 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 26

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C

Les tableaux : algorithmes de Tri


tri_insertion(tableau T, entier longueur)
} Tri par insertion debut
entier i, compt, memory
Principe : A la i-éme étape, insérer a[i] entre a[1], a[2], ..., a[i-1] déjà triés.
pour i=1 à (longueur-1) faire
i=0 5 2 1 1 1 mémoire <-T(i) //valeur à insérer au tour i
compt <-i
i=1 2 5 2 2 2
tantque (compt >0 et T(compt-1) > memory) faire
i=2 1 1 5 3 3 T(compt)<-T(compt -1) //décalage des plus grandes
valeurs compteur<-compteur-1
i=3 3 3 3 5 5 fin tant
T(compt)<-memoire //affectation de la valeur à insérer dans la
i=4 4 4 4 4 4 //bonne case
fin pour
Insérer i: 1 avt 0 2 avt 0 3 avt 2 4 avt 3 fin

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 27 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 28

7
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Méthodes de Recherches Méthodes de Recherches
Recherche séquentielle La dichotomie
Il suffit de lire le tableau progressivement du début vers la fin. Si le tableau Dans le cas d'un tableau trié, en cherchant à limiter l'espace de recherche. On
n'est pas trié, arriver en fin du tableau signifie que l'élément n'existe pas, compare la valeur cherchée à l'élément central du tableau, si ce n'est pas la bonne,
dans un tableau trié le premier élément trouvé supérieur à l'élément un test permet de trouver dans quelle moitié du tableau on trouvera la valeur. On
recherché permet d'arrêter la recherche, de plus cette position correspond à continue récursivement jusqu'à un sous-tableau de taille 1.
celle où il faudrait insérer l'élément cherché pour garder un tableau trié.
int rech_dichotomie_tus(type-tus tab, int N, composante val)
int rech_sequentielle_tus(type_tus tab, int N, composante val) { int g,m,d; /* gauche, milieu, droite */
/*rend -1 si val non trouvée, première occurrence trouvée sinon */ g=0;d=N;
{ int i; while (g<=d)
for(i=0;i<N;i++) { m=(g+d)/2; /* division entière */
{ if(val<tab[m])
if(tab[i]==val) d=m-1;
return(i); else
} if(val>tab[m])
return(-1); g=m+1;
} else return(m) }
return(-1);
}

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 29 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 30

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
TP1 Récursivité
Raisonnement par récurrence (Math)
On considère un répertoire qui est un ensemble d’information dont chaque élément
possède les informations suivantes :
Exemple : Montrer que : S ( n) = å i = n( n + 1)
Contact : Nom*, Prénom*, Lien de parenté, adresse, Tél dom, Tél. Entreprise, GSM*, n
email* }
Avec Adresse : Numéro, Nom Rue, Code Postal, Ville, Pays Preuve : i=0 2
Le lien de parenté est un indice de la liste suivante : Cas de base : 0
0 (0 + 1)
0 : Mère,1 : Père,2 : Sœur,3 : Frère,4 : cousin,5 : Parent,6 : Ami,7 : Relation personnelle
} n=0: S (0) = å i = 0 = = 0 (Vrai)
8 : Relation professionnelle,9 : Aucun i= 0 2
} n=1: 1(1 + 1 )
= 1 (Vrai)
1

Les fonctions à programmer : S (1 ) = å


i = 0 +1 =
i=0 2
Ø Ajouter un contact
Ø Afficher la liste des contacts
Ø Consulter un contact Récurrence :
Ø Modifier un contact
Ø Supprimer un contact Hypothèse : S(n) est vrai,
Ø Recherche par Nom
Ø Recherche multicritère : Nom, Prénom, Ville, montrer que S(n+1) est vrai

32
FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 31 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 32

8
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Récursivité Récursivité
Équations de récurrences
n +1 n } Base : S(0) = 0
S ( n + 1) = å i = ( å i) + ( n + 1) = S ( n ) + ( n + 1)
i=0 i=0 } Récurrence : S(n+1) = S(n)+(n+1)
hypothèse de récurrence
F La récursivité est un
ò
n ( n + 1) mécanisme de calcul puissant!!
= + ( n + 1)
2
Ä Résoudre un problème de taille n
n ( n + 1)( n + 2)
= ( n + 1)( + 1) = (Vrai )
2 2 peut se ramener à la résolution
d’un (plusieurs) sous problèmes
de taille plus réduite ...ð
33 34
FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 33 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 34

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Récursivité Récursivité
} Action récursive } Objet récursif
« une action A est exprimée de façon récursive si la « La définition d ’un objet est récursive lorsqu ’elle se formule
décomposition de A fait appel à A. » en utilisant l’objet même qu’elle entend définir »
} Action calculer S(n) :
Appliquer les deux règles suivantes: } Exemple (déf. récursive d’une chaîne)
1) S(0) = 0 Une chaîne de caractère est :
2) S(n) = S(n
S(n--1) + n , n>0 } soit la chaîne vide
Ø S(3) ? } soit un caractère suivi d’une chaîne de caractère
= S(2) +3 = (S(1)+2 ) +3
= ((S(0)+1)+2)+3 = ((0+1)+2)+3 = 6

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 35 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 36

9
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Récursivité Récursivité Vs Itération
} Exemple (suite) Itération Récursivité
D’après la définition précédente :
procédure Itération( ) procédure Itération( )
Ø «a» est une chaîne : Tantque (condition) faire Si (condition) alors
un caractère ‘a’ suivi d’une chaîne vide
Ø «ab» est une chaîne : <Instructions> <Instructions>
un caractère ‘a’ suivi de la chaîne « b » fin tantque Itération
fin si
FLa récursivité est un fonction S(n) : entier
fonction S(n) : entier
S :=0
mécanisme puissant de définition d’objets! Tant que (n>0) faire Si (n=0)
alors retourner 0
S:=S+n
n:=n-1 sinon retourner S(n-1)+n
fin tant que fin si
retourner S

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 37 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 38

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Récursivité : applications Récursivité : applications
} Exemple 1 : calcul de la factorielle } Exemple 2 : suite de fibonacci
Équations de récurrences : Équations de récurrences :
} 0! = 1 (base) } u(0) = 0, u(1) = 1 (Base)
} n! = n(n-
n(n-1)! (récurrence) } u(n) = u(n-
u(n-1)+u(n
1)+u(n--2), n>1 (récurrence)
fonction fact(d
fact(d n:entier): entier fonction u(d
u(d n:entier) : entier
si n = 0 si (n=0) ou (n=1)
alors retourner 1 alors retourner n
sinon retourner n * fact(n-
fact(n-1) sinon retourner u(n-
u(n-1) + u(n-
u(n-2)
fin si fin si
fin action fin action
¯ Que se passe t-
t-il si n <0? ð récursivité infinie

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 39 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 40

10
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Récursivité : applications Récursivité
Exemple 2 (suite) : solution itérative Les Tours de Hanoï (TH)
action u(d
u(d n:entier) : entier } Le problème des tours de Hanoï est un jeu de réflexion imaginé par le
var x, y, z, i : entier mathématicien français Édouard Lucas, et consistant à déplacer des disques de
si (n=0) ou (n=1) alors retourner n diamètres différents d'une tour de « départ » à une tour d'« arrivée » en passant par
sinon x:=0 {u(0)} une tour « intermédiaire » et ceci en un minimum de coups, tout en respectant les
y:=1 {u(1)} règles.
pour i allant de 2 à n faire
z:= x+y{u(n)
x+y {u(n) = u(n-
u(n-1)+u(n
1)+u(n--2)}
x:=y
y:=z
fin pour
retourner z
fin si
fin action

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 41 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 42

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Récursivité : applications Récursivité : applications
} 3 axes, n disques concentriques TH : idée de la solution récursive
} exprimer le problème des n disques à l ’aide de la même
solution sur n-
n-1 disques
} (base) savoir résoudre le problème pour 1 disque
n
Équations de récurrences
G(auche) M(ilieu) D(roite)
} But : déplacer tous les disques de G à D
} Règles :
} 1 seul disque peut être déplacé à la fois
} 1 disque ne peut jamais être déposé sur un plus petit
} 1 disque ne peut être déposé que sur G, M ou D
G(auche) M(ilieu) D(roite)

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 43 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 44

11
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Récursivité : applications Récursivité: applications

k 1(hypo)
1 3 k+1 3(hypo)

2 G(auche) M(ilieu) 2 D(roite)


G(auche) M(ilieu) D(roite) Solution
procédure déplacer(n, G, M, D)
(k=2) « déplacer un disque de G vers D en utilisant l’axe M »
(Base) n=1, déplacer un disque de G vers D
(k=3) …, bonne chance
(récurrence)
3 • déplacer(n
déplacer(n--1, G, D, M)
Récurrence :
• déplacer un disque de G vers D
Hypothèse: on connaît la solution le problème pour k disques
• déplacer(n
déplacer(n--1, M, G, D)
Trouver la solution pour k+1 disques
FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 45 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 46

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Récursivité: applications Récursivité
#include <stdio.h>
#include <conio.h> Conclusion
void deplacer(int n, char G, char M, char D)
{ } La récursivité est un principe puissant nous
if (n==1)
{ permettant de :
printf("déplacer un disque de %c vers %c ", G, D) ;
} } définir des structures de données complexes
else
{
deplacer(n-1, G, D, M); } de simplifier les algorithmes opérants sur ces structures
printf("déplacer un disque de %c vers %c ", G, D) ;
deplacer(n-1, M, G, D); de données
}
}
int main()
{
int n; // nombre de disques
printf("donner le nombre de disques : ") ;
scanf((" %i",&n);
deplacer(n, ‘g’, ‘m’, ‘d’);
getch();
return 0;
}
FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 47 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 48

12
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Récursivité : Exercices Les tableaux : autres méthodes de Tri
} Exercice 1: Tri rapide
} La fonction MYSTERE(x,y) calcule le produit de X par Y pour X, Y entiers (Y>=1). int pivot(int T[],int inf,int sup)
} MYSTERE(x,y) = x + MYSTERE(x,y-1) { int i,j,piv;
} = x + x + MYSTERE(x,y-2) i=inf;
j=sup;
} = x + x + ... + MYSTERE(x,1)
piv=T[(inf+sup)/2];
} = x + x + ... + x while(i<j)
} \-----v-------/ {
} y termes while(piv>T[i])i++;
} =x*y while(piv<T[j])j--;
if(i<j)
} Ecrire la fonction récursive MYSTERE et le programme principale main qui fait appel à cette permuter(T,i,j);
fonction. }
} Exercice 2: return i;
} La suite de Fibbonacci est définie par : }
} fibo(0) = fibo(1) = 1 void tri_rapide(int T[],int p,int d)
{ int index_pos;
} fibo(n) = fibo(n − 1) + fibo(n − 2) if(p<d)
} 1. Ecrire la fonction récursive C fibo(n) qui calcule la suite de Fibbonacci. { index_pos=pivot(T,p,d);
} 2. Ecrire le programme qui demande une valeur n à l’utilisateur et écrit fibo(n) sur STDOUT tri_rapide(T,p,index_pos-1);
(utiliser la fonction ´écrite à la question 1). Si la valeur n est négative le programme s’arrête. tri_rapide(T,index_pos+1,d);
}
}

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 49 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 50

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Les tableaux : autres méthodes de Tri Les tableaux : autres méthodes de Tri
Tri par fusion (suite)
Tri par fusion void fusion(int T[],int n,int t1[],int n1,int t2[])
{ int i,j,k;
void diviser(int T[],int n,int t1[],int n1,int t2[]) for(i=0,j=0,k=0;i<n1&&j<n-n1;k++)
{ { if(t1[i]<t2[j])
int i=0,j=0; { T[k]=t1[i];
for(i=0;i<n1;i++) i++; }
t1[i]= T[i]; else
for(j=0;j<n-n1;j++) {T[k]=t2[j];
t2[j]=T[j+n1]; j++;}
} }
while(i<n1)
{ T[k]=t1[i];
i++;
k++; }
while(j<n-n1)
{ T[k]=t2[j];
j++;
k++;}
}

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 51 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 52

13
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Les tableaux : autres méthodes de Tri Les pointeurs
Tri par fusion (suite)
Définition
void trifusion(int T[],int n)
{ § Un pointeur est une variable spéciale qui contient l’adresse d’une autre variable.
if(n>1) § Une variable de type pointeur se déclare à l'aide de l'objet pointé précédé du
{ symbole * (opérateur d'indirection).
int n1=n/2,t1[20],t2[30];
diviser(T,n,t1,n1,t2); Exemple :
trifusion(t1,n1) ;
trifusion(t2,n-n1) ; int *p ; p est un pointeur pointant sur un objet de type int
fusion(T,n,t1,n1,t2); char *c ; c est un pointeur pointant sur un objet de type char
}
&a 7
} Soit la variable :
int a=7 ;
a est représentée par :
§ L’adresse de l’espace mémoire qui lui est réservée. &pt pt=
§ Le contenu de cet espace mémoire.
int *pt ;
pt=&a si pt contient l’adresse d’une variable a, on dit que pt pointe sur a.

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 53 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 54

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Les pointeurs Les pointeurs : Exercices
Les opérateurs de base :
Exercice 1:
& : opérateur qui renvoie l’adresse de l’objet désigné.
* : opérateur qui renvoie le contenu de la variable pointée. Qu’affiche le programme suivant :
Exemple : main()
{
int X=4,Y; int n=5,m=3,*p;
int *P,*q; p=&n; printf("n=%d m=%d \n",n,m);
P=&X ; /* P contient l’adresse de X*/ (*p)++; printf("n=%d m=%d \n",n,m);
Printf(‘%d’,*p) : affiche le contenu de la variable pointée par P(c.-à-d. la valeur n++; printf("n=%d m=%d \n",n,m);
de X). p=&m; printf("n=%d m=%d \n",n,m);
Y=*P-1 ; /* Y vaut 3 */ m+=n; printf("n=%d m=%d \n",n,m);
*P+=1 ; /* incrémente X de 1*/ n+=(*p)++; printf("n=%d m=%d \n",n,m);
(*P)++ ; /* incrémente aussi de 1 la variable pointée par P , X vaut 6*/ *p=7; printf("n=%d m=%d \n",n,m);
}
N.B : les parenthèses sont importantes. Car *P++ incrémente le pointeur
P(l’adresse )et non pas la valeur de X.

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 55 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 56

14
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Les pointeurs : Exercices Les pointeurs & les tableaux
Exercice 2 : Les pointeurs ont une relation très étroite avec les tableaux ils facilitent beaucoup plus leur
manipulation.
On considère un programme contenant les instructions suivantes, Complétez le tableau
suivant. Exemple :
A B C P1 P2
Soit A un tableau contenant des éléments du type float
Init. 1 2 3 / /
float A[20], X;
P1=&A 1 2 3 &A /
P2=&C Comme A représente l'adresse de A[0],
*(A+1) désigne le contenu de A[1]
*P1=(*P2)++ *(A+2) désigne le contenu de A[2]
...
P1=P2
*(A+i) désigne le contenu de A[i]
P2=&B
*P1-=*P2
++*P2 Alors, les écritures suivantes sont équivalentes :
*P1*=*P2 *tab tab[0]
tab &tab[0]
A=++*P2**P1
*(tab+i) tab[i]
P1=&A (tab+i) &tab[i]

*P2=*P1/=*P2
FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 57 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 58

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Les pointeurs & les tableaux Les pointeurs : Exercices
La déclaration d’un tableau réserve automatiquement un espace mémoire. Exercice 3:
Pour le cas des pointeurs, il faut impérativement utiliser une fonction pour allouer
1) Ecrire une fonction qui calcule la somme des éléments d’un tableau.
dynamiquement un espace. Comme la fonction malloc de la bibliothèque <malloc.h>.
2) Ecrire une fonction qui détermine le minimum d’un tableau.
Exemple : 3) Ecrire un programme qui fait appel à ces deux fonctions.
int *tab ; Exercice 4 :
tab=(int *)malloc(sizeof(int) *10) ; Soit p un pointeur qui pointe sur un tableau A :
int A[]= {12,23,27,42,67,70, 73,76,89,90}
Cette instruction réserve un espace mémoire pour dix entiers.
Int *p ;
Ou bien Int p=A ;
Quelles valeurs fournissent ces expressions :
Int *tab, N; *p+2 ; *(p+2) ;*(p+(*p-9)) ; *(p+*(p+7)-A[6]);
tab=(int *)malloc(sizeof(int) *N) ;
Exercice 5 :
Avec N la dimension du tableau. Ecrire un programme qui range les éléments d'un tableau A du type int dans l'ordre
inverse. Le programme utilisera des pointeurs P1 et P2 et une variable numérique
AIDE pour la permutation des éléments.

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 59 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 60

15
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Les pointeurs & les chaines de caractères Les pointeurs : Exercices
Une chaîne de caractère est un tableau de caractères, et donc la manipulation des chaines de Exercice 6 :
caractères est identique à celle d’un tableau. Ecrire un programme qui compte le nombre de lettres majuscules dans une chaîne de
Pour déclarer une chaine de caractère pointeur on utilise la syntaxe suivante : caractères entrée par l’utilisateur, en utilisant le formalisme pointeur.
Char *ch ; Exercice 7:
Ch=(char *)malloc(sizeof(char)*20); Ecrire un programme qui convertie une chaîne de caractères majuscule en minuscule en utilisant
Cette déclaration réserve un espace mémoire pour vingt caractères. les pointeurs.
Exercice 8 :
Exemple: Ecrire un programme qui teste si une chaîne de caractères entrée par l’utilisateur est palindrome
#include<stdio.h> (une chaine de caractère est dite palindrome si elle se lit de droite comme de gauche), en
void main() utilisant le formalisme pointeur.
{ Exemple : NON, RESSASSER.
Char *ch ;
Char *p ;
Ch=(char *)malloc(sizeof(char)*20) ;
Printf(‘entrer votre chaine ‘) ;
Gets(ch) ;
For(p=ch ;*p ;p++)
Ln++ ;
Printf(‘la longueur de la chaine est %d’,ln) ;
}

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 61 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 62

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Passage des arguments d’une fonction Passage des arguments d’une fonction
Exercice : Passage par valeur :
Écrire une fonction de type void permettant d’échanger la valeur de deux variables entiers. Les paramètres sont passés par copie de valeur et ne seront pas modifiés en dehors de la
Ecrire un programme principal qui fait appel à cette fonction. fonction.
Est-ce que les deux valeurs ont été vraiment permutées?
Solution : Passage par adresse :
void echanger(int x,int y) Pour pouvoir échanger les paramètres x et y de la fonction principale, il faut faire le
{int z; passage par adresse. Ce sont les pointeurs qui offrent la possibilité de modifier les contenus
z=x; des variables de la fonction principale (fonction main()).
x=y;
y=z; Exemple :
printf("x= %d y=%d ",x,y); void echanger(int *x, int *y)
} {
int z; z=*x; *x=*y; *y=z;
int main() printf("x= %d y=%d ",*x,*y);
{ }
int x=5,y=7; int main()
echanger(x,y); { int x=5,y=7;
printf("x= %d y=%d ",x,y); echanger(&x,&y);
getch(); printf("x= %d y=%d ",x,y);
return(0); getch();
return 0;
} }

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 63 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 64

16
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Les pointeurs & les structures Les listes chainées
On peut déclarer des pointeurs sur des structures. Cette syntaxe est très utilisée en langage C, Pour les tableaux :
elle est notamment nécessaire lorsque la structure est un paramètres modifiable dans la
fonction. § Lors de la déclaration d’un tableau, on doit connaître sa taille.
Un symbole spécial a été créé pour les pointeurs de structures, il s'agit du symbole à § La variable contiendra l'adresse du premier élément
§ Le stockage des éléments du tableau est contigu
Déclaration: § Possibilité d'atteindre directement la case i d'un tableau.
contact *C; //déclaration d’une structure de type pointeur § Pour supprimer ou ajouter un élément à un tableau, il faut créer un nouveau tableau et
supprimer l'ancien.
Utilisation:
C=(contact*)malloc(sizeof(contact)); /* réserve de la place dans la mémoire */
printf("NOM :");scanf("%s",Cànom);
printf("Code postale :");scanf("%i",&Càadr.CP);

Exercice:
Ecrire un programme qui permet de saisir 4 points, de les arranger dans un tableau puis
d’afficher ses attributs.

Exercice:
Refaire le TP 1 en utilisant une structure pointeur.

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 65 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 66

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Les listes chainées
Les listes chainées Déclaration d’une liste chainée
Définition : #include <stdlib.h>
typedef struct element elements;
Une liste chainée est un ensemble d’éléments (cellules) dont chaque cellule est composée des struct element {
int val;
deux parties suivantes: struct element *nxt;
§ la valeur à stocker, };
§ l'adresse de l'élément suivant, s'il existe. typedef element * llist;

N.B: Initialisation d’une liste chainée


S'il n'y a plus d'élément suivant, alors l'adresse sera NULL, et désignera la fin de la chaîne. #include <stdlib.h>
typedef struct element element;
struct element {
Pour les listes chainées : int val;
struct element *nxt;
§ Pour déclarer une liste chaînée, il suffit de créer le pointeur qui va pointer sur le premier };
élément de votre liste chaînée, aucune taille n'est donc à spécifier. typedef element* llist;
§ La taille de la liste n’a pas de limites (ca dépend de la mémoire disponible) int main()
§ Pour accéder à l’élément i de la liste, il faut traverser les i-1 éléments précédents. { /* Déclarons 3 listes chaînées de façons différentes mais équivalentes */ l
list ma_liste1 = NULL;
§ Il est possible d'ajouter, de supprimer, d'intervertir des éléments d'une liste chaînée en element *ma_liste2 = NULL;
manipulant simplement leurs pointeurs. struct element *ma_liste3 = NULL;
return 0;
}

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 67 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 68

17
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Manipulation des listes chainées Manipulation des listes chainées
Ajout d’un élément en tête d’une liste Ajout d’un élément en fin d’une liste

llist ajouterEnTete(llist liste, int valeur)


{ llist ajouterEnFin(llist liste, int valeur)
/* On crée un nouvel élément */ {
element* nouvelElement = (element*) malloc(sizeof(element)); /* On crée un nouvel élément */
/* On assigne la valeur au nouvel élément */ element* nouvelElement = (element*)malloc(sizeof(element));
nouvelElementàval = valeur; /* On assigne la valeur au nouvel élément */
/*On assigne l'adresse de l'élément suivant au nouvel élément */ nouvelElementàval = valeur;
nouvelElementànxt = liste; /* On ajoute en fin, donc aucun élément ne va suivre */
/* On retourne la nouvelle liste, i.e. le pointeur sur le premier élément */ nouvelElementànxt = NULL;
return nouvelElement;
}
FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 69 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 70

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Manipulation des listes chainées Manipulation des listes chainées
Ajout d’un élément en fin d’une liste (suite) Exercice 1
Ecrire la fonction permettant d’afficher les éléments d’une liste (parcourir toute la liste en
if(liste == NULL) affichant les valeurs qu’elle contient)
{
/* Si la liste est videé il suffit de renvoyer l'élément créé */ Solution
return nouvelElement;
void afficherListe (llist liste)
}
{
else
element *tmp = liste;
{
/* Tant que l'on n'est pas au bout de la liste */
/* Sinon, on parcourt la liste à l'aide d'un pointeur temporaire et on indique que le
while(tmp != NULL)
dernier élément de la liste est relié au nouvel élément */
{
element *temp=liste;
/* On affiche */
while(tempànxt != NULL)
printf("%d ", tmpàval);
{
/* On avance d'une case */
temp = tempànxt;
tmp = tmpànxt;
}
}
tempànxt = nouvelElement;
}
return liste;
}
}

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 71 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 72

18
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Manipulation des listes chainées Manipulation des listes chainées
Exercice 2
En utilisant les trois fonctions suivantes: Exercice 3
• ajouterEnTete Écrire une fonction qui renvoie 1 si la liste est vide, et 0 si elle contient au moins un
• ajouterEnFin élément. Son prototype est le suivant :
• afficherListe
Ecrire la fonction main permettant de remplir et afficher la liste chaînée suivante :
Solution
543 2 112345
Solution int estVide(lliste liste)
int main() {
{ if(liste == NULL)
llist ma_liste = NULL; {
int i; return 1;
for(i=1;i<=5;i++) }
{ else
ma_liste = ajouterEnTete(ma_liste, i); {
ma_liste = ajouterEnFin(ma_liste, i); return 0;
} }
afficherListe(ma_liste); }
supprimerListe(ma_liste); // Libère les ressources
return 0;
}

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 73 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 74

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Manipulation des listes chainées Manipulation des listes chainées
Suppression d’un élément en fin d’une liste
Suppression d’un élément en tête d’une liste
llist supprimerElementEnFin(llist liste)
llist supprimerElementEnTete(llist liste) {
{ /* Si la liste est vide, on retourne NULL */
if(liste != NULL) if(liste == NULL)
{ return NULL;
/* Si la liste est non vide, on se prépare à renvoyer l'adresse de l'élément en 2ème position*/ /* Si la liste contient un seul élément */
element* aRenvoyer = listeànxt; if(listeànxt == NULL)
/* On libère le premier élément */ {
free(liste); /* On le libère et on retourne NULL (la liste est maintenant vide) */
/* On retourne le nouveau début de la liste */ free(liste);
return aRenvoyer; return NULL;
} }
else /* Si la liste contient au moins deux éléments */
{ element* tmp = liste;
return NULL; element* ptmp = liste;
}
}

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 75 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 76

19
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Manipulation des listes chainées Manipulation des listes chainées
Suppression d’un élément en fin d’une liste (suite) Recherche d’un élément dans une liste

/* Tant qu'on n'est pas au dernier élément */ llist rechercherElement(llist liste, int valeur)
while(tmpànxt != NULL) {
{ element *tmp=liste;
/* Tant que l'on n'est pas au bout de la liste */
/* ptmp stock l'adresse de tmp */
while(tmp != NULL)
ptmp = tmp; {
/* On déplace tmp (mais ptmp garde l'ancienne valeur de tmp */ if(tmpàval == valeur)
tmp = tmpànxt; {
} /* Si l'élément a la valeur recherchée, on renvoie son adresse */
/* A la sortie de la boucle, tmp pointe sur le dernier élément, et ptmp sur l'avant- return tmp;
dernier. On indique que l'avant-dernier devient la fin de la liste et on supprime }
le dernier élément */ tmp = tmpànxt;
}
Ptmpànxt = NULL;
return NULL;
free(tmp); }
return liste;
}

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 77 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 78

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Manipulation des listes chainées Les listes chainées : Exercices
Recherche le nombre d’occurrences d’une valeur dans une liste Exercice 4
Ecrire une fonction permettant de Compter le nombre d'éléments d'une liste chaînée en
int nombreOccurences(llist liste, int valeur) utilisant les deux méthodes itérative et récursive.
{
int i = 0; Solution itérative
/* Si la liste est vide, on renvoie 0 */ int nombreElements(llist liste)
if(liste == NULL) {
return 0; int nb = 0;
/* Sinon, tant qu'il y a encore un élément ayant la val = valeur */ element* tmp = liste;
while((liste = rechercherElement(liste, valeur)) != NULL) /* On parcours la liste */
{ while(tmp != NULL)
/* On incrémente */ {
liste = listeànxt; /* On incrémente */
i++; nb++;
} tmp = tmpànxt;
/* Et on retourne le nombre d'occurrences */ }
return i; /* On retourne le nombre d'éléments parcourus */
} return nb;
}

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 79 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 80

20
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Les listes chainées : Exercices Les listes chainées : Exercices
Exercice 5
Exercice 4 Ecrire une fonction récursive permettant d’effacer complètement une liste chainée de la
Ecrire une fonction permettant de Compter le nombre d'éléments d'une liste chaînée en
mémoire
utilisant les deux méthodes itérative et récursive.
Solution
Solution récursive llist effacerListe(llist liste)
{
int nombreElements(llist liste) if(liste == NULL)
{ {
/* Si la liste est vide, il y a 0 élément */ /* Si la liste est vide, il n'y a rien à effacer, on retourne une liste vide i.e. NULL */
if(liste == NULL) return NULL;
return 0; }
/* Sinon, il y a un élément (celui que l'on est en train de traiter) plus le nombre d'éléments else
contenus dans le reste de la liste */ {
return nombreElements(listeànxt)+1; /* Sinon, on efface le premier élément et on retourne le reste de la liste effacée */
} element *tmp;
tmp = listeànxt;
free(liste);
return effacerListe(tmp);
}
}
FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 81 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 82

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Les piles & les files Les piles & les files
Sommet
de la pile
Définition:
Déclaration d’une pile : 3
§ Les piles (stack) et les files (queue) sont des structures de données
permettant de stocker un ensemble de données, comme pourrait le struct cellule
faire un tableau. { 8
§ Les piles et les files sont des listes chainées particulières. int val;
§ Une pile permet de réaliser une LIFO (Last In First Out) : les struct cellule *suivant; cellules
derniers éléments à être ajoutés à la pile seront les premiers à êtres };
récupérés. (ex: une pile d'assiette) typedef cellule * pile;
§ Une file permet de réaliser une FIFO (First In First Out) : les
premiers éléments ajoutés à la file, seront aussi les premiers à être 6
récupérés.

Pile (liste)

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 83 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 84

21
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Les piles & les files Les piles & les files
Retirer un élément de la pile
Ajout d’un élément dans la pile
1. Vérifier si la pile n'est pas vide
L’ajout d’un élément dans la pile se fait en cinq étapes : 2. Si elle ne l'est pas, Stocker dans un élément temporaire l’adresse du deuxième élément de
la pile
1. On crée un nouvel élément de type Pile 3. Supprimer le premier élément
2. On assigne à la donnée de cet élément, la donnée que l'on veut ajouter. 4. Faire pointer la pile vers notre élément temporaire
3. On fait pointer cet élément sur le sommet de la pile 5. Retourner la nouvelle pile
4. On fait pointer le sommet de la pile sur cet élément 6. Sinon retourner la pile vide.

pile empiler(pile P, int valeur) pile depiler(pile P)


{ {
pile NewElement=(pile)malloc(sizeof(cellule)); pile NewSommet;
NewElementàval=valeur; if(P!=NULL)
NewElementàsuivant=P; {
return NewElement; NewSommet=Pàsuivant;
} free(P);
return(NewSommet);
}
else
return NULL;
}
FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 85 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 86

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Les piles & les files Les piles & les files
Déclaration d’une file : Ajout d’un élément dans la file

struct cellule file ajouter(file F, int valeur)


{ {
int val; file NewElement=(file)malloc(sizeof(cellule));
struct cellule *suivant; NewElementàval=valeur;
}; NewElementàsuivant=F;
typedef cellule * File; return(NewElement);
}
Tête de la file NewElement

3 5 3 2 6 F 3 5 3 2 6
Tête de la file

File (liste) La file F

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 87 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 88

22
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Les piles & les files Les fichiers
Retirer un élément de la file Définition
Un fichier est un ensemble structuré de données stockées sur un support externe (disquette,
file retirer(file F) disque dur, disque optique, bande magnétique, ...).
{ file tmp,ptmp; Les informations contenues dans un fichier ne sont pas forcément de même type (un char, un int,
tmp=F; une structure ...), elles sont rassemblées dans une structure du type spécial FILE
while(tmp->suivant!=NULL)
{ Fichier séquentiel
ptmp=tmp; Dans les fichiers séquentiels, les enregistrements sont mémorisés consécutivement dans l'ordre
tmp=tmp->suivant; de leur entrée et peuvent seulement être lus dans cet ordre. Si on a besoin d'un enregistrement
} précis dans un fichier séquentiel, il faut lire tous les enregistrements qui le précèdent, en
ptmp->suivant=NULL; commençant par le premier.
free(tmp);
return F;
} Tête de la file

NULL

3 5 3 2 6 NULL

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 89 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 90

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Manipulation des fichiers Manipulation des fichiers
1 - Déclaration: 3- Ouverture d’un fichier :

FILE *fichier; /* majuscules obligatoires pour FILE */


FILE * fopen(<Nom>, <Mode>);
<Nom> est une chaîne de caractères constante ou une variable de type chaîne qui représente le
On définit un pointeur qui fournit l'adresse d'une cellule donnée. nom du fichier sur le médium de stockage,

A l’ouverture d’un fichier, le pointeur est positionné au début du fichier (sauf en <Mode> détermine le mode d'accès au fichier, il peut être en :
mode a+ ) ‘r’ lecture seule
‘w’ écriture seule (destruction de l'ancienne version si elle existe)
‘w+’ lecture/écriture (destruction ancienne version si elle existe)
2- Initialisation ‘r+’ lecture/écriture d'un fichier existant (mise à jour), pas de création d'une
nouvelle version.
int main() ‘a+’ lecture/écriture d'un fichier existant (mise à jour), pas de création d'une
{ nouvelle version, le pointeur est positionné à la fin du fichier.
FILE* fichier = NULL;
return 0; Exemple:
} FILE *fichier;
fichier = fopen(″test.txt″, ″w″ ) ;

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 91 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 92

23
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Manipulation des fichiers Manipulation des fichiers
Exercice d’application:
4- Fermeture d’un fichier : Ecrire un programme qui contient les opérations suivants :
§ Ouvrir un fichier
int fclose(<FP>); § Tester si l’ouverture est bien passé sinon afficher un message d’erreur
§ Fermer le fichier
§ <FP> est un pointeur du type FILE* relié au nom du fichier que l'on désire fermer
Solution:
§ La fonction fclose() Retourne 0 si la fermeture s’est bien passée et EOF en cas d’erreur. int main()
{
FILE* fichier = NULL;
Exemple: fichier = fopen("test.txt", "r+");
FILE *fichier; if (fichier != NULL)
fichier = fopen(″test.txt″, ″w″ ) ; { // On peut lire et écrire dans le fichier
/* Ici instructions de traitement */ }
fclose(fichier) ; else { // On affiche un message d'erreur si on veut
printf("Impossible d'ouvrir le fichier test.txt");
}
close(fichier);
return 0;
}

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 93 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 94

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Manipulation des fichiers Manipulation des fichiers
5- L’écriture dans un fichier : 5- La lecture dans un fichier :
Il existe plusieurs fonctions capables d'écrire dans un fichier. On cite comme exemple : Il existe plusieurs fonctions capables d'écrire dans un fichier. On cite comme exemple :
§ fputc : écrit un caractère dans le fichier (UN SEUL caractère à la fois). § fgetc : lit un caractère
§ fputs : écrit une chaîne dans le fichier § fgets : lit une chaîne
§ fprintf : écrit une chaîne "formatée" dans le fichier, fonctionnement quasi- § fscanf : lit une chaîne formatée
identique à printf
Syntaxe :
Exemples :
int fgetc(FILE* pointeurDeFichier);
fputc('A', fichier); // Ecriture du caractère A
fputs("Salut les Zér0s\nComment allez-vous ?", fichier);
….. char* fgets(char* chaine, int nombreCaracteresALire, FILE* PointeurFichier);
printf("Quel age avez-vous ? "); // On demande l'âge
scanf("%ld", &age);
// On l'écrit dans le fichier
fprintf(fichier, "Le Monsieur qui utilise le programme, il a %ld ans", age);

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 95 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 96

24
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Manipulation des fichiers Manipulation des fichiers
5- La lecture dans un fichier : 5- La lecture dans un fichier :
Exemple 1: Exemple 3:
do
{ int main()
caractereActuel = fgetc(fichier); // On lit le caractère {
FILE* fichier = NULL;
printf("%c", caractereActuel); // On l'affiche
long score[3] = {0}; // Tableau des 3 meilleurs scores
} while (caractereActuel != EOF); fichier = fopen("test.txt", "r");
if (fichier != NULL)
Exemple2: {
fgets(chaine, TAILLE_MAX, fichier); fscanf(fichier, "%ld %ld %ld", &score[0], &score[1], &score[2]);
// On lit maximum TAILLE_MAX caractères du fichier, on stocke le tout dans "chaine" printf("Les meilleurs scores sont : %ld, %ld et %ld", score[0], score[1], score[2]);
printf("%s", chaine); // On affiche la chaîne fclose(fichier);
}
return 0;
}

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 97 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 98

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Manipulation des fichiers Manipulation des fichiers
6- Supprimer un fichier : 6- Renommer un fichier :
Pour supprimer un fichier, on utilise la fonction suivante : Pour renommer un fichier, on utilise la fonction suivante :

int remove(const char* fichierASupprimer); int rename(char* ancienNom, char* nouveauNom);

Exemple: Exemple:
int main() int main()
{ {
remove("test.txt"); rename("test.txt", "test_renomme.txt");
return 0; return 0;
} }

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 99 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 100

25
02/03/2015

Algorithmique & Programmation : Algorithmique & Programmation :


Langage C Langage C
Manipulation des fichiers Manipulation des fichiers
Exercice 1 7- Mise à jour d’un fichier :
Ecrire un programme qui permet de:
§ Créer un fichier texte dont le nom est choisi par l’utilisateur
§ Ouvrir le fichier crée
§ remplir le fichier dont le nombre des enregistrements est déterminé par l’utilisateur
Le programme suivant effectue l'insertion d'un
§ Afficher son contenu enregistrement à introduire au clavier dans un
Exercice 2
fichier trié selon la seule rubrique de ses
Ecrire un programme qui permet de calculer et d’afficher le nombre de caractères d’un enregistrements : le nom d'une personne
fichier (utiliser n’importe quel fichier )

Exercice 3
Copier un fichier texte dans un autre: créer un fichier "essai.dat" sous éditeur. Tester le
programme en vérifiant après exécution la présence du fichier copié dans le directory.

FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 101 FST Tanger : parcours MIPC Document préparé par Pr. Abdellah AZMANI Partie 1 : Page 102

26