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 instructions /* 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 Size Costant <limits.h> Min Max Char 1 CHAR_MIN CHAR_MAX 255 signed char SCHAR_MIN SCHAR_MAX -127 127 Short 2 SHRT_MIN SHRT_MAX -32767 32767 unigned short USHRT_MAX 65535 Int 4 INT_MIN INT_MAX -2147483647 2147483647 Unsigned int UNIT_MAX 4294967295
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; 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; 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; */ 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); if ((a >= b) && (a >= c)) if (b >= c) 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++) 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 Fonction de type « void » 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]; index 1 2 3 4 5 6 7 8 9 vett
Les tableaux en C float vett[10]; index 1 2 3 4 5 6 7 8 9 vett 1 2 3 4 5 6 7 8 9 vett vett[4] = 5,4
Les tableaux en C 5,4 float vett[10]; index 1 2 3 4 5 6 7 8 9 vett 1 2 3 4 5 6 7 8 9 5,4 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] 1 2 matr Index de colonne 1 2 3 4 1 2 matr Index de colonne 1 2 3 4 Index de ligne
Les tableaux en C float matr[5][3] 1 2 matr Index de colonne 1 2 3 4 1 2 matr Index de colonne 1 2 3 4 Index de ligne matr[1] [2] = 4,5
Les tableaux en C / C++ 4,5 float matr[5][3] 1 2 matr Index de colonne 1 2 matr Index de colonne 4,5 1 2 3 4 Index de ligne matr[1] [2] = 4,5
Les tableaux Mode de transmission Un tableau n’est jamais transmis par valeur Un tableau est toujours transmis 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; 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));