Définition d objets auto-référents

Documents pareils
1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Les structures de données. Rajae El Ouazzani

Les arbres binaires de recherche

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Programmation système de commandes en C

Java Licence Professionnelle CISII,

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Introduction au langage C

Compression de Données - Algorithme de Huffman Document de Conception

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Le prototype de la fonction main()

Cours de Programmation Impérative: Zones de mémoires et pointeurs

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Le langage C. Séance n 4

Cours Programmation Système

Chap III : Les tableaux

Conventions d écriture et outils de mise au point

Algorithmique, Structures de données et langage C

Arguments d un programme

Bases de programmation. Cours 5. Structurer les données

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

3IS - Système d'exploitation linux - Programmation système

Les structures. Chapitre 3

Cours d Algorithmique et de Langage C v 3.0

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

OS Réseaux et Programmation Système - C5

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN

SUPPORT DE COURS. Langage C

Programmation Classique en langage C

Analyse de sécurité de logiciels système par typage statique

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Programmation système I Les entrées/sorties

Programmation en langage C

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

INF 104 (SELC) Introduction au langage C

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Le système de gestion des fichiers, les entrées/sorties.

Chapitre 1 : La gestion dynamique de la mémoire

Cours de C. Allocation dynamique. Sébastien Paumier

Cours d initiation à la programmation en C++ Johann Cuenin

Programmation système en C/C++

Algorithmique et Programmation, IMA

UE C avancé cours 1: introduction et révisions

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

SUPPORT DE COURS. Dr. Omari Mohammed Maître de Conférences Classe A Université d Adrar Courriel : omarinmt@gmail.com

Programme Compte bancaire (code)

Introduction aux Systèmes et aux Réseaux

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Génération de code binaire pour application multimedia : une approche au vol

INITIATION A LA PROGRAMMATION

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Architecture des ordinateurs

Playing with ptrace() for fun and profit

Exercice sur les Dockers

Cours 6 : Tubes anonymes et nommés

Pensez à vous inscrire... si ce n est pas encore fait

TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 2 e année Génie Informatique

TD2/TME2 : Ordonnanceur et Threads (POSIX et fair)

Programmation C. J.-F. Lalande. 15 novembre 2012

Utilisation d objets : String et ArrayList

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7


TP2 : tableaux dynamiques et listes chaînées

Le Langage C Licence Professionnelle Qualité Logiciel Pr. Mouad BEN MAMOUN ben_mamoun@fsr.ac.ma Année universitaire 2011/2012

Gestion de la mémoire

Rappels Entrées -Sorties

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Introduction à MATLAB R

Programmation impérative

Initiation à l algorithmique

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Programmation client-serveur sockets - RPC

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

COMPARAISONDESLANGAGESC, C++, JAVA ET

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Anis ASSÈS Mejdi BLAGHGI Mohamed Hédi ElHajjej Mohamed Salah Karouia

Les processus légers : threads. Système L3, /31

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Utilisation de la Kinect

Introduction à la programmation concurrente

Programmation C. Apprendre à développer des programmes simples dans le langage C

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

Notes du cours 4M056 Programmation en C et C++ Vincent Lemaire et Damien Simon

Claude Delannoy. 3 e édition C++

Assurance Qualité. Cours de génie logiciel. Renaud Marlet. LaBRI / INRIA (d'après A.-M. Hugues) màj 23/04/2007

Programmation en C. École Nationale Supérieure de Techniques Avancées. Pierre-Alain Fouque et David Pointcheval

Premiers Pas en Programmation Objet : les Classes et les Objets

Initiation. àl algorithmique et à la programmation. en C

Cours de Systèmes d Exploitation

Un ordonnanceur stupide

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Transcription:

V0 (30-10-2009) Licence Informatique Université Lille 1 Pour toutes remarques : Alexandre.Sedoglavic@univ-lille1.fr Semestre 5 2009-2010

Définition d objets auto-référents L idée de base est d inclure dans la définition de l objet des références à des objets de même type ; arbres, listes, graphes, etc. : ce sont des nœuds référençant d autres nœuds ; ce sont des types récursifs. Par exemple, pour arbre binaire de on a : struct noeud int value; struct noeud *gauche, *droit; ; mais l espace mémoire est réservé pour un pointeur sur une structure noeud ; pas pour stocker un objet de type noeud. On peut définir des objets en référence croisée : struct s struct t...... struct t *p_t; struct s *p_s; ; ;

Nous allons implanter les outils de manipulation d une liste en nous imposant une contrainte forte : nous ne nous servirons pas des fonctions malloc et free. Le seul espace mémoire disponible sera constitué d un tableau de caractères : #define SIZE 1<<16 char memoire[size] ; Ce type est uniquement choisi pour désigner des octets. Nous devrons donc gérer l allocation dynamique de la mémoire. Notez bien qu il ne s agit pas ici de donner des implantations rudimentaires des fonctions malloc et free. En effet, dans notre cas, nous allouerons toujours la même taille de mémoire correspondant à une cellule.

Les déclarations et définitions basiques des types et variables #define NULL 0 /* pour d\ esigner la fin d une liste */ struct cellule_m unsigned int contenu ; struct cellule_m *next ; ; typedef struct cellule_m cellule_t ; /* pour compenser l absence de fonction free, on utilise */ cellule_t *ListeDesCellulesLibres = NULL ; /* on peut ensuite avoir autant de listes que n\ ecessaire */ cellule_t *maliste = NULL ;

V33 (30-10-2009) Les fonctions classiques de manipulation de ces listes int estvide(cellule_t *liste) return!liste ; void inserer( cellule_t *cell, cellule_t **liste ) cellule_t *tmp=null, *ptr = *liste ; while(ptr && ptr->contenu < cell->contenu) tmp = ptr ; ptr = ptr->next; cell->next= ptr ; if(tmp) tmp->next= cell ; else *liste = cell ; void supprimer( cellule_t *cell, cellule_t **liste ) cellule_t *tmp=null, *ptr = *liste ; while(ptr && ptr!= cell) tmp = ptr ; ptr = ptr->next ; if(tmp) tmp->next = cell ->next ; else *liste = NULL ;

Les fonctions d allocations de cellules char *sommet = memoire ; void FreeCellule(cellule_t *cell) inserer( cell, &ListeDesCellulesLibres ) ; cellule_t *MallocCellule(unsigned int stuff) cellule_t *tmp = ListeDesCellulesLibres ; if( estvide(listedescelluleslibres) ) extraire( tmp, &ListeDesCellulesLibres ) ; tmp->contenu = stuff ; tmp->next = NULL ; return tmp ; if(size-(sommet-memoire)<sizeof(cellule_t)) return NULL ; tmp = (cellule_t *) sommet ; tmp->contenu = stuff ; tmp->next = NULL ; sommet = (char *) ((cellule_t *) sommet +1) ; return tmp;

On se propose de parcourir un labyrinthe que l on aura préalablement représenté par un tableau. #define FERME 0 #define OUVERT 1 #define PARCOURU 2 #define LONGUEUR 5 #define LARGEUR 6 char petitlab[longueur][largeur] = FERME, OUVERT, FERME, FERME, FERME, FERME, FERME, OUVERT, OUVERT, OUVERT, OUVERT, FERME, FERME, OUVERT, FERME, FERME, FERME, FERME, FERME, OUVERT, OUVERT, OUVERT, OUVERT, FERME, FERME, FERME, FERME, FERME, OUVERT, FERME ; /* XXXXX X X X X X X X X X On commence et on termine toujours au m\^eme endroits XXXXX */

Implantation d une pile Pour ce faire, nous utilisons une pile contenant des pas et implanter par une liste (sans s occuper de la base mais uniquement du sommet) : struct Pas int x ; int y ; ; typedef struct Pas Pas_t ; struct cell struct cell * next ; Pas_t pas ; char *chemin ; /* nous verrons plus tard */ ; /* \ a quoi \cca sert */ typedef struct cell cell_t ; typedef cell_t * Pile_t ;

Il nous faut maintenant implanter les fonctions classiques de manipulations de pile : int estvide (Pile_t *pile) return!((int) *pile) ; void empiler(pas_t step, Pile_t *pile) cell_t *tmp = (cell_t *) malloc (sizeof(cell_t)) ; tmp->pas = step ; tmp->next = *pile ; *pile = tmp ; Pas_t depiler(pile_t *pile) cell_t *tmp = *pile ; Pas_t res = tmp->pas ; /* un test est possible pour */ *pile = tmp->next ; /* ne pas d\ epiler null */ free(tmp) ; return res ;

V33 (30-10-2009) Algorithme pour savoir si on peut sortir Pour parcourir notre labyrinthe, nous allons utiliser une variable globale représentant notre pile et qui contiendra les pas à explorer. Au début du parcours, elle ne contient que le seul pas allant de (0, 1) à (1, 1). Tant que notre pile n est pas vide, on retire le pas de tête. S il est possible, on réaffiche le labyrinthe en prenant soin de marquer d un signe les cases déjà visitées pour ne pas boucler. Puis on ajoute à la pile tous les pas possibles (pour lesquels la case d arrivée est franchissable) à partir du point d arrivée du pas considéré. Il suffit d itérer ce qui précède pour sortir du labyrinthe. De plus, si on stocke à chaque pas la direction prise, on peut mémoriser la sortie. Par exemple, on peut utiliser une chaîne de caractères initialement vide à laquelle, on peut ajouter les lettres : n, e, s, w pour signifier nord, etc. (par convention, on ne se déplace pas en diagonale).

Fonctions auxiliaires Pour gérer les chemins inefficacement, on utilise la fonction char * concat(char *, char) qui prend en entrée un chemin (disons "ws"), un déplacement ( s ) et retourne un pointeur sur la nouvelle solution ainsi formée ("wss") pour laquelle de la mémoire aura été réservée (l ancien chemin n est pas modifié). Ceci modifie l empilement et le dépilement : void empiler(pas_t step, Pile_t *pile, char *chemin) cell_t *tmp = (cell_t *) malloc (sizeof(cell_t)) ; tmp->chemin = chemin ; tmp->pas = step ; tmp->next = *pile ; *pile = tmp ; Pas_t depiler(pile_t *pile) cell_t *tmp = *pile ; Pas_t res = tmp->pas ; *pile = tmp->next ; free(tmp->chemin) ; free(tmp) ; return res ;

Le début de la fonction principale #include<stdio.h> #include<stdlib.h> #include <string.h> #include"labyrinthe.h" #include"labyrintheexemple.h" extern void empiler(pas_t, Pile_t *, char *); extern Pas_t depiler(pile_t *) ; extern int estvide(pile_t *) ; char * concat(char *,char); void affichage(char lab[longueur][largeur]) ; void mystrcpy(char **, char *); char * parcourir(pile_t *, char lab[longueur][largeur]) ;

V33 (30-10-2009) La fonction principale int main (void) char *path = "" ; /* Le premier pas */ Pas_t PointDeDepart =.x = 0,.y = 1 ; Pile_t mapile = NULL ; empiler(pointdedepart, &mapile, path) ; /* On considere que l entr\ ee est parcouru */ petitlab[pointdedepart.x][pointdedepart.y]=parcouru ; /* Parcours et analyse du resultat */ path = parcourir(&mapile,petitlab) ; if( path ) printf("\n Felicitation, vous \\^etes sorti par le chemin %s\n",path); else printf("\n ;-( ce labyrinthe n a pas de sortie\n"); return 0 ;

La fonction de parcours char * parcourir(pile_t *pile, char lab[longueur][largeur]) Pas_t pos,nextpos, pas[4] = 0,1,1,0,0,-1,-1,0 ; char dep[4] = s, e, n, w ; char *path = NULL; int i ; do mystrcpy(&path,(*pile)->chemin) ; pos = depiler(pile) ; if (pos.x==longueur-1 && pos.y==largeur-2) return path ; /* C est gagn\ e on est sorti */ for(i=0; i<4 ; i++) nextpos.x = pos.x+pas[i].x ; /* On prepare les pas */ nextpos.y = pos.y+pas[i].y ; /* \ a empiler */ if (lab[nextpos.x][nextpos.y]==ouvert) lab[nextpos.x][nextpos.y]=parcouru; empiler(nextpos,pile,concat(path,dep[i])) ; affichage(lab) ; printf("\n") ; while (estvide(pile)) ; return 0 ;

Un programme qui affiche ses arguments triés L option -r indique que l ordre est décroissant. Le fichier abr.h : struct noeud int v ; struct noeud *fg, *fd ; ; typedef struct noeud Noeud ; typedef Noeud * Abr ; void init(abr *); void inserer(abr *, int); void imprimer_croissant(abr); void imprimer_decroissant(abr);

V33 (30-10-2009) Le fichier main.c : #include "abr.h" void init (Abr *a) *a = NULL ; void inserer (Abr *a, int v) if (! *a) *a = (Abr) malloc (sizeof (struct noeud)) ; (*a)->v = v ; (*a)->fg = (*a)->fd = NULL ; else if (v <= (*a)->v) inserer (& (*a)->fg, v) ; else inserer (& (*a)->fd, v) ;

V33 (30-10-2009) Suite du fichier abr.c void imprimer_croissant (Abr a) if (a) imprimer_croissant (a->fg) ; printf ("%d\n", a->v) ; imprimer_croissant (a->fd) ; void imprimer_decroissant (Abr a) if (a) imprimer_decroissant (a->fd) ; printf ("%d\n", a->v) ; imprimer_decroissant (a->fg) ;

33 (30-10-2009) int main (int argc, char *argv[]) char order = 0; Abr a; if (!(strcmp(argv[1], "-r"))) order=1; argc-=1; argv+=1; init(&a); while (--argc) inserer(&a, atoi(*++argv)); if (order) imprimer_decroissant(a); else imprimer_croissant(a); return 0 ;

V33 (30-10-2009) Arbre binaire : insertion itérative Insertion itérative dans l arbre #define allouer (struct noeud *) malloc(sizeof(struct noeud)) void inserer_iter(abr *a, int v) enum doite, gauche direction; ABR pere = NULL, current = *a; while (current) pere = current; if (v <= current->v) dir = gauche; current = current->fg; else dir = droite; current = currrent->fd; /* fin du while. Tonev dixit ;-) */ if (pere) if (dir == gauche) current = pere->fg = allouer ; else current = pere->fd = allouer ; else current = *a = allouer ; current->v = v; current->fg = current->fd = NULL;