Académique Documents
Professionnel Documents
Culture Documents
SOMMAIRE
SOMMAIRE……………………………………………………………………………………………………………..……..02
TP5(Polynômes)……………………………………………………………………………………………………………30
TP7( Arbres)………………………………………………………………………………………………….………………41
TP8( Graphes)…………………………………………………………………………………………………….…………50
2
TP1 Tableaux et temps d’exécution
REPONSE
1. //On doit utiliser un pointeur car, à partir d’un certain n , le tableau ne peut plus recevoir
d’éléments. On est donc arrivé à sa capacité maximale.
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
main()
{ printf("\n\n-----RECHERCHE DU MAXIMUM-----\n");
printf("________________________________________\n\n");
int n,i=0,*p,max;
printf("Veuillez entrer le nombre n de vos entiers: \n");
scanf("%d",&n);
srand(time(NULL));
p=(int*)malloc(n*sizeof(int));
//remplissage du tableau aléatoirement
while (i<n)
{
*(p+i)=rand();
i++;}
//Recherche du maximum
max=*p;
for (i=1;i<n;i++)
{
if (*(p+i)>max)
{
max=*(p+i);
}
}
//Affichage du maximum
printf(" \n \n Le maximum est : \n %d",max);
}
3
2-En nombre de comparaisons, la complexité de l’algorithme est de : n-1
3- Supposons qu’on effectue n-2 itérations, il se peut que la solution soit à l’itération n-1 donc
elle ne sera pas atteinte n, donc l’algorithme dans ce cas sera incorrect .
Donc on peut conclure que notre algorithme est optimal.
REPONSE
1-Implémentation de l’algorithme du tri à bulles
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
main()
{ printf("\n\n-----TRI A BULLES-----\n");
printf("________________________________________\n\n");
int n,i,dim,aide,*p,en_desordre=1;
printf("Veuillez entrer la dimension de votre tableau : \n");
scanf("%d",&n);
p=(int*)malloc(n*sizeof(int));
//remplissage aléatoire du tableau
srand(time(NULL));
while (i<n)
{
*(p+i)=rand();
i++;}
//affichage du tableau initial
printf("\n \n Affichage du tableau rempli arbitrairement:\n\n");
for(i=0;i<n;i++){
printf("%d \t",*(p+i));}
dim=n;
while(en_desordre){
en_desordre=0;
for(i=0;i<dim-1;i++){
if(*(p+i)>*(p+i+1)){
4
//Permutation
aide=*(p+i+1);
*(p+i+1)=*(p+i);
*(p+i)=aide;
en_desordre=1;
}
}
dim--;//ce n'est pas la peine d'aller jusqu'à la fin du tableau }
//affichage du tableau trié
printf("\n \n \nAffichage du tableau après le tri à bulles:\n \n");
for(i=0;i<n;i++){
printf("%d \t",*(p+i));}
}
5
else{
f=milieu-1;}
}while(trouve==0);
return milieu;
}
//menu principal
int main()
{
printf("\n\n-----RECHERCHE DICHOTOMIQUE-----\n");
printf("________________________________________\n\n");
int A[10]={1,7,8,9,12,15,18,22,30,31};
printf("La cle 30 se trouve à la position %d du tableau
!",Recherche_Dichotomie(A,10,30));
2-Soit un tableau de n éléments tel que n=2K. Supposons que la clé ne sera trouvée qu’à la
dernière itération. On sait qu’à chaque itération, le tableau est divisé par deux. La position i
doit donc être multiplié par deux à chaque division effectué. Vu que le tableau est constitué
de n=2k éléments. Il y aura k division. D’où le nombre d’itérations maximal sera de k.
2-Dans un tableau de n éléments, on a 2k-1≤n≤2k. On néglige les autres instructions devant
la boucle Do While. La complexité est donc k-1≤log2(n) ≤k.
D’où La complexité est d’ordre log2(n).
6
TP2 Tableaux et temps d’exécution(suite)
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
main()
{
char *s; int n;
s=(char*)malloc(sizeof(s));
printf("\n\n-----Inverse d'une chaine en repetant chacune de ses lettres-----\n");
printf("________________________________________\n\n");
printf("Veuillez entrer un mot: \t");
scanf("%s",s);
printf("\n Veuillez saisir le nombre de repetition: \t");
scanf("%d",&n);
printf(" \n Le nouveau mot est : \n %s",multichar(s,n));
}
7
Exercice 2 : Calcul d’une suite un
Soit la suite un définie par : u0=1 et un+1=3un2+2un+1
1-Ecrire une fonction qui prend en paramètre un entier n et qui retourne un tableau contenant les n
premiers termes de la suite un. La fonction doit marcher quel que soit l’entier n rentré.
2-Ecrire le programme principal qui saisit l’entier n et affiche les n premiers termes de la suite un (en
utilisant la fonction définie en 1).
REPONSE
#include<stdio.h>
#include<stdlib.h>
void suite(int n)
{
int i;
unsigned long long int *p;
//remplissage du tableau avec de très longs carctères non signés
p=(unsigned long long int*)malloc(n*sizeof(unsigned long long int));
p[0]=1 ;// equivalente à u(0)=1
printf("p[0]=%d \n",p[0]);
for (i=0;i<n;i++)
{p[i+1]=3*p[i]*p[i]+2*p[i]+1;
//affichage au fur et a mesure
printf("p[%d]=%llu \n",i+1,p[i+1]);
}
}
main()
{
int n;
printf("\n\n-----SUITE Un-----\n");
printf("________________________________________\n\n");
printf("Entrez la valeur n: \t");
scanf("%d",&n);
suite(n); }
8
REPONSE
______________________________________________________________________________
___________________________________ 1________________________________________
void suppr ()
{
printf("\n\n----Supprimer un élement de la position i d'un tableau-----\n");
printf("________________________________________\n\n");
int n ,i,b;
printf("Veuillez entrer la taille de votre tableau: \t");
scanf("%d",&n);
int *p;
p=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++)
{
printf("Entrez p[%d]\t",i);
scanf("%d",p+i);}
for (i=b;i<n;i++)
{
p[i]=p[i+1];
}
n=n-1; //puisqu'on supprimera un élément donc la dimension du nouveau tableau sera n-1
printf("\n Le nouveau tableau est: \n");
for(i=0;i<n;i++)
{
printf("p[%d]=%d \t \n",i,p[i]);}
}
_________________________________________________________________________
___________________________________ 2______________________________________
void inverse ()
{
printf("\n\n----Inverser le contenu d'un tableau-----\n");
printf("________________________________________\n\n");
int n , i,b,aide;
printf("Veuillez entrer la taille de votre tableau: \t");
scanf("%d",&n);
9
int *p;
p=(int*)malloc(n*sizeof(int));
//remplissage du tableau
for(i=0;i<n;i++)
{
printf("Entrez p[%d] \t",i);
scanf("%d",p+i);}
printf("\n\n");
//permuation
for (i=0;i<n/2;i++)
{
aide=p[i];
p[i]=p[n-1-i];
p[n-1-i]=aide;}
//affichage du tableau obtenu
printf("le nouveau tableau est: \n");
for(i=0;i<n;i++)
{
printf("p[%d]=%d \n",i,p[i]);}
}
______________________________________________________________________________
____________________________________ 3________________________________________
void tri(int dim,int *p){
int en_desordre=1,i,aide;
while(en_desordre){
en_desordre=0;
for(i=0;i<dim-1;i++){
if(*(p+i)>*(p+i+1)){
//permutation
aide=*(p+i+1);
*(p+i+1)=*(p+i);
*(p+i)=aide;
en_desordre=1;
}
}
dim--;//ce n'est pas la peine d'aller jusqu'à la fin du tableau
}}
void fusion(){
printf("\n\n----Fusion de deux tableaux triés-----\n");
printf("________________________________________\n\n");
10
int n1,n2,dim1,dim2,i,dim3,en_desordre,aide;
//affichage du tableau p3
printf("\n \n Le tableau trié obtenu de cette fusion est le suivant: \n");
for(i=0;i<n1+n2;i++){
printf("M3[%d]= %d \n",i,*(p3+i));}
}
11
______________________________________________________________________________
____________________________________ 4________________________________________
void creermat(){
printf("\n\n-----Création d'une matrice avec des valeurs aléatoires-----\n");
printf("________________________________________________________________\n\n");
srand(time(NULL));
int **matrice,i,j,n,m;
printf("La matrice est d'ordre nxm. Entrez leurs valeurs: \n n=\t");
scanf("%d",&n);
printf("\t m= \t");
scanf("%d",&m);
matrice=(int**)malloc(n*sizeof(int));
for(i=0;i<n;i++){
matrice[i]=(int*)malloc(m*sizeof(matrice[i]));}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
matrice[i][j]=rand();
}
}
______________________________________________________________________________
____________________________________ 5________________________________________
void affichermat(matrice,n,m){
printf("\n\n-----Affichage de la matrice-----\n");
printf("____________________________________\n\n");
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
printf("\n matrice[%d][%d]= %d",i,j,matrice[i][j]);
}
}
}
12
______________________________________________________________________________
____________________________________ 6________________________________________
void AddMat (){
int n1,n2,m1,m2,i,j;
printf("\n\n-----Additionner deux matrices M1 et M2-----\n");
printf("________________________________________________________________\n\n");
srand(time(NULL));
int **matrice1,**matrice2;
//creation de la matrice 1 et la remplir aleatoirement
printf("La matrice 1 est d'ordre n1xm1. Entrez leurs valeurs: \n n1=\t");
scanf("%d",&n1);
printf("\t m2= \t");
scanf("%d",&m2);
matrice1=(int**)malloc(n1*sizeof(int));
for(i=0;i<n1;i++){
matrice1[i]=(int*)malloc(m1*sizeof(matrice1[i]));}
for(i=0;i<n1;i++)
{
for(j=0;j<m1;j++)
{
matrice1[i][j]=rand();
}
}
//creation de la matrice 2 et la remplir aleatoirement
printf(" \nLa matrice 2 est d'ordre n2xm2. Entrez leurs valeurs: \n n2=\t");
scanf("%d",&n2);
printf("\t m2= \t");
scanf("%d",&m2);
matrice2=(int**)malloc(n2*sizeof(int));
for(i=0;i<n2;i++){
matrice2[i]=(int*)malloc(m2*sizeof(matrice2[i]));}
for(i=0;i<n2;i++)
{
for(j=0;j<m2;j++)
{
matrice2[i][j]=rand();
}
}
if((n1==n2)&&(m1==m2)){
13
for(i=0;i<n1;i++){
for(j=0;j<m1;j++){
matrice1[i][j]=matrice1[i][j]+matrice2[i][j];}
}}
else{ printf("On ne peut pas additionner deux matrices qui n'ont pas la meme taille!");}
//affichage de la matrice résultante
printf("\n La matrice résultante est:\n");
for(i=0;i<n1;i++){
for(j=0;j<m1;j++){
printf("%d",matrice1[i][j]);}
printf(" \n");}
}
______________________________________________________________________________
____________________________________ 7________________________________________
void mulmat(){
printf("\n\n-----Multiplication de deux matrices M1 et M2-----\n");
printf("________________________________________________________________\n\n");
int n1,n2,m1,m2,i,j,k;
int **matrice1,**matrice2;
//creation de la matrice 1 et la remplir aleatoirement
printf("La matrice 2 est d'ordre n1xm1. Entrez leurs valeurs: \n n1=\t");
scanf("%d",&n1);
printf("\t m2= \t");
scanf("%d",&m2);
matrice1=(int**)malloc(n1*sizeof(int));
for(i=0;i<n1;i++){
matrice1[i]=(int*)malloc(m1*sizeof(matrice1[i]));}
for(i=0;i<n1;i++)
{
for(j=0;j<m1;j++)
{
matrice1[i][j]=rand();
}
}
14
matrice2=(int**)malloc(n2*sizeof(int));
for(i=0;i<n2;i++){
matrice2[i]=(int*)malloc(m2*sizeof(matrice2[i]));}
for(i=0;i<n2;i++)
{
for(j=0;j<m2;j++)
{
matrice2[i][j]=rand();
}
}
if(m1==n2){
//creation de la matrice produit
matriceP=(int**)malloc(n1*sizeof(int));
for(i=0;i<n1;i++){
matriceP[i]=(int*)malloc(m2*sizeof(matriceP[i]));}
//effectuer la multiplication
for (i=0; i<n1; i++){
for (j=0; j<m2; j++)
{
matriceP[i][j]=0;
for (k=0;k<m1; k++){
matriceP[i][j] += matrice1[i][k]*matrice2[k][j];}}
}
//Affichage de la matrice produit
for (i=0; i<n1; i++){
for (j=0; j<m2; j++)
{
printf("%d",matriceP[i][j]);}
printf("\n");}
}
else{ printf("Ce n'est pas possible ! ");}
}
REPONSE
Le premier programme est correct . Quant au deuxième , la première ligne est fausse car on
ne peut initialiser une chaîne de caractères sans taille !
15
TP3 Les listes chaînées
Ce TP consiste en la création d’un module, ici une liste, passant par une partie données locales ou
fichier source contenant des fonctions, un fichier header contenant les prototypes des fonctions
définis dans la bibliothèque, et enfin, le main, c’est le programme principal qui permet d’exécuter
l’ensemble des fonctions choisies par l’utilisateur.
Donc tout d’abord, on commence par la création d’un nouveau projet, (Fichier -> nouveau -> projet
->Console d’application) , et ensuite , on commence à implémenter dans ce projet les 3 fichiers
suivants : liste.h , liste.cpp et enfin mainliste.cpp
REPONSE
liste.h
#define faux 0
#define vrai 1
#define NONORDONNE 0
#define CROISSANT 1
#define DECROISSANT 2
//Nouveaux types
typedef void objet;
typedef int booleen;
//type liste
typedef struct liste{
element* premier; //premier élémént de la liste
element* dernier; //dernier élément de la liste
element* courant; //élément en cours de traitement (parcours de la liste)
int nbelt; //nombre d'éléments dans la liste
int type; //0:simple, 1:croissant , 2:décroissant
char* (*afficher) (objet*);
int (*comparer) (objet*,objet*);
}liste;
16
//comparer deux chaines de caracteres
//fournit <0 si ch1<ch2; 0 si ch1=ch2; >0 sinon
int comparer (objet* objet1, objet* objet2);
char* afficher(objet* objet);
//créer la liste
liste* creerliste( int type,char* (*afficher) (objet*),int (*comparer) (objet*,objet*));
//initialiser la liste
void initliste(liste* li,int type,char* (*afficher) (objet*),int (*comparer)(objet*,objet*));
//Calculer le nombre d'éléménts de la liste
int nbelement(liste* li);
//vérifier si la liste est vide
booleen listevide(liste* li);
//Ajout en tete de liste
void insererentetedeliste(liste* li,objet* objet);
//Ajout après l'élément précédent
//insérer dans la liste li, objet après précédent
//si précédent est NULL, insérer en tête de liste
void insererapres(liste* li,element* precedent,objet* objet);
//Ajout en fin de liste
void insererenfindeliste(liste* li, objet* objet);
//Fonction ouvrir liste
void ouvrirliste(liste* li);
//Fonction finiliste
booleen finliste(liste* li);
//element courant
element* elementcourant(liste* li);
//objet courant
objet* objetcourant(liste* li);
//lister la liste
void listerliste(liste* li);
//chercher un objet
objet* chercherunobjet(liste* li, objet* objetcherche);
//retrait en tete de liste
objet* extraireentetedeliste(liste* li);
//extraire apres l'élément précédent
objet* extraireapres(liste* li, element* precedent);
//Extraire en fin de liste
objet* extraireenfindeliste(liste* li);
//extraire un objet à partir de sa référence
booleen extraireunobjet(liste* li,objet* objet);
//detruire liste
void detruireliste(liste* li);
liste.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
17
#include"liste.h"
// créer la liste
liste* creerliste (int type, char* (*afficher) (objet*), int (*comparer) (objet*, objet*)){
liste* li = (liste*) malloc (sizeof (liste));
initliste (li, type, afficher, comparer);
return li;
}
18
void insererentetedeliste(liste* li, objet* objet){
element* nouveau = creerelement();
nouveau->reference = objet;
nouveau->suivant = li->premier;
li->premier = nouveau;
if(li->dernier ==NULL){
li->dernier = nouveau;}
li->nbelt++;}
//fonction ouvrirliste
void ouvrirliste(liste* li){
li->courant = li ->premier;}
//fonction finliste
booleen finliste(liste* li){
return li->courant == NULL;}
//element courant
element* elementcourant(liste* li){
element* ptc = li -> courant;
if(li -> courant != NULL){
li -> courant = li -> courant ->suivant;}
return ptc;}
//objet courant
19
objet* objetcourant (liste* li){
element* ptc = elementcourant(li);
return ptc == NULL ? NULL : ptc -> reference;}
//lister la liste
void listerliste(liste* li){
ouvrirliste(li);
while(!finliste (li)){
objet* objet = objetcourant(li);
printf("%s \n",li -> afficher(objet));}
}
//chercher un objet
objet* chercherunobjet (liste* li, objet* objetCherche){
booleen trouve = faux;
objet* objet; //pointeur courant
ouvrirliste(li);
while(!finliste(li)&& !trouve){
objet = objetcourant(li);
trouve = li -> comparer(objetCherche,objet) == 0;
}
return trouve ? objet : NULL;}
20
li -> nbelt--;
}
ouvrirliste(li);
while(!finliste(li) && !trouve){
precedent = ptc; //repere l'element precedent
ptc = elementcourant(li);
trouve = (ptc -> reference == objet) ? vrai : faux;
}
if (trouve==faux){return faux ;}
else{
return vrai;}
}
//detruire liste
void detruireliste(liste* li){
ouvrirliste(li);
while(!finliste(li)){
element* ptc = elementcourant(li);
//free (ptc -> reference); // si on veut detruire les objets
21
free(ptc); }
initliste(li,0,NULL,NULL);}
______________________________________________________________________________
Mainliste.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "liste.h"
int menu(){
printf("\n\n GESTION D'UNE LISTE D'ENTIERS \n\n");
printf("1 - Creer une liste \n");
printf("2 - Initialiser une liste \n");
printf("3 - Retourner le nombre des objets \n");
printf("4 - Verifier si la liste est vide \n");
printf("5 - Insertion en tete de liste \n");
printf("6 - Insertion en fin de liste \n");
printf("7 - Retrait en tete de liste \n");
printf("8 - Retrait en fin de liste \n");
printf("9 - Retrait d'un objet à partir de sa reference \n");
printf("10 - Afficher les objets de la liste \n");
printf("11 - Chercher un objet \n");
printf("12 - Destruction de la liste \n");
printf("13 - FIN \n");
printf("\n");
printf("Votre choix?");
int cod; scanf("%d",&cod); getchar();
printf("\n");
return cod;
}
main(){
int fin = 1;
liste* li = NULL;
while(fin)
{
switch(menu())
{
case 1 : li = creerliste(0,afficher,comparer);
break;
case 2 : initliste(li,0,afficher,comparer);
break;
22
case 3 : printf("Le nombre d'elements est : %d",nbelement (li));
break;
case 7 : int* c;
c = (int*)extraireentetedeliste(li);
if(c == NULL) printf("Liste Vide !");
else printf("L'element extrait : %d",*c);
break;
case 8 : int* d;
d = (int*)extraireenfindeliste(li);
if(d == NULL) printf("Liste Vide !");
else printf("L'element extrait : %d",*d);
break;
case 10 : listerliste(li);
break;
23
if(g == NULL) printf("Le nombre n'est pas trouve !!");
else printf("Le nombre est trouve !!");
break;
case 12 : detruireliste(li);
printf("Liste est detruite :( ");
break;
case 13 : fin = 0;
break;
default : printf("Tapez un nombre entre 1 et 13");
break;
}} }
Exécution du Programme
24
TP4 Liste de personnes
Dans cet exercice, on va appliquer le programme précédent sur une liste de personnes.
Donc on va ajouter 2 autre fichiers ( personne.h et personne.c ) .
personne.h
#include <string.h>
#include<stdlib.h>
typedef char ch15[16];
typedef void Objet;
typedef struct { //creer la structure Personne
ch15 nom;
ch15 prenom;
}Personne;
Personne* creerPersonne(char* nom,char* prenom); //fonction qui creer un personne
char* ecrirePersonne(Objet* objet); //pour affichier la Personne crée
int comparerPersonne(Objet* objet1,Objet* objet2);// pour comparer 2 personne a partir de
leur nom
______________________________________________________________________________
personne.c
#include <stdio.h>
#include "personne.h"
#include <string.h>
25
{
Personne* p=new Personne();
strcpy(p->nom,nom);
strcpy(p->prenom,prenom);
return p;
}
//fonction d'affichage d'une personne
char* ecrirePersonne(Objet* objet){
Personne *p=(Personne*) objet;
char* output=(char*)malloc(sizeof(Personne));
snprintf(output,sizeof(Personne),"%s %s\n",p->nom,p->prenom);
return output;
}
//fonction de comparaison entre 2 personnes
int comparerPersonne(Objet* objet1,Objet* objet2){ //fontion
Personne *p1=(Personne*) objet1;
Personne *p2=(Personne*)objet2;
return strcmp(p1->nom,p2->nom);
}
__________________________________________________________________________
listePersonne.c (main)
#include<stdio.h>
#include"liste.h"
#include"personne.h"
int menu()
{
int cod;
printf("\n\nGESTION D'UNE LISTE DE PERSONNES\n\n");
printf("0 - Fin\n");
printf("1 - Insertion en tete de liste\n");
printf("2 - Insertion en fin de liste\n");
printf("3 - Retrait en tete de liste\n");
printf("4 - Retrait en fin de liste\n");
printf("5 - Retrait d'un element a partir de son nom\n");
printf("6 - Parcours de la liste\n");
printf("7 - Recherche d'un element a partir de son nom\n");
printf("8 - Destruction de la liste\n");
printf("\n");
printf("Votre choix?\t");
scanf("%d",&cod);
printf("\n");
return cod;
}
main()
26
{ Liste* lp=creerListe(0,ecrirePersonne,comparerPersonne);
booleen fini=faux;
while(!fini){
switch(menu()){
case 0:
fini=vrai;
break;
case 1:{
printf("nom de la personne a creer??");
ch15 nom;
scanf("%s",nom);
printf("prenom de la personne a creer??");
ch15 prenom;
scanf("%s",prenom);
Personne* nouveau=creerPersonne(nom,prenom);
insererEnTeteDeListe(lp,nouveau);
}break;
case 2:{
printf("nom de la personne a creer??");
ch15 nom;
scanf("%s",nom);
printf("prenom de la personne a creer??");
ch15 prenom;
scanf("%s",prenom);
Personne* nouveau=creerPersonne(nom,prenom);
insererEnFinDeListe(lp,nouveau);
}break;
case 3:
{
Personne* P=(Personne*) extraireEnTeteDeListe(lp);
if(P!=NULL)
{
printf("Element %s %s extrait en tete de
liste\n",P->nom,P->prenom);
}
else
{
printf("Liste est vide");
}
}
break;
case 4:
{
Personne* P=(Personne*) extraireEnFinDeListe(lp);
27
if(P!=NULL)
{
printf("Element %s %s extrait en fin de liste\n",P->nom,P->prenom);}
else
{printf("Liste est vide");}
}
break;
case 5:
{
printf("Donnez le nom de personne a extraire:\t");
ch15 nom;
scanf("%s",nom);
Personne* P=creerPersonne(nom,"?");
Personne* P2 = (Personne*) chercherUnObjet(lp,P);
if(extraireUnObjet(lp,P2))
{
printf("Element %s %s extrait de la liste\n",P2-
>nom,P2->prenom);
}
}
break;
case 6:
listerListe(lp);
break;
case 7:
{
printf("Donnez le nom de personne a chercher:\t");
ch15 nom;
scanf("%s",nom);
Personne* P=creerPersonne(nom,"?");
Personne* P2 = (Personne*)chercherUnObjet(lp,P);
if(P2 != NULL)
{
printf("%s %s trouver dans la liste\n",P2-
>nom,P2->prenom);
}
else
{
printf("%s n'existe pas dans la liste\n",nom);
}
}break;
case 8:
detruireListe(lp);
break;
}
} return 0
28
Exécution du Programme
Insertion en tête
de la liste Parcours de la liste
Retrait en fin de
Recherche d’un Liste
Elément
29
TP5 Listes chaînées (POLYNÔMES)
Le type monôme est une structure (un objet) contenant un coefficient réel et un exposant
entier. Le type Polynôme correspond au type Liste.
Implémenter au langage C les fonctions du module polynôme qui permettent de créer un
monôme, de créer un polynôme , d’insérer un monôme dans un polynôme , d’afficher un
polynôme, de calculer la valeur d’un polynôme pour une valeur x donnée et de détruire un
polynôme .
polynome.h
#include "liste.h"
typedef struct
{
double coefficient;
int exposant;
}monome;
typedef liste polynome;
monome* creermonome(double coefficiant, int exposant);
char* ecriremonome(objet* objet);
int comparermonome(objet* objet1, objet* objet2);
polynome* creerpolynome();
void insererenordre(polynome* po, monome* nouveau);
void afficherpolynome(polynome* po);
double valeurpolynome(polynome* po, double x);
void detruirepolynome(polynome* po);
polynome.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "polynome.h"
30
}
//ecriture du monome
char* ecriremonome(objet* objet)
{
monome* m = (monome*)objet; //transformation du type de objet de objet* vers
monome*
char* output = (char*)sizeof(monome);
snprintf(output, sizeof(monome), "%s*x^%s", m->coefficient, m->exposant); //on
utilise snprintf pour avoir une écriture comme on le veut
return output;
}
//insertion en ordre!!!!!!!!!!!!!!!!!!
void insererenordre(polynome* po, monome* nouveau)
{
insererenordreliste(po, nouveau); // on a pas cette fonction dans liste
}
31
//affichage du polynome qui est une liste de monome et donc qui est semblable a listerliste
void afficherpolynome(polynome* po)
{
listerliste(po);
}
double valeur=0;
while (objetcourant(po) != NULL)
{
monome* m = (monome*)objetcourant(po);
valeur += m->coefficient*expo(x, m->exposant);
}
return valeur;
}
32
MainPolynome.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include "liste.h"
#include "polynome.h"
int menu(){
printf("\n\n GESTION DE POLYNOME \n\n");
printf("1 - Créer un monome \n");
printf("2 - Ecrire un monome \n");
printf("3 - Comparer deux monomes \n");
printf("4 - Création d'un polynome \n");
printf("5 - Insertion en ordre \n");
printf("6 - Affichage du polynome \n");
printf("7 - Valeur du polynome \n");
printf("8 - Destruction de la liste \n");
printf("9 - FIN \n");
printf("\n");
printf("Votre choix?");
int cod; scanf("%d",&cod); getchar();
printf("\n");
return cod;
}
main(){
int fin = 1;
polynome* po = (polynome*)malloc(sizeof(polynome));
monome* mo = (monome*)malloc(sizeof(monome));
double coefficient,coefficient1,coefficientn,x;
int exposant, exposant1,exposantn;
while(fin)
{
switch(menu())
{
case 1 : printf("Veuillez entrer un coefficient : \t");
scanf("%lf",&coefficient);
printf("\n et veuillez entrer un exposant : \t");
scanf("%d",&exposant);
mo = creermonome(coefficient,exposant);
printf("Votre monome a été créé ! \n")
break;
33
printf(" \n %s",monome);
break;
case 4 : p0=creerpolynome();
printf("Votre polynome a été créé avec succes !");
break;
case 5 :
printf("Veuillez entrer un coefficient : \t");
scanf("%lf",&coefficientn);
printf("\n et veuillez entrer un exposant : \t");
scanf("%d",&exposantn);
monome* nouveau = creermonome(coefficientn,exposantn);
insererenordre(p0,nouveau);
break;
case 6 : afficherpolynome(po);
break;
case 7 :
printf("Veuillez saisir une valeur pour x :\t");
scanf("%f",&x);
double resultat = valeurpolynome(p0,x);
printf("\n Le calcul de votre polynome est: %f",&resultat);
break;
case 8 : detruirepolynome(p0);
printf("\n Votre polynome a été détruit avec succès!");
break;
case 9 : fin = 0;
break;
34
Exécution du Programme
35
TP6 PILES - FILES
Une Pile est une structure de données telle que l’ajout d’un élément se fait au sommet
Et la suppression d’un élément se fait également au sommet .(LAST IN FIRST OUT =LIFO)
Une file est une structure de données telle que l’ajout d’un élément en fin de fille d’attente
Et la suppression d’un élément se fait en début de file d’attente .(LAST IN FIRST OUT =LIFO)
Le but de tp c’est implémenter la pile et la file pour un liste de personnes , donc on ajoute 2
fichier pour chaque type : pile.h et pile.c
: file.h et file.c
Et on applique Le programme pour 3 personnes .
REPONSE Pile :
Pile.h
#include "liste.h"
Pile* CreerPile(int type, char* (*afficher) (Objet*), int (*comparer) (Objet*, Objet*) );
booleen pileVide(Pile *P);
void Empiler(Pile* P,Objet *O);
Objet* Depilert(Pile* P);
void ListerPile(Pile* P);
void detruirePile(Pile* P);
Pile.c
#include <stdio.h>
#include <string.h>
#include "Pile.h"
Pile* CreerPile(int type, char* (*afficher) (Objet*), int (*comparer) (Objet*, Objet*) )
{
return creerListe(type,afficher,comparer);
}
36
booleen pileVide(Pile *P)
{return listeVide(P);}
void Empiler(Pile* P,Objet *O)
{insererEnTeteDeListe(P,O);}
Objet* Depilert(Pile* P)
{return extraireEnTeteDeListe(P);}
void ListerPile(Pile* P)
{listerListe(P);}
void detruirePile(Pile* P)
{detruireListe(P) ;}
Main
#include <stdio.h>
#include <stdlib.h>
#include "Personne.h"
#include "Pile.h"
37
Exécution du Programme
REPONSE FILE :
File.h
#include "liste.h"
typedef Liste File;
File* CreerFile(int type, char* (*afficher) (Objet*), int (*comparer) (Objet*, Objet*) );
booleen fileVide(File *F);
void Enfiler(File* F,Objet *O);
Objet* Defiler(File* F);
void ListerFile(File* F);
void detruirePile(File* F);
38
File.c
#include <stdio.h>
#include <string.h>
#include "File.h"
File* CreerFile(int type, char* (*afficher) (Objet*), int (*comparer) (Objet*, Objet*) )
{
return creerListe(type,afficher,comparer);
}
booleen FileVide(File *F) //verification si la file est vide
{return listeVide(F);}
void Enfiler(File* F,Objet *O) //enfiler depuis la file
{insererEnTeteDeListe(F,O);}
Objet* Defiler(File* F) // defiler depuis la file
{return extraireEnFinDeListe(F);}
void ListerFile(File* F) // parcours les elements du file
{ listerListe(F);}
void detruirefile(File* F) // detruire la file
{detruireListe(F);}
Main
#include <stdio.h>
#include <stdlib.h>
#include "Personne.h"
#include "File.h"
/* run this program using the console pauser or add your own getch, system("pause") or input
loop */
Personne *Pr;
while(i<4)
{
printf("Donner le nom de %d personne \n",i);
scanf("%s",nom);
39
printf("Donner le prenom de %d personne\n",i);
scanf("%s",prenom);
Pr= creerPersonne(nom,prenom);
Enfiler(F,Pr);
i++;}
printf("\nles elements de la File sont:\n");
ListerFile(F);
Pr=Defiler(F);
printf("\nla dernier personnes inserer est :\n%s\t%s",Pr->nom,Pr->prenom);
printf("\nles nouvelles elements de la File sont:\n");
ListerFile(F);
printf("\nla destruction de la file");
detruirefile(F);
return 0;}
Exécution du Programme
40
TP7 Les Arbres
En nous inspirant du TP précédent , on doit implémenter :
-arbre.h : qui contient la déclaration du type arbre et les prototypes des fonctions de gestion
d’un arbre ;
-arbre.cpp : qui contient le corps des fonctions dont le prototype est défini dans arbre.h
-mainarbre.cpp : qui est le programme principal des arbres.
arbre.h
typedef void Objet;
typedef int booleen;
#define faux 0
#define vrai 1
typedef struct
{
Noeud* racine;
char* (*afficher) (Objet*);
int (*comparer) (Objet*, Objet*);
}Arbre;
Arbre* creerArbreGene();
41
Arbre* creerArbreAri();
arbre.c
#include <stdio.h>
#include <stdlib.h>
#include "Arbre.h"
#include "Liste.h"
Noeud* cF(Objet* o)
{
return cNd(o,NULL,NULL);
}
42
A->racine= R;
A->afficher=afficher;
A->comparer=comparer;
}
Arbre* creerArbreGene()
{
Noeud*
racine=cNd("Samir",cNd("Kamal",cNd("Yassine",NULL,cNd("Hind",NULL,cF("Yasmi
ne"))),cNd("Sarah",cF("Karim"),NULL)),NULL);
//Noeud*
racine=cNd("1",cNd("2",cF("4"),cNd("5",cF("7"),cF("8"))),cNd("3",NULL,cNd("6",cF("
9"),NULL)));
return creerArbre(racine,NULL,NULL);
}
Arbre* creerArbreAri()
{
Noeud* racine=cNd("-",cNd("*",cNd("+",cF("a"),cF("b")),cNd("-
",cF("c"),cF("d"))),cF("e"));
return creerArbre(racine,NULL,NULL);
}
43
printf("%s\t",afficher(R->ref));
Prefixe(R->Droit,afficher);
}
}
44
insererEnFinDeListe(li,extrait->Droit);
}
}
int taille(Noeud* R)
{
if(R == NULL)
return 0;
else
{
return 1 + taille(R->Gauche) + taille(R->Droit);
}
}
int hauteur(Noeud* R)
{
if(R == NULL)
{
return 0;
}
else
{
return 1 + max(hauteur(R->Gauche),hauteur(R->Droit));
}
}
mainarbre.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Arbre.h"
char* afficher(Objet* O)
{
char* N= (char*) O;
return N;
45
}
int menu()
{
int rep;
printf("\n\nGESTION D'ARBRES BINAIRES\n\n");
printf("0 - Fin\n");
printf("\n");
printf("1 - Creation de l'arbre genealogique\n");
printf("2 - Creation de l'arbre de l'expression arithmetique\n");
printf("\n");
printf("3 - Parcours prefixe\n");
printf("4 - Parcours infixe\n");
printf("5 - Parcours postfixe\n");
printf("6 - Trouver noeud\n");
printf("7 - Taille\n");
printf("8 - Hauteur\n");
printf("9 - Parcours En Largeur\n");
printf("\n");
printf("Votre choix?\t");
scanf("%d",&rep);
printf("\n");
return rep;
}
while(!fini)
{
switch(menu())
{
case 0 :
fini = vrai;
break;
46
case 1:
{
A1 = creerArbreGene();
}
break;
case 2:
{
A2 = creerArbreAri();
}
break;
case 3:
if(A1!=NULL)
{
printf("\nParcours prefixe de l'arbre genealogique\n");
Prefixe(A1->racine,afficher);
}
if(A2!=NULL)
{
printf("\nParcours prefixe de l'arbre arithmetique\n");
Prefixe(A2->racine,afficher);
}
break;
case 4:
if(A1!=NULL)
printf("\nParcours infixe de l'arbre genealogique\n");
Infixe(A1->racine,afficher);
if(A2!=NULL)
{
printf("\nParcours infixe de l'arbre arithmetique\n");
Infixe(A2->racine,afficher);
}
break;
case 5:
if(A1!=NULL)
{
printf("\nParcours postfixe de l'arbre genealogique\n");
Postfixe(A1->racine,afficher);
}
if(A2!=NULL)
{
printf("\nParcours postfixe de l'arbre arithmetique\n");
Postfixe(A2->racine,afficher);
}
break;
case 6:
47
printf("donner le nom a rechercher:\t");
scanf("%s",chercher);
if(A1!= NULL)
{
N1=trouverNoeud(A1-
>racine,chercher,comparer);
if(N1!=NULL)
{
printf("%s existe dans l'arbre genealogique\n",N1->ref);
}
else
{
printf("%s n'existe pas dans l'arbre genealogique\n",chercher);
}
}
if(A2!= NULL)
{
N2=trouverNoeud(A2-
>racine,chercher,comparer);
if(N2!=NULL)
{
printf("%s existe dans l'arbre arithmetique\n",N2->ref);
}
else
{
printf("%s n'existe pas dans l'arbre arithmetique\n",chercher);
}
}
break;
case 7:
if(A1 != NULL)
{
printf("La taille de l'arbre genealogique est: %d\n",taille(A1->racine));
}
if(A2 != NULL)
{
printf("La taille de l'arbre arithmetique est: %d\n",taille(A2->racine));
}
break;
case 8:
if(A1 != NULL)
{
printf("L'hauteur de l'arbre genealogique est:
%d\n",hauteur(A1->racine));
}
if(A2 != NULL)
48
{
printf("L'hauteur de l'arbre arithmetique est: %d\n",hauteur(A2->racine));
}
break;
case 9:
if(A1 != NULL)
{
printf("parcours en largeur de l'arbre genealogique\n");
EnLargeur(A1->racine,afficher);
}
if(A2 != NULL)
{
printf("parcours en largeur de l'arbre arithmetique\n");
EnLargeur(A2->racine,afficher);
}
break;
}
}
return 0;}
Exécution du Programme
49
TP8 Les Graphes
Un graphe est une structure de données composée d’un ensemble de sommets, et d’un
ensemble de relations entre ces sommets .
Dans ce TP , on va implémenter un programme adéquat comme demandé .
Graphemat.h
#include <stdio.h>
typedef struct {
int n;
int nMax;
booleen value;
NomSom* nomS;
Matrice element;
Matrice valeur;
booleen* marque;
} GrapheMat;
Graphemat.c
#include "graphemat.h"
50
#include <string.h>
#include <stdlib.h>
51
}
return trouve ? i : -1;
}
52
for (int i=0; i<graphe->n; i++) {
if ( (graphe->element [numSommet*nMax+i] == vrai)
&& !graphe->marque [i] ) {
profondeur(graphe, i);
}
}
}
MainGraphemat.c
#include "graphemat.h"
#include <stdlib.h>
#include <string>
int menu () {
printf ("\n\n Graphes \n");
printf (" -------\n\n");
printf (" 0 - Fin du programme\n");
printf (" 1 - Creer la graphe\n");
printf (" 2 - Detruire la graphe\n");
printf (" 3 - Ajouter un sommet\n");
printf (" 4 - Ajouter un arc\n");
printf (" 5 - Ecrire graphe\n");
printf (" 6 - Parcourir en profondeur\n");
printf ("\n --------------------------------- \n");
printf ("\n Votre choix : ");
int cod; scanf ("%d", &cod); getchar();
printf ("\n\n");
return cod;
}
main()
{
GrapheMat* graphe1 ;
53
fini = vrai;
break;
case 1 :{
graphe1 = creerGrapheMat(4,0);
break;
}
case 2 :{
detruireGraphe (graphe1);
break;
}
case 3 :{
printf(" Donner le nom du sommet\n");
NomSom x;
gets(x);
ajouterUnSommet (graphe1,x);
break;
}
case 4 :{
NomSom x1,x2;
int x3;
printf(" Donner le premier sommet\n");
gets(x1);
printf(" Donner le deuxieme sommet\n");
gets(x2);
printf("Donner l'arc\n");
scanf("%d",&x3);
ajouterUnArc (graphe1,x1,x2,x3);
break;
}
case 5 :{
ecrireGraphe (graphe1);
break;
getchar();
}
case 6 :{
parcoursProfond (graphe1);
break;
}
default: printf("choisir un nombre entre 0 et 6 !! ");
getchar();
}
}
}
54
Exécution du Programme
55