1 / 170

Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons

Programmation en. Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed . Benjelloun @fpms.ac.be 2005-2006. Qu'est-ce qu'un bon programme?. Il doit résoudre le PROBLEME !. Efficacité  Rapidité?. DUREE DE VIE ?. INSTANTANE !. Lisible Structuré. Portabilité.

clovis
Download Presentation

Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programmation en Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@fpms.ac.be 2005-2006

  2. Qu'est-ce qu'un bon programme? Il doit résoudre le PROBLEME ! Efficacité Rapidité? DUREE DE VIE ? INSTANTANE ! • Lisible • Structuré Portabilité

  3. Types de base en C++ Les autres types seront dérivés de ceux-ci. booléen: bool qui s'accompagne des mots-clés true et false. sizeof(i);retourne la taille en octet de la variable i

  4. Pour commencer Tout programme doit avoir un point d’entrée nommé main() void main(void) { /* corps du programme*/ déclaration des Cstes et Var ; instruction1 ; instruction2 ; …. } main(void)  main() 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() 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 ‘//’

  5. initialisations Variables : déclarations, Syntaxe : Type identificateur1, id2,…. ; int i=9; ou int i; i=9; char c1= 'A'; ou char c1; c1= 'A'; Exemple: char c1, c2, c3; int i, j, var_ent;

  6. 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)

  7. asm auto bool break case catch char class const continue default delete do double else enum extern float for friend goto if inline int long mutable namespace new operator private protected public register return short signed sizeof static struct switch template this typedef union unsigned using virtual void volatile while Un identificateur ne peut pas être un mot réservé du langage : Les mots réservés du langage C++ doivent être écrits en minuscules.

  8. 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 … ; 7 cinet cout sont définies dans la librairie <iostream.h>. #include <iostream.h> void main(void) { cout<<" Salut a vous tous" << endl; cout << " oui tous " ; } endl signifie un saut de ligne

  9. #include <iostream.h> 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 ; } 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 : 5 9.9 V V 9.9 5 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

  10. L’initialisation desconstantes est obligatoire lors de leur déclaration. 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;  … void main(void) { const int Nmax=10; char c = 'A'; int i=50, k; k=10; … est équivalent à Les constantes caractères s’écrivent entre quottes simples : 'A''s''2''[' = opérateur d’affectation Cette règle s'applique à tous : char, int, float ...

  11. 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/2 7.0/2 7/2.0 7.0/2.0 3 3.5 

  12. if( choix == 2) { Correction  ! Les opérateurs de comparaison < plus petit <= plus petit ou égal > plus grand >= plus grand ou égal == égal != différent 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. ! == et pas = if( choix = 2){

  13. 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 programme programme oui non Condition vraie Condition vraie oui non Bloc d’instructions Bloc 1 d’instructions Bloc 2 d’instructions Suite du programme do-while Bloc d’instructions oui Condition vraie Suite du programme non Suite du programme if-else while

  14.   Les décisions - if else programme if(Condition vraie) { BLOC 1 D'INSTRUCTIONS } else { BLOC 2 D'INSTRUCTIONS } if (Condition vraie) instruction 1; else instruction 2; Condition vraie oui non Bloc 1 d’instructions Bloc 2 d’instructions if(a<b) min=a; else min=b; Suite du programme if (Condition vraie) { instruction 1; instruction 2; instruction 3; … instruction N; } if (Condition vraie) instruction 1; Condition vraie oui non if ( temperature > 70.0) cout << " Alarme "<<endl; Bloc 1 d’instructions Suite du programme

  15. int i = 1; if(i < 0) cout <<" i < 0 \n"; cout <<" Il faut un i > 0 \n"; cout <<" alors!! \n"; … non oui Condition vraie Bloc 1 d’instructions Il faut un i > 0 alors!! int i = 1; if(i < 0){ cout <<" i < 0 \n"; cout <<" Il faut un i > 0" << endl; } cout <<" alors!! \n"; alors!!

  16. int i = -1; if(i < 0){ cout <<" i < 0 \n"; cout <<" Il faut un i > 0" << endl; } cout <<" alors!! \n"; i < 0 Il faut un i > 0 alors!! non oui int i = -1; if(i < 0){ cout <<" i < 0 \n"; cout <<" Il faut un i > 0" << endl; } else { cout <<" alors!! \n"; } Condition vraie Bloc 2 d’instructions Bloc 1 d’instructions i < 0 Il faut un i > 0

  17. – for for( init ;(Condition vraie); itération) { /* liste d'instructions */ } Les itérations #include <iostream.h> void main() { int i=0; cout << "i = " << i << endl; i++; cout << "i = " << i << endl; i++; cout << "i = " << i << endl; i++; cout << "i = " << i << endl; } i=0 i=1 i=2 i=3 for (i = 0; i <4; i++) { cout << "i = " << i << endl; } for (i = 0; i <4; ) { cout << "i = " << i << endl; i++ ; }

  18. La boucleTANT QUE ... FAIRE ... Boucle pré-testée Il s'agit de l'instruction while : tant que (expression vraie) faire{ BLOC D'INSTRUCTIONS } Organigramme: (Boucles) tant que, pas jusqu’à ce que! Syntaxe: while(Condition vraie) { ............; /* bloc d'instructions */ ............; ............; } Le test se fait d'abord, le bloc d'instructions n'est pas forcément exécuté. Condition vraie oui non Bloc 1 d’instructions Suite du programme

  19. do while= REPETER … tant que (garantit l’exécution au moins une fois) do { ............; /* bloc d'instructions */ ............; } while (Condition vraie); programme Bloc d’instructions oui non Condition vraie Suite du programme int j = 5; do cout<<"j = "<<j--<<endl; while(j > 0); cout <<"stop\n"; int j = 5; do { cout<<"j = "<<j <<endl; j--; } while(j > 0); cout <<"stop\n"; j = 5 j = 4 j = 3 j = 2 j = 1 stop

  20. 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'échappementbreak; permet de quitter la boucle ou l'aiguillage le plus proche.*/ casevaleur2:........; // 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

  21. switch : instruction commode pour les "menus": int choix; switch(choix) { case 1: … 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; } float f; switch(f) { case 2: .... ! switch(i) { case 2 * j: ....

  22. tab[0] tab[1] tab[2] tab[3] 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 const int SIZE = 5; int A[SIZE] // A est un vecteur de 5 entiers float B[5] Déclaration int A[SIZE] = { 10, 20, 30, 40, 50 }; int premier[] = { 1, 2, 3, 5, 7, 11, 13 }; char Tab_Char[4] = { 'A', 'C', 'F', 'G' }; int Tab[50] = { 0 }; Initialisation int i = 10; int a[i]; int primes[]; Interdiction

  23. 'H' 'e' 'l' 'l' 'o' '\0' Chaînes de caractères ou String S[0] S[1] S[2] S[3] S[4] S[5] En C++, il y a deux façons pour traiter et manipuler unechaînede caractères: • Un tableau de char à une dimension: charIdent[dim]; • Un type spécial string : stringIdent; // Il faut inclure <string.h> Initialisation charIdent[dim]; Pour terminer la chaîne, on place en fin de chaîne le caractère nul '\0', de code ASCII 0. Ce caractère est soit ajouté automatiquement par le compilateur, soit introduit par le programmeur, selon les fonctions utilisées. char S[] = {'H','e','l','l','o','\0'}; char S[6] = "Hello"; char S[] = "Le main";

  24. Pourquoi utiliser string Ident; plutôt que charIdent[dim]; ? char S1[6] = "Salut", S2[6] = "Hello", S3[12]; S1= S2; S1= "Hooo"; S3=S1+S2; if(S1= =S2) … Interdit string S1 = "Salut", S2 = "Hello", S3; S1= S2; S1= "Hooo"; S3=S1+S2; if(S1= =S2) … Autorisé S1= "Hello" S1= "Hooo" S3= "HoooHello" false

  25. Fonctions en C++ Fonctions … pourquoi ? void fonction1() { cout<<"\n fonction1 \n"; void fonction2() { cout<<"\n fonction2 \n"; } } Définition L'imbrication de fonctions n'est pas autorisée

  26. Résumé #include … intfonct (int a) { a=1 ; return a; } void main(void){ int var = 5; var = fonct (var); cout << var << endl; } #include … void fonct (int a) { a=1 ; } void main(void){ int var = 5; fonct (var); cout << var << endl; } #include … void fonct (int &a) { a=1 ; } void main(void){ int var = 5; fonct (var); cout << var << endl; } 1 1 5

  27. Structure d'un programme C++ Directives du préprocesseur : accès avant la compilation #include <iostream> using namespace std; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - int fonc1(int x); void fonc2(int y); int Var_Glob; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void main(void) { /* début du bloc de la fonction main*/ int i, j=5, k; // définition des variables locales i = 0 ; j=fonc1(i) ; fonc2(i) ; } // fin du bloc de la fonction main - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - int fonc1( int var){ ….. ; return var ; } void fonc2( int t){ /* Corps de la fonction fonc2 */ ….. ; } Déclarations Programme principal Définitions des fonctions

  28. Passer des tableaux aux fonctions • Les tableaux peuvent être passés comme paramètres d'une fonction. • Ils ne peuvent pas être retournés comme résultat d'une fonction. • La longueur du tableau ne doit pas être définie à la déclaration de la fonction. • Un tableau peut être modifié dans une fonction. Il est passé par référence (adresse) et non par valeur. ! #include … void Modif(inta[]){ a[0] = 5; a[1] = 6; } void main(void){ int p[2] = { 1, 2 }; cout << p[0] << " ; " << p[1]; Modif(p); cout << p[0] << " ; " << p[1]; } 1 ; 2 5 ; 6

  29. Appel par valeurs, pointeurs, références ??!! par Valeur Pointeur Référence #include … void Modifier(int v); void main(){ int v = 5; Modifier(v); cout << "\nmain: v = " << v; } void Modifier(int v){ v = v *100; cout << "Modifier: v = "<< v; } #include … void Modifier(int*v); void main(){ int v = 5; Modifier(&v); cout << "\nmain: v = " << v; } void Modifier(int *v){ *v = *v *100; cout << "Modifier: *v = "<< *v; } #include … void Modifier(int &v); void main(){ int v = 5; Modifier(v); cout << "\nmain: v = " << v; } void Modifier(int &v){ v = v *100; cout << "Modifier: v = "<< v; } Modifier: v = 500 main: v = 5 Modifier: *v = 500 main: v = 500 Modifier: v = 500 main: v = 500 var = 5 var = 5 var = 500 var = 500

  30. 10 9 9 Règles de visibilité des variables #include … int globale; void fonc(int x); void main(void) { int i = 5, j; float f = 2.8, g; d = 3.7; globale =10; cout << " valeur de j= " << j ; cout << "\nglobale = " << globale ; fonc (i); cout << "\nglobale = " << globale ; } void fonc(int v) { double d, f; i++; globale --; } // variable globale;; initialisation à 0 (0) (1) (2) (3) // locales à fonc (4) (5)

  31. #include … int g; void affichage(int un, int deux) { cout << un << " " << deux << " " << g << endl; } #include … int g; void affichage(int un, int deux, int g) { cout << un << " " << deux << " " << g << endl; }

  32. Allocation dynamique de la mémoire Tableaux  réserver plus de places en mémoire que nécessaire. Création d’un tableau de taille quelconquel'allocation dynamique #include <iostream> … void affiche(int T[], int d, char C[]){ for(int i=0; i<d; i++) cout<< "\n T["<<i<<"] = " << T[i] << " C["<<i<<"] = " <<C[i]; cout << endl; } void main(){ int N, *T, i; cout << " N = " ; cin >> N; char *C = new char[N]; T= new int[N];affiche(T, N, C); for(i=0; i<N; i++){ T[i]=i; C[i]='A'+i; } affiche(T, N, C); delete[] T; affiche(T, N, C); delete[] C; affiche(T, N, C); } T[0] = -842150451 C[0] = ◙ T[1] = -842150451 C[1] = ◙ T[2] = -842150451 C[2] = ◙ T[0] = 0 C[0] = A T[1] = 1 C[1] = B T[2] = 2 C[2] = C T[0] = -572662307 C[0] = A T[1] = -572662307 C[1] = B T[2] = -572662307 C[2] = C T[0] = -572662307 C[0] = ¦ T[1] = -572662307 C[1] = ¦ T[2] = -572662307 C[2] = ¦

  33. char *C = new char[N]; et Equiv à char *C; C = new char [N]; *C = new char[N];

  34. Tableau de taille quelconque tab = new int [n]; delete [] tab; #include <… void saisie_vect(int Tab[], int n){ int i; for(i=0;i<n;i++){ cin >> Tab[i]; } } void Affiche(int Tab[], int dim){ int i; for(i=0;i<dim;i++){ cout << "Tab[" << i <<"]=" <<i<<Tab[i]; } } Allocation dynamique du tableau void main() { int *tab, n; cout << " N= "; cin >> n; saisie_vect(tab, n); Affiche(tab, n); }

  35. Les Structures Une structure est un ensemble de variables (de types éventuellement différents), définissant un nouveau type sous un seul nom. Les structures sont définies en utilisant le mot-clé struct. structDate{ int jour; int mois; int an; }; struct Etudiant{ charnom[30], *adresse; int numero; float poids; struct Date D_Nais; }; /* champs ou membres */ Déclarer des instances struct Date { int jour, mois, an; } hier , demain; struct Date paques, semaine[7]; Date noël;// pas de struct Date nouvel_an = { 1, 1, 2005 }; Une fois la structure définie, les instances peuvent être déclarées. Par abus de langage, on appellera structure une instance de structure Déclaration avant ‘;’ Initialisation

  36. Des structures dans des structures struct Date { int jour; int mois; int an; }; struct Etudiant{ char nom[30]; char *adresse; int numero; float poids struct Date D_Nais; }; Etudiant JD = { "Dupont", "rue de Houdain, 9, 7000 Mons", 102, 60.7, { 15, 10, 1986 } }; Les membres sont accédés par le nom de l’instance, suivi de . , suivi du nom du membre cout <<"nom = "<< JD.nom; cout <<"\n numero = "<< JD.numero<< endl; cout << " jour de naissance "<<JD.D_Nais.jour;

  37. L'imbrication de structures n'est pas autorisée struct Etudiant{ char nom[30]; char *adresse; int numero; float poids struct Date { int jour; int mois; int an; }; };

  38. plus_art[0] plus_art[1] plus_art[2] #include … struct Article{ char nom[30]; int prix; }; void Affiche(Article AR){ cout << "\n\t Nom = " << AR.nom << " Prix = " << AR.prix; } void main(void){ Article un_article, plus_art[5]; cout << "Entrez le nom : "; cin >> un_article.nom; cout << " \nEntrez le prix "; cin >> un_article.prix; Affiche(un_article); for (int i=0; i<5; i++){ cout << "Entrez le nom : "; cin >> plus_art[i].nom; cout << "\nEntrez le prix "; cin >> plus_art[i].prix; Affiche(plus_art[i]); } }

  39. Une structure peut être passée, comme une autre variable, par valeur ou par adresse Passer par valeur n’est pas toujours efficace (recopiage à l’entrée) Passer par adresse ne nécessite pas de recopiage void Saisie(Article &AR){ Entrez le nom : Television Entrez le prix : 300 Nom = TelevisionPrix = 300 #include … struct Article{ char nom[30]; // ou string nom; int prix; }; void Affiche(Article AR){ cout << "\n\t Nom = " << AR.nom << " Prix = " << AR.prix; } void Saisie(Article AR){ cout << "Entrez le nom : "; cin >> AR.nom; cout << "\nEntrez le prix:"; cin >> AR.prix; } void main(void){ Article un_article; Saisie(un_article); Affiche(un_article); } Entrez le nom : Television Entrez le prix : 300 Nom = ╠╠╠╠Prix = -858993

  40. #include … struct Article{ char nom[30]; int prix; }; void Saisie(Article &AR){ cout << "Entrez le nom : "; cin >> AR.nom; cout << "\nEntrez le prix:"; cin >> AR.prix; } void main(void){ Article T1[5]; for (int i=0; i<5; i++) Saisie(T1[i]); } Article Nouv(){ Article AA; cout << "Entrez le nom : "; cin >> AA.nom; cout << "\nEntrez le prix:"; cin >> AA.prix; return AA; } L’opération d’affectation = peut se faire avec des structures T1[i]=Nouv();

  41. struct Person{ string nom; char *adresse; int res[Nmax]; char code; }; Person Tab[dim_cnst]; Ou Person *Tab; Sexe

  42. Gestion des fichiers en C++ Pour manipuler un fichier en C++il faut #include <fstream.h> • On y trouve essentiellement les classes: • ofstream (output file stream) permet d’écrire les données dans le fichier ; • ifstream (input file stream) permet de lire les données du fichier ; Ouverture et fermeture d’un fichier : Écriture : ofstream output; output.open("Res.txt"); ou output.open("c:\\labojeudi\\Res.txt"); Lecture : ifstream input ; input.open("Data.txt"); ou input.open("c:\\labojeudi\\Data.txt");

  43. Test! Mes Donnees H ; 1 e ; 2 l ; 3 l ; 4 o ; 5 o ; 5 ?? #include <fstream.h> void main() { ofstreamEcri; char Tab1[6]="Hello"; int Tab2[5]={1,2,3,4,5}; Ecri.open("Mon_fichier.txt"); Ecri << "Mes Donnees" << endl; for(int i=0; i<5; i++){ Ecri << Tab1[i] << " " << Tab2[i]<<endl; } Ecri.close(); } #include <fstream.h> void main() { ifstreamLec; char Tab1[6], char Titre[100]; int Tab2[5], i=0; Lec.open("Mon_fichier.txt"); Lec.getline(Titre,100); cout << Titre << endl; while(!Lec.eof()){ Lec >> Tab1[i] >> Tab2[i]; cout << Tab1[i] << " ; " << Tab2[i]<< endl; i++; } Lec.close(); } Mes Donnees H 1 e 2 l 3 l 4 o 5 ici

  44. Ecri.open("Mon_fichier.txt"); if(Ecri){ // on vérifie si l'ouverture se passe bien Ecri << "Mes Donnees" << endl; for(int i=0; i<5; i++){ Ecri << Tab1[i] << " " << Tab2[i]<<endl; } } else {// si échec à l'ouverture cout<<"Erreur"<<endl; } Ecri.close();

  45. N+1 TEST Recherche dichotomique  Et pos N+1 Nmax un tableau trié + un élément N Nmax + 6 Element  ou pas ?? Element Position ?? 6

  46. Recherche dichotomique  Et pos -7 N--

  47. int dicho(struct Element T[], int n, string nom, int &pos); int dicho(struct Element T[], int n, string nom, int &pos) { int debut,fin,m; debut = 0; fin = n; while (debut<fin) { m = (debut+fin)/2; if (T[m].nom<nom) debut = m+1; else fin = m; } pos = fin; if (T[fin].nom==nom) return 1; else return 0; }

  48. const int NMax = 5; struct Etudiant{ char *nom ; int numero ; int Matieres[NMax] ; } ; void saisie(Element T[], int n, int NM) { … n? NM? … } void affichage( ) { … }

  49. void saisie(struct Element T[], int &n, int &NM) { int i, j, size; string name; ? n et NM for(i=0;i<n;i++){ cout << " nom[" i << " ] = "; cin>> name; T[i].nom = new char[size+1]; T[i].nom = name; cout <<" num " ; cin >> T[i].num; for(j=0;j< NM;j++){ … } } } size = name.length(); ou size = name.size();

More Related