2.08k likes | 2.25k Views
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.
E N D
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 Action 1 Action 12 Action 2
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
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
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
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
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
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
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
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
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
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
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
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"); }; …
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
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
Compîlteurs • Sur le web • ideone.com (pour le début) • En TP • Visual C++
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
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'
char 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'; …..
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)
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)
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;
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
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
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é pour la valeur unsigned short int x ; unsigned long int x ;
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
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, mantisse et exposant 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
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
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;
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
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;
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'
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
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');
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]
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;
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
Parcours des éléments d’un tableau Parcours du premier au dernier int i; /* l’indice de balayage doit être un entier */ float t[100]; /* le type du tableau est quelconque, ici réel */ 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) t[i]= …….;
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
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; }
'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"
Définitions de type utilisateur typedef int entier; (entier est maintenant un type) entier i; typedef int tableaude20[20]; tableaude20 t; int t[20];
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
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
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
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')
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é