1 / 198

Types de données et représentation

B. Rouzeyre, Polytech'ERII. Langage C. Types de données et représentation. Représentation des algorithmes. Organigramme : façon graphique de représenter le déroulement d'un calcul. 1. Action de base 2. Séquencement 3. Bloc et niveau de détail. Action 1. Action 1. Action 2. Action 11.

sasha
Télécharger la présentation

Types de données et représentation

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. B. Rouzeyre, Polytech'ERII Langage C Types de données et représentation

  2. Représentation des algorithmes Organigramme : façon graphique de représenter le déroulement d'un calcul 1. Action de base 2. Séquencement 3. Bloc et niveau de détail Action 1 Action 1 Action 2 Action 11 Action 1 Action 12 Action 2

  3. Organigramme 4. Sélection Non structuré Σ Evi = 1 et Evi.Evj = 0 Structuré Action 1 Action 1 Ev.1 Action 21 Critère ? Critère ? Ev.2 Action 22 Ev.1 Ev.2 Ev.3 Ev.3 Action 23 Action 21 Action 22 Action 23 Action 3 Action 3 Se lit de haut en bas et de droite à gauche Se lit en suivant les fils

  4. Organigramme 4. Cas particulier : alternative Non structuré Structuré Action 1 Action 1 Vrai Action 21 Critère ? Critère ? Vrai Faux Faux Action 22 Action 21 Action 22 Action 3 Action 3

  5. Organigramme 5. Itérations : exprime le fait que l'on répète une action 5.1 "Tant que" Action 1 Action 1 Tant que critère vrai Vrai Faux Critère Action 2 Action 2 Action 3 Action 3 1 – On évalue le critère 2 – s'il est vrai on effectue l'action 2, retour en 1 2 bis – s'il est faux on passe à la suite Remarque : éventuellement l'action 2 n'est pas exécutée

  6. Organigramme 5. Itérations : 5.2 "Jusqu'à ce que" Action 1 Action 1 Jusqu'à ce que critère soit vrai Action 2 Action 2 Faux Vrai Critère Action 3 Action 3 1 – On exécute l'action 2 – s'il est faux, retour en 1 2 bis – s'il est vrai, on passe à la suite Remarque : l'action 2 est exécutée au moins une fois

  7. Organigramme 5. Itérations : 5.3 "Pour tout e ε E" Action 1 Action 1 Pour chaque e de E Vrai Faux e ε E ? Action 2 Action 2 Action 3 Action 3 e <- valeur suivante de E l'action 2 est exécutée autant de fois qu'il y a d'éléments dans E

  8. Organigramme : conseil • utiliser que les primitives précédentes • intérêt : traduction (presque) directe en C • ne pas faire de spaghetti : • traduction difficile • debug impossible • résultat incompréhensible • => 0 à l'examen Action 1 Vrai Faux e ε E ? Action 2 Action 3 e <- valeur suivante de E

  9. Organigramme : exemple x = premier S=0 x = premier S=0 x pair ? fin = faux S = S+ x Tant que x pair et fin = faux S = S+ x fin = v x dernier ? Vrai x dernier ? Faux x= suivant x= suivant Imprimer S Imprimer S OK KO

  10. Codage d'un algorithme en C • Les actions ou "instructions" en langage C ne sont en fait que des opérations élémentaires (+,-, * etc…) sur des données unitaires. • Chaque instruction est suivie d'un ; • Le début d'un bloc est signalé par un { , la fin d'un bloc par }. Un bloc devient l'équivalent syntaxique d'une instruction. • Ex : { x=1; y=2; z=x+y; printf("%d",z); }; x = 1 y = 2 Calcul z = x+y imprimer z optionnel

  11. Codage d'un algorithme en C Alternative if (expression) action1 ; else action2 ; fin de l'instruction if … if (z == 3) { printf("calcul juste"); z=z+10; } else printf ("problème"); printf ("%d",z); … calcul "calcul juste" Vrai z=3 ? z = z+10 Faux "problème" Imprimer z

  12. Codage d'un algorithme en C Cas particuliers de alternative … if (z == 3) ; else printf("problème); printf ("%d",z); … calcul Vrai z=3 ? "problème" Faux Imprimer z

  13. Codage d'un algorithme en C … if (z == 3) { printf("calcul juste"); z=z+10; } else; printf ("%d",z); … ou bien … if (z == 3) { printf("calcul juste"); z=z+10; }; printf ("%d",z); … Cas particuliers de alternative calcul "calcul juste" Vrai z=3 ? z = z+10 Faux Imprimer z

  14. Codage d'un algorithme en C Sélection multiple : en C, la sélection ne peut être qu'une comparaison à des valeurs de constante (si besoin passer à plusieurs if imbriqués) Action 1 z=3 "ok" z ? z=4 "PB1" autres "PB2" Action 3 … switch (z) { case 3 : printf("ok"); break; case 4 : printf("PB1"); break; default: "printf ("PB2"); }; …

  15. Codage d'un algorithme en C Structures itératives. Exemple, on veut imprimer tous les nombres de 1 à 10 TANT QUE : while (condition) action; JUSQU'À CE QUE : do action while (condition); x=1; while (x <=10) { printf("%d\n",x); x=x+1; }; … x=1 Tant que x ≤ 10 imprimer x x=x+1 x=1; do { printf("%d\n",x); x=x+1; } while (x <= 11); … Jusqu'à ce que x >11 x=1 imprimer x x=x+1

  16. Codage d'un algorithme en C Pour x E {1,2,…,10} POUR équivalent TANT QUE for(x=1; x≤10; x=x+1) printf("%d\n",x); imprimer x x=1; while (x <=10) { printf("%d\n",x); x=x+1; }; … x=1 Tant que x ≤ 10 imprimer x x=x+1

  17. Types de données • 3 types de base caractères ex : 'a', '1', '\n' entier relatifs ex : 0 , -12, 328 réel 3.14, 2.3 e+4 • Remarques : Pas de booléen (vrai, faux) Pas de type chaînes de caractères prédéfini

  18. Type caractère • Caractère : Symboles alphanumériques (a,z,!,1,9) + caractères spéciaux (retour à la ligne, beep, etc..) • Un caractère est représenté sur un octet (8 bits) suivant la table ASCII (American Standard Code for Information Interchange) • ex : 'a' = 9710 = 6116 = 0110 00012 • Table ASCII ex : code ASCII du 'A' = 65 'A'<'B'<……..< 'Z' '0'<'1'<'2'<…..<'9' 'a'<'b'<……….<'z' • Déclaration de variable de type caractère char c; c = 'a'; • Constante de type caractère #define caractère_a 'a'

  19. Table ASCII • Remarques : les chiffres sont codés suivant un ordre croissant (48 à 57) idem pour les lettres (65 à 90, 97 à 122) code des majuscules est inférieur au code des majuscules (différence constante = 32) les codes supérieurs à 128 dépendent de la langue : é, ö , ä, æ, œ etc… • Déclaration d'une variable caractère : char c; c='a'; …..

  20. Type caractère • Caractères spéciaux (retour à la ligne, tabulation etc..) • Exemple : retour à la ligne = CR = code ASCII 13 char retour; retour = 13; ou bien retour = '\n'; • Conventions \n : retour à la ligne \t : tabulation \f : nouvelle page \' : apostrophe \0 : caractère nul (indique la fin d'une chaîne de caractères)

  21. Les entiers : entiers naturels • Codage sur 2 ou 4 octets suivant le calculateur • Sur deux octets on peut coder les nombres de 0 à 216-1 (0 à 65535) • Nombre représenté en base 2, les bits sont rangés dans des cellules correspondant à leur poids, on complète à gauche par des 0 • Exemple : 13 = 8 + 4 +1 = 1*23+1*22+0*21+1*20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 • Déclaration d'une variable entier naturel x unsigned int x; short unsigned int x; (on force sur 16 bits) long unsigned int x; (on force sur 32 bits)

  22. Type entier relatif • Implantation sur 2 ou 4 octets suivant le compilateur • Représentation sur n bits : codage complément à 2 • Déclarations int a,b; …. a = 1; …. b= 3;

  23. Type entier relatif • Codage complément à 2 • Si xn-1 = 0 : nombre positif, xn-1 = 1 : nombre négatif • Exemple sur 16 bits +5 = 1 * 22 + 0 * 21 + 1 * 20 = 0000 0000 0000 0101 -3 = -32768 + 32765 = -215+ 214 + 213 + 212 + 211 + 210 + 29 + 28 + 27 + 26 + 25 + 24 + 23 + 1.22 + 0. 21 + 1.20 = 1111 1111 1111 1101 • Sur 16 bits (2 octets) -32768  x  32767 • Sur 32 bits -2147483648  x  2147483647

  24. Complément à 2 • Représentation non symétrique : le plus petit nombre n’a pas d’opposé : sur n bits • le plus grand entier positif est 2n-1-1 • le plus petit entier négatif est -2n-1 • sur 3 bits : 000 111 001 0 -1 1 110 -2 2 010 3 -3 -4 101 011 100

  25. Codage complément à 2 • Remarques 1/ Complément à 2 de x = Complément à 1 de x + 1 représentation de –3 ? 3 = 0000 0000 0000 0011 c1(3) = 1111 1111 1111 1100 +1 = 0000 0000 0000 0001 c1(3) +1= 1111 1111 1111 1101 2/ Représentation 16 bits = > 32 bits x >0 = 0000 0000 0000 0011 => x = 0000 0000 0000 0000 0000 0000 0000 0011 x <0 = 1111 1111 1111 1101 => x = 1111 1111 1111 1111 1111 1111 1111 1101 • Extensions int 2 ou 4 octets ? problème de portabilité short int x; 2 octets long int x ; 4 octets unsigned int x ; bit de signe utilisé unsigned short int x ; unsigned long int x ;

  26. Type réel • Déclaration float x,y; x = 3.14; y = 2.0 e+3; • Implantation sur 4 octets • Représentation suivant le compilateur en général mantisse exposant (norme IEEE) • 10-38 < x < 1038 • Extension : double x; x est codé sur 8 octets

  27. Nombre réels • Codage des réels : virgule flottante, Norme IEEE • flottant stocké sous la forme M * BE M : Mantisse ; B : Base ; E : Exposant • exemple : 123 . 103 = 123 000 • Représentation IEEE 754 (signe 1 bit, exposant et mantisse sur 32 ou 64 bits pour simple et double précision) • SM : signe de la mantisse : 1 bit • Eb : exposant biaisé : 8 ou 11 bits • M : Mantisse : 23 ou 52 bits SM Eb M

  28. Mantisse et exposant • Signe : bit de poids fort (0 = + ; 1 = -) • Exposant placé avant la mantisse pour simplifier les comparaisons (pour ceci il ne doit pas être représenté en complément à deux : -1 > 2) sur 8 bits : 0..256 sans signe mais biaisé de 127 (simple précision) : Eb = 1 ⇒ E = 1 – 127 = -126 Eb = 254 ⇒ E = 254 – 127 = 127 les exposants 255 (erreur) et 0 (nb dénormalisé) sont interdits • Mantisse normalisée : bit de poids fort n’est pas 0 et un seul chiffre avant la virgule • ex : 11,012 = 1,101 * 21

  29. SM Eb M f1,f2,……fn Virgule Flottante • Comme le bit de poids fort de la mantisse est nécessairement 1 : on ne l’indique pas (gaspillage de place), il est implicite • Mantisse partie fractionnaire = f1f2 …fn ⇒ m = 1,f1f2…fn nombre x = (-1)SM * 1,M * 2Eb-127 • Exemple x = (-2,5)10 = -1,01*212 SM = 1 ; E= 1 => Eb= 128 = 1000 0000 ; m=1,01 => M =010…….0 • Déclaration de variables réelles : float x; double y;

  30. Variables • Variable : élément de mémorisation élémentaire • Toutes les variables doivent être déclarées suivant un type int a, b; ou bien int a; int b; float x; char caractere; • Identificateur de variables (noms) Le premier caractères doit être une lettre Les autres caractères sont les lettres (majuscules et minuscules), les chiffres et le caractère _ Majuscule / minuscule significatifs • Exemples : Pi, pi3_14, a2B3 : corrects 2x,i-E : incorrects A1  a1

  31. Variables • Exemple : char a; int un; a = 'a'; un =1; a = '1'; • Initialisation des variables à l'exécution : int i; …. i = 0; à la compilation int i = 0;

  32. Conversion de types • Exemples : char c; int i; float f; // conversion entier vers char. c=98; // implicite : c prend le code ASCII 98 c-à-d ’b' c = (char) 98; // explicite plus propre // char vers entier i= 'a' ; // i prend la valeur 97 i= (int) 'a' ; //plus propre // entier vers réel f=3; // f prend la valeur 3.0; f=(float) 3; //+ propre //réel vers entier, attention : troncature i = 3.4; // i prend la valeur 3 i= -3.3; // i prend la valeur -3 i = (int) 3.4; // + propre

  33. Conversion de types : application • Passer au caractère suivant char c; c ='a'; c = c+1; // calcul fait en entier puis résultat converti en char c = (char) ((int) c+1) ; //+ propre • Conversions majuscule<-> minuscule char c; c='t'; // conversion en Majuscule c=c-32; // c contient 'T' ou mieux c=c-('a'-'A'); c=c+1; // c contient 'U' // conversion en minuscule c=c+32; ou c=c+('a'-'A') // conversion en Majuscule if ((c >= 'a') && (c <= 'z')) c = c-('a'-'A');

  34. Tableaux • Lorsque on veut mémoriser plusieurs données de même type, on peut utiliser un tableau c-à-d on regroupe sous un même nom plusieurs informations • Exemple de déclaration d'un tableau d'entiers inttab[100]; int : type des éléments du tableau tab : identificateur (nom du tableau) 100 : nombre d'éléments du tableau (dimension) tab peut recevoir 100 entiers identifiés de 0 à 99 (attention !) le premier est tab[0] le second tab[1] .. le dernier tab [99]

  35. Tableaux • Utilisation chaque élément du tableau est accessible par un indice qui doit être de type entier, quelque soit le type des éléments du tableau exemples : int i ; tab[2] 3eme élément du tableau tab[2+3] 6eme élément du tableau tab[i] i+1eme élément du tableau • Exemples : stocker les 100 premiers nombres pairs : 0,2,4,...,196,198 int i, t[100]; for (i=0; i < 100; i=i+1) t[i]= 2*i;

  36. Tableaux • Remarques: 1/ chaque élément du tableau s'utilise comme une variable tab[3] = 2; 2/ le nombre maximum d'éléments du tableau (dimension) 1/ doit être fixé à la compilation 2/ ne peut être modifié pendant l'exécution 3/ Pas d'opérations sur les tableaux en tant que tels

  37. Parcours des éléments d’un tableau Parcours du premier au dernier int i; /* l’indice de balayge doit être un entier */ float t[100]; /* le type du tableau est quelconque */ for (i=0; i < 100; i=i+1) // ou bien for (i=0; i <= 99; i=i+1) t[i]= …….; Parcours du dernier au premier int i; /* l’indice de balayge doit être un entier */ float t[100]; /* le type du tableau est quelconque */ for (i=99; i >= 0; i=i-1) // ou bien for (i=0; i <= 99; i=i+1) t[i]= …….;

  38. La dimension Bonne pratique de programmation int i; int t[100]; for (i=0; i < 100; i=i+1) t[i]= 100; Pb : modification du pgm, changement de la taille du tableau malaisée #define TAILLE 100 int i; int t[TAILLE]; for (i=0; i < TAILLE; i=i+1) t[i]= 100; Il suffit de changer TAILLE

  39. Exemples Point de l'espace 1ere solution : float x,y,z; 2eme solution float pt[3]; pt[0] pour x, pt[1] pour y, pt[2] pour z Mémorisation des 100 premiers nombres pairs et impairs: int pairs[100], impairs[100]; int i; for (i=0; i<100;i=i+1) { pairs[i]=2*i; impairs[i]=2*i+1; }

  40. 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 0 ? ? Chaînes de caractères • En c, pas de type prédéfini chaîne de caractères. En pratique on utilise des tableaux de caractères. • Convention : le dernier caractère utile est suivi du caractère \0 (de code ascii 0) • Exemples : char t[10]; (9 caractères max, puisque une case réservée pour \0; strcpy(t,"abcdefghi") chaque lettre est accessible par l'indice char t[12]; strcpy(t,"abcdefghi"); • Initialisation char t[12]= "abcdefghi"; ou char t[]= "abcdefghi"; • Constante chaîne de caractères #define ceciestuntexte "azssddqsdqsd"

  41. Définitions de type utilisateur typedef int entier; (entier est maintenant un type) entier i; typedef int tableaude20[20]; tableaude20 t;  int t[20];

  42. Les expressions en langage C

  43. Expressions : introduction • Remarque : expression  instruction • une instruction indique à l'ordinateur de mener une action • expression = élément syntaxique • Expressions : variable ou constante, ex : x, 3 constituées à l'aide d'opérateurs : x+ y conversion de type, opérateurs arithmétiques, de taille, relationnels et logiques, affectation, bit-à-bit, conditionnels, adresse

  44. Expressions • Une expression représente une donnée élémentaire : constante, variable, un élément de tableau, la référence à une fonction ou à une valeur, le résultat d'un calcul etc …. • Exemples 3 a+b x=y c = a+b x <= y x == y i++ sin(3.14) • Toute expression a une valeur

  45. Conversion de type • Conversion explicite : ( type ) expression Exemple : int a; float x; char c; a=2; x=(float) a; x=2.3; a= (int) (x+1); a = 98; c = (char) a; -> c='b' • Conversion implicite Exemple : int a; float x; char c; a=2; x= a; x=2.3; a= x+1; a = 98; c = a; -> c='b'

  46. Opérateurs arithmétiques • Opérateurs bi-opérandes + , - * , / , % (modulo) Les opérandes doivent être des valeurs numériques. entier opérateur entier -> résultat entier réel opérateur réel -> résultat réel entier opérateur réel -> résultat réel • Exemples int a,b; a=10; b= 3 a+b 13 a-b 7 a*b 30 a/b 3 (division euclidienne) a%b 1 float a,b; a=12.6; b= 3.0 a+b 13.6 a-b 9.6 a*b 37.8 a/b 4.2 (division réelle) a%b erreur de syntaxe

  47. Opérateurs arithmétiques • Opérateur % : - int a; flloat x; (a+x) % 4 incorrect. ((int) (a+x))%4 correct - si l'un des opérandes est négatif, le résultat est négatif. • Si l'un des opérandes est de type caractère, c'est la valeur du code ASCII qui est prise (conversion implicite char vers int ou float) • Conversion majuscule  minuscule Exemple : char c = 'a'; c = c+1; => c = 'b' mécanisme : c+1 = 98 + 1 =99 c = code ascii 99 = 'c' Exemple : char c ; if (c >= 'a' && c <='z') c = c-32 (ou bien c = c + 'A' –'a') if (c >= 'A' && c <='Z') c = c+32 (ou bien c = c - 'A' +'a')

  48. opérateurs arithmétiques • Opérateurs unaires (un opérande) a/ signe : + , - exemple : a = -a; b/ incrémentation, décrémentation : ++ (+1) , -- (-1) exemple : int i =1; ++i; printf("%d",i) ; -> 2; Syntaxes : ++i ou i++ ++i : la valeur de i est d'abord incrémenté, la valeur résultat est utilisée dans l'expression courante i++ : la valeur courante de i est utilisée dans l'expression courante, puis i est incrémenté

  49. ++ et -- • Exemples i=1; i=1; printf("i= %d\n",i); -> i=1 printf("i= %d\n",i); -> i=1 printf("i= %d\n",++i); -> i=2 printf("i= %d\n",i++); -> i=1 printf("i= %d\n",i); -> i=2 printf("i= %d\n",i); -> i=2 • Conclusions : 1/ appendre la règle (pour comprendre des programmes) 2/ à n'utiliser que lorsque il n'y a pas d'ambiguïté : x=y+z++; // à éviter x++; // pas de risque

More Related