M. BENJELLOUN : 2005 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons 2005 Programmation en
M. BENJELLOUN : 2005 Le langage C++ !! Qu'est-ce que c’est ? D'où vient-il ? Que peut-on faire avec et à quoi ça sert ? De quoi ai-je besoin pour programmer en C++ ?
M. BENJELLOUN : 2005 Qu'est-ce que c’est ? C'est un langage structuré, un langage de programmation dont la structure est proche de la machine et génère un code compact et rapide. D'où vient-il ? Concepteur est Bjarne Stroustrup (1982), Inspiré deux autres langages de programmation : Le C et Le Simula 67.
M. BENJELLOUN : 2005 Que peut-on faire avec et à quoi ça sert ? À créer ses propres programmes et logiciels, selon ses besoins, de manière portable (indépendamment de la machine et du système d'exploitation). On peut tout faire ou presque!! On peut créer son propre système d'exploitation, son interface graphique, sa base de données, son driver (pilote) pour la dernière machine à café USB, etc. Mais à quel prix ?
M. BENJELLOUN : 2005 De quoi ai-je besoin pour programmer en C++ ? D'un éditeur de texte basique, d'un compilateur, d'un bon bouquin, d'un débogueur et de beaucoup de patience, de la pratique. En principe, compilateur, bibliothèque(s), (débogueurs) et ‘doc’ sont fournis ensembles.
M. BENJELLOUN : 2005 Caractéristiques du C ++ Langage structuré : conçu pour traiter les tâches d'un programme en les mettant dans des blocs. Programmes efficaces : proche de la machine et génère un code compact et rapide… Modulaire : découper en modules pour compiler séparément. Transportable : portabilité en respectant la norme !!!. Objets : une meilleure qualité de programmation.
M. BENJELLOUN : 2005 Qu'est-ce qu'un bon programme? INSTANTANE ! Lisible Structuré Portabilité Efficacité Rapidité? Il doit résoudre le PROBLEME ! DUREE DE VIE ?
M. BENJELLOUN : 2005 Objectifs Être capable de construire des bons programmes Des programmes : corrects, efficaces, robustes, relativement faciles à comprendre, à modifier et à maintenir. Qualités attendues d'un programme Clarté, Simplicité, Efficacité, Modularité, Extensibilité. Programmer de manière modulaire
M. BENJELLOUN : 2005 Les autres types seront dérivés de ceux-ci. Types de base en C++ TypeReprésentationSignificationIntervalleTaille en octets Exemple caractères signed char ou char unsigned char Un caractère unique-128 à à 'a' 'A' 'Z' '\n' '\t' entiers signed int ou int unsigned int short ou long entier signé (par défaut) entier positif spécifie la taille de l'emplacement mémoire utilisé -231 à 231 –1 0 à à 2 15 –1 2 ou réels float double long double Réel simple précision Réel double précision Réel précision étendue +-10 E-37 à +-10 E E-307 à +-10 E E– sizeof(i) ; retourne la taille en octet de la variable i booléen : bool qui s'accompagne des mots-clés true et false.
M. BENJELLOUN : 2005 void main(void) { /* corps du programme*/ déclaration des Cstes et Var ; instruction1 ; instruction2 ; …. } Tout programme doit avoir un point d’entrée nommé main() main() est la fonction appelée lors de l’exécution du programme. { et } délimitent le corps de la fonction, bloc, la succession d'actions à réaliser. Chaque expression (instruction) doit finir par ; Commentaire : texte encadré par les symboles ‘/*’ et ‘*/’ ou une ligne commençant par le symbole ‘//’ Pour commencer void main(void): La fonction main ne prend aucun paramètre et ne retourne pas de valeur. int main(void): La fonction main retourne une valeur entière à l'aide de l'instruction return (0 si pas d’erreur). main(void) main()
M. BENJELLOUN : 2005 Y=X 2 et Z=X 3 ?? corps du programme int Y, Z, X; // déclaration des Variables X = 2 ; // instruction1 void main(void) // ou void main() { Y = X * X ; Z = Y * X ; // ou Z=X*X*X …. } Variables : déclarations, Syntaxe : Type identificateur1, id2,…. ; char c1, c2, c3; int i, j, var_ent; Exemple: initialisations int i=9; ou int i; i=9; char c1= ' A'; ou char c1; c1= 'A';
M. BENJELLOUN : 2005 Identificateurs Les identificateurs nomment les objets C++ (fonctions, variables...). Le C++ distingue les minuscules des majuscules. Exemple: abc, Abc, ABC sont des identificateurs valides et tous différents. Identificateurs valides : xx y1 somme_5 _position Noms Programme_1 Identificateurs invalides : 3eme commence par un chiffre x#y caractère non autorisé (#) no-commande caractère non autorisé (-) taux change caractère non autorisé (espace)
M. BENJELLOUN : 2005 Un identificateur ne peut pas être un mot réservé du langage : asmautoboolbreakcase catchcharclassconstcontinue defaultdeletedodoubleelse enumexternfloatforfriend gotoifinlineintlong mutablenamespacenewoperatorprivate protectedpublicregisterreturnshort signedsizeofstaticstructswitch templatethistypedefunionunsigned usingvirtualvoidvolatilewhile Les mots réservés du langage C++ doivent être écrits en minuscules.
M. BENJELLOUN : 2005 Y=X 2 et Z=X 3 ?? corps du programme int Y, Z, X; // déclaration des Variables void main(void) // ou void main() { Y = X * X ; Z = Y * X ; // ou Z=X*X*X …. } X = 2 ; // instruction1 Affichage !! cout
M. BENJELLOUN : 2005 Y=X 2 et Z=X 3 ?? void main(void) // ou void main() { int Y, Z, X; // déclaration des Variables X = 2 ; // instruction1 Y = X * X ; // instruction2 Z = Y * X ; // instruction3 } cout Y cout Z #include Directives du préprocesseur accès avant la compilation Directives du préprocesseur accès avant la compilation
M. BENJELLOUN : 2005 Directives du préprocesseur Une directive préprocesseur est une directive de compilation (précédées par un #) Le préprocesseur effectue un prétraitement du programme source avant qu'il soit compilé et exécute les directives. Inclusion de fichiers #include /* répertoire standard */ #include "nom_du_fichier" /* répertoire courant */ Exemples d’inclusion de librairies standards: Gestion des Entrées-Sorties standard Fonctions mathématiques Traitement de chaînes de caractères.h n’est pas toujours nécessaire
M. BENJELLOUN : 2005 Les entrées /sorties : cin et cout cout, le flux standard de sortie, habituellement associé à l'écran, Syntaxe : cout << expression << expression << expression … ; cin, le flux standard d’entrée, habituellement associé au clavier, Syntaxe : cin >> valeur >> valeur >> valeur … ; cin et cout sont définies dans la librairie. #include void main(void) { cout <<" Salut a vous tous" << endl; cout << " oui tous " ; } endl signifie un saut de ligne
M. BENJELLOUN : 2005 cout <<"Qu'il est agreable d'utiliser " <<"cout en\t C++,\nlorsqu'on l'utilise " <<endl <<"\t\tproprement\n"; Résultat : Qu'il est agreable d'utiliser cout en C++, lorsqu'on l'utilise proprement CaractèresSignification CODE ASCII (hexadécimal) \n ou endl Génère une nouvelle ligne (newline) 0x0A \t Tabulation horizontale 0x09 \v Tabulation verticale 0x0B \b Retour d’un caractère en arrière (backspace) 0x08 \r Retour chariot (return) 0x0D \f Saut de page (form feed) 0x0C.. \t
M. BENJELLOUN : 2005 Y=X 2 et Z=X 3 ?? void main(void) // ou void main() { int Y, Z, X; // déclaration des Variables X = 2 ; // instruction1 Y = X * X ; // instruction2 Z = Y * X ; // instruction3 } cout << " valeur de Y = " << Y << endl; cout << " valeur de Z = " << Z; #include valeur de Y= 4 valeur de Z = 8 cout << " valeur de Y = " << Y << endl << " valeur de Z = " << Z; cout << " valeur de Y = " << Y << " \nvaleur de Z = " << Z;
M. BENJELLOUN : 2005 void main(void) { int Y, Z, X; // déclaration des Variables X = 2 ; Y = X * X ; Z = Y * X ; } cout << " valeur de Y = " << Y << endl; cout << " valeur de Z = " << Z; #include valeur de Y= 4 valeur de Z = 8 X !! cout << " ??valeur de X = "; cin >> X; -3 valeur de Y= 9 valeur de Z = -27
M. BENJELLOUN : 2005 #include void main () { int n=2; float x= 3.4; char C= 'A' ; cout << " Entier n = "<< n << " ; Entrez un nouveau = " ; cin >> n ; cout << " Float x = "<< x << " ; Entrez un nouveau = " ; cin >> x ; cout << " Char C = "<< C << " ; Entrez un nouveau = " ; cin >> C ; cout << "\n L'entier vaut maintenant : " << n << endl; cout << " Le flottant vaut maintenant :" << x << endl; cout << " Le caractere vaut maintenant :" << C << endl ; } Entier n = 2 ; Entrez un nouveau = 3 Float x = 3.4 ; Entrez un nouveau = 5.67 Char C = A ; Entrez un nouveau = y L'entier vaut maintenant : 3 Le flottant vaut maintenant :5.67 Le caractere vaut maintenant :y int n=2; float x= 3.4; char C= 'A' ; cout << "Entrez n, x et C : "; cin >> n >> x >> C; cout << C << ' ' << x << ' ' << n Entrez n, x et C : V V 9.9 5
M. BENJELLOUN : 2005 Si X est une constante !! void main(void) { int Y, Z, X; // déclaration des Variables Y = X * X ; Z = Y * X ; } cout << " valeur de Y = " << Y << endl; cout << " valeur de Z = " << Z; #include const int X = 4 ; valeur de Y= 16 valeur de Z = 64 Constantes : déclarations+initialisations Syntaxe : const Type identificateur1=Val1, identificateur2=Val2, …,…. ; const char c = 'A'; const int i=5, var_ent=8; Exemple: const int i, i= 5;
M. BENJELLOUN : 2005 Les variables doivent être déclarées avant leur utilisation dans un début de bloc (juste après{), zone des déclarations: void main(void) { const int Nmax=10; char c; int i, k; c = 'A'; i = 50; K=10; … Cette règle s'applique à tous : char, int, float... est équivalent à void main(void) { const int Nmax=10; char c = 'A'; int i=50, k; k=10; … = opérateur d’affectation Les constantes caractères s’écrivent entre quottes simples : 'A' 'A' 's' 's' '2' '2' '[''[' L’initialisation des constantes est obligatoire lors de leur déclaration.
M. BENJELLOUN : 2005 Les opérateurs arithmétiques Le C++ propose les opérateurs suivants : + addition - soustraction * multiplication / division % modulo (reste de la division entière ) % ne peut être utilisé qu'avec des entiers 7.0/2 7/ /2.0 /2
M. BENJELLOUN : 2005 Le compilateur considère le type des opérandes pour savoir comment effectuer les opérations void main() { int i = 5, j = 4, k; float f = 5.0, g = 4.0, h; k = i / j; // k= 5/4 = 1 h = f / g; // h = 5.0/4.0 = 1.25 h = i / j; // h = 5/4 = } Utiliser des opérateurs arithmétiques
M. BENJELLOUN : 2005 Modulo : C=A%B; C prend le reste de la division entière de A par B, à utiliser uniquement pour les entiers. 4%2 = 0; 5%2 = 1; 8%3= 2; C=A%2 Si C=0 alors A est pair sinon (=1) A est impair Pair et Impair :
M. BENJELLOUN : 2005 <plus petit <=plus petit ou égal >plus grand >=plus grand ou égal ==égal !=différent Les opérateurs logiques &&et ||ou (non exclusif) !non Le résultat d'une expression logique est un booléen. Il vaut true si elle est vraie et false sinon. Toute valeur non nulle est considérée comme vraie et la valeur nulle comme fausse. ! ! Les opérateurs de comparaison !
M. BENJELLOUN : 2005 Contractions d'opérateurs Soient les opérateurs +=-= *=/= %= &=|= ^= >= Pour chacun d’entre eux expres1 op= expres2 est équivalent à: (expres1) = (expres1) op (expres2) a += 32; a = a + 32; f /= 9.2; f = f / 9.2; i *= j + 5; i = i * (j + 5);
M. BENJELLOUN : 2005 Incrément et décrément int i = 5, j = 4; i++; // i vaudra 6 --j; // j vaudra 3 ++i; // i vaudra 7 Deux opérateurs spéciaux existent pour incrémenter (ajouter 1) et décrémenter (retirer 1) des variables entières ++ incrément : i++ ou ++i est équivalent à i += 1 ou i = i décrément Ces opérateurs peuvent être préfixés (avant la variable) ou postfixés (après)
M. BENJELLOUN : 2005 Conversions de types (casting) Exemple 5 Pg 12 float F=65.49, FI; int I=98, IF; char C, CF, CI; IF = (int) F; // IF = 65 CF = (char) F; // CF= A FI = (float) I; // FI= CI = (char) I; // CI= b int I=3, J=4; float K; K = I/J; K = (float)I/J; /2 7/ /2.0 /2
M. BENJELLOUN : 2005 Les structures de contrôle Alternative: if-else Itérations: for, while, do-while Rupture de Contrôle: break, continue, return … Choix Multiple: switch-case Bloc 1 d’instructions Bloc 2 d’instructions ouinon Suite du programme ouinon Suite du programme Bloc d’instructions Condition vraie oui non Bloc d’instructions programme Condition vraie Suite du programme programme Condition vraie if-elsewhile do-while
M. BENJELLOUN : 2005 Condition vraie Bloc 1 d’instructions Bloc 2 d’instructions oui non Suite du programme void main() { /* corps du programme*/ déclaration des Cstes et Var ; instruction1 ; instruction2 ; …. } int a, b; a = 1; if ( Condition vraie ) { BLOC 1 D'INSTRUCTIONS } else { BLOC 2 D'INSTRUCTIONS } Les structures de contrôle Les décisions - if else
M. BENJELLOUN : 2005 Les décisions - if else if ( Condition vraie ) { BLOC 1 D'INSTRUCTIONS } else { BLOC 2 D'INSTRUCTIONS } if ( a<b ) min=a; else min=b; Bloc 1 d’instructions Bloc 2 d’instructions ouinon Suite du programme programme Condition vraie Bloc 1 d’instructions ouinon Suite du programme Condition vraie if ( Condition vraie ) instruction 1; else instruction 2; if ( Condition vraie ) { instruction 1; instruction 2; instruction 3; … instruction N; } if ( Condition vraie ) instruction 1; if ( temperature > 70.0) cout << " Alarme "<<endl;
M. BENJELLOUN : 2005 if ( ) else if ( ) else if ( ) else if ( ) else if ( ) else if ( ) else if ( ) else if ( ) else if emboîtés else est associé avec le if le plus proche if(i >= 0) if(i > 1000) cout 1000 "; else cout<<" i < 0 \n"; if(i >= 0) { if(i > 1000) cout 1000 "; } else cout<<" i < 0 \n";
M. BENJELLOUN : 2005 int i = 1; if(i < 0) cout <<" i < 0 \n"; cout 0 \n"; cout <<" alors!! \n"; … Il faut un i > 0 alors!! int i = 1; if(i < 0){ cout <<" i < 0 \n"; cout 0" << endl; } cout <<" alors!! \n"; alors!! Condition vraie Bloc 1 d’instructions oui non
M. BENJELLOUN : 2005 int i = -1; if(i < 0){ cout <<" i < 0 \n"; cout 0" << endl; } cout <<" alors!! \n"; i < 0 Il faut un i > 0 alors!! int i = 1; if(i < 0){ cout <<" i < 0 \n"; cout 0" << endl; } cout <<" alors!! \n"; alors!! Condition vraie Bloc 1 d’instructions oui non
M. BENJELLOUN : 2005 int i = -1; if(i < 0){ cout <<" i < 0 \n"; cout 0" << endl; } cout <<" alors!! \n"; i < 0 Il faut un i > 0 alors!! int i = -1; if(i < 0){ cout <<" i < 0 \n"; cout 0" << endl; } else { cout <<" alors!! \n"; } i < 0 Il faut un i > 0 Condition vraie Bloc 1 d’instructions oui non Bloc 2 d’instructions
M. BENJELLOUN : 2005 Fonctionnement : - Tapez et sauvegardez le programme, - Compilez le programme, - Exécutez le programme. Indenter = lisibilité Prenez l'habitude de respecter (au moins au début) les règles : - une accolade est seule sur sa ligne, - { est alignée sur le caractère de gauche de la ligne précédente, - } est alignée avec l'accolade ouvrante correspondante, - après {, on commence à écrire deux caractères plus à droite. #include void main(void) { /*main*/ instruction; { instruction; { instruction; } instruction; } /* fin main*/
M. BENJELLOUN : 2005 #include void main() { int i=0; cout << "i = " << i << endl; i++; cout << "i = " << i << endl; i++; cout << "i = " << i << endl; i++; cout << "i = " << i << endl; } Les itérations – for for( init ;(Condition vraie); itération ) { /* liste d'instructions */ } for (i = 0; i <4; i++) { cout << "i = " << i << endl; } for (i = 0; i <4; ) { cout << "i = " << i << endl; i++ ; } i=0 i=1 i=2 i=3
M. BENJELLOUN : 2005 for( ; ; ) { ; /* bloc d'instructions */ ; } Les itérations – for for( init ; ( Condition vraie) ; itération ) { /* liste d'instructions */ } double angle; for(angle = 0.0; angle < ; angle += 0.2) …….. ( Boucles ) est une boucle infinie (répétition infinie du bloc d'instructions). int i, j, k; for(i = 0, j = 2, k = -1; (i < 20) &&(j==2); i++, k--) int i,j; for (i = 0; i <3; i++) { cout<< "i = " << i << endl; } for(j = 5; j > 0; j- -) cout<< "j = " << j << endl; i = 0 i = 1 i = 2 j = 5 j = 4 j = 3 j = 2 j = 1
M. BENJELLOUN : 2005 #include void main() { char lettre; float pourcent; for (lettre = 'A'; lettre <= 'M'; lettre++) cout<<lettre; cout<<endl; for (lettre = 'z'; lettre >= 'n'; lettre--) cout<<lettre; cout<<endl; for (pourcent = 0.0; pourcent < 0.8; pourcent += 0.1) cout<<pourcent<<endl; } ABCDEFGHIJKLM zyxwvutsrqpon
M. BENJELLOUN : 2005 La boucle TANT QUE... FAIRE... Boucle pré-testée Il s'agit de l'instruction while : tant que (expression vraie) faire{ BLOC D'INSTRUCTIONS } Organigramme: while ( Condition vraie ) { ; /* bloc d'instructions */ ; } Le test se fait d'abord, le bloc d'instructions n'est pas forcément exécuté. Syntaxe: tant que, pas jusqu’à ce que! ( Boucles ) ouinon Suite du programme Condition vraie Bloc 1 d’instructions
M. BENJELLOUN : 2005 i=1; while(i<5) { cout<<"Interieur " <<i << endl; i++; } cout<<"Exterieur " <<i << endl; Exemples Interieur 1 Interieur 2 Interieur 3 Interieur 4 Exterieur 5 i=1; while(i<5) ; { cout<<"Interieur " <<i << endl; i++; } "tant que l'expression est vraie attendre". int j = 5; cout<<"start\n"; while(j == 0) cout<<"j = "<<j--<<endl; cout<<"end\n"; start end tant que, pas jusqu’à ce que! itération ICI
M. BENJELLOUN : 2005 do while = REPETER … tant que do { ; /* bloc d'instructions */ ; } while ( Condition vraie ); Condition vraie ouinon Bloc d’instructions programme int j = 5; do cout<<"j = "<<j--<<endl; while(j > 0); cout <<"stop\n"; j = 5 j = 4 j = 3 j = 2 j = 1 stop Suite du programme (garantit l’exécution au moins une fois) int j = 5; do { cout<<"j = "<<j <<endl; j--; } while(j > 0); cout <<"stop\n";
M. BENJELLOUN : 2005 i=1; do { cout <<"i= "<<i <<endl; i++; }while(i<0); cout <<"stop\n"; i = 1 stop do while = REPETER … tant que Condition vraie ouinon Bloc d’instructions programme Suite du programme
M. BENJELLOUN : 2005 Instructions d'échappement Pour rompre le déroulement séquentiel d'une suite d'instructions break ; int i, j=1; char a; for (i = -10; i <= 10; i++){ while(j!=0) // boucle infinie { cin >> a ; if(a=='x') break; } } Si x est tapé au clavier continue ; for (i = -10; i <= 10; i++) { if (i == 0) continue; // pour éviter la division par zéro cout << 1 / i; } return (expression); permet de sortir de la fonction qui la contient exit (expression); La fonction est interrompue. expression : un entier indiquant le code de terminaison du processus
M. BENJELLOUN : 2005 switch = AU CAS OU... FAIRE... switch(variable de type char ou int) // au cas où la variable vaut: { case valeur1 :......; // variable=valeur1 : exécutez ce bloc d'instructions ; break; /* L'instruction d'échappement break; permet de quitter la boucle ou l'aiguillage le plus proche.*/ case valeur2: ; // cette valeur2: exécutez ce bloc d'instructions ; break;.. // etc.... default: ; /* aucune des valeurs précédentes: exécuter ce bloc ; d'instructions, pas de "break" ici.*/ } Le bloc "default" n'est pas obligatoire. valeur1, valeur2, …. doivent être des expressions constantes. L’instruction switch correspond à une cascade d’instructions if...else
M. BENJELLOUN : 2005 char choix; cout << "Ensemble_instruction1 : TAPEZ 1 " << endl; cout << "Ensemble_instruction2 : TAPEZ 2" << endl; cout << "POUR SORTIR : TAPEZ 3 " << endl; cout << " \n\t\t VOTRE CHOIX: " << endl; cin >> choix ; switch(choix){ case '1': cout << "Ensemble_instruction1 : case 1" << endl; break; case '2': cout << "Ensemble_instruction2 : case 2" << endl; break; case '3': cout << " case 3 : FIN DU PROGRAMME...." << endl; break; default : cout << "\nCE CHOIX N'EST PAS PREVU "<< endl; } switch : instruction commode pour les "menus": int choix; switch(choix) { case 1: … ! switch(i) { case 2 * j:.... float f; switch(f) { case 2:....
M. BENJELLOUN : 2005 Tableaux et Strings Un tableau est une collection de variables de même type, appelées éléments Type Nom_Tableau[dim]; int tab[4]; déclare un tableau de 4 valeurs entières tab[0]tab[1]tab[2]tab[3] const int SIZE = 5; int A[SIZE] // A est un vecteur de 5 entiers float B[5] intA[SIZE] = { 10, 20, 30, 40, 50 }; intpremier[] = { 1, 2, 3, 5, 7, 11, 13 }; char Tab_Char[4] = { 'A', 'C', 'F', 'G' }; intTab[50] = { 0 }; inti = 10; inta[i]; intprimes[]; Déclaration Initialisation Interdiction
M. BENJELLOUN : 2005 Accès aux éléments d’un tableau Les éléments sont numérotés de 0 à dim-1 Il n’y a pas de vérification des bornes void main() { inta[6]; inti = 7; a[0] = 9; a[5] = -10; a[i/2] = 2; a[6] = 0; a[-1] = 5; } 0 a ? ? 2 ? -10 void main(void) { const int dim=6; int i; int A[dim] = { 1, 2, 3, 4, 5, 6 }; for (i=0;i<dim;i++) { A[i] += i; cout<<"A["<<i<<"]="<<A[i]; } A[0]=1 A[1]=3 A[2]=5 A[3]=7 A[4]=9 A[5]=11
M. BENJELLOUN : 2005 void main(void) { const int dim = 6; int i, A[dim], B[dim]; for (i=0;i<dim;i++) { cout <<"Entrez A["<<i<<"]="; cin >>A[i]; B[i] = A[i] ; cout<<"A["<<i<<"]="<<A[i]<<" et B["<<i<<"]="<<B[i]; } B = A ; ! Affectation de tableaux
M. BENJELLOUN : 2005 Matrices n Rangées ligne par ligne n Considérées comme des vecteurs de lignes n Accès aux composantes par double crochets int a[10][5]; a[1][0] = 7; int x[2][3] = {{1,5,7},{8,4,3}}; // 2 lignes et 3 colonnes Exemples : char tab[5][3]; déclare un tableau de 5*3=15 éléments int tab[2][2]={ {1,2},{3,4} }; tab[0][0] tab[2][1] tab[4][2]
M. BENJELLOUN : 2005 Exemple #include void main(){ int i, j, tab[5][4]; for (i = 0; i <5; i++) { // Saisie for (j = 0; j < 4; j++) tab[i][j] = i; } for (i = 0; i <5; i++) { // Affichage for (j = 0; j < 4; j++) cout<< tab[i][j] << ' ' ; cout << endl; }