Projet de Programmation Benoit Donnet Année Académique 2015-2016



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

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

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

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

Introduction à l héritage en C++

Introduction au langage C

Programmation système I Les entrées/sorties

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Programmation par les Objets en Java

Les structures. Chapitre 3

Le prototype de la fonction main()

Cours 1: Java et les objets

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Les structures de données. Rajae El Ouazzani

Java c est quoi? Java pourquoi?

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

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

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Cours Langage C/C++ Programmation modulaire

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Systeme d'exploitation

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

Algorithmique et Programmation, IMA

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

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

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)

Conventions d écriture et outils de mise au point

Cours Programmation Système

Chapitre 1 : La gestion dynamique de la mémoire

Programmer en JAVA. par Tama


I. Introduction aux fonctions : les fonctions standards

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

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Arguments d un programme

as Architecture des Systèmes d Information

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

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

Programmation en langage C

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

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

Le langage C. Séance n 4

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

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

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

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

SUPPORT DE COURS. Langage C

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

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

Département Automatisation et Informatisation Année Programmation en C++ Institut des Sciences et Techniques de l Ingénieur d Angers

Introduction à C++ et à wxwidgets

I00 Éléments d architecture

Programmation en Java IUT GEII (MC-II1) 1

Plan Pédagogique du cours

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

Programmation impérative

Java Licence Professionnelle CISII,

Package Java.util Classe générique

Chap III : Les tableaux

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Cours 14 Les fichiers

Chapitre 10. Les interfaces Comparable et Comparator 1

OS Réseaux et Programmation Système - C5

IRL : Simulation distribuée pour les systèmes embarqués

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

ARBRES BINAIRES DE RECHERCHE

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

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

Auto-évaluation Programmation en Java

Quelques éléments de compilation en C et makefiles

UE Programmation Impérative Licence 2ème Année

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

ALGORITHMIQUE ET PROGRAMMATION En C

Objets et Programmation. origine des langages orientés-objet

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

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

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Algorithmique, Structures de données et langage C

Cours d Algorithmique et de Langage C v 3.0

GOL502 Industries de services

Langage Éric Guérin 5 octobre 2010

INF 104 (SELC) Introduction au langage C

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

Généralités sur le Langage Java et éléments syntaxiques.

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

Une introduction à Java

INITIATION AU LANGAGE JAVA

Application web de gestion de comptes en banques

INITIATION A LA PROGRAMMATION

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

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

et Programmation Objet

Chapitre 2. Classes et objets

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

Rappels Entrées -Sorties

TP1 : Initiation à Java et Eclipse

Transcription:

Projet de Programmation Benoit Donnet Année Académique 2015-2016 1 Agenda Partie 1: Techniques Avancées de C Chapitre 1: Définition de Type Chapitre 2: Généricité Chapitre 3: Arguments d'un Programme 2

Agenda Chapitre 1: Définition de Type - Modélisation des Données - Include Guards - Type Opaque 3 Agenda Chapitre 1: Définition de Type - Modélisation des Données Enumération Intérêt des Enregistrements Bonnes/Mauvaises Pratiques - Include Guards - Type Opaque 4

Enumération Rappel - une énumération permet de définir des noms symboliques correspondant à des valeurs entières - cfr. INFO0946, Chap. 5 Il faut utiliser des énumérations dès que possible - simplicité d'un entier - plus expressif qu'une chaîne de caractères 5 Enumération (2) Exemple typedef enum{poule, lapin, cheval, chevre} TypeAnimal; typedef enum{mais, carotte, foin, herbe} TypeNourriture; int main(){ TypeAnimal monanimal = lapin; TypeNourriture nourriture; nourriture = foin; return 1; }//fin programme 6

Enumération (3) TypeNourriture trouve_nourriture(typeanimal animal){ switch(animal){ case poule: return mais; case lapin: return carotte; case cheval: return foin; case chevre: return herbe; default: printf("erreur nourriture!\n"); abort(); }//fin switch() }//fin trouve_nourriture() int main(){ TypeAnimal monanimal = lapin; TypeNourriture nourriture = trouve_nourriture(monanimal); printf("nourriture à acheter: %d\n", nourriture); return 1; }//fin programme 7 Enumération (4) char *animal_vers_chaine(typeanimal animal){ switch(animal){ case poule: return "poule"; case lapin: return "lapin"; case cheval: return "cheval"; case chevre: return "chevre"; default: return "inconnu"; }//fin switch() }//fin animal_to_string() int main(){ printf("je suis un: %s\n", animal_vers_chaine(cheval)); return 1; }//fin programme 8

Intérêt Enregistrements Pourquoi définir des enregistrements? - cacher la complexité cfr. Type Opaque - s'éloigner du code de bas niveau cacher les détails d'implémentation - modéliser une abstraction - modéliser un objet On peut très facilement écrire des modules manipulant des enregistrements 9 Intérêt Enregistrements (2) Un enregistrement sera toujours plus lisible #include <stdio.h> #include <math.h> float x, y; }Vecteur; float norme(vecteur *v){ return sqrt(v->x*v->x +v->y*v->y); }//fin norme() int main(){ Vecteur v={1,2}; printf("%f\n", norme(&v)); #include <stdio.h> #include <math.h> int main(){ float v[2] = {1,2}; float n = sqrt(v[0]*v[0] +v[1]*v[1]); printf("%f\n", n); return 1; }//fin programme return 1; }//fin programme 10

Intérêt Enregistrements (3) L'intérêt d'un enregistrement est de cacher l'implémentation Il faut mettre en avant l'objet (abstrait) manipulé plutôt que les éléments qui le composent 11 Bonnes/Mauvaise Pratiques Un bon enregistrement - encapsule des données - modélise un objet/une abstraction - contient des paramètres homogènes Un mauvais enregistrement - n'apporte pas d'information - contient des informations sans cohérence, ne modélise rien - ne sert que de conteneur de variables au niveau C - contient des noms peu significatifs cfr. Coding Style 12

Bonnes/Mauvaise Pratiques (2) Bien - bonne dénomination - haut niveau typedef enum{diesel, essence, lpg} TypeCarburant; int kilometrage; int immatriculation; TypeCarburant carburant; }Voiture; int main(){ Voiture v1; v1.carburant = diesel; return 1; }//fin programme 13 Bonnes/Mauvaise Pratiques (3) Pas bien - trop proche du code - niveau d'abstraction non homogène mélange int/voiture int unbr; //immatriculation int ukm; //kilometrage int uc; //carburant (0:diesel, 1:essence, 2:lgp) }Triplet; int main(){ Triplet v2; v.uc = 2; return 1; }//fin programme 14

Bonnes/Mauvaise Pratiques (4) Bien - homogène - modulaire #define N 50 int hauteur; char couleur[n]; int largeur; }TroncArbre; int nombre; char couleur[n]; }FeuilleArbre; TroncArbre tronc; FeuilleArbre feuille; RacineArbre racine; }Arbre; int profondeur; }RacineArbre; 15 Bonnes/Mauvaise Pratiques (5) Pas bien - absence d'homogénéité - non modulaire #define N 50 int hauteurtronc; char couleurtronc[n]; int largeurtronc; int nombrefeuille; char couleurfeuille[n]; int profondeurracine; }Arbre; 16

Bonnes/Mauvaise Pratiques (6) Pas bien - trop de modularité tue la modularité #define N 50 int n;}nombre; Nombre h;}hauteur; Nombre l;}largeur char valeur[n];}nom; Nom c;}couleur; Hauteur h; Largeur l; Couleur c; }TroncArbre; 17 Bonnes/Mauvaise Pratiques (7) Pas bien - niveau d'abstraction "inhomogène" - mélange de caractéristiques de haut niveau et de niveau système typedef enum{ epicea, chataignier, chene, eucalyptus }TypeArbre; int largeur; int hauteur; TypeArbre type; FILE *fid_disque; }Arbre; caractéristiques de haut niveau caractéristique niveau système 18

Bonnes/Mauvaise Pratiques (8) Pas bien - trop de champs - illisible - difficile à retenir int largeur, hauteur; TypeArbre type; int nombreembranchement, circonference; int poids, profondeursoussol; int nombrefleurs, fluxseve; int moisfleurissement, nombrejourfleurissement; int temperateurmaximale, quantiteeau; int valeurmarche, resistancevent; }Arbre; 19 Agenda Chapitre 1: Définition de Type - Modélisation des Données - Include Guards Problème Principe Fonctionnement Bonne Pratique - Type Opaque 20

Problème Soit une application permettant de gérer la location de voiture Le programme est composé de - voiture.{h/c} gestion de la structure de données Voiture - trajet.{h/c} gestion d'un trajet pour une Voiture - main-location.c programme principal 21 Fichier voiture.h int essence; int kilometrage; }Voiture; Problème (2) Voiture *cree_voiture(int essence, int kilometrage); Fichier trajet.h #include "voiture.h" Voiture *trajet_bruxelles_liege(voiture *v); Voiture *trajet_mons_anvers(voiture *v); 22

Fichier voiture.c Problème (3) #include <stdlib.h> #include "voiture.h" Voiture *cree_voiture(int essence, int kilometrage){ Voiture *v = malloc(sizeof(voiture)); if(v==null) return NULL; v->essence = essence; v->kilometrage = kilometrage; return v; }//fin cree_voiture() 23 Fichier trajet.c #include "trajet.h" #include "voiture.h" Problème (4) Voiture *trajet_bruxelles_liege(voiture *v){ v->essence -= 4; v->kilometrage += 97; return v; }//fin trajet_bruxelles_liege() Voiture *trajet_mons_anvers(voiture *v){ v->essence -= 5; v->kilometrage += 119; return v; }//fin trajet_mons_anvers() 24

Problème (5) Fichier main-location.c #include "trajet.h" #include "voiture.h" int main(){ Voiture *v = cree_voiture(45, 0); v = trajet_bruxelles_liege(v); return 1; }//fin programme 25 Compilation Problème (6) $>gcc -o main-location voiture.c trajet.c main-location.c In file included from trajet.c:5:./voiture.h:4:2: error: typedef redefinition with different types ('struct Voiture' vs 'struct Voiture') }Voiture; ^./voiture.h:4:2: note: previous definition is here }Voiture; ^ 1 error generated. In file included from main-location.c:2:./voiture.h:4:2: error: typedef redefinition with different types ('struct Voiture' vs 'struct Voiture') }Voiture; ^./voiture.h:4:2: note: previous definition is here }Voiture; ^ 1 error generated. 26

Problème (7) Problème d'inclusion multiple - gcc -E main-location.c > toto... # 1 "main-location.c" 2 # 1 "./trajet.h" 1 # 1 "./voiture.h" 1 int essence; int kilometrage; }Voiture; Voiture *cree_voiture(int essence, int kilometrage); # 2 "./trajet.h" 2 Voiture *trajet_bruxelles_liege(voiture *v); Voiture *trajet_mons_anvers(voiture *v); # 2 "main-location.c" 2 # 1 "./voiture.h" 1 int essence; int kilometrage; }Voiture; Voiture *cree_voiture(int essence, int kilometrage); # 3 "main-location.c" 2... inclusion de voiture.h inclusion de trajet.h 27 Problème (8) En fait, la situation est la suivante trajet.c voiture.h trajet.h voiture.c main-location.c implémente utilise 28

Problème (9) Solution 1 - n'inclure trajet.h que dans main-location.c - ingérable pour un grand projet Solution 2 - faire en sorte que le compilateur n'inclue pas deux fois voiture.h - include guards garde fou 29 Principe Include guard - garde fou Construction utilisée afin d'éviter le problème de l'inclusion multiple pouvant provenir des directives de pré-processing (#include) L'ajout de include guards à un header permet de le rendre idempotent 30

Principe (2) Les include guards se basent sur 2 mécanismes du pré-processeur - compilation conditionnelle #ifndef #endif - macro #define 31 Fonctionnement Fichier voiture.h #ifndef VOITURE #define VOITURE int essence; int kilometrage; }Voiture; Voiture *cree_voiture(int essence, int kilometrage); #endif On ne change rien à trajet.h ni à mainlocation.c 32

Fonctionnement (2) Application de l'include guard - gcc -E main-location.c > toto... # 1 "main-location.c" 2 # 1 "./trajet.h" 1 # 1 "./voiture.h" 1 int essence; int kilometrage; }Voiture; Voiture *cree_voiture(int essence, int kilometrage); # 2 "./trajet.h" 2 Voiture *trajet_bruxelles_liege(voiture *v); Voiture *trajet_mons_anvers(voiture *v); # 2 "main-location.c" 2 int main(){ Voiture *v = cree_voiture(45, 0); v = trajet_bruxelles_liege(v); }... return 1; 33 Bonne Pratique Pour tout fichier d'en-tête de nom nom.h - placer un include guard de la forme #ifndef NOM #define NOM //contenu du header #endif But? - éviter les inclusions multiples - éviter les collisions dues aux inclusions multiples 34

Agenda Chapitre 1: Définition de Type - Modélisation des Données - Include Guards - Type Opaque Principe Implémentation Exemple 35 Principe Type Opaque? - structure de données incomplètement définie dans une interface - manipulation de la donnée à travers des fonctions/procédures accesseurs Objectifs? - cacher à l'utilisateur la représentation du type - éviter que l'utilisateur ne modifie, à sa guise, la structure de données Typiquement, on définit un pointeur sur le type opaque et le manipule grâce aux fonctions/procédures - pointeur opaque Exemple - FILE 36

Implémentation Comment implémenter un type opaque? Dans le header - définir incomplètement la structure forward declaration utilisation du typedef - manipuler le type via des pointeurs obligatoire car le compilateur doit connaître la quantité de mémoire nécessaire associée au type la taille d'un pointeur est standard - définir constructeur, destructeur et accesseurs Dans le module - terminer la définition de la structure 37 Exemple Exemple - structure de données manipulant un point du plan Fichier point.h #ifndef POINT #define POINT typedef struct Point_t Point; déclaration incomplète //définition du constructeur/destructeur/accesseurs #endif 38

Exemple (2) Fichier point.h (cont.) //définition du constructeur/destructeur/accesseurs Point *create_point(float x, float y); constructeur void destroy_point(point *p); float get_x(point *p); float get_y(point *p); void *set_x(point *p, float x); void *set_y(point *p, float y); destructeur accesseurs en lecture accesseurs en écriture //chaîne de caractères représentant un point char *to_string(point *p); 39 Exemple (3) Fichier point.c #include <stdlib.h> #include <assert.h> #include <stdio.h> #include "point.h" struct Point_t{ float x; float y; }; Définition de la structure 40

Exemple (4) Fichier point.c (cont.) Point *create_point(float x, float y){ Point *p = malloc(sizeof(point)); if(p==null) return NULL; p->x = x; p->y = y; return p; }//end cree_point() void detruit_point(point *p){ assert(p!=null); free(p); }//end detruit_point() 41 Exemple (5) Fichier point.c (cont.) float get_x(point *p){ assert(p!=null); return p->x; }//end get_x() float get_y(point *p){ assert(p!=null); return p->y; }//end get_y() 42

Exemple (6) Fichier point.c (cont.) void set_x(point *p, float x){ assert(p!=null); p->x = x; }//end set_x() void set_y(point *p, float y){ assert(p!=null); p->y = y; }//end set_y() 43 Exemple (7) Fichier point.c (cont.) char *to_string(point *p){ assert(p!=null); char *s = malloc(sizeof(char)*32); if(s==null) return NULL; sprintf(s, "(%f, %f)", p->x, p->y); return s; }//end to_string() 44

Exemple (8) Fichier test_point.c #include <stdio.h> #include "point.h" int main(){ Point *p = cree_point(3, 4); printf("%s\n", to_string(p)); printf("%f\n", p->x); return 1; }//end program pas accepté à la compilation (car définition incomplète du type dans point.h) 45 Exemple (9) Fichier test_point.c (cont.) #include <stdio.h> #include "point.h" int main(){ Point *p = create_point(3, 4); printf("%s\n", to_string(p)); printf("%f\n", get_x(p)); set_y(p, -5); printf("%s\n", to_string(p)); destroy_point(p); p = NULL; return 1; }//end program 46