Beruflich Dokumente
Kultur Dokumente
ANNEE: 2009/2010
Sommaire
1. Introduction .................................................................................................................... 1 2. Prsentation .................................................................................................................... 1
2.1. 2.2. 2.3. Format des fichiers source ..................................................................................... 1 Mise en forme du code source ............................................................................... 1 Longueur des lignes .............................................................................................. 2
Rfrences............................................................................................................................ 15
1. Introduction
Les normes de programmation sont un ensemble de rgles rgissant la rdaction du code des programmes. Contrairement ce que plusieurs lves pensent, ces rgles ne sont pas l pour embter les programmeurs mais, au contraire, pour faciliter leur travail en amliorant la lisibilit et la clart du code. Elles permettent, lorsquelles sont bien appliques, de se retrouver facilement dans le code crit par dautres et mme dans celui quon a crit soimme. Vous devez donc appliquer ces rgles en tout temps. Obligez-vous le faire et vous verrez que, trs rapidement, cela deviendra un rflexe. Le prsent document propose de manire synthtique des lignes directrices de mise en forme du code source du langage C++. Les normes portent plus spcialement sur les noms de fichier et leur organisation, les commentaires, les dclarations, les instructions, les expressions, lespace blanc, les conventions de nommage et les pratiques de programmation. Pourquoi des normes de programmation ? 80% des cots dun logiciel au cours de son cycle de vie vont sa maintenance. Il est trs rare quun logiciel soit maintenu durant toute son existence par son auteur original. Les normes de programmation amliorent la lisibilit du code, ce qui permet dautres informaticiens et programmeurs de le comprendre plus rapidement et plus fond. De telles normes favorisent en outre : o lcriture de programmes corrects, o lobtention dun style consistant dans le code, o la dtection des erreurs les plus courantes. Pour quune norme fonctionne, chaque personne qui crit du logiciel doit sy conformer. Tout le monde, enseignants comme lves.
2. Prsentation
2.1. Format des fichiers source
Les fichiers doivent avoir les extensions suivantes : Fichier source : .cpp Fichier den-tte : .h Le nom dun fichier doit tre significatif (indiquant le contenu), la premire lettre en majuscule. Le nom du fichier d'entte doit tre identique au nom du fichier source dont il dfinit. Exemple: Vecteurs.h, Vecteurs.cpp.
Chaque fichier doit commencer par un en-tte identifiant les objectifs du fichier, son auteur ainsi que la date de cration. Un fichier source peut contenir plusieurs sections logiques. Chaque section doit tre spare par une ligne vide et un commentaire identifiant chacune de ces sections. Suite cet en-tte, le fichier source doit contenir les directives dimportation "#include", puis, les dclarations de constantes, types et structures. Ne jamais spcifier de chemin daccs complet dans les directives "#include". Cest dans lenvironnement de compilation quon doit spcifier o aller chercher les fichiers dinclusion. (Ex: VC++ Touls>Options>Directories) #include NomLibrairie.h // Ok #include c:\dev\include\NomLibrairie.h // viter Utiliser la directive #include NomLibrairie.h pour des librairies dfinies par le dveloppeur. Par consquent, ces librairies doivent tre places dans le mme rpertoire. Utiliser la directive #include <NomLibrairie.h> pour des librairies standard fournies par le fabricant du compilateur.
3. Les commentaires
Inclure des commentaires bien penss qui expliquent le programme. Le programme principal doit avoir une prface importante comprenant une brve description du problme, des rfrences appropries des documents externes, le nom du programmeur ou de l'quipe de programmeurs, la date de la ralisation originale, et un journal des changements. Les sections de code difficiles, les formules complexes, les variables importantes doivent aussi tre expliques par des commentaires. Les programmes peuvent avoir deux styles de commentaires :
Exemple: void main() { // ceci est un commentaire char a; // ceci est aussi un commentaire }
= b;
4. Les dclarations
4.1. Les constantes
Les constantes sont dclares pour viter de mettre des nombres dans le code except 0 et 1. La mise jour de ces nombres sera plus rapide et plus sre. 3 PDF created with pdfFactory Pro trial version www.software-partners.co.uk
const double TAXE = 0.125; prix = prixBrut + prixBrut * TAXE; au lieu de: prix = prixBrut + prixBrut * 0.125; Les constantes doivent tre dclares aprs les inclusions de librairies. Le nom de la constante est crit entirement en majuscule et les mots internes doivent tre spars par un soulign "_". const int VALIDE = 1; enum Couleur {BLEU, BLANC, VERT}; const double NIVEAU_CRITIQUE = 4.0; Les constantes doivent toujours tre dfinies avec " utiliser "#define". const" ou " enum"; ne jamais
const double PI = 3.1416; enum Couleur {BLEU, BLANC, ROUGE}; au lieu de: #define #define #define #define PI (3.1416) BLEU (0) BLANC (1) VERT (2)
bool estVide = true; Ne pas initialiser plusieurs variables une mme valeur dans une seule instruction. fChar = gChar = c; // viter Les variables utilises comme compteurs de boucle doivent tre des lettres i, j, k, l, m, ... et elles doivent tre dfinies au moment de leur utilisation uniquement. Exemple : for (int i = 0; i < 10; i++) { for (int j = 0; j < 20; j++) { ... // Code excuter } } Dclarer une variable par ligne afin d'encourager les commentaires. int taille; // taille du tableau int compteur; // nombre d'occurrences au lieu de: int taille, compteur; Ne pas placer des types diffrents sur la mme ligne : int taille; double x; // viter
5. Espacement du code
5.1. Lignes vides
Les lignes vides amliorent la lisibilit en sparant des sections de code qui sont logiquement relies. Utiliser une ligne vide : Entre des sections dun fichier source ; Entre des dfinitions de structures; Entre les fonctions; Entre les variables locales dune fonction et sa premire instruction ; 5 PDF created with pdfFactory Pro trial version www.software-partners.co.uk
Avant un commentaire en bloc; Entre les sections logiques lintrieur dune fonction.
5.3. L'imbrication
L'imbrication sert augmenter la lisibilit du code en clarifiant le dbut et la fin de chaque bloc d'instructions. Les accolades du bloc doivent tre places au mme niveau. L'imbrication de dbut de bloc doit tre place la ligne suivant l'accolade, et avec un dcalage droite. Si vous utiliser un diteur tel que l'diteur de Visuel Studio , un retour ligne cre automatiquement un dcalage (tabulation) droite de 04 espaces. Si vous utiliser un diteur de texte simple tel que Notepad, utiliser 04 espaces pour chaque dcalage au lieu d'utiliser la tabulation. Exemple if (n > 0) { // les deux accolades au mme niveau // un dcalage droite de 4 espaces X = 20; for (int i = 0; i < n; i++)
6. Les fonctions
Une fonction doit excuter une tche prcise et son nom doit bien dcrire cette dernire. Si on a du mal choisir un nom dcrivant la fonction, cest peut-tre parce quon essaye de dfinir une fonction qui effectue plus dune tche. Le nom d'une fonction commence toujours par une lettre majuscule. Si le nom est compos, les autres mots commenceront aussi par une lettre majuscule. Les prototypes de fonctions dun fichier source doivent tre dclar dans le fichier dentte correspondant. Les fonctions ne retournant aucune valeur, doivent avoir le type "void" Un commentaire en bloc doit tre plac avant la dclaration de chaque fonction, identifiant les objectifs de la fonction et contenant une description de sa sortie. Les paramtres d'entrs et de sorties de la fonction doivent tre aligns un par ligne est dcrit par des commentaires. Les paramtres d'entres doivent tre prcds par le mot rserv " const" pour viter leurs modifications non intentionnes. Exemple:
//******************************************** // La fonction MaxTab sert calculer la valeur // max dun tableau dentier. // Sortie : la valeur du maximum //******************************************** int MaxTableau(int *Tab, // un pointeur sur le tableau int taille) // taille du tableau { ... // corps de la fonction }
7. Pratiques de programmation
7.1. Affectation
viter dutiliser loprateur dassignation un endroit o il peut tre confondu avec loprateur dgalit. Exemple : c = d; if (c != 0) au lieu de :
if ((c = d) != 0) // viter Eviter des instructions comportant plus dune incrmentation tels que : c++ = d++; a = c++ + d++;
7.2. Parenthses
Utiliser les parenthses dans des expressions impliquant des oprateurs mixtes pour viter les problmes de prcdence des oprateurs. if ((a == b) && (c == d)) // Ok au lieu de : if (a == b && c == d) // viter Utiliser les parenthses dans une expression comme la suivante : (x >= 0) ? a = x : a = -x;
if (abs(a - b) < TOLERANCE) De la mme faon, float f = 0.1 + 0.1 + 0.1; if (f == 0.3) peut retourner FALSE.
8. Programmation des TP
8.1. Structure gnrale dun projet
Un projet doit contenir un programme principal, un ensemble de modules contenant les fonctions et l'ensemble de fichiers entte correspondant ces modules. Exemple: Fichiers du TP1 |___ Fichiers Source | |___ Principal.cpp | |___ Vecteur.cpp | |___ Matrice.cpp |___ Fichiers entte |___ Vecteur.h |___ Matrice.h
//Dclarations des structures de donnes void main() { Exo1(); // Titre de l'exercice 1 //Exo2(); //Titre de l'exercice 2 //... } void Exo1(void) // Titre de l'exercice 1 { ... // Programme relatif l'exercice 1 } void Exo2(void) // Titre de l'exercice 2 { ... // Programme relatif l'exercice 2 } ...
{ ... 10 PDF created with pdfFactory Pro trial version www.software-partners.co.uk // Corps de la fonction 1
//******************************************** // Prsentation de la fonction 2 11 PDF created with pdfFactory Pro trial version www.software-partners.co.uk
...
b) Ecrire une fonction void RemplirVec1(const int a, const int b, const int k1, const int k2, double *Vec) qui permet de remplir la partie comprise entre les indices k1 et k2 d'un tableau Vec par des valeurs alatoires comprises entre a et b.
2. Solution du TP
Le fichier principal.cpp
//*********************************************************// // Exemple d'illustration d'un TP contenant deux exercices // // Date de cration: 28/09/2009 // // Auteurs : Cne Bouznade & Cne Bakhtouchi // //*********************************************************// #include <iostream.h> #include "Geometrie.h" #include "Vecteurs.h" void Exo1(void); void Exo2(void); void main () { //Exo1(); //-- Surface et primtre d'un rectangle --// Exo2(); //-- Affichage et lecture d'un tableau --// } //---------------------------------------------------------// void Exo1(void) //-- Surface et primtre d'un rectangle --// { //--- a) calcul de la surface d'un rectangle ----// double Longueur = 10; double Largeur = 12.5;
cout << "a) La surface du rectangle est: " << Surface(Longueur, Largeur) << endl; //--- b) calcul du primtre d'un rectangle ----// cout << "b) Le primtre du rectangle est: " << Perimetre(Longueur, Largeur) << endl; } //-----------------------------------------------------------// void Exo2(void) //-- Affichage et lecture d'un tableau --// { //-- a) Affichage des lment d'un tableau --// int k1 = 0; int k2 = 3; double Vec[4] = {18, 15, 33, 11}; cout << "a) Les lments du tableau sont: "; AfficheVec1(k1, k2, Vec); cout << endl; //-- b) Remplissage des lment d'un tableau --// int a = 0; int b = 5; RemplirVec1(a, b, k1, k2, Vec); cout << "Les lments du tableau sont: "; AfficheVec1(k1, k2, Vec); cout << endl; }
Le module geometrie.cpp
//**********************************************************// // Module contenant des fonctions de gomtrie. // // calcul de la surface et du primtre d'un rectangle, ... // // Date de cration: 28/09/2009 // // Date de la dernire mise jour: 29/09/2009 // // Auteurs : Cne Bouznad & Cne Bakhtouchi // //**********************************************************// //*********************************************// // Calcul de la surface d'un rectangle // // Sortie : la surface du rectangle // //*********************************************// double Surface(const double Longueur, // la longueur du rectangle const double Largeur) // la largeur du rectangle { return Longueur * Largeur; } //********************************************// // Calcul du primtre d'un rectangle // // Sortie : le primtre du rectangle // //********************************************// double Perimetre (const double Longueur, // la longueur du rectangle const double Largeur) // la largeur du rectangle { return (Longueur + Largeur) * 2; }
Le fichier geometrie.h
//********************************************************// // fichier entte du module Geometri.cpp contenant des //
// fonctions de gomtrie. calcul de la surface et // // du primtre d'un rectangle, ... // // Date de cration: 28/09/2009 // // Date de la dernire mise jour: 29/09/2009 // // Auteurs : Cne Bouznad & Cne Bakhtouchi // //********************************************************// //**************************************// // Calcul de la surface d'un rectangle // // Sortie : la surface du rectangle // //**************************************// double Surface(const double Longueur, // la longueur du rectangle const double Largeur); // la largeur du rectangle //**************************************// // Calcule du primtre d'un rectangle // // Sortie : le primtre du rectangle // //**************************************// double Perimetre (const double Longueur, // la longueur du rectangle const double Largeur); // la largeur du rectangle
Le module Vecteur.cpp
//***********************************************************// // Module contenant des fonctions de traitement des tableaux.// // affichage et lecture d'un tableau, ... // // Date de cration: 28/09/2009 // // Date de la dernire mise jour: 29/09/2009 // // Auteurs : Cne Bouznad & Cne Bakhtouchi // //***********************************************************// #include <iostream.h> #include <stdlib.h> #include <math.h> //*********************************************// // Affichage de la partie d'un tableu comprise // // entre deux indices k1 et k2 // // Sortie : aucune // //*********************************************// void AfficheVec1( const int k1, // indice de dbut de l'affichage const int k2, // indice de fin de l'affichage const double *Vec) // le tableau afficher { if (k2 < k1) { cout << "--AfficheVec1: paramtres non valide !--" << endl; exit (0); } for (int i = k1; i <= k2; i++) { cout << " " << Vec[i]; } } //**************************************************// // Remplissage de la partie d'un tableu comprise // // entre deux indices k1 et k2 par des valeurs // // alatoires comprises entre a et b // // Sortie : le vecteur Vec remplit // //**************************************************//
void RemplirVec1( const double a, // borne infrieur de l'intervalle const double b, // borne suprieur de l'intervalle const int k1, // indice de dbut du remplissage const int k2, // indice de fin du remplissage double *Vec) // le tableau remplir { if (k2 < k1) { cout << "--RemplirVec1: paramtres non valide !--" << endl; exit (0); } for (int i = k1; i <= k2; i++) { Vec[i] = a + (b - a) * rand()/RAND_MAX; } }
Le fichier Vecteur.h
//********************************************************// // fichier entte du module Vecteurs.cpp contenant des // // fonctions de traitement des tableaux. Affichage et // // lecture d'un tableau, ... // // Date de cration: 28/09/2009 // // Date de la dernire mise jour: 29/09/2009 // // Auteurs : Cne Bouznad & Cne Bakhtouchi // //********************************************************// //*********************************************// // Affichage de la partie d'un tableu comprise // // entre deux indices k1 et k2 // // Sortie : aucune // //*********************************************// void AfficheVec1( const int k1, // indice de dbut de l'affichage const int k2, // indice de fin de l'affichage const double *Vec); // le tableau afficher //**************************************************// // Remplissage de la partie d'un tableu comprise // // entre deux indices k1 et k2 par des valeurs // // alatoires comprises entre a et b // // Sortie : le vecteur Vec remplit // //**************************************************// void RemplirVec1( const double a, // borne infrieur de l'intervalle const double b, // borne suprieur de l'intervalle const int k1, // indice de dbut du remplissage const int k2, // indice de fin du remplissage double *Vec); // le tableau remplir
Rfrences
[1] Apache. The Jakarta Site Coding Standards, http://jakarta.apache.org/turbine/common/code-standards.html [2] Fabrizio Gotti "Normes de programmation en C#" College de Bois-de-Boulogne, 2009 [3] Franois Lemieux "Norme de programmation pour pages HTML" Atelier de gnie logiciel, Ecole Polytechnique de Montral, 2005 [4] GNU. Gnu Coding Standards, http://www.gnu.org/prep/standards_toc.html 15 PDF created with pdfFactory Pro trial version www.software-partners.co.uk
[5] Marc Frappier "Norme de documentation des programmes" Dpartement dinformatique, Facult des sciences, Universit de Sherbrooke, 2004 [6] Marc Truitt "Visual Basic.Net Programming Guidelines" Information Technology Services, Johnson County, Kansas, 2004 [7] Ph. Gabrini "Normes de programmation", Dpartement d'informatique, UQAM , 2005 [8] Professeurs et chargs de cours / Dpartement Dinformatique et de gnie logiciel "Normes de programmation" Facult des sciences et de gnie / Universit LAVAL, 2004 [9] Sun Microsystems "Java Code Conventions", 1997 [10] Sun Microsystems. Code Conventions for the JavaTM Programming Language, http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html [11] Yves Roy "Normes de programmation en C++-2002" Document conu dans le cadre du cours IFT-19946 Programmation oriente objet, 2002