Programmation Orientée Système 2 Cours 2: Premiers Pas en C
Transcription
Programmation Orientée Système 2 Cours 2: Premiers Pas en C
Programmation Orientée Système Cours 2: Premiers Pas en C Francesco Belardinelli Laboratoire IBISC Diapos basées sur les notes Programmation en langage C par Mme Anne Canteaut 17 janvier 2017 Cours 2 1. Variables 2. Affectations aux variables 3. les Types Prédéfinis 4. les Constantes 5. les Opérateurs 6. les Fonctions d’Entrée et Sortie Variables Identificateurs de variables • valides : x, x1, x_1, _abc, ABC123z7, sum, RATE, count, data2, Big_Bonus • pas valides : 12, 3X, %change, data-1, myfirst.c, PROG.CPP Régle générale : • commence par une lettre a, . . . , z, A, . . . , Z ou • peut contenir les caractères a, . . . , z, A, . . . , Z , 0, . . . , 9, • jusqu’à 31 caractères significatifs • les compilateurs font la différence entre majuscules et minuscules : rate 6= RATE 6= Rate Mots réservés Mots prédéfinis du langage C ne pouvant être utilisés comme identificateurs : • Qualificateurs de données : char, const, double, float, int, long, short, signed, unsigned, void, volatile. • Classes d’allocation : auto, extern, register, static. • Constructeurs : enum, struct, typedef, union. • Instructions : do, for, while, case, default, if, else, switch, break, continue, goto, return. • Divers : asm, fortran, sizeof. Déclaration de Variables : exemple #include <stdio.h> int main(){ /* déclaration de variables */ int nombre_de_bonbons; double poid_individuel, poid_total; /* instructions */ printf("Saisissez le nombre de bonbons dans le paquet\n"); printf("et le poid des bonbons en grammes:\n"); scanf("%d",&nombre_de_bonbons); scanf("%lf",&poid_individuel); poid_total = nombre_de_bonbons * poid_individuel; printf("Si tu as %d bonbons,\n", nombre_de_bonbons); printf("chacun de poid %f, alors\n", poid_individuel); printf("le poid total est %f.\n", poid_total); return 0; } • déclaration de trois variables : I une variable de type int. I deux variables de type double. • variables du même type séparées par des , • variables de types différents séparées par des ; Les Types Prédéfinis • C est un langage typé • les variables (et aussi les fonctions, les constantes,. . .) sont typées • le type d’un objet définit la façon dont il est représenté en mémoire. • la mémoire de l’ordinateur se décompose en une suite continue d’octets • chaque octet dans la mémoire est caractèrisé par son adresse (entier) • quand une variable est définie, il est lui attribuée une adresse • cette variable correspondra à une zone de la mémoire dont la longueur (le nombre d’octets) est fixée par le type type char int float double nom caractères entiers réels réels # octets 1 octets 4 octets 4 octets 8 octets plage dépend du clavier [−231 ; 231 [ [10−38 ; 1038 [ [10−308 ; 10308 [ Le Type Caractère • le mot-clef char désigne un objet de type caractère • un char peut contenir n’importe quel élément du jeu de caractères de la machine utilisée • codé sur 1 octet • peut être assimilé à un entier #include <stdio.h> int main(){ char c = ’A’; printf("%c\n", c + 1); return 0; } Le Type Entier • le mot-clef int désigne un objet de type entier • codé sur 4 octet • le type short int est codé sur 2 octets • le type long int est codé sur 8 octets type short int int long int nom entiers entiers entiers # octets 2 octets 4 octets 8 octets plage [−215 ; 215 [ [−231 ; 231 [ [−263 ; 263 [ • la fonction sizeof(expr), où expr est un type ou un objet, renvoie un entier égal au nombre d’octets nécessaires pour stocker le type ou l’objet. short int x; taille = sizeof(short int); taille = sizeof(x); Le Type Réel • les mots-clef float et double désignent des nombres réels • codé sur 4 et 8 octet • le type long double est codé sur 16 octets type float double nom réels réels # octets 4 octets 8 octets plage [10−38 ; 1038 [ [10−308 ; 10308 [ • les réels sont stockés en mémoire sous la représentation de la virgule flottante normalisée : signe 0, mantisse B exposant , où B = 2. Les Constantes • costante : valeur qui apparaı̂t littéralement dans le code source d’un programme • le type de la constante est déterminé par la façon dont la constante est écrite • 4 types : entier, flottant (nombre réel), caractère, énumeration • les constantes sont utilisées, par exemple, pour initialiser une variable Les Constantes Entières Peuvent être représentées en 3 bases différentes : • décimale (ex. 0 ou 1234) • octale (commence par 0, ex. 00 ou 0377) • hexadécimale (commence par 0x ou 0X, ex. 0xe ou 0xff) Par défaut, une constante entière est représentéee avec le format interne le plus court parmi int, long int et unsigned long Les Constantes Réelles • représentées par la notation par mantisse et exposant • l’exposant est introduit par la lettre e ou E (nombre décimal éventuellement signé) • par défaut, une constante réelle est représentée avec le format du type double. • on peut influer sur la représentation interne de la constante en lui ajoutant un des suffixes f (ou F) et l (ou L) constante type 12.34 12.3e-4 12.34F 12.34L double double float long double Les Constantes Caractère • pour désigner un caractère imprimable, il suffit de le mettre entre apostrophes (ex. ’A’ ou ’$’) • exceptions : \\, \’, \?, \" • les caractères non-imprimables les plus fréquents disposent d’une notation simple \n \t \v \b \r \f \a nouvelle ligne tabulation horizontale tabulation verticale retour arrière retour chariot saut de page signal d’alerte Les Constantes Chaı̂nes de Caractères • suite de caractères entourées par des guillemets "Ceci est une chaine de caractères" • une chaı̂ne de caractères peut contenir des caractères non imprimables "ligne 1 \n ligne 2" • longues chaı̂nes de caractères sur plusieurs lignes "ceci est une longue longue longue longue longue longue \ chaine de caractères" Les Opérateurs : Affectation • symbolisée par le signe =. variable = expr • le terme de gauche de l’affectation peut être une variable simple, un élément de tableau mais pas une constante. • l’instruction a pour effet d’ évaluer expr et d’affecter la valeur obtenue à variable. • ex : poid_total = nombre_de_bonbons * poid_individuel; Les Opérateurs Arithmétiques symbole + * / % opération changement de signe (unaire) addition soustraction multiplication division reste de la division (modulo) • l’opérateur / produit une valeur entière si les deux opérandes sont de type entier • par contre, / délivrera une valeur réelle si l’un des opérandes est de type réel. Comparez float x; x = 3 / 2; et x = 3 / 2.; • pour calculer x y il faut utiliser la fonction pow(x,y) de la librairie math.h Les Opérateurs Relationnels symbole > >= < <= == != relation strictement supérieur supérieur ou égal strictement inférieur inférieur ou égal égal différent • syntaxe : expr_1 op expr_2 • la valeur rendue est de type int • elle vaut 1 si la condition est vraie, et 0 sinon. Les Opérateurs Relationnels : exemple • ne pas confondre l’opérateur de test d’égalité == avec l’opérateur d’affection =. #include <stdio.h> int main(){ int a = 0; int b = 1; if (a = b) printf("a et b sont egaux \n"); else printf("a et b sont differents \n"); return 0; } • résultat : a et b sont egaux ! Les Opérateurs Booléens symbole && || ! opération et logique (conjonction) ou logique (disjonction) non logique (négation) • syntaxe : expr_1 op_1 expr_2 op_2 ... expr_n • similaires aux opérateurs relationnels : • la valeur rendue est de type int. • elle vaut 1 si la condition est vraie, et 0 sinon. • exemple : int i; int p[10]; i = 11; if ((i >= 0) && (i <= 9) && !(p[i] == 0)) ... • si i n’est pas entre 0 et 9, la dernière clause ne sera pas évaluée Les Opérateurs Logiques bit à bit symbole & | ^ ~ << >> opération et ou inclusif ou exclusif complément à 1 décalage à gauche décalage à droite • considérez les entiers a = 23 et b = 77 de type unsigned char (sur 8 bits). expression a b a&b a|b a^b ~a b<<2 b<<5 b>>1 binaire 01001101 00010111 00000101 01011111 01011010 10110010 01011100 11100000 00001011 décimale 77 23 5 95 90 -78 92 736 11 Les Opérateurs d’Affectation Composée += -= *= /= %= • l’instruction expr_1 op_1= expr_2 est équivalent à expr_1 = expr_1 op_1 expr_2 &= ^= |= <<= >>= Les Opérateurs d’Incrémentation et de Décrémentation • les opérateurs d’incrémentation ++ et de décrémentation -- sont utilisés en suffixe (i++) et en préfixe (++i). • mais le résultat est différent : int a = 3, b, c; b = ++a; c = b++; /* a et b valent 4 */ /* c vaut 4 et b vaut 5 */ L’Opérateur de Conversion de Type (Cast) • permet de modifier explicitement le type d’un objet • syntaxe : (type)objet #include <stdio.h> int main(){ int i = 3, j = 2; float k = 2.5; printf("%f \n",(float)i/j); printf("%d \n",(int)k); return 0; } L’Opérateur d’Adresse • l’opérateur d’adresse & retourne l’adresse-mémoire d’une variable. • syntaxe : &objet #include <stdio.h> int main(){ int i; printf("adresse de la variable i = %ld \n",(long int)&i); return 0; } Les Fonctions d’Entrée-Sortie • fonctions de la librairie standard stdio.h • utilisées avec les unités classiques d’entrée et sortie (clavier et écran) #include <stdio.h> • sur certains compilateurs, l’appel à la librairie stdio.h n’est pas nécessaire pour utiliser printf et scanf. La fonction d’écriture “printf” printf("chaine de controle",expr_1, ..., expr_n); • La chaı̂ne de contrôle contient le texte à afficher et les spécifications de format correspondant à chaque expression de la liste • Les spécifications de format sont introduites par le caractère % suivi d’un caractère désignant le format d’impression • largeur minimale du champ d’impression : (ex. %10d) • précision : %.12f La fonction d’ écriture “printf()” : exemple #include <stdio.h> int main(){ int i = 23674; int j = -23674; long int k = (1l << 32); double x = 1e-8 + 1000; char c = ’A’; char *chaine = "chaine de caracteres"; printf("impression de i: \n"); printf("%d \t %u \t %o \t %x",i,i,i,i); printf("\nimpression de j: \n"); printf("%d \t %u \t %o \t %x",j,j,j,j); printf("\nimpression de k: \n"); printf("%d \t %o \t %x",k,k,k); printf("\n%ld \t %lu \t %lo \t %lx",k,k,k,k); printf("\nimpression de x: \n"); printf("%f \t %e \t %g",x,x,x); printf("\n%.2f \t %.2e",x,x); printf("\n%.20f \t %.20e",x,x); printf("\nimpression de c: \n"); printf("%c \t %d",c,c); printf("\nimpression de chaine: \n"); printf("%s \t %.10s",chaine,chaine); printf("\n"); return 0; } La fonction d’ écriture “printf()” : exemple (suite) [fbelard@fbelard lec2]$ ./ex_printf impression de i: 23674 23674 56172 5c7a impression de j: -23674 4294943622 37777721606 ffffa386 impression de k: 0 0 0 4294967296 4294967296 40000000000 100000000 impression de x: 1000.000000 1.000000e+03 1000 1000.00 1.00e+03 1000.00000001000000793283 1.00000000001000000793e+03 impression de c: A 65 impression de chaine: chaine de caracteres chaine de La fonction de saisie “scanf()” scanf("chaine de controle",arg_1, ..., arg_n); • La fonction scanf permet de saisir des données au clavier et de les stocker aux adresses spécifiées par les arguments de la fonctions • les conversions de format sont spécifiées par un caractère précédé du signe % • exemple : #include <stdio.h> main(){ int i; printf("Saisissez un entier sous forme hexadecimale i = "); scanf("%x",&i); printf("i = %d\n",i); return 0; } Impression et Lecture de Caractères • les fonctions getchar et putchar permettent de lire et d’imprimer des caractères. #include <stdio.h> int main(){ char c; while ((c = getchar()) != EOF) putchar(c); return 0; } • la fonction getchar retourne un int correspondant au caractère lu. Les Fonctions “gets()”, “atof()” et “atoi()” • gets : reçoit en entrée une chaı̂ne de caractère • atof : conversion de String à double • atoi : conversion de String à int Conclusions du Cours 2 1. Variables 2. Affectations aux variables 3. les Types Prédéfinis 4. les Constantes 5. les Opérateurs 6. les Fonctions d’Entrée et Sortie