460 likes | 545 Views
FLSI602 Génie Informatique et Réseaux. Alberto Bosio alberto.bosio@lirmm.fr www.lirmm.fr/~bosio/FLSI602. Agenda. langage de programmation C UNIX/Linux Réseau. Bibliographie. B.W. Kernighan, D.M. Ritchie, “Le langage C (2ème édition)”, Dunod, 2000 Internet …. Historique.
E N D
FLSI602 Génie Informatique et Réseaux Alberto Bosio alberto.bosio@lirmm.fr www.lirmm.fr/~bosio/FLSI602
Agenda • langage de programmation C • UNIX/Linux • Réseau
Bibliographie • B.W. Kernighan, D.M. Ritchie, “Le langage C (2ème édition)”, Dunod, 2000 • Internet …
Historique • Histoire du C est très liée à l'histoire du système UNIX. • En 1969, la 1ère version du système UNIX voit le jour programmée en assembleur. • Ken Thompson créa un nouveau langage de programmation, nommé B. • En 1971, création du successeur de B, nommé C, créé par Dennis Ritchie.
Historique • En 1983, un standard pour le langage C est créé : • la norme ANSI (American National Standards Institute). • La plupart des compilateurs (Borland, Microsoft, GNU CC...) utilisent ce standard. • un programme écrit en ANSI C est compilable presque partout.
Structure d'un programme • En langage C <directives de précompilation> <définitions de types de donnes> <prototypes de fonctions> <définitions de variables globales> <définitions de fonctions> • Structure d'une fonction <type> nomFonction(<paramètres>) { <définition de variables> <instructions> }
Structure d'un programme • En langage C • Le partie principale du programme est une fonction nommée main. <type> main(<paramètres>) { <définition de variables > <instructions> }
Un premier exemple • Calcul du volume d’une sphère /* Directive de précompilation */ #include <stdlib.h> /* Fonction principale */ void main(void) { const float PI = 3.14159; /* Définition d’une constante */ float rayon; /* Définition d’une variable */ float volume; /* Définition d’une variable */ volume = 4*PI*rayon*rayon*rayon / 3; }
Un premier exemple • Calcul du volume d’une sphère /* Directive de précompilation */ #include <stdlib.h> /* Fonction principale */ void main(void) { const float PI = 3.14159; /* Définition d’une constante */ float rayon; /* Définition d’une variable */ float volume; /* Définition d’une variable */ volume = 4*PI*rayon*rayon*rayon / 3; } Commentaire
Un premier exemple • Calcul du volume d’une sphère /* Directive de précompilation */ #include <stdlib.h> /* Fonction principale */ void main(void) { const float PI = 3.14159; /* Définition d’une constante */ float rayon; /* Définition d’une variable */ float volume; /* Définition d’une variable */ volume = 4*PI*rayon*rayon*rayon / 3; } constant
Un premier exemple • Calcul du volume d’une sphère /* Directive de précompilation */ #include <stdlib.h> /* Fonction principale */ void main(void) { const float PI = 3.14159; /* Définition d’une constante */ float rayon; /* Définition d’une variable */ float volume; /* Définition d’une variable */ volume = 4*PI*rayon*rayon*rayon / 3; } variable
Un premier exemple • Calcul du volume d’une sphère /* Directive de précompilation */ #include <iostream.h> /* Fonction principale */ void main(void) { const float PI = 3.14159; /* Définition d’une constante */ float rayon; /* Définition d’une variable */ float volume; /* Définition d’une variable */ volume = 4*PI*rayon*rayon*rayon / 3; } instructions
Les types, variables et constantes • Les commentaires /* Sur plusieurs lignes : en C, C++ ou Java */ • Les types de données • Entiers : short, int, long int, unsigned short, . . . • Réels : float, double, long double • Caractères : char, unsigned char
Les types, variables et constantes • Déclarations et initialisation de variables • int jour, mois, annee = 2000; • double puissance = 10.4; • char reponse = ‘A’; • int test = 10;
Les types, variables et constantes • Le type char char reponse = ‘A’; printf(“%c“, response); /* A */ printf(“%d“, response); /* 65 */ char reponse = 65; printf(“%c“, response); /* A */ reponse = 65 + 32 ; printf(“%c“, response); /* a */
Les types, variables et constantes • Le type char char reponse = ‘A’; printf(“%c“, response); /* A */ printf(“%d“, response); /* 65 */ char reponse = 65; printf(“%c“, response); /* A */ reponse = 65 + 32 ; printf(“%c“, response); /* a */ ASCII Code (http://www.asciitable.com/)
Les types, variables et constantes • Définition d’une constante • Directive de précompilation en langage C #define SIZE 100 • Mot clef réservé « const » en langage C const int SIZE = 100;
Les types, variables et constantes • Les constantes littérales • Une constante de type caractère est entourée de simple-quotes • ‘A’, ‘b’, ‘\n’ (retour à la ligne), ‘\t’ (tabulation) • Une constante de type chaîne est entourée de double-quotes • “il est trop tard\n“, “Janvier\tFevrier\tMars“ • Les énumérations • Une énumération permet de définir un nouveau type enum Saison { Printemps = ‘P’, Ete = ‘E’, Automne = ‘A’, Hiver = ‘H’ }; Saison S = Printemps;
Les types, variables et constantes • La définition d’un nouveau type • Le mot clef réservé « typedef » typedef int typeEntier; . . . typeEntier i; // int i; i = 5; typedef float typeTableau[10]; . . . typeTableau notes; // float notes[10]; notes[4] = 10.5;
Les différents types d’opérateurs • Opérateur d’affectation • Symbole « = » • Opérateurs arithmétiques • Symboles « + », « - », « * », « / », « % » • + addition • - soustraction • * multiplication • / division • % reste de la division (modulo)
Les différents types d’opérateurs • Opérateurs bit à bit • Symboles « & », « ^ », « | », « << », « >> » 26 & 150 = (00011010 & 10010110) = 00010010 = 18 /* ET */ 26 ^ 150 = (00011010 ^ 10010110) = 10001100 = 140 /* OU exclusif */ 26 | 150 = (00011010 | 10010110) = 10011110 = 158 /* OU */ 13 << 3 = (00001101 << 3) = 01101000 = 104 /* Décalage */ 150 >> 2 = (10010110 >> 2) = 00100101 = 37 /* Décalage */
Les différents types d’opérateurs • Opérateurs d’incrémentation • Pour simplifier certaines expressions ++i; ou i++; /* i = i + 1; */ --i; ou i--; /* i = i - 1; */ i = ++j; /* j = j + 1; i = j; pré-incrémentation */ i = j++; /* i = j; j = j + 1; post-incrémentation */ • Opérateurs d’affectation élargis • Pour simplifier certaines affectations i = i + 4; /* i += 4; */ temps = temps * k; /* temps *= k; */
Les différents types d’opérateurs • Les opérateurs conditionnels if (ok == true) . . . /* Test d’égalité */ if (ok != false) . . . /* Test d’inégalité */ if (i < 4) . . . if (i <= 4) . . . if (i >= 4) . . . • Les opérateurs logiques if ((ok == 1) && (i < 4)) . . . /* si ok est 1 ET i est inférieur à 4 */ if ((ok == 1) || (i < 4)) . . . /* si ok est 1 OU i est inférieur à 4 */ if (!(ok == 1)) . . . /* s’il est faux que ok soit 1 */
Les différents types d’opérateurs • Les opérateurs de « cast » • Pour convertir explicitement le type de certaines données double x = 14.5; int i; i = int(x); ou i = (int) x; /* i=14;*/ i = 10; x = i / 4; /* x = 2; */ i = 10; x = double(i) / 4; /* x = 2.5; */
Les entrées / sorties en C • Comment afficher des informations ? • La fonction « printf » • Définition dans la bibliothèque « stdio.h » • Syntaxe : printf(<un format d’affichage>, <une liste d’expressions>) int qt = 4; float pr = 10.5; printf(“quantite = %d et prix = %f”, qt, pr); /* quantite = 4 et prix = 10.5 */ • Un format d’affichage est une chaîne comportant • Des caractères à afficher tels quels • Des codes de format : « %d », « %f »
Les entrées / sorties en C • Comment afficher des informations ? • Les différents codes de format int i = 6; printf(“entier = %d”, i); float x = 2.3; printf(“réel = %f”, x); char c = ‘A’; printf(“cara = %c”, c); char *m = “oui”; printf(“mes = %s”, m);
Les entrées / sorties en C • Comment lire des données au clavier ? • La fonction « scanf » • Définition dans la bibliothèque « stdio.h » • Syntaxe : scanf (<un format de lecture>, <une liste d’adresses>) int i; float x; scanf(“%d %f”, &i, &x); • pour lire au clavier un entier et un réel placés respectivement dans les variables « i » et « x »
L’exécution conditionnelle /* Exemple de branchement conditionnel */ if (a > b) { plusGrand = a; plusPetit = b; } else{ plusGrand = b; plusPetit = a; } printf (“%d est plus grand que %d”, plusGrand, plusPetit); /* Exemple de branchement conditionnel */ if ((a >= b) && (a >= c)) plusGrand = a; else { if (b >= c) plusGrand = b; else plusGrand = c; }
L’exécution conditionnelle /* Exemple de « switch » en C */ int mois, nbjours, annee; switch(mois) { /* Mois de 30 jours */ case 4 : case 6 : case 9 : case 11 : nbjours = 30; break; /* Mois de 31 jours */ case 1 : case 3 : case 5 : case 7 : case 8 : case 10 : case 12 : nbjours = 31; break; /* Mois de février */ case 2 :{ if (estBissextile(annee)) nbjours = 29; else nbjours = 28; break; } default : printf (“Mois non valide”); } /* Fin du switch */
L’exécution itérative • Trois types de boucles • La boucle « while » compteur = 1; while (compteur <= 5) { printf (“boucle : %d \n”,compteur); compteur++; } • La boucle « for » for(compteur = 1; compteur <= 5; compteur++) printf (“boucle : %d \n”,compteur); • La boucle « repeat » do { printf (“Voulez-vous recommencer ? ”); scanf (“%c”, &reponse); } while ((reponse == ‘o’) || (reponse == ‘O’));
Modes de transmission des arguments • La transmission par valeur void echanger(int a, int b) { int tmp = a; a = b; b = tmp; printf (“%d - %d\n”,a, b); } void main() { int i = 4, j = 8; echanger(i, j); /* a sera une copie de i, et b une copie de j */ printf (“%d - %d\n”,i, j); }
Modes de transmission des arguments • La transmission par référence (adresse) void classer(int a, int b, int* min, int* sup) { if (b > a) { *min=a; *sup=b; } else { *min=b; *sup=a; } } void main() { int i = 4, j = 8, m, s; classer(i, j, &m, &s); printf (“%d - %d\n”,m, s); }
Les fonctions • Fonction retournant une valeur int min(int a, int b) { int t; if (a < b) t = a; else t = b; return (t); } • Fonction de type « void » void calculer_min() { int a, b; printf (“Donnez deux entiers : ”); scanf (“ %d %d ” , &a ,&b); printf (“Le min entre %d et %d est %d ”, a, b, min(a,b)); }
Les tableaux en C • Tableaux unidimensionnels typedef double Vecteur[10]; double x[10]; Vecteur y; for(int i = 0; i < 10; i++) x[i] = y[i] = 0.0;
Les tableaux en C float vett[10]; 3 6 index 0 1 2 4 5 7 8 9 vett
Les tableaux en C float vett[10]; 3 6 index 0 1 2 4 5 7 8 9 vett vett[4] = 5,4
Les tableaux en C float vett[10]; 3 6 index 0 1 2 4 5 7 8 9 vett vett[4] = 5,4
Les tableaux en C • Tableaux multidimensionnels typedef double Matrice[10][5]; double A[10][5]; Matrice B; for(int i = 0; i < 10; i++) for(j = 0; j < 5; j++) B[i][j] = A[i][j];
Les tableaux en C float matr[5][3] 0 1 2 matr Index de colonne 0 1 2 3 4 Index de ligne
Les tableaux en C float matr[5][3] 0 1 2 matr Index de colonne 0 1 2 3 4 Index de ligne matr[1] [2] = 4,5
Les tableaux en C / C++ float matr[5][3] 0 1 2 matr Index de colonne 0 1 2 3 4 Index de ligne matr[1] [2] = 4,5
Les tableaux • Mode de transmission • Un tableau n’est jamaistransmis par valeur • Un tableau est toujourstransmis par adresse void initialise(double* t, int n) { int i; for(i = 0; i < n; i++) t[i] = i; } double somme(double* t, int n) { double s; int i; for(i = 0, s = 0.0; i< n; i++) s = s + t[i]; return (s); } void main() { double x[2], y[3]; initialise(x, 2); initialise(y, 3); Printf (“%f , %f\n” ,somme(x, 2), somme(y, 3)); }
Les tableaux • Mode de transmission • Différents modes de déclaration des fonctions void initialise(double* t, int n); void initialise(double t[], int n); • Toutes ces déclarations sont équivalentes
Les chaînes de caractères • Sans type prédéfini en langage C #include <string.h> char prenom[64] = “Pierre”; char nom[64] = { ‘J’, ‘o’, ‘y’, ‘c’, ‘e’, ‘\0’ }; strcpy(prenom, “James”); /* Erreur : prenom = “James”; */ strcat(nom, “ ”); strcat(nom, prenom); scanf (“%s”, nom); printf (“%s”, nom);
Les chaînes de caractères • Sans type prédéfini en langage C if (nom[0] == ‘A’) … if (strcmp(nom, prenom) < 0) /* Erreur : if (nom < prenom)*/ if (strcmp(nom, prenom) == 0) /* Erreur : if (nom == prenom)*/ printf (“Longueur = %d”, strlen(nom));