12.07.2015 Views

Langage Ca - Pages de Michel Deloizy - Free

Langage Ca - Pages de Michel Deloizy - Free

Langage Ca - Pages de Michel Deloizy - Free

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

• ð structures contenant <strong>de</strong>s tableaux.13 Autres types• les types définis par le programmeur• type<strong>de</strong>f• void• type<strong>de</strong>f unsigned char byte;• type<strong>de</strong>f unsigned short word;• type<strong>de</strong>f unsigned long dword;14 Déclaration <strong>de</strong>s variables• char x ; ⇒ x est un caractère(sur 8 bits : [-128…+127])[• int i, j, k ;⇒ i, j et k sont <strong>de</strong>s entiers(sur 16 bits : [-32768…+32767])[• unsigned arthur ; ⇒ arthur est un entier non signé(sur 16 bits : [0…+65535])• unsigned char octet ; ⇒ octet est un caractère non signé(sur 8 bits : [0…+255])• char tab[10] ; ⇒ tab est un tableau pouvant contenir10 caractères• double f[5][3] ; ⇒ f est un tableau <strong>de</strong> 5 ligneset 3 colonnes (15 x double)15 Tableaux• Le premier élément d’un tableau est d’indice 0.• Rangement consécutif en mémoire (Ex. <strong>de</strong> tab[0] à tab[9])• Tableaux multi-dimensionnés: le <strong>de</strong>rnier indice « court » le plus vite :f[0][0], f[0][1], f[0][2], f[1][0], f[1][1], f[1][2], f[2][0], … , f[4][1], f[4][2]16 ConstantesTypesÉcrituresExemples<strong>Ca</strong>ractère‘x’ ‘A’, ‘=’, ‘\\’,‘‘\’’‘Entiernnn ou ±nnn421, 0, -12, +456Entier exprimé en octal 0nnn ou ± 0nnn 0712, 010, -057Entier hexadécimal0xnn ou 0xNN0x4A, 0x00ffdouble± nnn.nn ou ± nnnE ± nn 1.0, -4., 3E4, 1.6e-1919Chaîne <strong>de</strong> caractères"xxxxxx""Bonjour les amis"Remarque : \ est le caractère d‘échappement en C17 Constantes particulièresSéquenceSignificationExempleRésultat\r Retour chariot (en début <strong>de</strong> ligne).printfprintf(" ("\rbonjour")bonjour\n Saut à la ligne suivante. 0x0A printf("bonjour("bonjour\n") n") bonjourÉ\t Tabulation. 0x09printf("Rés.("Rés.\tMoy.\n")Rés.Moy. É\\ <strong>Ca</strong>ractère \ printf("valeur : \\10\\\n")valeur : \10\É\’ <strong>Ca</strong>ractère 'x='\''''-0x20x=39-3232 ⇒ x=7\" <strong>Ca</strong>ractère "printf("Il dit : \"Bof!\"\n")Il dit : "Bof!" ?\xnnNombre hexadécimal0x3B, 0xFA8 59, 4008\oooNombre octal (o : digit octal) \012,\03310, 2718 SuffixesSuffixe :sansU ou uL ou lF ou fEntierintunsigned intlongfloatVirgule flottantedouble- long double Float


• Exemples :12L : valeur 12 codée sur un type long40000u : codé sur un type unsigned int13.4 : constante double12.5f : constante float12UL : constante unsigned long intApplications :unsigned x = 120000UL*4/10000;long y = 15000L*4;19 Organisation générale d’un module20 Définition d’une fonction• Déclaration :• du nom <strong>de</strong> la fonction,• du type <strong>de</strong> valeur retournée par la fonction• <strong>de</strong>s noms et <strong>de</strong>s types <strong>de</strong>s arguments transmis.• Corps <strong>de</strong> la fonction (entre accola<strong>de</strong>s) :• déclarations <strong>de</strong> données locales à la fonction• blocs d'instructions• retour à la fonction appelante (avec un éventuel renvoi d'une valeur)21 Exempledouble somme(double a, double b){double res;res = a + b;return res;}22 Ancienne syntaxevoid init_glob( ( ){A=0;TOT=12E4;}double somme(a, b)double a, b;{double res;res = a + b;return res;}23double somme(double a, double b){double res;res = a + b;return res;}• ‘;’ omis en fin <strong>de</strong> ligne <strong>de</strong> définition• Paramètres transmis par valeur


24void init_glob(){A=0;TOT=12E4;}Fonction ne renvoie rien → void25somme(inta, int b){int s;s=a+b;return s;}Type <strong>de</strong> la fonction est omis → int26double pi(voidvoid){double x;x=atanatan(1.0)*4;return x;}Fonction non déclarée → intIci : inclure math.h27 Prototype• Permet d'indiquer :• le type <strong>de</strong> donnée retourné par une fonction• le nombre et le type <strong>de</strong>s arguments transmis.è Déclaration <strong>de</strong> fonction.Exemples <strong>de</strong> prototype :double sin(double);double somme(double a, double b);28 Blocs d’instructions• Constitué :• d'une instruction élémentaire terminée par un caractère ";"ou• d'un ensemble d'instructions élémentaires encadrées par <strong>de</strong>s accola<strong>de</strong>s; dans ce cas, le blocd'instructions peut comporter <strong>de</strong>s déclarations (locales à ce bloc).ou• d'un simple caractère ';'.''. Dans ce cas, l'instruction est vi<strong>de</strong> (sans effet).29 Exemplesx = 2*a + b;ou :


{x = 2;y = 4;z = x+y;}ou :{int i;i = 3;x = 2*(i++);y=i;}30 Opérateurs arithmétiques31 Opérateurs logiques32 Opérateurs d’affectationÉcritures possibles :x = (a=3)+1;met 3 dans a et 4 dans xx -= = (a+=10); augmente a <strong>de</strong> 10 et soustrait le résultat <strong>de</strong> x33 Opérateur ternaire34 Séquenceur35 Opérateurs unaires36 Expressions• Utilisent <strong>de</strong>s opérateurs selon leur prioritéExemple :x = 2*a + 3*b/4/c;ó37 Priorités38 Structures conditionnellesTests si … sinon …if (condition)bloc d'instructions à exécuter si la condition est vraieelsebloc d'instructions à exécuter si la condition est fausse


39 Structure itérative tant queBoucles tant que … faire :while (condition)bloc d'instructions à exécuter si la condition est vraie.Exemple :while(x k */switch (k) /* Test <strong>de</strong> k */{


→ Permet d'indiquer au compilateur le type à utiliserExemples :x = (long)a * b/c;void CopyDat(void*d, void *s, size_t sz){size_t i;for(i=0; i


• Initialisation <strong>de</strong> donnéeso Exemple :void fonctionZ(void){const char t1[ ]="toto est le plus beau";→ t1 est un tableau constant <strong>de</strong> 22 caractères→ la chaîne <strong>de</strong> caractères est chargée au démarrage du programme→ le contenu <strong>de</strong> t1 n'est pas modifiable}127• Initialisation <strong>de</strong> donnéeso Exemple :void fonctionW(void){char *t1="toto est le plus beau";→ t1 est un pointeur initialisé sur une chaîne <strong>de</strong> caractères constante (à chaque appel <strong>de</strong>fonctionW)}128• Initialisation <strong>de</strong> donnéeso Exemple :void fonctionY(void){static char *t1="toto est le plus beau";→ t1 est un pointeur initialisé au chargement du programme sur une chaîne <strong>de</strong> caractèresconstante→ t1 pourra être modifié (pour pointer sur une autre chaîne)}129• Initialisation <strong>de</strong> donnéeso Exemple :double tab[ ]={1.0, 3.0, 5.0, 7.0};char *mots[ ]={"toto","titi","tata",0};struct {char *nom;double val;} liste[100] = {{ "pi", 3.14 },{ "x", 200.12 },};130 Fonction main• Démarrage du programme• Renvoie une valeur entière au système d'exploitation→ co<strong>de</strong> d'erreur• Admet 3 paramètres :int main(intint argc, , char *argv*argv[ [ ], char *arge*arge[ [ ])131 Exemple• Paramètres "transmis" par le système d'exploitation• argc : nombre <strong>de</strong> paramètres sur la ligne <strong>de</strong> comman<strong>de</strong> (à l'invocation du programme)• argv : chaînes <strong>de</strong> caractères contenant les paramètres• arge : variables d'environnement


pgm.exe –x3toto.dat titi.out• argc = 4• argv[0]="[0]="pgm.exe"" (avec le chemin d'accès complet)• argv[1]="[1]="-x3"• argv[2]="[2]="toto.dat"• argv[3]="[3]="titi.out"132 Ponteurs <strong>de</strong> fonctionsNom <strong>de</strong> fonction → adresse <strong>de</strong> la fonction→ Pointeur <strong>de</strong> fonctionPeut être utilisé pour in<strong>de</strong>xer une fonction parmi plusieurs.Exemple :void TriBulle(intint t[ ], int nb);void TriInsertion(intint t[ ], int nb);void (*fctTrifctTri)( )(intt[ ], int nb);…int tab[ ] = {1, 4, 0, -1, 2};fctTri = TriBulle;fctTri(tab,(tab,sizeof(tab)/sizeof(*tab));fctTri = TriInsertion;fctTri(tab,(tab,sizeof(tab)/sizeof(*tab));133 Allocation dynamique <strong>de</strong> mémoire→Quand un espace mémoire m moire est requis, <strong>de</strong> taille inconnue lors <strong>de</strong> la conception duprogramme→Pour optimiser l'utilisation <strong>de</strong> la mémoiremmoire→Deman<strong>de</strong> <strong>de</strong> mémoire m moire à l'environnementFonctions :134 Exemple• void * malloc(size_tsz);Renvoie un pointeur sur la zone allouéeou NULL si pas d'espace disponible• void free(void* ptr);Libère l'espace mémoire m moire attribué par mallocint nb, , *tab;printf("Nombre <strong>de</strong> valeurs à acquérir :");scanf("%d",&("%d",&nb);tab = malloc(nbnb*sizeof(*tab));if(tab!=NULL) {int i;for(i=0; i


• Gestion par va_list, va_start, va_arg, va_end→ définis dans stdarg.h136 Exemplevoid ErrPrintf(int ext, const char *fmt, …){va_list ap;printf(ext ? "Erreur : " : "Avertissement : ");va_start(ap,fmt);vprintf(fmt,ap);va_end(ap);if(ext) exit(ext);}…F = fopen(nf="toto.dat","r");if(F==NULL) ErrPrintf(1,"Le fichier '%s' ne peut être ouvert.\n",nf);…137 Signal• Gestion d'événements exceptionnels• Défini dans signal.hvoid (*signal(intint sig, void (*handlerhandler)( )(int)))(int);138 <strong>Langage</strong> CSignaux :Détermine la façon dont les signaux ultérieurs seront traités.handler : fonction <strong>de</strong> traitement du signalFonctions prédéfinies :SIG_DFL : comportement par défautSIG_IGN : le signal sera ignoréRetour : handler ou SIG_ERR en cas d'erreurSIGABRT: arrêt anormalSIGFPE : erreur arithmétiqueSIGILL : instruction illégaleSIGINT : appel au système invali<strong>de</strong>SIGSEGV: accès mémoire interditSIGTERM: <strong>de</strong>man<strong>de</strong> d'arrêt du programmeQuand signal survient :1. Le comportement par défaut est rétabli2. La fonction handler est appelée3. Si la fonction rend la main, le programme se poursuit à l'endroit t où il avait été interrompu

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!