Le langage C − cours P.

TRAU

Le langage C − cours P.TRAU

Table des matières
1 Langage C........................................................................................................................................................1 2 Introduction (première partie)......................................................................................................................3 2.1 Organisation de l'ordinateur..............................................................................................................3 2.2 Langages de programmation.............................................................................................................3 3 Connaissances de base....................................................................................................................................5 4 Fonctions d'entrées/sorties les plus utilisées.................................................................................................7 5 La syntaxe du C .............................................................................................................................................10 5.1 Second exemple, définitions...........................................................................................................11 5.2 Variables / identificateurs / adresse / pointeurs..............................................................................12 5.3 Expressions / opérateurs.................................................................................................................12 5.3.1 Arithmétiques ..................................................................................................................13 5.3.2 Relationnels....................................................................................................................14 5.3.3 Affectation......................................................................................................................14 5.3.4 Opérateurs d'adresses......................................................................................................15 5.3.5 Autres..............................................................................................................................15 5.3.6 Ordre de priorité et associativité.....................................................................................15 5.4 Instructions ......................................................................................................................................16 5.5 Structures de contrôle.....................................................................................................................17 5.5.1 Boucles ............................................................................................................................17 5.5.2 Branchements conditionnels...........................................................................................19 5.5.3 Branchements inconditionnels........................................................................................20 5.6 Déclaration et stockage des variables.............................................................................................21 5.6.1 Déclarations locales........................................................................................................21 5.6.2 Déclarations globales......................................................................................................23 5.6.3 Déclaration de type.........................................................................................................24 5.7 Fonctions.........................................................................................................................................25 5.7.1 Définitions générales......................................................................................................25 5.7.2 Récursivité, gestion de la pile.........................................................................................25 5.7.3 Arguments passés par adresse .........................................................................................26 5.7.4 La fonction main.............................................................................................................26 5.7.5 Fonction retournant un pointeur et pointeur de fonction................................................27 5.8 Les types de données du C..............................................................................................................27 5.8.1 Variables scalaires..........................................................................................................28 5.9 Tableaux ..........................................................................................................................................30 5.9.1 Tableaux unidimensionnels............................................................................................30 5.9.2 Tableaux et pointeurs / arithmétique des pointeurs........................................................30 5.9.3 Chaînes de caractères......................................................................................................32 5.9.4 Bibliothèques de fonctions pour tableaux et chaînes......................................................32 5.9.5 Allocation dynamique de mémoire.................................................................................33 5.9.6 Tableaux multidimensionnels.........................................................................................33 5.10 Structures et unions.......................................................................................................................34 5.10.1 Déclaration....................................................................................................................34 5.10.2 Utilisation ......................................................................................................................34 5.10.3 Champs de bits..............................................................................................................35 5.10.4 Unions...........................................................................................................................35 5.10.5 Structures chaînées.......................................................................................................35

i

Le langage C − cours P.TRAU

Table des matières
6 Les fichiers de données.................................................................................................................................39 6.1 Fichiers bruts ...................................................................................................................................39 6.2 Fichiers bufférisés...........................................................................................................................41 7 Directives du pré−compilateur....................................................................................................................43 8 Utiliser Turbo C (3.5 par exemple).............................................................................................................45 9 Liens vers d'autres sites sur le C.................................................................................................................47 10 Correction des exercices..............................................................................................................................48 10.1 1. while_puiss................................................................................................................................48 10.2 2. while_err....................................................................................................................................48 10.3 3. do_while .....................................................................................................................................48 10.4 4. for...............................................................................................................................................49 10.5 5. jeu ...............................................................................................................................................49 10.6 6. calcul..........................................................................................................................................50 10.7 7. moyenne.....................................................................................................................................50 10.8 8. rotation.......................................................................................................................................51 10.9 9. classer .........................................................................................................................................52 10.10 10. chaînes ....................................................................................................................................53 10.11 11. matrices..................................................................................................................................53 10.12 12. determinant............................................................................................................................55 10.13 13. tel...........................................................................................................................................56 10.14 14. liste et insertion......................................................................................................................58 10.15 15. agenda....................................................................................................................................60 11 Langage C − Index .....................................................................................................................................63 11.1 A .....................................................................................................................................................63 11.2 B.....................................................................................................................................................63 11.3 C.....................................................................................................................................................63 11.4 D .....................................................................................................................................................64 11.5 E.....................................................................................................................................................64 11.6 F.....................................................................................................................................................64 11.7 G .....................................................................................................................................................65 11.8 H .....................................................................................................................................................65 11.9 I......................................................................................................................................................65 11.10 K ...................................................................................................................................................65 11.11 L...................................................................................................................................................65 11.12 M..................................................................................................................................................66 11.13 N ...................................................................................................................................................66 11.14 O ...................................................................................................................................................66 11.15 P...................................................................................................................................................66 11.16 Q ...................................................................................................................................................66 11.17 R...................................................................................................................................................66 11.18 S...................................................................................................................................................67 11.19 T...................................................................................................................................................67 11.20 U ...................................................................................................................................................67 11.21 V ...................................................................................................................................................67 11.22 W..................................................................................................................................................68

ii

qui peut encore se développer. mais pas encore rédigées : utilisation des objets C++. les méthodes et moyens utilisés pour optimiser des algorithmes. ce qui ne lui permettra pas d'être le langage optimal pour les machines massivement parallèles (mais aujourd'hui il n'existe pas encore de langage universel pour ce type de machines qui puisse combiner efficacement des calculs procéduraux et du déclaratif). gestion d'un liste dynamique à l'aide d'un tableau). avec de nombreux exemples directement dans le texte. seuls les exemples sont en C. l'informatique est présente dans tous les domaines de la vie courante. Mais son principal avantage est que ces trois types de programmation peuvent être combinés dans un même programme. − la disponibilité de logiciels dans tous les domaines. A l'inverse. pour de très grosses industries. Le domaine intermédiaire. programmation graphique évennementielle (Microsoft Windows. Elle est importante du fait de la nécessité du graphisme dans les programmes. c'est un langage structuré. et d'être séquentiel. ce qui est nécessaire pour accéder aux interfaces entre l'ordinateur et son extérieur. Il y a pour cela trois grandes raisons : − les gains (en temps. Mais il permet également (avec son extension C++) de gérer des objets. − le prix abordable des matériels. pour ces cas pratiques. il permet également une programmation proche du langage machine. tout en restant portable sur tous les ordinateurs existants. Elle n'est pas spécifique. Mais elle détaille également. le C est souvent le meilleur choix. concerne les programmes spécifiques. En effet. qualité) que l'informatique peut apporter. Le langage C a néanmoins deux inconvénients majeurs. Ceci est la première partie du livre "Programmation en C.1 Langage C Le Langage C Aujourd'hui. d'un coût total important et donc limités à des sujets très pointus. le méthodes utilisées pour parvenir au même résultat sont précisées (par exemple. langage et algorithmes". c'est d'être un peu plus complexe d'utilisation (mais uniquement du fait de ses nombreuses possibilités). Les fonctionnalités du C non disponibles dans d'autres langages sont analysées. pour des applications de moindre importance. Deux domaines sont pleinement exploités : − les logiciels généraux. * La troisième partie quand à elle traite des algorithmes d'infographie. Pour les autres cas. avec toutes les possibilités des autres langages structurés. Les tableurs et bases de données par exemple disposent désormais de véritables langages de programmation (souvent orientés objets) qui vont plus loin que les précédents langages de macro−commandes. mais à des degrés différents. vendus en grande série. − les logiciels spécifiques. X−Windows) 1 Langage C 1 . * La première définit le langage C. * La seconde partie traite des structures de données et des algorithmes. * Les parties que j'ai prévues. argent. Une bibliothèque graphique est fournie en annexe. le texte et les algorithmes restent utilisables dans tout langage séquentiel. et donc relativement bon marché. il est nécessaire de disposer de langages de programmation. qui est composé de trois parties. et certains supplémentaires en annexe. Pour cela.

Le langage C − cours P.TRAU • Introduction (première partie) • Connaissances de base • Fonctions d'entrées/sorties les plus utilisées • La syntaxe du C • Les fichiers de données • Directives du pré−compilateur • Utiliser Turbo C (3.5 par exemple) • Correction des exercices • Autres sites sur le C • Sommaire 1 Langage C 2 .

uniquement sur des entiers. * l'exécuter. dans les Laboratoires BELL. cette norme apportant un nombre non négligeable de modifications au langage. et à très peu de choses : * addition. si plusieurs modules ont été compilés séparément. * comparer des nombres. en particulier FORTRAN (FORmula TRANslator) pour le calcul scientifique et COBOL pour les applications de gestion. qui ont défini en 78.2 Introduction (première partie) • Organisation de l'ordinateur • Langages de programmation 2. la séquence (la suite ordonnée) des ordres à effectuer l'un après l'autre. Puis ce langage a été normalisé en 88 (norme ANSI). l'édition de liens (LINK ou BIND). des langages dits "évolués" ont été mis au point pour faciliter la programmation. Le but principal était de combiner une approche structurée (et donc une programmation facile) avec des possibilités proches de celles de l'assembleur (donc une efficacité maximale en exécution. les règles de base de ce langage. L'ordinateur ne comprenant que des ordres codés en binaire (le langage machine). quitte à passer plus de temps de programmation). 2. mais la phase de mise au point sera plus complexe.2 Langages de programmation Un ordinateur est une machine bête. * le traduire en langage machine (c'est à dire en codes binaires compréhensibles par l'ordinateur) : c'est la compilation et. dans "The C Language". multiplication en binaire. à l'avance. Sa puissance vient du fait qu'il peut être PROGRAMME. Le C a été développé conjointement au système d'exploitation UNIX. Contrairement à un basic interprété. Bien que le langage soit normalisé. Le C est un langage compilé. tout est partageable) − Réseau : plusieurs CPU et MC non partageable (sauf réseau de multipostes). tout en restant standard (c'est à dire pouvoir être implanté sur n'importe quelle machine). un certain nombre de points dépendent de la machine et du compilateur utilisé (par exemple comment appeler le compilateur). Ces indications ne seront pas données ici. Ce dernier (comme le C) favorise une approche méthodique et disciplinée (on dit "structurée"). c'est à dire que l'on peut lui donner. ont été créés le BASIC.1 Organisation de l'ordinateur − Multipostes : plusieurs consoles sur un même ordinateur (CPU puissant. par Brian W Kernigham et Dennis M Ritchie. pour une approche simple de la programmation. au début des années 60. c'est à dire qu'il faut : * entrer un texte dans l'ordinateur (à l'aide d'un programme appelé EDITEUR). pour des besoins pédagogiques principalement. l'exécution sera beaucoup plus rapide puisqu'il n'y a plus de traduction à effectuer. Par contre. MdM et périphériques partageables ou locaux. Le grand avantage de l'ordinateur est sa rapidité. * sortir un résultat ou lire une valeur binaire (dans une mémoire par exemple). soustraction. Puis. et PASCAL au début des années 70. ne sachant qu'obéir. Si vous avez 2 Introduction (première partie) 3 . c'est le programmeur qui doit TOUT faire.

TRAU le choix. Il permet une mise au point aussi simple que si le langage était interprété 2 Introduction (première partie) 4 . je vous conseille TURBO C. le plus pratique d'emploi (en particulier parce qu'il possède son propre éditeur de texte).Le langage C − cours P.

T. c'est à dire réel (type dit à virgule flottante. scanf attend que l'on entre une valeur au clavier.TTC. Ces transformation sont faites dans une première passe (appelée pré compilation)."). * un "bloc d'instructions". Dans ce cas on ne possède qu'une seule fonction. * des instructions. %f\n". Une instruction est un ordre élémentaire que l'on donne à la machine. toutes terminées par un . sous format réel (%f). Détaillons les 4 instructions de notre programme : puts affiche à l'écran le texte qu'on lui donne (entre parenthèses. c'est à dire des remplacements d'un texte par un autre sans chercher à en comprendre la signification. Dans cet exemple il s'agit de puts. ici float. comme tout ce que l'on donne à une fonction. délimité par des accolades {}. le réel (float) et le caractère (char).TTC). } On trouve dans ce programme : * des directives du pré processeur (commençant par #) #include : inclure le fichier définissant (on préfère dire déclarant) les fonctions standard d'entrées/sorties (en anglais STanDard In/Out). scanf et printf. et entre guillemets. à condition d'avoir choisi des noms de variables suffisamment différents (et de plus d'une lettre). Une faute de frappe devrait donc être facilement détectée. puis la met dans la mémoire (on préfère dire variable) HT.C.T.. TTC=HT*(1+(TVA/100)). scanf. scanf("%f". d'où ce nom). elle définit le "point d'entrée" du programme. ainsi que son type. ces trois lettres seront remplacées par 18. que l'on se réserve pour notre programme. qui feront le lien entre le programme et la console (clavier/écran).6 void main(void) { float HT. ici soit par appel de fonctions (puts. On définit le nom que l'on choisit pour chaque variable. printf("prix T. * une entête de fonction. #define : définit une constante. Cette ligne est obligatoire en C.3 Connaissances de base regardons ce petit programme : #include <stdio. le mot TVA.6. la fonction principale (main function). On ne peut jamais utiliser de variable sans l'avoir déclarée auparavant. dans sa traduction de la suite du fichier en langage machine. puts ("veuillez entrer le prix H. A chaque fois que le compilateur rencontrera. Une variable est un case mémoire de l'ordinateur. c'est à dire l'endroit où débutera l'exécution du programme. printf) soit par affectation (=). Les trois types scalaires de base du C sont l'entier (int). et comportant : * des déclarations de variables. comme toute constante texte en C). 3 Connaissances de base 5 . qui manipulera les données (variables) du programme. sous la forme : type listevariables.h> #define TVA 18. où l'on ne fait que du "traitement de texte".&HT).

TRAU une affectation : on commence par diviser TVA par 100 (à cause des parenthèses). en faisant tous les calculs nécessaires.Le langage C − cours P. puis on y ajoute 1. puis on le multiplie par le contenu de la variable HT. Une affectation se fait toujours dans le même sens : on détermine (évalue) tout d'abord la valeur à droite du signe =. printf affichera enfin le résultat stocké dans TTC. aucune opération. Le résultat de ce calcul est stocké (affecté) dans la variable cible TTC. puis elle est transférée dans la mémoire dont le nom est indiqué à gauche du =. 3 Connaissances de base 6 . mais à sa gauche seul un nom de variable est possible. On peut donc placer une expression complexe à droite du =.

{ char caractere. Printf retourne le nombre de 4 Fonctions d'entrées/sorties les plus utilisées 7 . stdout est l'écran. ou un fichier si on a redirigé l'écran (en rajoutant >nomfichier derrière l'appel du programme. Les entrées sorties.H on trouve les fonctions de base de gestion de la console : putch(char) : affiche sur l'écran (ou du moins stdout) le caractère fourni en argument (entre parenthèses). Si besoin est.listevaleurs) affiche la liste de valeurs (variables ou expressions) dans le format choisi. Le format est une chaîne de caractères entre guillemets (doubles quote "). ce n'est pas ainsi que getche est réellement défini. dans l'ordre donné dans listevaleurs. Tous les caractères peuvent être entrés. getche(void) : idem getch mais avec écho. caractere=getch(). Dans CONIO. En cas de redirection du clavier. on peut donc les utiliser tout en restant portable. et peut donc encore être modifié. Les entrées sont dites "bufférisées".H.H et STDIO. Nous détaillerons ici deux bibliothèques : CONIO.h).4 Fonctions d'entrées/sorties les plus utilisées Le langage C se veut totalement indépendant du matériel sur lequel il est implanté. dans laquelle se trouve un texte qui sera écrit tel quel. et les transformer pour en faire une chaîne de caractères ou une valeur numérique. La saisie est terminée par un retour chariot. c'est à dire que rien n'est affiché à l'écran. On a simplement prévu des bibliothèques de fonctions de base. avant le retour chariot. pouvant traiter plusieurs caractères à la suite (par les fonctions de conio. on prend le prochain caractère dans le fichier d'entrée. c'est à dire que le texte n'est pas transmis. getch(void) : attend le prochain appui sur le clavier. putch(caractere). cette fonction rend le caractère affiché ou EOF en cas d'erreur. la chaîne de caractères puis positionne le curseur en début de ligne suivante. L'appui sur une touche se fait sans écho. des spécifications de format (débutant par %) qui seront remplacées par la valeur effective des variables. c'est à dire que sur chaque compilateur on dispose de ces bibliothèques. ne font donc pas partie intégrante du langage. sous DOS ou UNIX). puts retourne EOF en cas d'erreur. et de caractères spéciaux (\). y compris les blancs. sur stdout. contenant les même fonctions (du moins du même nom et faisant apparemment la même chose.H. et rend le caractère qui a été saisi. entière ou réelle par exemple. Dans STDIO. Gets retourne un pointeur sur le premier caractère entré (donc égal à son paramètre d'entrée. puts(chaîne) affiche. On pourrait réécrire cette fonction en fonction des deux précédentes : char getche(void). gets(chaîne) lecture d'une chaîne sur stdin. return(caractere). } ou même {return(putch(getch))} Dans la pratique. bien que nécessaires à tout programme (il faut lui donner les données de départ et connaître les résultats). printf(format. mais programmées différemment en fonction du matériel). ou le pointeur NULL en cas d'erreur (fin du fichier stdin par exemple). mais en assembleur pour un résultat plus rapide. Ces bibliothèques ont été définies par la norme ANSI. on trouve des fonctions plus évoluées. qui sont néanmoins standardisées.

u (entier non signé). La largeur est le nombre minimal de caractères à écrire (des blancs sont rajoutés si nécessaire). CR). e ou E (réel en notation exponentielle).précision][modificateur]type (entre [] facultatifs) Le flag peut valoir : − (cadrage à gauche. scanf s'arrête avant s'il trouve un séparateur (blanc. la suite servira au prochain scanf. + (impression du signe. double pour les réels). des séparateurs blancs (l'utilisateur devra taper un ou plusieurs blancs.&i. Les caractères spéciaux utilisables dans le format sont \t (tabulation). tab. L (long double pour les réels). tabulations. si scanf a pu lire tous ses arguments sans arriver à la fin de la ligne. D. x ou X (entier affiché en hexadécimal).réel)).listeadresse) lecture au clavier de valeurs.X pour long). le nombre de chiffres après la virgule (doit être inférieur à la largeur). rajout de blancs si nécessaire à droite). pour plus de détails voir l'aide en ligne de Turbo C. indique le nombre minimal de chiffes désiré (ajout de 0 sinon). jusqu'au ###BOT_TEXT###). retours à la ligne). on peut donc séparer par des CR plusieurs valeurs demandées dans le même scanf. On ne pourra donc pas entrer une chaîne avec des blancs par scanf. comme la largeur. getchar(void) fonctionne comme getche. il est néanmoins écrit en totalité. le blanc est également un séparateur. En donnant le signe * comme largeur. pour les réels. scanf(format. f (réel en virgule fixe). D'autres Flags sont possibles mais moins utiles. Mais de même. \nb tout code ASCII.o. dans le format spécifié.TRAU caractères écrits. 0 (la justification d'un nombre se ferra par rajout de 0 à gauche au lieu de blancs). \n (retour à la ligne).largeur. % (pour afficher le signe %).Le langage C − cours P. Utilisez gets(bidon) avant (pour être sur de commencer sur une nouvelle ligne) ou après scanf (pour ignorer la fin de la ligne) si nécessaire. elle indique la longueur maximale imprimée (tronqué si trop long). et ne sera pas stocké). La précision peut. le prochain argument de la liste de valeurs donnera la largeur (ex printf("%*f". blanc (impression d'un blanc devant un nombre positif. pour les entiers). * signifie que la valeur sera lue mais ne sera pas stockée (ex scanf("%d%*c%d". La précision définit. Les arguments sont des pointeurs sur les variables résultats (dans le cas de variables scalaires. On dispose aussi de sprintf(chaîne.x : pour entiers short. en décimal. alors que pour une chaîne (%s). d (int). format. Une spécification de format est de la forme : % [flag][largeur][. les précéder par l'opérateur &). Scanf retourne le nombre de valeurs effectivement lues et mémorisées (pas les %*). Scanf lit dans stdin en considérant les retours chariot (CR) comme des blancs.* Le modificateur peut être : h (short. Dans le cas des chaînes (%s). \ (signe \). même pour les positifs). mais utilise le même tampon que scanf. Le format peut contenir (entre ") : du texte (il devra être tapé exactement ainsi par l'utilisateur. l (long pour les entiers. Si le texte à écrire est plus long. les modificateurs et types sont les mêmes que pour printf (excepté d. Le type est : c (char). sous la forme %[*][largeur][modificateur] type. o (entier affiché en octal). ou EOF en cas de problème. il faut utiliser gets.O. s (chaîne de caractères. être variable en donnant . hexa ou octal (2=###BOT_TEXT###40=###BOT_TEXT###x20=' '). listevaleurs) qui permet d'écrire dans une chaîne plutôt que sur 4 Fonctions d'entrées/sorties les plus utilisées 8 . p (pointeur). g ou G (réel en f si possible. et des spécifications de format.&j) : lecture de deux entiers séparés par n'importe quel caractère) la largeur est la largeur maximale lue. Dans la cas d'entiers. à la place du signe). e sinon).

l isteadresse) qui lit dans une chaîne plutôt qu'au clavier. On possède encore d'autres fonctions dans STDIO. et donc faire des conversions numériques −>ASCII. en particulier pour gérer les fichiers. et de sscanf(chaîne. 4 Fonctions d'entrées/sorties les plus utilisées 9 .TRAU l'écran. format.Le langage C − cours P.

gestion de la pile ♦ Arguments passés par adresse ♦ La fonction main ♦ Fonction retournant un pointeur et pointeur de fonction • Les types de données du C ♦ Variables scalaires ◊ char : caractère (8 bits) ◊ int : entier ◊ float : réel ◊ Tailles et plages ◊ Conversions de type / cast ◊ Enumérations 5 La syntaxe du C 10 . définitions • Variables / identificateurs / adresse / pointeurs • Expressions / opérateurs ♦ Arithmétiques ◊ unaires ◊ deuxaires ♦ Relationnels ◊ comparaisons ◊ logique booléenne ◊ binaires ♦ Affectation ◊ affectation simple = ◊ incrémentation / décrémentation ◊ affectation élargie ♦ Opérateurs d'adresses ♦ Autres ◊ conditionnel ? : ◊ séquentiel . ♦ Ordre de priorité et associativité • Instructions • Structures de contrôle ♦ Boucles ◊ While (tant que) ◊ Do While (faire tant que) ◊ For (pour) ♦ Branchements conditionnels ◊ If − Else (Si − Sinon) ◊ Switch − Case (brancher − dans le cas) ♦ Branchements inconditionnels ◊ Break (interrompre) ◊ Continue (continuer) ◊ Goto (aller à) ◊ Return (retourner) ◊ Exit (sortir) • Déclaration et stockage des variables ♦ Déclarations locales ♦ Déclarations globales ♦ Déclaration de type • Fonctions ♦ Définitions générales ♦ Récursivité.5 La syntaxe du C • Second exemple.

) * de déclarations globales (terminées par un . float s) { varglob++. /* déclaration locale */ varglob=0.float). définitions 11 . affiche_calcul(a.varloc). scanf("%f %f".float y) { float varloc. int varglob. void main(void) { float a. terminées par un retour à la ligne (pas de . puts("veuillez entrer 2 valeurs").Le langage C − cours P. } Un programme C est composé : * de directivess du pré−processeur.h> void affiche_calcul(float. printf("nombre d'appels à produit : %d\n". commençant par #.1 Second exemple.b. écrites les unes après les autres (sans imbrication comme on le ferait en Pascal) Les fonctions sont écrites sous la forme : entête { corps } L'entête est de la forme : type_résultat nom (arguments) . return(r*s). Le type_résultat n'était obligatoire (avant la norme 5.float).) * d'une suite de fonctions. } void affiche_calcul(float x. définitions Considérons le programme ci−dessous : #include <stdio. } float produit(float r.y).1 Second exemple. varloc=produit(varloc. printf("le carré du produit est %f\n". /* prototype */ float produit(float.&b).TRAU • Tableaux ♦ Tableaux unidimensionnels ♦ Tableaux et pointeurs / arithmétique des pointeurs ♦ Chaînes de caractères ♦ Bibliothèques de fonctions pour tableaux et chaînes ♦ Allocation dynamique de mémoire ♦ Tableaux multidimensionnels • Structures et unions ♦ Déclaration ♦ Utilisation ♦ Champs de bits ♦ Unions ♦ Structures chaînées 5.&a.b). varloc=produit(x.varloc).varglob).

de chiffres et du caractère _ (souligné).). on pourra y stocker une valeur. On appelle pointeur une variable dans laquelle on place (mémorise) une adresse de variable (où elle est) plutôt qu'une valeur (ce qu'elle vaut). les commentaires ne peuvent donc pas être imbriqués. opérateur. 5. Le nom de cette variable est choisi par le programmeur. 5.. Si la fonction ne nécessite aucun argument. Les commentaires sont une portion de texte commençant par /* et finissant par le premier */ rencontré.TRAU ANSI) que s'il était différent de int (entier). s'ils existent. ainsi qu'un type (on a précisé ce qu'on mettra dans cette variable (entier. on retrouve facilement l'adresse des différentes composantes par une simple addition. L'endroit où le compilateur a choisi de mettre la variable est appelé adresse de la variable (c'est en général un nombre. et la modifier au cours du programme..Le langage C − cours P. mais pas 1ere_valeur. Les types de variables scalaires simples que l'on utilise le plus couramment sont le char (un caractère). et d'instructions. Une fonction est un bout de programme (que vous avez écrit ou faisant partie d'une bibliothèque) auquel on "donne" des valeurs (arguments). En C. ou du moins (). Les arguments. chaque mémoire d'un ordinateur étant numérotée de 0 à ? ).. On considère comme blanc : soit un blanc (espace). . Les identificateurs doivent suivre quelques règles de base : il peut être formé de lettres (A à Z).). l'int (entier) et le float (réel). Une expression de base peut donc être un appel à une fonction (exemple sin(3. en connaissant son adresse (son début). soit plusieurs de ceux−ci. La plupart des compilateurs acceptent n'importe quelle longueur d'identificateurs (tout en restant sur la même ligne) mais seuls les 32 premiers caractères sont significatifs. Cette adresse ne nous intéresse que rarement de manière explicite. On préfère utiliser le terme identificateur plutôt que nom. à laquelle on a donné un nom. dans une autre expression. toutes terminées par un . Le blanc est donc interdit dans un identificateur (utilisez _). mais un commentaire peut comporter n'importe quel autre texte. Ce résultat pourra servir. mais souvent de manière indirecte. Il doit désormais être void (rien) si la fonction ne renvoie rien (dans un autre langage on l'aurait alors appelé sous−programme.. Le premier caractère doit être une lettre (ou _ mais il vaut mieux le réserver au compilateur). dans un tableau.2 Variables / identificateurs / adresse / pointeurs 12 . caractère. réel.1416). Un identificateur se termine soit par un blanc. des appels de fonction et des constantes combinés entre eux par des opérateurs (ex : MaVariable*sin(VarAngle*PI/180) ). . soit par un signe non autorisé dans les identificateurs (parenthèse.. chaque caractère étant représenté par son numéro de code ASCII. le compilateur va lui réserver en mémoire la place nécessaire à un entier (2 octets en Turbo C). car il permet d'identifier tout objet que l'on voudra utiliser (pas seulement les variables). pour que le compilateur puisse lui réserver la quantité de mémoire nécessaire. il faut indiquer (void) d'après la norme ANSI. Par exemple. soit un commentaire. voire comme 5. Les lettres accentuées sont également interdites. les minuscules sont différentes des majuscules (SURFace et surFACE désignent deux objets différents). ou sous−routine). y compris sur plusieurs lignes. entre parenthèses et séparés par des virgules. Dans cette variable. Exemple : int a. soit un retour à la ligne. Par exemple valeur1 ou prem_valeur sont possibles. Une expression comporte des variables. si nécessaire. procédure. La fonction fait un calcul sur ces arguments pour "retourner" un résultat. composé d'éléments consécutifs en mémoire. soit une tabulation. Le char est en fait un cas particulier des int.2 Variables / identificateurs / adresse / pointeurs On appelle variable une mémoire de l'ordinateur (ou plusieurs). a est une variable entière. Le corps est composé de déclarations de variables locales. sont passés par valeur. Le blanc est alors autorisé mais non obligatoire.3 Expressions / opérateurs Une expression est un calcul qui donne une valeur résultat (exemple : 8+5).

0 −> 21. Le résultat est du même type que l'argument. les autres utilisent soit des entiers.y=2. et donc implicite de b en float.3. Dans le cas de fonctions devant modifier une variable. le compilateur prévoit une conversion implicite (vous ne l'avez pas demandée mais il la fait néanmoins) suivant l'ordre : { char −> int −> long −> float −> double } et { signed −> unsigned }.Le langage C − cours P.3.5). les opérations sont en fait faites sur les numéros de code (ASCII).b=2. 5.3. /* signe = donc en premier calcul de l'argument à droite : 7 (entier) / 2 (entier) donne 3 (entier. qui elles ne pourront que modifier les copies (et pas les paramètres réels). Ces opérateurs nécessitent deux arguments. Les arguments donnés à l'appel de la fonction (dits paramètres réels ou effectifs) sont recopiés dans le même ordre dans des copies (paramètres formels). /* 7 et b entiers => passage en réel inutile.1 Arithmétiques Ces opérateurs s'appliquent à des valeurs entières ou réelles. % (reste de la division). pour éviter des dépassements de capacité. je l'utilise parce que binaire est pour moi associé à la base 2. Les calculs arithmétiques sont faits uniquement soit en long soit en double. placés de part et d'autre de l'opérateur.. voir plus bas). calcul de 7/3 donne 2 (entier.TRAU argument d'une fonction exemple atan(tan(x)). reste 1) puis opérateur = (transformation du 2 en 2. il faut fournir en argument l'adresse (par l'opérateur &. /* un int et un float autour de / : transformation implicite de 7 en réel (7. a=(c*2)/1000. Lorsque les deux opérandes sont de type différent (mais numérique évidement).1.3. − (soustraction). /* calcul (entier) de a+1. soit des réels.c=32000.. les opérateurs possibles sont assez nombreux. puis transfert dans x */ x=((float)(a+1))/b. le résultat sera toujours du type des opérandes.0). le résultat est 64. puis transformation explicite en float.1 Arithmétiques 13 . bien que l'on soit passé par un résultat intermédiaire (64000) qui dépassait la capacité des entiers (mais pas celle des long) */ b=7/b.0 puis transfert dans X qui vaut donc 2. /* que des int. 5. % nécessite obligatoirement deux arguments entiers. Ce sont + (addition).666. float x=1. Les opérandes doivent être du même type. Pour former une expression.1.1 unaires Ce sont les opérateurs à un seul argument : − et + (ce dernier a été rajouté par la norme ANSI). */ 5. / (division). donc b=3 */ x=7/b. que l'on obtient par 5%2). division des deux réel (3. 5. comme par exemple pour scanf.2 deuxaires Le terme "deuxaire" n'est pas standard. division 65.0) */ x=7/y. exemples : int a=1. nous allons les détailler suivant les types de variables qu'ils gèrent. * (produit). On remarque qu'il considère les char comme des entiers. reste 1.0/3.

l'affectation (signe =) est une opération comme une autre. et 0 sinon. unaire). il y a conversion implicite en float). Le deuxième opérande n'est évalué que si le premier n'a pas suffi pour conclure au résultat (ex (a= =0)&&(x++<0) incrémente x si a est nul. >=. qui sera donc ajouté à 5 pour être mis dans a. Des deux côtés du signe opératoire.2 Relationnels 14 . et peut donc servir de Rvalue. Le résultat de l'expression est 7 (si l'on veut s'en servir). Exemple : (5<7)+3*((1+1)= =2) donne 4. <=.3.3. 2. voir plus loin). ~0 donne −1 (tous les bits à 1. Remarque : il ne faut pas confondre = et = =. >. Exemples : a=5 (met la valeur 5 dans la variable a. le résultat de l'opération est 2. << (décalage à gauche).3. le résultat de l'opération vaut 0 et est donc interprété par IF comme faux. la première affectation nécessite le calcul d'une Rvalue : 5+(b=2).2 Relationnels 5. vaut 0 si les deux opérandes sont nuls. Exemple : if (a=0) est toujours faux car quelle que soit la valeur initiale de a.Le langage C − cours P. le compilateur ne vous prévient pas si vous avez mis = au lieu de = = (= est aussi un opérateur.2. les résultats ne se limitent pas à 0 et 1. Opérateur unaire : ! (non). != (différent).3. dans le cas d'opérandes numériques si ce n'est pas le cas le compilateur effectuera une conversion implicite (la Lvalue doit être de type "plus fort" que la Rvalue). <.1 affectation simple = En C.3. L'opération d'affectation rend une valeur. Le résultat de l'opération est 0 si faux. Si a est float.3. un à droite. On peut utiliser ~ (complément. 1 si vrai (le résultat est de type int). Contrairement aux opérateurs relationnels.3. on l'écrase par la valeur 0. vaut 1 si les 2 opérandes sont non nuls. exemples : 7&12 donne 4 (car 0111&1100 donne 0100). 0 sinon) et || (OU.2 logique booléenne Le résultat est toujours 0 (faux) ou 1 (vrai).3. !arg vaut 1 si arg vaut 0. 1 sinon). le laisse intact sinon). celle qui a été transférée. 5.1 comparaisons Ces opérateurs sont deuxaires : = = (égalité). Celle ci comporte une addition. & (et). ^ (ou exclusif). Ils effectuent des opérations binaires bit à bit. 5. Il met donc 2 dans b. 5.TRAU 5. Opérateurs deuxaires : && (ET.3 binaires Ces opérateurs ne fonctionnent qu'avec des entiers. dont il évalue le premier opérande (5) puis le second (b=2). A vaut donc 7 et b. les opérandes devant être de type entier (si char conversion implicite). toute autre valeur étant considérée vraie. 8>>2 donne 32. et un à gauche (Lvalue) qui doit désigner l'endroit en mémoire où l'on veut stocker la Rvalue. transformation implicite) mais numérique (les caractères sont classés suivant leur numéro de code ASCII). 5.3 Affectation 5. y compris celui de signe). Elle nécessite deux opérantes. >> (décalage à droite. il faut deux opérandes de même type (sinon.2. appelé Rvalue. | (ou inclusif). le 2ème opérande est le nombre de décalages). 0 symbolisant faux.2. puis met le résultat dans b). mais le résultat sera différent de celui prévu. qui doit être une expression donnant un résultat d'un type donné. a=5+(b=2) (Le compilateur lit l'expression de gauche à droite. Les deux opérandes doivent être de même type. b=(a*5)/2 (calcule d'abord la Rvalue. Attention. Le compilateur ne peut pas remarquer une erreur (contrairement au Pascal ou Fortran) car les deux sont possibles.

3. p2=&i2. : champ d'une structure • −> : champ pointé exemple : supposons déclarer : int i1=1. Dans le cas d'une utilisation de cet opérateur dans une liste. la décrémentation −−a et a−− soustrait 1 à a. exemple : j=++i est équivalent à j=(i=i+1) 5. 5. <<= .(i++.k) i est modifié mais sa valeur n'est pas affichée.*p2=*p1.2 séquentiel . printf("%d\n". et c si a est faux.i>10. *= . %= . met dans p1 l'adresse de i1. &= .3.2 incrémentation / décrémentation ++a : ajoute 1 à la variable a.i2) affiche donc 1. On utilise • &variable : donne l'adresse d'une variable • *pointeur : réfère à la variable pointée (opérateur d'indirection) • . /= . puisqu'ils contiennent une adresse d'entier. la valeur finale de l'expression étant celle du second opérande. donc copier la valeur de i1 dans i2. 5. Il faut encore ici une Rvalue à droite et une Lvalue à gauche.6 Ordre de priorité et associativité opérateurs () [] −> . utilisez les parenthèses pour distinguer les signes . int *p1.TRAU 5.j++). ^= . p1=&i1. p2=p1. à l'adresse pointée par p2 mettre ce qui est pointé par p1. : exemple (inutile) : printf("%d %d". L'expression a?b:c vaut la valeur de b si a est vrai (entier.3. alors que p1 et p2 sont des pointeurs. différent de 0). Cet opérateur permet de regrouper deux sous expressions en une seule. On l'utilise pour évaluer deux (ou plus) expressions là où la syntaxe du C ne nous permettait que d'en mettre une. 5. printf("%d\n".3.3. a++ : ajoute 1 à la variable a. met la même adresse (celle de i1) dans p2. On effectue le premier opérande puis le second. |= a+=5 est équivalent à a=(a+5). 5.i++.Le langage C − cours P.3.3.3 affectation élargie += .5. i1 et i2 sont deux mémoires contenant un entier.3.5. −= .3.4 Opérateurs d'adresses Ces opérateurs sont utilisées avec des pointeurs. Exemple : max=a>b?a:b 5.j++).*p1) affiche ce qui est désigné (pointé) par p1 donc i1 donc 1. exemple : for(i=j=0.3 Affectation associativité −> 15 description . Le résultat de l'expression est la valeur finale de a (c'est à dire après incrémentation).i2=2. On l'appelle incrémentation préfixée. >>= . Le résultat de l'expression est la valeur initiale de a (c'est à dire avant incrémentation). de même.3.5 Autres 5. C'est l'incrémentation postfixée.*p2.1 conditionnel ? : C'est un (le seul) opérateur ternaire.

L'associativité définit l'ordre d'évaluation des opérandes.4 Instructions 16 ...TRAU ! ~ ++ −− − + & * (cast) */% +− >> << < <= > >= = = != & ^ | && || ?: = += −= *= etc.). Les opérateurs les plus prioritaires se verront évaluer en premier. 5. qui se compose uniquement d'un . (utilisé là où une instruction est nécessaire d'après la syntaxe). Un cas particulier est l'instruction vide. Seule la première forme est terminée par un . Les seules exceptions sont : • les opérateurs unaires. • L'affectation : on calcule l'opérande de droite. où le résultat de l'expression est la valeur de l'argument avant l'opération. le résultat est celui de l'opération. − soit une structure de contrôle (boucle. L'opérande est évalué puis l'opération est effectuée. sauf dans le cas de l'incrémentation / décrémentation postfixée.).. <− −> −> −> −> −> −> −> −> −> −> −> <− <− unaires (* pointeurs) multiplicatifs addition décalages relations d'ordre égalité binaire binaire binaire logique logique conditionnel (ternaire) affectation séquentiel Dans ce tableau.. • La virgule : la valeur à droite est calculée avant celle à gauche (en particulier lors d'un appel de fonction) • Les opérateurs logiques et conditionnel évaluent toujours leur premier argument. écrits à gauche de l'opérateur. puis on l'affecte à celui de gauche. Le résultat est la valeur transférée. les opérateurs sont classés par priorité décroissante (même priorité pour les opérateurs d'une même ligne). − soit un bloc d'instructions : ensemble de déclarations et instructions délimités par des accolades {}. Le second par contre n'est évalué que si c'est nécessaire.4 Instructions Une instruction peut être : − soit une expression (pouvant comprendre une affectation. un appel de fonction.. Un bloc sera utilisé à chaque fois que l'on désire mettre plusieurs instructions là où on ne peut en mettre qu'une. 5. .Le langage C − cours P. La plupart se font de gauche à droite ( 4/2/2 donne (4/2)/2 donc 1 (et pas 4/(2/2))). terminé par un . branchement. qui en fait signifie "on peut oublier le résultat de l'expression et passer à la suite".

Tant qu'elle est vraie.5 Structures de contrôle 17 . les instructions s'effectuent séquentiellement.5 Structures de contrôle Normalement. seul).&nombre). } Exercice (while_puiss) : faire un programme qui affiche toutes les puissances de 2. if (!(++compte%tous_les)) printf("valeur obtenue %12.1 While (tant que) structure : while (expression) instruction Tant que l'expression est vraie (!=0). on effectue l'instruction.2f à 1%% près\n". le branchement conditionnel et la boucle. dès qu'elle est fausse.1 Boucles Une boucle permet de répéter plusieurs fois un bloc d'instructions. compte).). racine). c'est à dire l'une après l'autre. L'expression est au moins évaluée une fois. nombre.tous_les. Pour accéder à une autre instruction que la suivante. scanf("%d".(float)(debut+(compte*pas)).2f en %d calculs\n". Exercice (while_err) : que fait ce programme ? #include <stdio. au lieu de %6.TRAU 5.01. exemple : #include <stdio. puts("entrez un nombre réel entre 0 et 10").01 void main(void) { float nombre=debut.5. on a trois solutions : le branchement inconditionnel. bloc (entre {}) ou vide (. int compte=0.Le langage C − cours P. puts("afficher les résultats intermédiaires tous les ? (333 par exemple) ?").8f. printf("la racine de %f vaut %4. 5.1.h> void main(void) { float nombre.h> #include <math.&tous_les).h> #define debut 100 #define pas 0. qui peut être simple (terminée par . } 5. on effectue l'instruction. jusqu'à une valeur maximale donnée par l'utilisateur. 5. scanf("%f". nombre.compte).racine=0. On calculera la puissance par multiplications successives par 2. l'instruction n'est jamais effectuée). } printf("erreur de 100%% en %d calculs\n".5. on passe à l'instruction suivante (si elle est fausse dès le début. while (racine*racine<nombre) racine+=0. while (fabs(nombre−(debut+(compte*pas)))<pas) { nombre+=pas. Cliquez ici pour une solution.

La boucle est équivalente à : expr_initiale. } while (a!=482).1 Boucles 18 . final) comme while. Le calcul de la moyenne s'effectue en initialisant une variable à 0. (attention au . Cliquez ici pour une solution.2 Do While (faire tant que) structure : do instruction while (expression)..5. On effectue l'instruction puis l'incrémentation tant que la condition est vraie. où l'on indiquera le nombre d'essais. Puis on teste la condition. On ne donnera pas d'indications avant la découverte de la solution.). } Une ou plusieurs des trois expressions peuvent être omises. } Exercice (do_while) : écrivez un programme de jeu demandant de deviner un nombre entre 0 et 10 choisi par l'ordinateur. scanf("%d". mais l'instruction est au moins faite une fois. for(. while (expr_condition) { instruction expr_incrémentation. L'expr_initiale est effectuée une fois. } Exercice (for) : faire un programme qui calcule la moyenne de N notes.3 For (pour) structure : for ( expr_initiale. 5. avant la première évaluation de l'expression. L'instruction et l'incrémentation peuvent ne jamais être effectuées. 5.expr_incrémentation) instruction Cette boucle est surtout utilisée lorsque l'on connaît à l'avance le nombre d'itération à effectuer. 5. en premier. puts("c'est gentil de m'avoir obéi"). puis en y ajoutant progressivement les notes saisies puis division par N.c>='A'.expr_condition.5. La solution sera choisie par l'ordinateur par la fonction rand() qui rend un entier aléatoire (déclarée dans stdlib. N et les notes seront saisies par scanf.c−−)putchar(c). for(c='Z'.&a). exemple : { char c.h). l'instruction peut être vide.1.1. est donc une boucle infinie. Cliquez ici pour une solution.TRAU Cliquez ici pour une solution. do { puts("entrez le nombre 482"). exemple : #include <stdio.5.h> void main(void) { int a.Le langage C − cours P.

long).. Exercice (jeu) : modifier le jeu de l'exercice (do_while) en précisant au joueur à chaque essai si sa proposition est trop grande ou trop petite.. Le else étant facultatif. if (c1) {if (c2) i1. si c1 et pas c2 alors i2. on effectue l'instruction 2 puis on passe à la suite (dans le cas sans else on passe directement à la suite). int.} else i2. si pas c1 alors i2. puis on passe directement au "case" correspondant à la valeur trouvée. sinon mais si c2 alors i2 puis i5..2 Switch − Case (brancher − dans le cas) Cette structure de contrôle correspond à un "goto calculé". else if (c2) i2. mais si il est prévu il doit être le dernier cas. 5.. si c1 alors i1 puis i5. 5.2 Branchements conditionnels On a souvent besoin de n'effectuer certaines instructions que dans certains cas. On dispose pour cela du IF et du SWITCH.5.5. structure : switch (expression_entière) { case cste1:instructions case cste2:instructions . si pas c1 alors (quel que soit c2) rien. case csteN:instructions default :instructions } L'expression ne peut être qu'entière (char.. exemple : if(c1) if(c2) i1. : si c1 et c2 alors i1.TRAU 5. : si c1 et c2 alors i1.5. un else se rapporte toujours au if non terminé (c'est à dire à qui on n'a pas encore attribué de else) le plus proche.. 5. Cliquez ici pour une solution. L'instruction d'un if peut être un autre if (imbriqué) exemple : if(c1) i1.2 Branchements conditionnels 19 . On peut aussi terminer un if sans else en l'entourant de {}.. puis on passe à la suite. Le cas default est facultatif.Le langage C − cours P..5. i5. Sinon. En fait. il peut y avoir une ambiguïté s'il y a moins de else que de if. else i2.2.2.. L'expression est évaluée. . else if (c3) i3. else i4.1 If − Else (Si − Sinon) structure : if (expression) instruction1 ou : if (expression) instruction1 else instruction2 Si l'expression est vraie (!=0) on effectue l'instruction1. Si ni c1 ni c2 ni c3 alors i4 puis i5. si c1 et pas c2 alors rien.

3 Branchements inconditionnels Quand on arrive sur une telle instruction.. 5. } } Remarque : l'instruction break permet de passer directement à la fin d'un switch (au } )...1 Break (interrompre) Il provoque la sortie immédiate de la boucle ou switch en cours. permet uniquement de continuer la boucle la plus interne..Le langage C − cours P.inst2... Dans le cas d'un while ou do while. Cliquez ici pour une solution.. exemple : for (i=0.TRAU exemple : fonction vérifiant si son argument c est une voyelle.. En cas de boucles imbriquées.break. exemples : do {if(i= =0)break. } /*endroit où l'on arrive après un break*/ Exercice (calcul) : faire un programme simulant une calculatrice 4 opérations.i++){.i++){..}while (i!=0). et donc ne permet plus d'assurer que ce qui est au dessus est correctement terminé.} /* à remplacer par for(i=0.2 Continue (continuer) Cette instruction provoque le passage à la prochaine itération d'une boucle.(i<10)&&(!erreur).....i++) {if (i= =j) continue.. int voyelle(char c) { switch(c) { case 'a': case 'e': case 'i': case 'o': case 'u': case 'y':return(1)...5. saut vers l'évaluation du test de sortie de boucle...... 5.5. /* 1=vrai */ default :return(0). Ces instructions sont à éviter si possible.. car ils rendent le programme plus complexe à maintenir.5. Dans le cas d'un for on passe à l'expression d'incrémentation puis seulement au test de bouclage. le fait d'être dans une ligne de programme ne suffisant plus pour connaître immédiatement quelle instruction on a fait auparavant.5. } peut être remplacé par : 5. Exemple : switch (a) { case 1:inst1.if (erreur) break. Il ne faut les utiliser que dans certains cas simples. Il est limité à un seul niveau d'imbrication.break. case 2:.i<10.. . Dans le cas de switch imbriqués on ne peut sortir que du switch intérieur.3.} */ 5.i<10...3.... /* un while aurait été mieux */ for (i=0. default:. on se branche obligatoirement sur une autre partie du programme.3 Branchements inconditionnels 20 .

... Mais on ne peut entrer dans un bloc que par son { (qui créera proprement les variables locales du bloc).3. float. } 5. } .4 Return (retourner) Permet de sortir de la fonction actuelle (y compris main). son type (int.} 5.. Cette fonction libère la mémoire utilisée par le programme (variables + alloc) et ferme (sur beaucoup de compilateurs) les fichiers ouverts. goto truc. durée de vie.3 Goto (aller à) La pratique des informaticiens a montré que l'utilisation des goto donne souvent des programmes non maintenables (impossibles à corriger ou modifier).. structure : goto label... en se branchant à son dernier }. avant la première instruction. else return(b). où l'on indique le nom que l'on désire lui donner.5.. int b) {if (a>b) return(a).5.i++) if (i!=j) { ... On peut lui donner comme argument le code de sortie (celui que l'on aurait donné à return dans main).3.. on réserve la mémoire nécessaire aux 5. dans STDLIB. structure : return ou return(valeur) exemple : int max(int a..) pour que le compilateur sache combien de mémoire il doit lui réserver et les opérateurs qui peuvent lui être associés. {. 5... Return permet également (et surtout) de rendre la valeur résultat de la fonction. mais aussi comment elle doit être gérée (visibilité. Elles seront alors "locales au bloc" : elles n'existent qu'à l'intérieur du bloc.Le langage C − cours P..5. suivi de deux points (:).3 Branchements inconditionnels 21 .. {.). et indiquant la destination du saut.5 Exit (sortir) Ceci n'est pas un mot clef du C mais une fonction disponible dans la plupart des compilateurs (définie par ANSI. Un goto permet de sortir d'un bloc depuis n'importe quel endroit. on peut déclarer des variables.. structure : exit()... truc: ..1 Déclarations locales Dans tout bloc d'instructions.. Les problèmes qu'ils posent ont amené les programmeurs expérimentés à ne s'en servir qu'exceptionnellement. .. ou exit(valeur).. 5. mais non utilisé pour autre chose).. Label est un identificateur (non déclaré. à l'exécution. } 5.3. on arrive sur le début du bloc ({).6. Elle permet de quitter directement le programme (même depuis une fonction)..i<10.5. Ces variables sont mises en mémoire dans une zone de type "pile" : quand..TRAU for (i=0.6 Déclaration et stockage des variables Une variable doit être définie par le programmateur dans une déclaration....H)...

et libérée à la sortie. autre exemple : void main(void). et on les retire en quittant le bloc. {int a=3. } fonction(a). fonction(a). on lui donne la valeur de a. à qui l'on donne la valeur 5. On affichera donc : 10 5. } void main(void) { int a=5. les variables locales restent réservées. Puis appel de doubl : création de b au sommet de la pile. Mais a n'est plus visible. une variable peut être visible ou non.a).Le langage C − cours P. La sortie d'un bloc par un branchement gère la libération des variables locales. Exemple : #include <stdio. [4a] a=1 | b=2 | a=3 | b=3 : entrée dans la fonction.doubl(a). } A l'entrée du bloc main.TRAU variables locales au sommet de la pile (ce qui en augmente la hauteur).5. Une variable locale est créée à l'entrée du bloc. Cette période est appelée sa durée de vie. et on libère le sommet de la pile (c et b n'existent plus) mais a reste (avec son ancienne valeur) jusqu'à la sortie de main. que la quantité nécessaire de mémoire. mais tant qu'une autre variable locale de même nom ne la cache pas. {int a=1. à un instant donné. Par contre. {int b=2. mais seule l'entrée dans un bloc par son { gère leur création. qui peut donc resservir par après pour d'autres variables. recopie de l'argument réel (a) dans l'argument formel (b). lorsque l'on quitte temporairement un bloc (par appel à une fonction). c=2*b. b=0. on lui donne la valeur b*2=10. Puis entrée dans le bloc. [4b] a=1 | b=2 | a=3 | b=3 | c=0 5. l'autre vit encore (valeur 1 gardée) mais n'est plus visible. Mais pendant sa durée de vie. c=b+8. De plus la libération/réservation de la pile aura fait perdre un peu de temps. on rend 10 à la fonction appelante. } } int fonction (int b) {int c=0. et y entrant à nouveau plus tard (par son {). création de a. } [1] [2] [3] [4] [5] [6] [7] [8] [a] [b] [c] [d] analysons progressivement l'évolution de la pile au cours du temps (en gras : variable visible) : [1] a=1 [2] a=1 | b=2 [3] a=1 | b=2 | a=3 : seul le a le plus haut est visible (a=3). L'intérêt consiste à n'utiliser. les variables locales ne sont plus nécessairement recréées au même endroit.h> int doubl(int b) {int c. on annule b (mais pas a). return(c). et n'auront plus le même contenu. création sur la pile de c. printf("%d %d\n". Le désavantage (rarement gênant et pouvant être contrecarré par la classe STATIC) est qu'en quittant le bloc (par } ou un branchement). Par contre elle n'est pas visible dans une fonction appelée par le bloc (puisque son code source est hors du bloc).3 Branchements inconditionnels 22 . Elle est visible : dans le texte source du bloc d'instruction à partir de sa déclaration jusqu'au }.

(entre [] facultatif) Le type peut être simple (char. voir plus loin). Elle est visible de sa déclaration jusqu'à la fin du fichier. Sa durée de vie sera donc celle du programme.. Chaque nom de la liste peut être précédés d'une *. Sa visibilité reste la même (limitée au bloc). Mais ne présumez jamais retrouver une valeur sur la pile. on quitte le programme Notez que la réservation et l'initialisation prennent un peu de temps à chaque entrée du bloc. par exemples dans le cas des éléments finis où une même instruction peut être répétée des milliards de fois..6. Elle sera initialisée une fois. La liste_variables est la liste des noms des variables désirées. déjà initialisées). mais sera placée dans un registre du (micro)processeur. Elle ne sera initialisée qu'une fois. Mais le compilateur peut avoir besoin des registres pour ses besoins internes ou pour les fonctions des bibliothèques.. et souvent de manière plus pertinente que vous. possède la même durée de vie et visibilité qu'une classe auto. dans ce cas une optimisation manuelle peut être utile. Une variable statique permet en général un gain en temps d'exécution contre une perte en place mémoire. seules les classes varient. Une déclaration a toujours la structure suivante : [classe] type liste_variables [initialisateur]. 5. séparées par des virgules s'il y en a plusieurs.. L'initialisateur est un signe =. Si tous les registres sont déjà utilisés. Mais le compilateur ne sait pas à l'avance quelles fonctions seront appelées le plus souvent. même si votre programme n'a pas utilisé la pile entre temps (surtout sur système multitâche ou avec mémoire virtuelle). met le résultat dans le c le plus haut. La variable est stockée en mémoire statique. et restera toujours réservée.. suivi de la valeur à donner à la variable lors de sa création (à chaque entrée du bloc par exemple).2 Déclarations globales 23 . [4d] a=1 | b=2 | a=3 : suppression des variables locales b et c du sommet de la pile [5] a=1 | b=2 : sortie de bloc donc libération de la pile [6a] a=1 | b=2 | b=1 : l'argument réel (a) n'est plus le même qu'en [4a] [6b] a=1 | b=2 | b=1 | c=0 [6c] a=1 | b=2 | b=1 | c=9 [6d] a=1 | b=2 : suppression b et c [7] a=1 [8] la pile est vide. La classe peut être : • auto (ou omise. la variable sera de classe auto. De plus les compilateurs optimisés choisissent de mettre en registre des variables auto. • static : la variable ne sera pas dans la pile mais dans la même zone que le code machine du programme. sa durée de vie est celle du programme.6. En retournant dans un bloc. s'il n'en reste plus le gain peut se transformer en perte. • register : la variable est créée. 5. mais aussi une expression avec des constantes voire des variables (visibles. Elle sera donc d'un accès très rapide. il prend la plus haute de la pile donc 3 (c'est la seule visible). c'est la classe par défaut pour les variables locales) : la variable est créée à l'entrée du bloc (dans la pile) et libérée automatiquement à sa sortie (comme expliqué plus haut).Le langage C − cours P. elle possédera donc encore la valeur qu'elle avait à la précédente sortie.. L'autre b n'est pas modifié. float.2 Déclarations globales Une déclaration faite à l'extérieur d'un bloc d'instructions (en général en début du fichier) est dite globale. Le format d'une déclaration globale est identique à une déclaration locale. structures.) ou composé (tableaux.TRAU [4c] a=1 | b=2 | a=3 | b=3 | c=11 : quand le compilateur cherche la valeur de b. int. au début du programme. La valeur peut être une constante. à l'entrée du programme (initialisée à 0 si pas d'autre précision). ceci spécifiant un pointeur.

5. la fonction est publique. /* déclarée (et initialisée) dans un autre fichier */ float produit(float.TRAU Par défaut. structure : typedef type_de_base nouveau_nom. lorsque l'on crée une bibliothèque (groupe de fonctions et variables regroupées dans un fichier compilé séparément). il peuvent même être omis (les types des arguments doivent être identiques). Le prototype peut être utilisé pour utiliser une fonction du même fichier. int *b). Une déclaration de fonction ne peut être que globale. initialisées à 0 */ static int k=1.j. comme toute déclaration − les noms des arguments n'ont pas besoin d'être les mêmes. la classe peut être extern (c'est ce que l'on trouve dans les fichiers . initialisée à 1 */ extern int z. peut être initialisé par =&i */ Remarque : Le premier typedef pouvait être remplacé par un #define mais pas le second. mais la rendre visible).Le langage C − cours P. /* privée.6.float). qui pourra être inclus dans tout fichier utilisant la bibliothèque. et connue des autres fonctions. pour pouvoir être utilisée. /* définition d'un nouveau type */ entierlong i. La classe extern permet de déclarer une variable d'un autre fichier (et donc ne pas lui réserver de mémoire ici. la variable est publique. le prototype n'existait pas. En général. /* prototype d'une fonction définie plus loin dans ce fichier */ extern void échange(int *a.H) ou static (visibilité limitée au fichier). Le prototype est de la forme : [classe] type_retourné nom_fonction(liste_arguments). La classe static.6.3 Déclaration de type La norme ANSI permet de définir de nouveaux types de variables par typedef. /* création d'une variable i de type entierlong */ typedef entierlong *pointeur. exemples de déclarations globales : int i. /* publiques. par contre. exemple : typedef long int entierlong. extern dans les autres. Une variable commune à plusieurs fichiers devra donc être déclarée sans classe dans un fichier (et y être initialisée). doit également être déclarée. 5. Sinon. mais ne crée aucune variable. Sans précision de classe. /* prototype d'une fonction définie dans un autre fichier */ Avant la norme ANSI. Elle ne doit pas être initialisée ici. rend la visibilité de la variable limitée au fichier actuel.H. Ceci permet de donner un nom à un type donné. on prépare un fichier regroupant toutes les déclarations extern.3 Déclaration de type 24 . Toute fonction. Une déclaration de fonction est appelée "prototype". elle est donc identique à l'entête de la fonction mais : − est terminée par un . /* création de p (qui contiendra une adresse). /* nouveau type : pointeur = pointeur d'entierlong */ pointeur p. Une fonction non définie auparavant était considérée comme rendant un int (il fallait utiliser un cast si ce n'était pas le cas). c'est à dire qu'elle pourra même être visible dans des fichiers compilés séparément (et reliés au link). Une déclaration typedef est normalement globale et publique. mais avant de l'avoir définie (par exemple si l'on veut main en début du fichier). noté .

float b) { float z. Les valeurs fournies à l'appel de la fonction (arguments réels) y sont recopiés à l'entrée dans la fonction.) Avant la norme ANSI. La valeur retournée par la fonction est indiquée en argument de return.7. } 5. i>1 donc on appelle factorielle(1) 5.2 Récursivité. } analysons la pile en appelant factorielle(3) : i=1 i=2 i=2 i=2 i=3 i=3 i=3 i=3 i=3 (a) (b) (c) (d) (e) • (a) appel de factorielle(3). float b) {bloc} K&R: float truc(a. return(z). comme i>1 on calcule i*factorielle(i−1) : i=3. L'appel se fera dans les deux cas par nom() (parenthèses obligatoires). Désormais il est obligatoire. affecté de la valeur 2. Les arguments (formels) sont des variables locales à la fonction. le type_retourné pouvait être omis si int. gestion de la pile Une fonction peut s'appeler elle−même : int factorielle(int i) { if (i>1) return(i*factorielle(i−1)). alors qu'auparavant les types étaient précisés entre l'entête et le bloc : ANSI: float truc(int a.Le langage C − cours P. La liste_arguments doit être typée (ANSI). z=a*b.7 Fonctions 5. suivie d'un bloc d'instructions entête : type_retourné nom_fonction(liste_arguments) (pas de . {bloc} Si la fonction n'utilise pas d'arguments il faut la déclarer (ANSI) nom(void) ou (K&R) nom().1 Définitions générales Une fonction est définie par son entête.7 Fonctions 25 . exemple : float produit(float a. si la fonction ne retourne rien on indique : void.b) int a. Les instructions de la fonction s'exécutent du début du bloc ({) jusqu'à return(valeur) ou la sortie du bloc (}).float b.i−1=2 on appelle factorielle(2) • (b) création i. else return(1). création de i. à qui on affecte la valeur 3.7.TRAU 5.

dans i on recopie l'argument réel qui et l'adresse de x. on crée une variable locale k pouvant contenir un entier. on récupère cette valeur par ERRORLEVEL). return(result). Définissons donc la fonction ainsi : void échange(int *i.7. on peut rendre 2. 5.k=*i. et l'opérateur * devant chaque apparition de l'argument formel. On a donc échangé x et y.i−−) result*=i. i (sommet de la pile) vaut 2. puis on "dépile" i • (e) on peut calculer i*factorielle(2). dans le cas où on n'a pas indiqué de return(code).j. les variables locales i.i=j. on retourne où la fonction factorielle(1) a été appelée en rendant 1. Puis on place la valeur de k à l'adresse pointée par j (y). i vaut la valeur de x. Les contenus de i et j sont échangés puis la pile est libérée. aussi bien dans l'entête que le bloc de la fonction.7. i vaut 3 (sommet de la pile). il suffit d'ajouter l'opérateur & devant l'argument réel (à l'appel de la fonction). j celle de y. On utilisera les opérateurs unaires : & (adresse de) et * (contenu de).i>1.j=k. Pour résoudre ce problème. factorielle(1) vaut 1.k sont créées sur la pile. for(result=1. c'est à dire qu'à l'appel. et l'adresse de y dans j. et voir l'évolution des contenus des variables. il ne faut l'utiliser que si l'on ne sait pas facilement faire autrement : int factorielle(int i) { int result. De même.} On appelle la fonction par échange(&x.3 Arguments passés par adresse Imaginons la fonction : void échange(int i. qui est l'adresse de x). Attention. L'arrivée sur le } final retourne la valeur 0. la fonction main peut rendre un entier (non signé) au système d'exploitation (sous MSDOS. sans modifier x et y. la récursivité est gourmande en temps et mémoire. en entrant dans le bloc.*i=*j. } 5.&y). on crée sur la pile des variables i et j pouvant contenir une adresse.int *j) {int k.7.3 Arguments passés par adresse 26 . le système d'exploitation peut transmettre des arguments au programme. on libère le pile de son sommet. On a tout intérêt à essayer cet exemple en se fixant des adresses et des valeurs. il faut passer par des pointeurs.} Lors d'un appel à cette fonction par échange(x. factorielle(2) vaut 2 3*2=6. sinon elle représente un numéro d'erreur. On place la valeur pointée par j (donc y) à l'adresse pointée par j (donc x). pour effectuer un passage d'argument par adresse.int j) {int k.*j=k. Une valeur 0 signale en général une fin normale du programme. • (d) on peut maintenant calculer i*factorielle(1).k=i. En conclusion. donc le contenu de x.y). la pile est vidée et retrouve sont état initial. Puis on met dans k non pas la valeur de i mais le contenu pointé par i (donc ce qui se trouve à l'adresse marquée dans i. La déclaration complète de l'entête de la fonction main est : 5.4 La fonction main Si on le désire. i=1 donc on quitte la fonction. on retourne 6.Le langage C − cours P. les deux arguments formels de la fonction (i et j) sont des pointeurs sur des int.TRAU • (c) création de i.

argv est un tableau de pointeurs sur chaque mot de la ligne de commande. env est un tableau de pointeurs sur les variables d'environnement.. Si votre programme s'appelle COPIER.(*calcul)(10. type (*fonc)(arguments) est un pointeur sur une fonction exemple : int max(int. mais aussi très utilisées sous UNIX par env). printf("%d\n". return(grand).char *argv[]. on n'en connaît pas le nombre mais le dernier vaut le pointeur NULL. int taille) { int i.int). } Cette fonction rend l'adresse du plus grand entier du tableau.int b) {return(a>b?a:b).20)). env pointe sur les variables de l'environnement (sous MSDOS obtenues par SET.} Cette fonctionnalité du C est assez peu utilisée. exemple : int *max(int tableau[].i++) if(tableau[i]>*grand) grand=tableau+i. 5. } int max(int a.int b) {return(a<b?a:b).i=1.. 5.TRAU int main(int argc.Le langage C − cours P.} int min(int a.7.5 Fonction retournant un pointeur et pointeur de fonction type*fonc(arguments) est une fonction qui renvoie un pointeur. On peut aussi utiliser char **argv. mais cela peut paraître moins clair.i<taille. argv[0] pointe sur "COPIER". do c=getchar(). void main(void). while ((c!='A')&&(c!='I')).int). calcul=(c= ='A')?&max:&min. int min(int.. argc indique le nombre de mots de la ligne de commande du système d'exploitation.*grand. /* calcul est un pointeur donc une variable qui peut être locale */ char c. { int (*calcul)(int. tableaux par exemple).int). puts("utiliser max (A) ou min (I) ?").) et les types agrégés (combinaisons de scalaires. argv[1] sur "TRUC" et argv[2] sur "MACHIN".8 Les types de données du C Nous allons définir les différents types de variables existantes en C. 5. for(grand=tableau. argv[3] vaut le pointeur NULL.5 Fonction retournant un pointeur et pointeur de fonction 27 . mais est nécessaire dans les langages orientés objets. On verra les types scalaires (entiers. et que sous MSDOS vous ayez entré la commande COPIER TRUC MACHIN alors argc vaut 3. char *env[]) Le dernier argument est optionnel).7.

• \xnombre : en hexa Les char sont considérés dans les calculs comme des int (on considère leur code ASCII).2 int : entier Si l'on désire une taille précise. alors que la taille de l'exposant définit le plus grand nombre acceptable par la machine. unsigned). alors que "a" à deux ('a' et ###BOT_TEXT###).1 Variables scalaires On appelle variable scalaire une variable ne contenant qu'une seule valeur. 'a' correspond à un octet. Les réels sont toujours signés.TRAU 5. 5.8. mais on peut préciser unsigned int. 5.4 Tailles et plages type char unsigned char short (short int) taille (en bits) 8 8 16 plage de valeurs −128 à +127 0 à 255 −32768 à 32767 5.1. Pour utiliser les caractères spéciaux du PC (non standard). il faut d'abord décaler la mantisse pour égaliser les exposants puis faire l'addition. sur laquelle on pourra faire un calcul arithmétique. int comme 32 bits et long comme 64 bits.1. Pour une addition par exemple. On possède trois types de base (char. Par défaut. Les opérations sur les réels sont plus lents que sur les entiers. La taille de la mantisse définit le nombre de chiffres significatifs. Par défaut en C un char est signé donc peut varier de −128 à +127. Désormais certains compilateurs considèrent short comme 16 bits. 5.1. float) que l'on peut modifier par 3 spécificateurs (short. utiliser short int (16 bits) ou long int (32 bits). les int sont signés.3 float : réel Un flottant est un nombre stocké en deux parties. int.8. Certains compilateurs acceptent même des long double (quadruple précision). par le préfixe \ (antislash) : • \n nouvelle ligne • \t tabulation • \b backspace • \r retour chariot (même ligne) • \f form feed (nouvelle page) •

apostrophe • \ antislash • ###BOT_TEXT###quot; double quote • ###BOT_TEXT### nul • \nombre en octal sur 3 chiffres (ou moins si non suivi d'un chiffre). long. mais long sur les stations 32 bits).8.8.Le langage C − cours P.8. On peut également utiliser le nom double au lieu de long float.1 char : caractère (8 bits) Une constante caractère est désignée entre apostrophes (simples quotes). 5.8. On peut par contre utiliser le spécificateur long pour des réels avec une précision accrue. On peut définir certains caractères spéciaux. une mantisse et un exposant.1. int donnera les programmes les plus rapides pour une machine donnée (int = short sur PC. il faut utiliser des unsigned char (de 0 à 255). Sans précision.1 Variables scalaires 28 .

1 Variables scalaires 29 16 32 32 32 64 80 0 à 65535 −2.8.147. mardi=1. exemple : enum jour aujourd_hui=mardi. etc.5. soit mardi.} Un cast transformant un réel en entier prendra la partie entière.1E+4932 (19 chiffres signif." dimanche"}. si nécessaire. On peut forcer une transformation en utilisant le cast.5 donnera donc 5. pour qu'il n'émette pas de message d'erreur (à utiliser avec grande prudence).4E−4932 à 1.7e308 (15 chiffres significatifs) 3.. "jeudi". vendredi.nom[aujourd_hui]). jeudi. "vendredi". le cast ne permet que de faire croire au compilateur que la variable est d'un autre type que ce qu'il attendait. La syntaxe est : (type_résultat) valeur_à_transformer exemple : {float x. Il n'y a aucun test de validité (dimanche+1 donne 7).1.294.648 à 2.483.5 Conversions de type / cast Dans les calculs.Le langage C − cours P. ou indiquer : enum nomdutype liste_variables.647 0 à 4. mais on peut faire: char *nom[7]={"lundi".295 −3. On peut directement mettre la liste des variables à créer (entre le "}" et le ". On a créé un nouveau type. dimanche}.147.1. mardi.8.6 Enumérations On peut définir un nouveau type (d'entiers) sous la forme : [classe] enum nomdutype {liste_valeurs} [liste_variables]. mercredi. "mercredi". suivant l'ordre : char −> int −> long −> float −> double signed −> unsigned Attention la transformation n'est effectuée que le plus tard possible. utiliser (int)(réel_positif+0.) . les char sont automatiquement transformés en int.4e38 (7 chiffres significatifs) −1. Ceci permet de rendre les programmes plus clairs. Pour obtenir l'entier le plus proche .7e308 à 1.5)... De plus les opérations arithmétiques sont toujours effectuées sur des long ou double. avec lundi=0. elle est impossible implicitement.. Attention. Quand un opérateur possède des arguments de type différent. ([] facultatifs) exemple : enum jour {lundi.967. "samedi". Il faut bien noter que le cast n'est une opération de transformation que pour les types scalaires. samedi."). toute variable de type jour pourra valoir soit lundi. pour tous les autres types. x=(float)a. On peut donc faire toutes les opérations entières (aujourd_hui++ par exemple). pour une précision maximale quels que soient les résultats intermédiaires (voir exemples au chapitre expressions arithmétiques). puis printf("%s". qui est un opérateur unaire. 5.8.483. une transformation de type est effectuée automatiquement.4e38 à 3. "mardi". 5/2+3..int a=5. printf affichera un entier. 5.) En fait le type jour est un type int. Cette transformation doit être explicite. On obtiendrait un résultat équivalent avec #define.TRAU unsigned short long (long int) unsigned long float double (long float) long double (non standard) 5.

6. 5.1 Tableaux unidimensionnels Un tableau est un regroupement. jusqu'à tab[9].b=5. l'adresse du début de cette zone est TAB.3}. par exemple.j. aucune erreur ne sera signalée et vous utiliserez une partie de mémoire qui a certainement été réservée pour autre chose. les suivantes seront initialisées à 0 : vecteur vect0={0. 5. Cliquez ici pour une solution. Mais si elle est donnée.9 Tableaux 5.c=6 En utilisant typedef. exemple : int tab[10]. L'arithmétique des pointeurs en C a cette particularité que l'opération dépend du type de variable pointée. Ceci réserve en mémoire − la place pour 10 entiers.9.i. de plusieurs variables simples. Déclarons : int TAB[10]. Ceci réserve en mémoire un espace contigu pouvant contenir 10 entiers.c.2. Attention.f} : d=2.k.pique.4. en utilisant tab[10] ou plus.d=2. Le premier est tab[0]. mais également la soustraction (pointeur − pointeur) qui donne un nombre d'éléments.*ptr.9}.Le langage C − cours P. int chiffres[]={0. couleurs i. Il est possible de définir un tableau de n'importe quel type de composantes (scalaires.2 Tableaux et pointeurs / arithmétique des pointeurs En déclarant.9. Exercice (moyenne) : Ecrire le programme qui lit une liste de Nb nombres.1. Dans ce cas la dimension n'est pas nécessaire.y. structures et même tableaux). Les deux écritures TAB et &TAB[0] sont équivalentes (ainsi que TAB[0] et *TAB). Il est également possible de définir un type tableau par typedef : typedef float vecteur[3]. l'identificateur TAB correspond en fait à l'adresse du début du tableau.carreau.0}. On peut aussi initialiser un tableau. /* les 17 autres à 0 */ On peut également déclarer un tableau sans en donner sa dimension. pointeurs. 5.9 Tableaux 30 . la soustraction (pointeur − entier).e=3. toutes de même type.2.7.f=a=4.trèfle}couleurs.z. on n'a pas besoin de répéter enum dans la déclaration de variables : typedef enum {coeur. On définit donc l'addition (pointeur+entier): TAB+i=&TAB[i].3. elle aura du être réservée autre part (par exemple tableau externe ou argument formel d'une fonction). int TAB[10].0. − la place pour l'entier i. Les opérations de comparaisons entre pointeurs sont donc également possibles.8. calcule et affiche la moyenne puis l'écart entre chaque note et cette moyenne. dans une même variable. int tableau[20]={1. On définit l'opération d'incrémentation pour les pointeurs par TAB+1=adresse de l'élément suivant du tableau. ajouter 1 consistant à ajouter à l'adresse la taille de l'objet pointé.b.TRAU On peut aussi prévoir une codification non continue : enum truc {a=4. vecteur x.5.e. Dans ce cas là le compilateur ne lui réserve pas de place. déclaration : [classe] type nom [nombre_d'éléments]. et est supérieure au nombre de valeurs données.

prévoyez le cas de valeurs égales. for(ptr=TAB.i++) printf("%d : %d\n". } void affiche_tableau(int t[].*ptr++). On pourra décomposer le programme en fonctions. /* affiche TAB[1] puis ajoute 1 à TAB[1]*/ TAB est une "constante pointeur". celle d'un pointeur uniquement la place d'une adresse.ptr<TAB+10 /* ou &TAB[10] */. } void main(void) { int tableau[10]. la décale d'un cran vers le haut (le premier doit se retrouver en dernier). /*met l'adresse du début du tableau dans ptr*/ for(i=0. Exercice (classer) : Classer automatiquement un tableau de Nb entiers puis l'afficher dans l'ordre croissant puis décroissant.max>0.(*ptr)++).Le langage C − cours P.ptr++) printf("%d ". Si vous vous en sentez la force. alors que ptr est une variable (donc TAB++ est impossible). /* ou &TAB[i] puisque scanf veut une adresse*/ } puts("affichage du tableau"). } Exercice (rotation) : Ecrire un programme qui lit une liste de Nb nombres. La déclaration d'un tableau réserve la place qui lui est nécessaire. affiche_tableau(tableau.max−−)*(t++)=0. 5.h> void annule_tableau(int *t. /* attention actuellement on pointe derrière le tableau ! */ ptr−=10.i. Cliquez ici pour une solution. Analysons les instructions suivantes : ptr=TAB.*ptr+1). /* affiche TAB[1] */ printf("%d". /* +1 pour commencer à 1*/ scanf("%d". annule_tableau(tableau. On pourra utiliser des fonctions de l'exercice précédent. /* affiche TAB[0] puis pointe sur TAB[1] */ printf("%d". for(i=0. on ne peut que le passer par adresse (recopier le tableau prendrait de la place et du temps).i+1). Pour passer un tableau en argument d'une fonction. /* affiche (TAB[0])+1 */ printf("%d".i<10.int max) { for(.9 Tableaux 31 .10). l'affiche puis la décale vers le bas.*(ptr+1)).10).TRAU − la place pour un pointeur d'entier (le type pointé est important pour définir l'addition). /* ou plutôt ptr=TAB qui lui n'a pas changé */ printf("%d".i++) { printf("entrez la %dième valeur :\n". int max) { int i.t[i]). exemple utilisant ces deux écritures équivalentes : #include <stdio. On pourra créer un (ou plusieurs) tableau temporaire (donc local).i<max.ptr+i).*ptr). Cliquez ici pour une solution. puts(" ").

TRAU 5.int longmax) idem • int strcmp(char *str1. Exercice (chaînes) : écrire un programme qui détermine le nombre et la position d'une sous−chaîne dans une chaîne (exemple ON dans FONCTION : en position 1 et 6). on trouve des fonctions utiles (limitées au caractères) : • int isdigit(int c) rend un entier non nul si c'est un chiffre ('0' à '9'). Le compilateur crée la chaîne en mémoire de code (constante) et une variable strptr contenant l'adresse de la chaîne.char *source. isascii (0 à 127). le ###BOT_TEXT### indiquant la fin de la chaîne).. mais pas les accents). Le programme pourra donc changer le contenu de strptr (et donc pointer sur une autre chaîne).9. isxdigit (0 à 9.'r'.void *s2. En C. les guillemets " (double quote). On peut au cours du programme modifier le contenu de mess. • void *memcpy(void *dest.char *source.int longueur). c'est pourquoi en entrée elles rajoutent automatiquement le ###BOT_TEXT### (gets.A à F.void *src.Le langage C − cours P. exemples : puts("salut"). on représente les chaînes par un tableau de caractères. tab. char mess[]="bonjour". rend un pointeur sur la destination • char *strncpy(char *destination. iscntrl (0 à 31). >0 si str1>str2. isalnum (isalpha||isdigit).h) possède des fonctions utiles à la manipulation de chaînes : • int strlen(chaîne) donne la longueur de la chaîne (###BOT_TEXT### non compris) • char *strcpy(char *destination. La longueur est à donner en octets (on peut utiliser sizeof) : • int memcmp(void *s1. islower (minuscule). 0 sinon. Cliquez ici pour une solution. certaines fonctionnalités ont été ajoutées aux tableaux dans le cas des tableaux de caractères. • de même : isalpha (A à Z et a à z.h.. mais pas changer le contenu de la chaîne initialement créée. dont le dernier est un caractère de code nul (###BOT_TEXT###). 0 si erreur dès le premier caractère) • de même atol et atof Dans ctype.char *source) recopie la source à la suite de la destination. 5. comme dans les autres langages. printf). return.4 Bibliothèques de fonctions pour tableaux et chaînes Toutes les fonctions standard d'entrée / sortie de chaînes considèrent la chaîne terminée par un ###BOT_TEXT###. à condition de ne pas dépasser 8 caractères (mais on peut en mettre moins. mais pour tous tableaux (sans s'arrêter au ###BOT_TEXT###) sont déclarées dans mem..int longueur).int longmax) idem strcpy mais s'arrête au ###BOT_TEXT### ou longmax (qui doit comprendre le ###BOT_TEXT###) • char *strcat(char *destination.a à f). scanf).. isspace (blanc.###BOT_TEXT###} */ puts (mess).). 5.3 Chaînes de caractères En C. déclarées dans stdlib. Mais on peut également initialiser un pointeur avec une chaîne de caractères : char *strptr="bonjour"..3 Chaînes de caractères 32 . <0 si str1<str2.char *source) recopie la source dans la destination. isupper. La bibliothèque de chaînes (inclure string.. Idem strncmp Des fonctions similaires. On possède également des fonctions de conversions entre scalaires et chaînes.h. /* évite de mettre ={'b'.char*str2) rend 0 si str1= =str2. Une constante caractères est identifiée par ses délimiteurs.'o'. rend un pointeur sur la destination • char *strncat(char *destination.9..h • int atoi(char *s) traduit la chaîne en entier (s'arrête au premier caractère impossible. mess est un tableau de 8 caractères (###BOT_TEXT### compris). en sortie elles affichent jusqu'au ###BOT_TEXT### (puts.9.

car il place dans l'ordre t[0][0]. Egalement tolower 5. Il faut d'abord déclarer une variable pointeur qui contiendra l'adresse du début du tableau.t[0][2]. En quittant proprement le programme.5. au dépends d'autres variables ou tableaux. 5. En retour. tab=(float*)calloc(nb. ni de la libérer. En fait. c'est à dire ligne après ligne. l'adresse du bloc modifié (pas nécessairement la même qu'avant) ou le pointeur NULL en cas d'erreur. Dans un tableau multidimensionnel initialisé. .6}} mais cette écriture est équivalente à {1.t[1][0]. Une erreur fréquente consiste à "perdre" l'adresse du début de la zone allouée (par tab++ par exemple) et donc il est alors impossible d'accéder au début de la zone. Un tableau peut être initialisé : int t[2][3]={{1. int taille) : équivalent à malloc(nb*taille).h ou alloc. − void *realloc(void *pointeur.3. si possible.sizeof(float)).6}.4.. lors de l'exécution.. une matrice est un tableau de lignes. rend c sinon.&nb).{4. Retourne le pointeur NULL en cas d'erreur (en général car pas assez de mémoire). lorsque l'on connaît la taille désiré. On peut expliciter cela par typedef : typedef int ligne[3]. Pointeur est l'adresse retournée lors de l'allocation. Si nécessaire. mais t[1] est aussi un tableau (une ligne). scanf("%d".h (suivant votre compilateur). pour gérer un tableau de NBLIG lignes de NBCOL éléments.5.3}. et retourne un pointeur sur le début du bloc réservé. − void *calloc(int nb.Le langage C − cours P. le bloc est déplacé et son contenu recopié.6 Tableaux multidimensionnels On peut déclarer par exemple int tab[2][3] : matrice de 2 lignes de 3 éléments.t[1][2].TRAU • int toupper(int c) rend A à Z si c est a à z.t[0][1]. une zone de mémoire contiguë.2.9. En utilisant pointeurs et allocation dynamique. accès 5. int nb.int taille) essaie. − void free(void *pointeur) libère la place réservée auparavant par malloc ou calloc.2. donc désigne l'adresse &t[1][0].9. puts("taille désirée ?").5 Allocation dynamique de mémoire La taille déclarée d'un tableau est définie à la compilation. de la taille désirée (mais pas plus). En C. t correspond à l'adresse &t[0][0]. typedef ligne matrice[2]. exemple : float *tab. de réajuster la taille d'un bloc de mémoire déjà alloué (augmentation ou diminution de taille).5 Allocation dynamique de mémoire 33 . la mémoire allouée est automatiquement restituée même si on omet d'appeler free. on peut : • soit créer une matrice complète : allocation par t=malloc(NBLIG* NBCOL* sizeof(élément)).9. malloc et calloc nécessitent un cast pour que le compilateur ne signale pas d'erreur. seule la dimension la plus à gauche peut être omise (ici int t[][3]={. le lien entre les tableaux et pointeurs permet de réserver. Ces fonctions sont définies dans stdlib.} était possible). on peut réserver une zone mémoire (dans la zone appelée "tas" ou "heap") par les fonctions : − void *malloc(int taille) : réserve une zone mémoire contiguë de taille octets.t[1][1]. A l'exécution. il faut donc surdimensionner le tableau (et donc réserver des mémoires dont on ne servira que rarement. Dans le cas d'une taille inconnue à l'avance.

int année. Les noms de champs ont une portée limitée à la structure (c'est à dire qu'un autre objet peut avoir le même nom. Cette méthode est plus rapide que la précédente.lui. Exercice (déterminant) : écrire un programme qui calcule le déterminant d'une matrice carrée (N. Cliquez ici pour une solution. date aujourdhui={24. qui sont des variables composées de plusieurs variables (ou CHAMPS) de types différents.c par *(t+l*NBCOL+c). struct identite id.10 Structures et unions 34 .nom). Ceci permet une optimisation si les lignes n'ont pas toutes la même longueur (traitement de textes par exemple) mais aussi de manipuler facilement les lignes (exemple : échanger deux lignes sans recopier leur contenu). Le déterminant d'une matrice (1. char prenom[20].10. s'il n'est pas cité dans cette structure). 5.jacques. 5. pointeurs..nom[0]." gets(jean. Les champs peuvent être de n'importe quel type valable (scalaires.1 Déclaration déclaration : struct nom_type {déclaration des champs} liste_variables . prenom et age. sizeof(jacques) retournera 52.12.} moi. voire d'autres types: struct identite lui. 5.10 Structures et unions Dans un tableau. nom_type et liste_variables sont optionnels mais au moins l'un des deux doit être présent. • soit créer un tableau de NBLIG pointeurs de lignes. mais par un identificateur. }jean. /*évite de répéter struct*/ 5. puis chaque ligne séparément. car les adresses de chaque début de ligne sont immédiatement connues.groupe[20]. L colonnes) par une matrice (L. il peut être utilisé plus loin pour déclarer d'autres variables.prenom[0]).1) est sont seul élément. tous les constituants doivent être du même type. struct prisonnier {long numero. Il existe (heureusement) d'autres méthodes plus rapides.int mois. int age.lui. groupe[i]) comporte trois champs : nom. tableaux. Cliquez ici pour une solution.. Nom_type (ici identite) est le nom d'un nouveau type. Toute variable de type identité (jean. y compris une structure (à condition d'être déclaré plus haut). NOM_CHAMP . Exercice (matrices) : faire le calcul de multiplication d'une matrice (M lignes. sans calcul. mais remplacement du tableau de pointeurs (dimension prévue à l'avance) par une allocation dynamique.}date. et (pas sur tous les compilateurs) d'initialiser une structure : typedef struct {int jour. jacques.Le langage C − cours P.10.N). Ce n'est pas le cas des structures.1992}. • soit utiliser des pointeurs de pointeurs (même principe que le cas précédent. printf("initiales : %c %c\n". par l'opérateur unaire ".2 Utilisation On accède à une composante par NOM_VARIABLE .TRAU à l'élément l. exemple : struct identite { char nom[30]. Chaque champ n'est plus désigné par un numéro comme dans un tableau. On utilisera bien évidement la récursivité.N) : résultat (M.N).). Il est également possible d'utiliser typedef. sachant qu'il vaut la somme (sur chaque ligne) de l'élément de la ligne en 1ère colonne par le déterminant de la sous−matrice obtenue en enlevant la ligne et la 1ère colonne (en changeant le signe à chaque fois).

tous ceux d'Obernai.ptr−>mois=7.10. ville. faire un programme de recherche automatique de toutes les informations sur les personnes répondant à une valeur d'une rubrique donnée (tous les PATRICK . numéro de téléphone). Depuis la norme ANSI. Cette méthode permet l'utilisation de plusieurs index (par exemple un second par date de naissance). Exercice (tel) A l'aide d'un tableau de personnes (nom. Les différents champs commenceront tous à la même adresse (permet d'utiliser des variables pouvant avoir des types différents au cours du temps. Supposons désirer stocker les adhérents par ordre alphabétique. 5. sur le revers de couverture on indique l'adresse du premier. Une solution un peu plus simple serait de numéroter les pages. on peut utiliser l'affectation pour des structures (recopie de tous les champs). gommer toutes les pages suivantes pour les réécrire une page plus loin. On les utilise comme les structures.jour=14.). code postal. L'opérateur −> permet une simplification d'écriture (il signifie champ pointé) : date *ptr.age). Les champs n'ont alors pas d'adresse (impossible d'utiliser & sur un champ). scanf("%d". il va falloir trouver où l'insérer. On suppose que le tableau est déjà initialisé. Un tableau correspond à une gestion dans un cahier : un adhérent par page.} Les champs sont créés à partir des bits de poids faible. prénom. Appliquons cela . non utilisés par le programme). à une liste d'entiers. La troisième solution est la liste chaînée : les pages sont numérotées.int Crc:6.3 Champs de bits 35 . rue. mais l'insertion d'un nouvel adhérent se fera avec le minimum d'opérations.5 Structures chaînées Le principal problème des données stockées sous forme de tableaux est que celles−ci doivent être ordonnées : le "suivant" doit toujours être stocké physiquement derrière. Sur les compilateurs non ANSI.. 5. dans l'ordre. struct état{unsigned ReadOnly:1. derrière chaque champ.3 Champs de bits En ne définissant que des champs entiers (signés ou non). entrer les adhérents dans n'importe quel ordre et disposer d'un index : un feuille où sont indiqués les noms. sa taille après un ":".id.10.4 Unions déclaration : union nom_type {déclaration des champs} liste_variables . Si un nouvel adhérent se présente." et "−>".10. avec les opérateurs ". *ptr. numéro dans la rue. il faut utiliser des pointeurs. de manière informatique. On utilise ces structures comme les autres. 5. On utilise des pointeurs de structures comme des pointeurs sur n'importe quel autre type. Il suffit pour cela de préciser.&moi. ptr=(struct date *)malloc(sizeof(date)). on peut définir la taille (en bits) de chaque champ.nom). L'utilisation d'une telle liste nécessite un véritable "jeu de piste". Toute insertion ne nécessitera de décalages que dans l'index. sur chaque page est indiquée la page de l'adhérent suivant. associés à leur "adresse" : le numéro de page. avec pour chaque valeur l'adresse (numéro de mémoire) du suivant : 5. puis insérer le nouvel adhérent. mais un seul à un instant donné). ainsi que le passage des structures en arguments de fonction passés par valeur.. etc. Les champs peuvent être de tout type. Cliquez ici pour une solution. Le nom du champ est optionnel (dans le cas de champs réservés. Imaginons gérer une association.Le langage C − cours P. Une composante d'enregistrement s'utilise comme une variable du même type (avec les mêmes possibilités mais aussi les mêmes limitations).groupe[10].TRAU printf("nom %s \n". y compris structures.10.

struct page *premier. struct page *suivant.3 Champs de bits 36 .h> #include <ctype. puts("\nentrez votre entier"). } precedent−>suivant=NULL.&nouveau−>val).h> #include <conio. precedent−>suivant=nouveau.10. return(toupper(getche())= ='O'). precedent=nouveau. les modifications à apporter sont minimes : En C on définira un type structure regroupant une valeur entière et un pointeur : struct page {int val. soit le premier (la liste est dite bouclée). }. scanf("%d".Le langage C − cours P. Au fur et à mesure des besoins on se crée une nouvelle page : nouveau=(struct page *)malloc(sizeof(struct page)). on choisit généralement soit le pointeur NULL. Un pointeur (souvent global) nous indiquera toujours le début de la liste: struct page *premier.*nouveau. int encore(void) /* demande si on en veut encore*/ { printf("encore (O/N) ? ").TRAU Si l'on veut insérer une valeur dans la liste. premier=(struct page *)malloc(sizeof(struct page)). puts("entrez votre premier entier").h> #include <alloc. exemple : #include <stdio. while (encore()) { nouveau=(struct page *)malloc(sizeof(struct page)). struct page *suivant.h> /*ou stdlib. le dernier élément ne doit pas pointer sur n'importe quoi.h*/ struct page {int val. precedent=premier. En n'oubliant pas de préciser le lien avec le précédent : precedent−>suivant=nouveau. }. } void lecture(void) { struct page *precedent. scanf("%d". } 5.&premier−>val).

Les modifications sont aisées. actu=premier. debut=debut−>suivant. La solution de l'exercice précédent contient également cette insertion Ce type de données (structure pointant sur un même type) est utilisé dans d'autres cas. affiche(premier). actu−>val). } Exercice (liste) : modifier la fonction lecture ci−dessus pour que la liste soit stockée dans l'ordre inverse de son introduction (chaque nouvel élément est placé devant la liste déjà existante). } else { prec=actu.Le langage C − cours P. if (toupper(getche())= ='O') { if(actu= =premier)premier=actu−>suivant. } void main(void) { lecture(). free(actu). while(debut!=NULL) { printf("%d ". while (actu!=NULL) { printf("\nvaleur : %d − supprimer celui_ci (O/N) ? ".10. Cliquez ici pour une solution de cet exercice (et du suivant). break.3 Champs de bits 37 . pour représenter un arbre. Exemple : suppression d'un élément : void suppression(void) { struct page *actu. Par exemple. actu=prec−>suivant.*prec.debut−>val). une fois que l'on a repéré l'endroit de la modification. il suffit pour chaque élément de connaître l'adresse de chaque fils : 5. else prec−>suivant=actu−>suivant. } printf("\n").TRAU void affiche(struct page *debut) { printf("\nliste : "). } } } Exercice (insertion) : ajouter au programme précédent une procédure d'insertion d'une valeur dans la liste.

TRAU Remarque : si le nombre de fils n'est pas constant. ainsi que le frère suivant(voir partie algorithmique et structures de données). 5.Le langage C − cours P.3 Champs de bits 38 .10. on a intérêt à stocker uniquement le fils aîné.

le type d'erreur est donné dans la variable errno.h (les autres). unsigned taille). l'adresse du bloc à écrire et la taille 6 Les fichiers de données 39 . La première opération à effectuer est d'ouvrir le fichier. détaillée dans errno. Les fichiers sur support magnétique (bande. Dans ce cas. O_CREAT crée le fichier s'il n'existe pas. Les fichiers étant dépendants du matériel. On peut distinguer les fichiers séquentiels (on accède au contenu dans l'ordre du stockage) ou à accès direct (on peut directement accéder à n'importe quel endroit du fichier). On désigne le fichier destination par son handle (celui rendu par open). d'où gain de place mais incompatibilité entre logiciels). On utilise pour cela des constantes définies dans fcntl. On appelle pour cela la fonction : int open(char *nomfic. disquette.h pour être compatible UNIX et créer un fichier lecture/ écriture/ exécution autorisée.. Mode permet de définir comment on utilisera le fichier. 6. nomfic pointe sur le nom du fichier (pouvant contenir un chemin d'accès). mais au prix d'un temps d'accès aux données très supérieur.6 Les fichiers de données • Fichiers bruts • Fichiers bufférisés Les données stockées en mémoire sont perdues dès la sortie du programme. C'est au programmeur de préparer et gérer ses blocs. cluster.h : O_RDONLY lecture seule. Ceci consiste à définir le nom du fichier (comment il s'appelle sous le système) et comment on veut l'utiliser.h. O_WRONLY écriture seule. prototypées dans stdio. et correspondant à la taille d'un enregistrement physique (secteur..). soit formaté ASCII (un float binaire sera transformé en décimal puis on écrira le caractère correspondant à chaque chiffre). soit lire soit écrire un bloc (l'opération est alors directement effectuée sur disque) : int write(int handle. Les fichiers sont soit binaires (un float sera stocké comme il est codé en mémoire . UNIX) mais pas standardisés. O_EXCL renvoie une erreur si fichier existant (utilisé avec O_CREAT).h (ouverture et fermeture) et dans io. O_TRUNC vide le fichier s'il existait. void *bloc. par une opération OU (|) : O_APPEND positionnement en fin de fichier (permet d'augmenter le fichier). La fonction rend un entier positif dont on se servira par la suite pour accéder au fichier (HANDLE). On accède au fichier par lecture ou écriture de blocs (groupe d'octets de taille définie par le programmeur).1 Fichiers bruts C'est la méthode la plus efficace et rapide pour stocker et récupérer des données sur fichier (mais aussi la moins pratique). ils ne sont pas prévus dans la syntaxe du C mais par l'intermédiaire de fonctions spécifiques. disque) sont par contre conservables. Deux modes spécifiques au PC sont disponibles : O_TEXT change tous les \n en paire CR/LF et inversement. On traite les fichiers par l'intermédiaire de fonctions. On peut combiner cet accès avec d'autres spécifications. O_RDWR lecture et écriture. int mode). On peut ensuite. On choisira en général une taille de bloc constante pour tout le fichier. ou −1 en cas d'erreur. suivant le mode d'ouverture. seul S_IWRITE utile sur PC). disponibles sur la plupart des compilateurs (DOS. au lieu de donner une erreur. sans effet s'il existe (rajouter en 3ème argument S_IREAD | S_IWRITE | S_IEXEC déclarés dans stat. O_BINARY n'effectue aucune transformation.

La fonction retourne le nombre d'octets lus (<=taille.O_RDONLY|O_BINARY))<0) {puts("erreur ouverture"). pour pouvoir traiter le suivant). −1 si erreur. <si fin du fichier en cours de lecture. et le met dans le bloc dont on donne l'adresse et la taille. int nb_lus. nb_lus). La fonction retourne la position atteinte (en nb d'octets). Lorsque l'on ne se sert plus du fichier.} do { nb_lus=read(source. rend la taille d'un fichier (sans déplacer le pointeur de fichier). long filelength(int handle). rend 0 si ok.h> #include <fcntl. Pour déplacer le pointeur de fichier en n'importe que autre endroit. long combien.Le langage C − cours P. close(destination). O_WRONLY| O_CREAT| O_TRUNC| O_BINARY. int read(int handle. 0 si on était déjà sur la fin du fichier.taillebloc). lit dans le fichier désigné par son handle. if (argc!=3) {puts("erreur arguments"). } while ((nb_lus==taillebloc)&&(nb_ecrits>0)). il faut le fermer (obligatoire pour que le fichier soit utilisable par le système d'exploitation. void *bloc. on appelle la fonction : long lseek(int handle. −1 si erreur.h> #include <sys\stat.} if((destination=open(argv[2].return(1). if (nb_lus>0) nb_ecrits= write(destination. entre autre mise à jour de sa taille : int close(int handle) fermeture. Le fichier peut être utilisé séquentiellement (le "pointeur de fichier" est toujours placé derrière le bloc que l'on vient de traiter.(char *)buffer.h> #define taillebloc 1024 int main(int argc. char buffer[taillebloc]. à partir de : début du fichier si code=0. close(source). unsigned taille).char *argv[]) { int source. 6 Les fichiers de données 40 . Exemple : copie de fichier (les noms de fichiers sont donnés en argument du programme) #include <stdio.TRAU (en octets) de ce bloc. position actuelle si 0. return(0).return(2). int code).nb_ecrits. int eof(int handle) dit si on se trouve (1) ou non (0) sur la fin du fichier. −1 si erreur). destination.} if((source=open(argv[1]. déplace le pointeur de fichier de combien octets. −1L si erreur. Le nombre d'octets écrits est retourné. fin du fichier si 2.return(2). S_IREAD| S_IWRITE| S_IEXEC))<0) {puts("erreur ouverture").(char*)buffer.h> #include <io.

int fread(void *bloc. char fputs(char *s. il y a eu erreur (tester ferror ou errno). FILE *id). Sur PC. FILE *id) : écrit la chaîne dans le fichier sans ajouter de \n. Les fichiers bufférisés permettent aussi des sorties formatées : au niveau caractère : char fgetc(FILE *id). sans fermer le fichier (à appeler par exemple avant une instruction qui risque de créer un "plantage").Le langage C − cours P. FILE *id) : lit une chaîne en s'arrêtant au \n ou à max−1 caractères lus.h) sont : FILE *fopen(char *nomfic. int fseek(FILE *id. création si inexistant). et retour du pointeur s ou NULL si erreur. int feof(FILE *id) dit si on est en fin de fichier ou non (0). r+ (lecture et écriture. La fonction void perror(char *s mess) affichera le message correspondant à l'erreur. détaillée dans errno. résultat dans la zone pointée par s. w+ (lecture et écriture mais effacement au départ du fichier si existant).c=fgetc(id)}. int max. rend le dernier caractère écrit ou EOF si erreur. ou le définir par défaut en donnant à la variable _fmode la valeur O_TEXT ou O_BINARY. a+ (lecture et écriture. char *mode) : ouvre le fichier.−1. en général on lui donne le nom du fichier. a (append : écriture à la suite du contenu actuel. long combien.2 Fichiers bufférisés 41 . le résultat étant stocké à l'adresse bloc. positionnement en fin de fichier si existant. le fichier doit exister). La fonction rend le nombre d'éléments lus (<nb si fin de fichier). int fclose(FILE *id) : ferme le fichier. FILE *id) : lit nb éléments dont on donne la taille unitaire en octets. int nb. Ceci signifie qu'une instruction d'écriture n'impliquera pas une écriture physique sur le disque mais dans le buffer. on peut rajouter t ou b au mode pour des fichiers texte (gestion des CR/LF. dans le fichier désigné par id. le pointeur NULL est retourné. Les fichiers sont identifiés non par un entier mais par un pointeur sur une structure FILE (définie par un typedef dans stdio. 6. suivant le mode : r (lecture seule). en y recopiant le reste du buffer si nécessaire. int fflush(FILE *id) : transfère effectivement le reste du buffer sur disque. FILE *id) qui permet de "reculer" d'un caractère. fopen rend un identificateur (ID) qui nous servira pour accéder au fichier. 0 si erreur. position actuelle (mode=1) ou fin du fichier (mode=2). et même char ungetc(char c.1). int taille. le type d'erreur est donné dans une variable errno. int taille.h. Les fonctions disponibles (prototypées dans stdio. création sinon). int code) : déplace le pointeur de fichier de combien octets.TRAU } 6. avec écriture sur disque uniquement quand le buffer est plein. int nb.h). Retourne 0 si tout s'est bien passé. si le fichier existe il est d'abord vidé).2 Fichiers bufférisés Les opérations d'entrée / sortie sur ces fichiers se font par l'intermédiaire d'un "buffer" (bloc en mémoire) géré automatiquement. Retourne 0 si tout c'est bien passé. à partir de : début du fichier (mode=0). Cette fonction est obligatoire pour être sur d'avoir l'intégralité des données effectivement transférées sur le disque. Cette fonction n'est utilisable que si l'on connaît la taille des données dans le fichier (impossible d'aller directement à une ligne donnée d'un texte si on ne connaît pas la longueur de chaque ligne). Cette fonction correspond donc à {fseek(id. option par défaut) ou binaires. si le nombre rendu est différent de nb. En cas d'erreur. au niveau chaîne de caractères : char *fgets(char *s. int fwrite(void *bloc. FILE *id) : écriture du bloc sur fichier. w (écriture. char fputc(char c.

En général. On pourra ensuite apporter les améliorations suivantes : recherche rapide par dichotomie sans lire tout le fichier (en le supposant classé par ordre alphabétique). Les \n sont transformés en CR/LF si fichier en mode texte (spécifique PC). tous formatés sous forme ASCII. ou EOF si erreur. on utilise les fichiers bufférisés : − Soit en accès direct. puis chaque ligne du fichier contiendra une ligne de la matrice. imprimante. le précédent. contiendront en première ligne le nombre de lignes puis le nombre de colonnes. ceci permettant d'accéder directement à un élément donné (le 48ème. Exercice (fic_formaté) : modifier le programme de produit de matrices en lui permettant de donner sur la ligne de commande trois noms de fichiers : les deux premiers contiendront la description des matrices à multiplier. Les fichiers seront formatés.. création de fichiers index classés alphabétiquement sur les noms. le dernier sera créé et contiendra le résultat. avec tous les éléments de même type et même taille (souvent une structure.). avec possibilité d'ajout. département et ville pour accès rapide par dichotomie. On utilisera un fichier binaire à accès direct.. en lecture seule ou écriture seule (il est peu probable que le remplacement d'un élément se fasse avec le même nombre d'octets et nécessiterait un décalage dans le fichier). en lecture et écriture. Un tel fichier s'utilise comme l'écran et le clavier. 0 si erreur).Le langage C − cours P. listeadresses) : rend le nombre de variables lues et stockées.).. l'avant dernier.2 Fichiers bufférisés 42 . ces fichiers seront compréhensibles par n'importe quel autre programme (éditeur de texte. char *format. listearguments) : rend le nb d'octets écrits. 6. par des fonctions similaires. édition du fichier. en format binaire).TRAU int fprintf(FILE *id. suppression.. char *format. Exercice (agenda) : modifier l'agenda de l'exercice tel en permettant de sauver les données sur disque. int fscanf(FILE *id. − Soit en accès séquentiel. avec des éléments de type différent. les autres se faisant par recherche séquentielle.

7 Directives du pré−compilateur Attention. mais pas de gestion de pile. En C on a l'habitude de noter les constantes numériques en majuscules.. #include <nomfic> permet d'insérer à cet endroit un fichier. en le cherchant dans le répertoire actuel (le votre) #define nom valeur : remplace chaque occurrence du nom par la valeur. qui serra cherché dans le répertoire correspondant à la bibliothèque du C (sur PC dans \TC\INCLUDE) #include "nomfic" permet d'insérer à cet endroit un fichier. Il ne faut pas de blanc entre le nom de la macro et la "(" pour différencier d'un define simple.y) (((x)>(y)?(x):(y) replacera max(a. Il faut donc utiliser des parenthèses. exemple : #define PI 3. faire attention en cas de #if imbriqués #ifdef nom : comme #if mais vrai s'il y a eu auparavant un #define nom #ifndef nom : vrai si variable non définie exemples: #ifndef entier #define entier int 7 Directives du pré−compilateur 43 . On ne peut prendre en compte qu'une ligne (le retour à la ligne terminant la définition). les paramètres seront substitués lors de la réécriture.c)) par a>b>c?b:c?a:b>c?b:c #define max(x. Une macro ressemble à une fonction.. #if (expression) : les lignes qui suivent ne seront lues (et compilées que si l'expression est vraie #endif : fin de portée du #if précédent #else : possible mais optionnel. les directives se terminent par le retour à la ligne et pas un ". mais sera d'exécution plus rapide : le texte est directement inséré à l'endroit voulu.".c)) par (((a)>( (((b)>(c))?(b):(c)) )) ? (a) : (((( b)>(c)) ? (b) : (c))) ce qui donne des parenthèses superflues mais le résultat escompté. même si elles semblent inutiles : #define double(a) (a)*2 autre exemple: #define max(x. #undef nom : annule le précédent #define nom .max(b. comme s'il était écrit ici.max(b.1415926 #define begin { #define end } #define macro(parametres) définition : permet la définition d'une macro. #define double(a) a*2 remplacera double (i+5) par i+5*2.y) x>y?x:y replacera max(a.

TRAU /* si une autre bibliothèque incluse plus haut l'a déjà défini. on ne le redéfinit plus */ #endif #ifdef biblio_graphique initialise_ecran().h) inclus ou non plus haut */ 7 Directives du pré−compilateur 44 .Le langage C − cours P. trace(dessin). #else puts("si on avait eu un écran graphique j'aurai fait un dessin"). efface_ecran(). #endif /* biblio_graphique peut être défini dans un "header" (fichier.

WINDOW : choix des fenêtres ouvertes. par exemple.. changement de taille. déplacement. on valide par ESPACE. vous aurez une indication sur tous les formats possibles ainsi que des exemples. utile pour voir à la fois vos résultats et votre programme. surtout après l'avoir effacée par erreur par CTRL Y. Sinon. Placez vous dans votre répertoire (pas celui de Turbo C pour ne pas mélanger avec vos fichier) et appelez TC. En choisissant l'option menus longs. on accède à une commande d'un menu par ALT et lettre en surbrillance. SEARCH : recherche ou remplacement d'un texte dans tout le fichier (CTRL L pour rechercher le suivant).5 par exemple) Turbo C est d'après moi le compilateur le plus intéressant sur PC en phase d'apprentissage : éditeur intégré. au cas ou votre programme planterait la machine (automatisation possible sous options) 8 Utiliser Turbo C (3. débogueur puissant. inspect). PROJECT : un projet contient la liste de fichiers nécessaires au fonctionnement d'un programme (fichiers séparés). HELP : aide En vous plaçant sur une commande d'un menu. sait dans quel header elle est déclarée). sauver le fichier actuel (save ou save as). DEBUG : en mode pas à pas on peut voir ou modifier l'état d'une variable (evaluate.5 par exemple) 45 .. aide en ligne. COMPILE : compiler pour voir les erreurs. il vaut mieux posséder une souris. mode 43 lignes (environnement preferences) et même couleurs.8 Utiliser Turbo C (3. et surtout remettre une ligne de texte dans son état initial (restore line). il faut faire un EXE pour pouvoir utiliser le programme hors de TC. sauvez votre source avant de l'exécuter. Entre autres la fenêtre OUTPUT correspond à l'écran tel que le gère votre programme. Au menu principal. EDIT : couper − coller. voir l'état de la pile (imbrication des fonctions et arguments réels : call stack) voir dans une fenêtre à tout moment l'état d'une variable (add watch). puis choisir le fichier dans la liste). niveau de messages d'erreur de compilation. les touches de raccourci sont indiquées à côté des fonctions des menus. l'appui sur F1 vous détaille ce que permet cette commande. avancer d'une ligne (trace into ou step over). éditeur multifenêtres. On peut exécuter le programme pas à pas : Aller jusqu'à la ligne dans laquelle est le curseur. Les commandes sont accessibles par menus. uniquement si c'est un mot clef du C (mais connaît toutes les fonctions. Ceci permet de voir dans quel ordre s'exécutent les instructions. Dans une fenêtre de texte . Dernier conseil. quitter TC (quit ou ALT X). lié aux messages d'erreur. OPTION : on peut tout choisir : répertoires. tapez printf puis CTRL F1. on change d'option par TAB. reprendre un fichier déjà existant (open. RUN : exécuter le programme. on peut : FILE : gérer les fichiers : en créer un nouveau (new). l'appui sur CTRL F1 vous donne une aide sur le mot sous le curseur.

Le langage C − cours P.TRAU

8 Utiliser Turbo C (3.5 par exemple)

46

9 Liens vers d'autres sites sur le C
Je ne suis pas le seul à publier mon cours sur Internet. Voici d'autres liens, pour compléter (ou remplacer) ce que je propose. • Le cours d'Irène Charon (ENST Paris) : le language est présenté progressivement à partir d'exemples. C'est un très bon complément à qui n'a pas trop aimé ma méthode de présentation (mes étudiants par exemple) • Le cours de Alain Dancel : Très bon cours, très complet. • cours ANSI−C de Fred Faber (Lycée Technique des Arts et Métiers, Luxembourg) • le cours d'Yves Papegay (Inria) (sous Unix) vous cherchez un compilateur (freeware, évidement) ? DJGPP pour DOS, ou GNU−Win32 pour Win 95/NT, ou GCC pour Unix (c'est le seul que j'ai essayé). De nouveaux arrivants : Pacific : sous DOS (freeware), avec un environnement sympa (un peu comme Turbo C), et une doc en pdf (la version Windows est payante). Désormais, Inprise (Borland) vous propose ses compilateurs gratuitement ! (pour certaines versions Turbo C, Turbo Pascal, Borland C, Delphi..., évidement pas les plus récentes).

9 Liens vers d'autres sites sur le C

47

10 Correction des exercices
langage C / Patrick TRAU
1. while_puiss 2. while_err 3. do_while 4. for 5. jeu 6. calcul 7. moyenne 8. rotation 9. classer 10. chaînes 11. matrices 12. déterminant 13. tel 14. liste et insertion 15. agenda

10.1 1. while_puiss
#include <stdio.h> void main(void) { int puissance=1,max; puts("nombre maximal désiré (ne pas dépasser 16000) ?"); scanf("%d",&max); while (puissance<max) printf("%d\n",puissance*=2); }

retour au sujet de cet exercice

10.2 2. while_err
Ce programme démontre les erreurs de calcul toujours effectuées sur des nombres réels. On additione successivement 0.01 (qui n'a pas de représentation finie en binaire) à un réel initialement nul. On compte le nombre de calculs jusqu'à obtenir une erreur de 100%. Dans ce cas il faut 16246 calculs. On peut essayer d'autres pas et d'autres débuts. retour au sujet de cet exercice

10.3 3. do_while
#include <stdio.h> #include <stdlib.h> /* pour rand() */ #include <time.h> /* pour trouver l'heure pour srand */ void main(void) { int solution,reponse,nb_essais=0;

10 Correction des exercices

48

scanf("%d". puts("nombre de notes ? "). else if (nb_essais<4) puts("bravo"). /* reste sera toujours entre 0 et 10 */ do { nb_essais++.srand((unsigned) time(&t)). puts("proposez votre nombre entre 0 et 10"). } /* initialiser le générateur à partir du compteur de temps. printf("trouvé en %d essais\n".Le langage C − cours P.4 4. else if (reponse!=solution) puts("trop petit").nb_essais). scanf("%f". puts("proposez votre nombre entre 0 et 10"). printf("moyenne calculée :%5. else if (nb_essais>6) puts("ce score me semble bien minable").i<N. /* reste sera toujours entre 0 et 10 */ do { nb_essais++.nb_essais=0.2f\n". if (nb_essais==1) puts("vous avez eu un peu de chance").i++) { printf("entrez votre %dième note".h> #include <stdlib.&N). for #include <stdio.somme=0.i+1).srand((unsigned) time(&t)).N. if (reponse>solution) puts("trop grand"). pour qu'il soit plus aléatoire */ solution=rand()%11.h> void main(void) { int i.h> /* pour rand() */ #include <time. float note.5 5.nb_essais). } /* initialiser le générateur*/ solution=rand()%11. } 10.&reponse). somme+=note. { time_t t.&note).h> /* pour trouver l'heure pour srand */ void main(void) { int solution. } retour au sujet de cet exercice 10. for 49 .4 4. jeu #include <stdio. printf("trouvé en %d essais\n".moyenne. } retour au sujet de cet exercice 10.TRAU {time_t t. } while (reponse!=solution). scanf("%d".moyenne). } moyenne=somme/N. scanf("%d". for(i=0. } while (reponse!=solution).reponse.&reponse).

i<Nb.Le langage C − cours P.val2.i<Nb. } while (!fin). ou 1=1 pour finir ? "). scanf("%f%c%f".i++) printf("%dième note : écart : %f\n".val1.6 6. switch (op) { case '*':res=val1*val2. tableau tab.break.h> void main(void) { float val1. } void affichage(float moy) { int i.&val1. case '=':fin++. } 10.&val2).h> #define max 100 typedef float tableau[max].res.6 6. } retour au sujet de cet exercice 10.&Nb). float somme=0.Nb. for (i=0. puts("entrez le nombre de notes à traiter :"). void lecture(void) { int i. char op.tab[i]−moy).break. /* pas besoin de break. je suis déjà au } */ } if (!fin) printf("%f%c%f=%f\n".val2. int fin=0. case '+':res=val1+val2.TRAU retour au sujet de cet exercice 10. do scanf("%d". while ((Nb<=0)||(Nb>max)).i+1). int Nb. for(i=0. for(i=0. calcul 50 .7 7. printf("la moyenne des %d notes est %f\n". } } float moyenne(void) { int i. calcul #include <stdio.i+1.res). case '/':res=val1/val2.break. return(somme/Nb).op.&tab[i]).break.&op.moy). scanf("%f".i<Nb. moyenne #include <stdio. case '−':res=val1−val2.i++) somme+=tab[i].i++) { printf("valeur n° %d ? ". do { puts("calcul à effectuer (par ex 5*2).

puts("tableau initial :").*t++).*t. rotation 51 . int nb) { composante c.&nombre). affichage(moyenne()). lecture(tableau. for (i=1. rotation #include <stdio. } retour au sujet de cet exercice 10. puts("décalage vers le bas :").nombre). affiche(tableau.} *t=c.8 8.h> typedef int composante.i++) printf("%d ". scanf("%d".i<nb. c=*t.nombre).i<=*nb. puts("nombre de valeurs à entrer ? ").i++) {*t=*(t+1).t++).t−−.i++) { printf("%dième valeur : ". decale_bas(tableau. decale_haut(tableau.nb). t=deb+(max−1). int max) { int i. } void decale_bas(composante *deb. puts(" ").i<max.i). scanf("%d".nombre).int i. int max) { composante c.8 8.nombre).} *t=c. puts("décalage vers le haut :"). } void decale_haut(composante *t.TRAU void main(void) { lecture().int *nb) { int i. while (t>deb) {*t=*(t−1). } retour au sujet de cet exercice 10. } void main(void) { composante tableau[100]. int nombre.t++. for(i=1. affiche(tableau. c=*t.Le langage C − cours P. for(i=0. } } void affiche(composante *t. affiche(tableau. void lecture(composante *t.nombre).

/* 1er : recherche du plus petit. int nombre. } copier(tempo. tempo[ind_faits=0]=tab[indice].i<=*nb. classer #include <stdio. /* les suivants : recherche le + petit mais > au précédent */ for(ind_faits=1. puts(" ").indice.i++) if (t[i]==t[indice_dep]) return(i).t++). /* si on est encore là c'est qu'il n'y en pas d'égal */ for(i=0. scanf("%d".i++) if(tab[i]<tab[indice]) indice=i. int nb) { composante tempo[dim]. } void main(void) { composante tableau[dim]. for(i=1. for(i=indice_dep+1.tab. scanf("%d". classer 52 . } void copier(composante *source.indice_resultat=−1.i<max.i<nb_indices.TRAU 10. void lecture(composante *t.i++) if ((t[i]>t[indice_dep]) && ((indice_resultat<0) || (t[i]<t[indice_resultat]))) indice_resu return(indice_resultat). } } void affiche(composante *t.i<nb.nb).i<nb_indices. for(i=0.&nombre). puts("nombre de valeurs à entrer ? ").9 9. /* un malloc(sizeof(composante)*nb) aurait été mieux mais on n'en a pas encore parlé en cours */ int i. puts("tableau initial :"). for(i=0. int nb) /* copie le tableau source dans le tableau dest */ { int i. * −soit la plus petite mais >t[indice_deb] */ { int i. mais d'indice > à indice_dep. composante *dest. for(i=1.nb).i++) { printf("%dième valeur : ".h> #define dim 100 typedef int composante. } void classe(composante tab[].ind_faits++) { indice=indice_min(tab.i).i++) *(dest++)=*(source++).int *nb) { int i.*t++). tempo[ind_faits]=tab[indice].i++) printf("%d ".nb). le 1er si ex aequo */ indice=0. int max) { int i.ind_faits.int indice_dep.i<nb. int nb_indices) /* cherche l'indice de la valeur du tableau : * −soit égale à t[indice_dep]. } int indice_min(composante t[]. lecture(tableau. 10.ind_faits<nb.indice.Le langage C − cours P.9 9.

puts("sous−chaîne à trouver ?").Le langage C − cours P. chaînes #include <stdio.c++) 10.col). } retour au sujet de cet exercice 10. matrices #include <stdio.sch++.pos). float f. else {ch++.int *col) /* lit à l'écran une matrice */ { int l. typedef float *pointeur.c<*col.l<*lig.nombre).char *sch) { int pos=0. classe(tableau.h> #define DIM 10 typedef float ligne[DIM].nombre). void lecture(matrice t.10 10.c. } } void main(void) { char ch[taille].l++) for(c=0. puts("chaîne à tester ? ").lig). puts("tableau classé :"). ch++. puts("nombre de colonnes de la matrice ?").sch)) printf("trouvé en position %d\n". puts("nombre de lignes de la matrice ?").nombre).11 11. gets(sch).} } return(!(*sch)).sch). } void recherche(char *ch. for (l=0. scanf("%d". affiche(tableau. typedef ligne matrice[DIM]. recherche(ch. } retour au sujet de cet exercice 10. gets(ch).sch[taille]. while (*ch) { if (debut_egal(ch.int *lig.h> #define taille 255 int debut_egal(char *ch.TRAU affiche(tableau.char *sch) /* répond si sch est exactement le début de ch */ { while (*sch && *ch) { if (*sch!=*ch) return(0). scanf("%d".pos++.10 10. chaînes 53 .

i<DIM.l.10 10.n). affiche(c.in<n. for(i=0. 0 autre) */ { int i.i++) { printf("ligne %d : ".i. lecture(a.matrice b.j<c.&l).j.im<m.m.1f ".matrice c.j. */ { int i.i<DIM*DIM. zero(t). for(im=0.i++) t[i][i]=1.&n).c. affiche(b. } void main(void) { int m.int n) /* calcul du produit */ { int im.il.&f). zero(c).j<DIM.TRAU { printf("élément [%d.b.in.b.0.l).numcol */ { int i.int m.in++) for(il=0.t[i][j]).m.%d] ? ".n.int l. for(j=0.m.&i.il++) c[im][in]+=a[im][il]*b[il][in].n).j++) t[i][j]=i+j/10. } void affiche(matrice t.l.i<l. for(i=0.i). puts("−−− FOIS −−−").Le langage C − cours P. printf("\n"). puts("−−− FAIT −−−"). chaînes 54 . } } void zero(float *t) /* met toute la matrice à 0 */ { int i.i++) for(j=0. matrice a. scanf("%f".im++) for(in=0. if(i!=l) puts("calcul impossible : dimensions incompatibles").&m.c). lecture(b.int c) /* puts("affichage du tableau ligne par ligne :").i++) *t++=0.l. } } void produit(matrice a. produit(a.n).l. } void unit(matrice t) /* remplit la matrice unité (1 diagonale. for(i=0. affiche(a.i<DIM. } retour au sujet de cet exercice 10. t[l][c]=f. for(i=0.int l. } void init(matrice t) /* initialisation de matrice à numlig.j++) printf("%3.c.il<l.

l<dim. } void unit(matrice t.Le langage C − cours P. float det=0. 0 autre) */ { int i.c<*lig.int dim) /* met toute la matrice à 0 */ { int i.c<dim.h> #include <stdlib.int ligavirer) { int l. */ { int i.c. printf("\n").TRAU 10.l++) 10.j<dim.12 12.i<dim.l<dim.l++) for(c=0.signe=1. } } void copiesauflc(matrice source. for(i=0. void lecture(matrice t. t[l][c]=f.lig).i<l.l.c).j.1f ". for (l=0. } } void zero(matrice t.matrice dest. ld++.c++) { printf("élément [%d. int l.int dim) { matrice sous_m. for(i=0. for(j=0. for(i=0.int l) /* puts("affichage du tableau ligne par ligne :"). nb_appels++.j.j++) t[i][j]=0. if (dim==1) return(m[0][0]).i<dim. for (l=0.i++) { printf("ligne %d : ". typedef float *pointeur.%d] ? ". scanf("%f".c. float f.j++) printf("%3.int dim.l++) if (l!=ligavirer) { for (c=1. determinant #include <stdio. } void affiche(matrice t. determinant 55 .i).l<*lig.ld=0.i++) t[i][i]=1.&f).12 12.int *lig) /* lit une matrice (au clavier) */ { int l.j<l. scanf("%d". } } float determinant(matrice m. int dim) /* remplit la matrice unité (1 diagonale.t[i][j]). puts("dimension de la matrice ?"). zero(t.c++) dest[ld][c−1]=source[l][c]. long nb_appels.dim). typedef ligne matrice[DIM]. for(l=0.h> #define DIM 10 typedef float ligne[DIM].i++)for(j=0.

&taille). printf(" en %ld appels\n". char rue[60].char *). *rech_prenom(fiche *. char *nomchamp[7]={"Nom".char *argv[]) { int taille.13 13. *rech_rue(fiche *. tel 56 . long codepostal. ptrfonction tabfonction[7]={rech_nom. "Rue".h> #include <string. /* au moins je connais le résultat*/ affiche(mat. rech_prenom.char *). "Prénom". *rech_ville(fiche *.prenom.in<dim.matrice b.in.Le langage C − cours P.char *). "Numéro".il<dim. */ unit(mat.int dim) /* calcul du produit */ { int im. typedef struct { char nom[15].l).TRAU { copiesauflc(m.char *).ville.taille).in++) for(il=0. *rech_cp(fiche *.im<dim.dim).char *).dim. matrice mat. char ville[20]. tel #include <stdio.determinant(mat. zero(c.matrice c. "Ville".char*).h> #define DIM 100 enum champs {nom. *rech_nom(fiche *.taille)). *rech_tel(fiche *.cp. "Code Postal".sous_m.h> #include <stdlib. char tel[15]. } void main(int argc. printf("déterminant : %20.char *).char *).il++) c[im][in]+=a[im][il]*b[il][in].13 13. typedef fiche *ptrfiche. /* test avec matrice unité. } fiche. char prenom[20].im++) for(in=0.tel}.char *).rue. int num. } void produit(matrice a.nb_appels). rech_num. typedef ptrfiche (*ptrfonction)(ptrfiche. signe=−signe.17f ". det+=signe*m[l][0]*determinant(sous_m.dim−1).taille). */ taille=atoi(argv[1]).num. } retour au sujet de cet exercice 10. fiche fiche fiche fiche fiche fiche fiche fiche *rech_nom(fiche *. } return(det). 10. for(im=0.il. "Tel"}. /* lecture(mat. *rech_num(fiche *.

rech_tel}.n)))pf++. gets(tab−>prenom). f−>prenom. gets(tab−>nom).} fiche *rech_tel(fiche *pf.} fiche *rech_num(fiche *pf.char *n) {while ((pf−>nom[0])&&(!idem(pf−>tel.} fiche *rech_rue(fiche *pf. f−>codepostal. sscanf(lig. rech_ville. } fiche *rech_nom(fiche *pf. return(pf).char *n) {while ((pf−>nom[0])&&(!idem(pf−>prenom. for (i=nom.char *s2) /* compare deux chaines. void affiche(fiche *f) { if(f−>nom[0]) printf("%s %s\n%d. do { printf("nom (rien pour finir) ?").char *n) {while ((pf−>nom[0])&&(!idem(pf−>rue. } void lecture(fiche *tab) { char lig[40].char *n) {while ((pf−>nom[0])&&(!idem(pf−>ville. f−>nom. printf(" rue ? "). 10.char *n) {while ((pf−>nom[0])&&(!idem(pf−>nom. On pourrait supposer égalité quand la chaine s2 est incluse dans s1 */ { return(strcmp(s1. return(pf).nomchamp[i]). printf(" N° ? "). f−>num.i. tel 57 .n)))pf++. return(pf).} int choix(void) { char lig[40].} fiche *rech_cp(fiche *pf. else printf("fiche inconnue\n").13 13. f−>tel).&(tab−>num)).} fiche *rech_ville(fiche *pf. } int idem(char *s1.s2)?0:1)."%d".n)))pf++. printf("\nou −1 pour quitter.Le langage C − cours P.char *n) {while ((pf−>nom[0])&&(pf−>codepostal!=atoi(n)))pf++.rep.char *n) {while ((pf−>nom[0])&&(pf−>num!=atoi(n)))pf++. return(pf).n)))pf++. ou non (0). f−>ville. sscanf(lig.&rep). Type de recherche désirée ? "). gets(lig).} fiche *rech_prenom(fiche *pf.i<=tel. rech_cp. gets(lig). return(pf)."%d". if(tab−>nom[0]) { printf(" prénom ? ").TRAU rech_rue. f−>rue. return(pf). %s\n%ld %s\nTel : %s\n". return(rep). return(pf). dit si elles sont égales (1). enum champs i.i++) printf("%d:%s ".n)))pf++.

liste et insertion #include #include #include #include <stdio. 10. } } while ((tab++)−>nom[0]).&nouveau−>val). }. printf("quel(le) %s recherche−t'on ? ". } retour au sujet de cet exercice 10. gets(tab−>ville). } while (c>=0)."%ld".&premier−>val).nomchamp[c]).*nouveau. printf(" code postal ? "). } void lecture(void) { struct page *precedent. int encore(void) /* demande si on en veut encore*/ { printf("encore (O/N) ? "). liste et insertion 58 . puts("\nentrez votre entier"). scanf("%d".h> struct page {int val.h> <conio. printf("n° de téléphone ? "). precedent=nouveau. } void main(void) { enum champs c. puts("entrez votre premier entier").h> <alloc. printf(" ville ? "). } precedent−>suivant=NULL.clef)). while (encore()) { nouveau=(struct page *)malloc(sizeof(struct page)). do { if (((c=choix())<0)||(c>6)) break. affiche(tabfonction[c](tab. lecture(tab).Le langage C − cours P. gets(tab−>tel). premier=(struct page *)malloc(sizeof(struct page)).14 14. precedent=premier. gets(clef). struct page *suivant. char clef[40]. struct page *premier. sscanf(lig. fiche tab[DIM]. return(toupper(getche())=='O').h> <ctype. scanf("%d". precedent−>suivant=nouveau.&(tab−>codepostal)).14 14.TRAU gets(tab−>rue). gets(lig).

} else { prec=actu. printf("\nnouvelle valeur ? "). while(prec!=NULL) { printf("\nvaleur : %d − insérer après celui_ci (O/N) ? ". while (actu!=NULL) { printf("\nvaleur : %d − supprimer celui−ci (O/N) ? ".*prec. debut=debut−>suivant. } printf("\n"). break. prec−>val). break.TRAU } void affiche(struct page *debut) { printf("\nliste : ").*prec.&(nouveau−>val)). free(actu). actu=premier. nouveau−>suivant=prec−>suivant. else prec−>suivant=actu−>suivant. while(debut!=NULL) { printf("%d ".actu−>val).14 14. if (toupper(getche())=='O') { nouveau=(struct page *)malloc(sizeof(struct page)). scanf("%d". } else prec=prec−>suivant. } void suppression(void) { struct page *actu. if (toupper(getche())=='O') { nouveau=(struct page *)malloc(sizeof(struct page)). prec−>suivant=nouveau. } } } void ajouter(void) { struct page *nouveau. actu=prec−>suivant. } } } 10.&(nouveau−>val)).debut−>val). if (toupper(getche())=='O') { if(actu==premier)premier=actu−>suivant. printf("\najouter en premier (O/N) ? "). } else { prec=premier.Le langage C − cours P. printf("\nnouvelle valeur ? "). scanf("%d". liste et insertion 59 . premier=nouveau. nouveau−>suivant=premier.

} while(encore()). agenda 60 . long codepostal.TRAU void main(void) { lecture(). rech_cp. char *nomchamp[7]={"Nom".char *).Le langage C − cours P.h> <ctype. rech_num."Prénom". "Code Postal". } while(encore()). affiche(premier). affiche(premier). fiche *rech_tel(fiche *. char ville[20].num.h> /* définitions des types et variables associées */ enum champs {nom. fiche *rech_rue(fiche *.15 15.prenom.char *). char tel[15].15 15. do { suppression()."Ville".char *). 10. affiche(premier).char *). ptrfonction tabfonction[7]= {rech_nom. #define taille sizeof(fiche) typedef fiche *ptrfiche. typedef ptrfiche (*ptrfonction)(ptrfiche.dat".char *). agenda #include #include #include #include #include <stdio.h> <string."Numéro". fiche *rech_nom(fiche *. } retour au sujet de cet exercice 10.rue. char rue[60].tel}. char prenom[20]. typedef struct { char nom[15]. /* définitions des fonctions de recherche. fiche *rech_num(fiche *. rech_prenom. fiche *rech_prenom(fiche *. int num.cp.char*). fiche *rech_ville(fiche *.char *). rech_ville. fiche *rech_cp(fiche *. } fiche.char *).h> <stdlib.ville. /* fichier de données */ char *nomfic="agenda. regroupées dans un tableau */ fiche *rech_nom(fiche *. rech_tel}.h> <conio."Rue"."Tel"}.char *). do { ajouter(). /* variables globales */ FILE *fic. rech_rue.

&(f. printf(" code postal ? "). if ((toupper(*s1)!=toupper(*s2))||(!*s1)||(!*s2)) return(0). printf(" prénom ? ").fic)!=1) { puts("impossible d'ajouter cette fiche au fichier ").15 15. printf("nom ? ").f−>codepostal.nb).s2++. } void ajouter(void) { char lig[40]. printf("%d fiches présentes dans l'agenda\n".nom)."a+b"))==NULL) { puts("ouverture impossible du fichier de données"). %s\n%ld %s\nTel : %s\n".f−>ville.f−>tel). nb=(int)ftell(fic)/taille. printf(" Numero ? "). gets(f. fseek(fic. dit si elles sont égales (1). f−>rue. gets(f. gets(lig).ville). ou non (0). gets(lig).char *s2) /* compare deux chaines. gets(f."%ld".prenom). printf("n° de téléphone ? "). } nb++. exit(0). gets(f.codepostal)).f−>nom. f−> prenom. sscanf(lig. else printf("fiche inconnue\n"). Une des chaines peut se terminer par *. } 10.&(f. printf(" rue ? ").rue). } fseek(fic. On considère égales majuscules et minuscules.) { if (((!*s1)&&(!*s2))||(*s1=='*')||(*s2=='*')) return(1). fiche f.. agenda 61 .2).2).TRAU int nb. } int idem(char *s1.Le langage C − cours P. printf(" ville ? "). exit(1). sscanf(lig. s1++. if(fwrite(&f.taille. on supposera identique si tout ce qui précède l'* était identique */ { for(.num)). f−>num. détermine le nb de fiches de fic */ { if ((fic=fopen(nomfic. /* nb de fiches dans le fichier */ void init(void) /* ouvre le fichier."%d".0L.tel). } void affiche(fiche *f) { if((f!=NULL)&&(f−>nom[0])) printf("%s %s\n%d.1.0. gets(f.

clef))."%d".1.nomchamp[i]).&rep). case 'R':recherche(). } } while (rep!='Q'). Type de recherche désirée ? "). if (nblu==1) return(pf). switch (rep=toupper(getch())) { case 'A':ajouter(). do nblu=fread(pf. affiche(tabfonction[c](&f.puts("Au revoir"). } /* les autres recherches sont à continuer */ int choix(void) { char lig[40]. do { if (((c=choix())<0)||(c>6)) break. Recherche d'une fiche. } void main(void) { char rep.break.Le langage C − cours P. } void recherche(void) { enum champs c.fic).i<=tel. agenda 62 .15 15. printf("\nou −1 pour quitter. for (i=nom. } retour au sujet de cet exercice 10. else return(NULL).taille. printf("quel(le) %s recherche−t'on ? ".break. init().char *n) { int nblu. do { puts("Ajouter une fiche.n))).nomchamp[c]).i. enum champs i.rep.0L. fiche f. gets(lig). fseek(fic. default :puts("option non prévue"). return(rep).0).i++) printf("%d:%s ". sscanf(lig. gets(clef).TRAU } fiche *rech_nom(fiche *pf.break. Quitter le prog ? "). while ((nblu==1)&&(!idem(pf−>nom. char clef[40]. } while (c>=0). case 'Q':fclose(fic).

2 B • bibliothèque [1] • bibliothèques standard [1] • bit [1] • blanc [1] • bloc [1] [2] [3] [4] • boucle [1] • break [1] [2] • buffer [1] 11.B.V.3 C • calloc [1] • caractère [1] [2] • case [1] • cast [1] [2] • chaîne [1] [2] • champ [1] • char [1] [2] • classe [1] [2] • close [1] • commentaire [1] • conio.O.W 11.Q.L.F.1 A • accès direct [1] [2] • accès séquentiel [1] • addition [1] • adresse [1] • affectation [1] [2] • alloc.h [1] • allocation dynamique [1] • ANSI [1] [2] [3] [4] • antislash [1] • arbre [1] • argc [1] • argument [1] [2] [3] [4] [5] [6] ♦ formel [1] [2] ♦ réel [1] [2] • argv [1] • associativité [1] • atof [1] • atoi [1] • atol [1] • auto [1] 11.T.h [1] 11 Langage C − Index 63 .H.N.C.P.R.D.11 Langage C − Index A.K.I.E.G.M.S.U.

h [1] • exit [1] • expression [1] [2] • extern [1] 11.4 D 64 .5 E • else [1] • entête [1] • de fonction [1] • entier [1] [2] • entrées/sorties [1] • enum [1] • énumération [1] • EOF [1] [2] • errno.h [1] 11.Le langage C − cours P.h [1] • feof [1] • fflush [1] • fgetc [1] • fgets [1] • fichier [1] [2] • filelength [1] • float [1] • fonction [1] [2] [3] • fopen [1] • for [1] • format printf [1] 11.TRAU • continue [1] • contrôle [1] • conversion [1] • corps [1] • ctype.4 D • déclaration [1] [2] [3] ♦ de type [1] ♦ globale [1] ♦ locale [1] • décrémentation [1] • default [1] • define [1] [2] [3] • deuxaire [1] • directive [1] • division [1] • do while [1] • double [1] • durée de vie [1] 11.6 F • faire tant que [1] • fclose [1] • fcntl.

9 I • identificateur [1] • if [1] [2] ♦ imbriqué [1] • ifdef [1] • ifndef [1] • include [1] [2] • incrémentation [1] • instruction [1] • int [1] • isalnum [1] • isalpha [1] • isdigit [1] • islower [1] • isspace [1] • isupper [1] 11.10 K • Kernigham [1] 11.11 L • label [1] • liste [1] • long [1] [2] [3] • longueur d'identificateur [1] 11.Le langage C − cours P.7 G • getch [1] • getchar [1] • getche [1] • gets [1] • goto [1] • goto calculé [1] 11.7 G 65 .8 H • handle [1] • heap [1] 11.TRAU • formaté [1] [2] • fprintf [1] • fputc [1] • fputs [1] • fread [1] • free [1] • fscanf [1] • fseek [1] • fwrite [1] 11.

12 M • macro [1] • main [1] • malloc [1] [2] • matrice [1] • mem.14 O • opérande [1] • opérateur [1] [2] • open [1] 11.TRAU • lseek [1] • Lvalue [1] 11.15 P • paramètre [1] • passage d'argument [1] • pile [1] [2] [3] • pointeur [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] • pour [1] • pré−compilateur [1] • printf [1] [2] • priorité [1] • produit [1] • prototype [1] • putch [1] • puts [1] [2] 11.Le langage C − cours P.16 Q • quote [1] 11.12 M 66 .h [1] • memcmp [1] • memcpy [1] 11.17 R • récursivité [1] • réel [1] [2] • rand [1] • read [1] • realloc [1] • register [1] • return [1] [2] • Ritchie [1] 11.13 N • NULL [1] [2] 11.

20 U • unaire [1] • undef [1] • ungetc [1] • union [1] • unsigned [1] [2] [3] 11.TRAU • Rvalue [1] 11.Le langage C − cours P.19 T • tableau [1] [2] [3] • tailles [1] • tant que [1] • tas [1] • ternaire [1] • tolower [1] • toupper [1] • typedef [1] [2] [3] [4] 11.18 S • séquentiel [1] • scalaire [1] • scanf [1] [2] • short [1] [2] • si − Sinon [1] • soustraction [1] • sprintf [1] • sscanf [1] • static [1] [2] [3] • stdio.h [1] • strlen [1] • strncat [1] • strncpy [1] • struct [1] [2] • structuré [1] • structure [1] [2] • switch [1] 11.h [1] [2] • stdlib.18 S 67 .h [1] [2] • strcat [1] • strcmp [1] • strcpy [1] • string.21 V • variable [1] [2] • variables locales [1] • visibilité [1] • visible [1] • void [1] 11.

22 W • while [1] • write [1] 11.TRAU 11.22 W 68 .Le langage C − cours P.

Related Interests

apostrophe • \ antislash • ###BOT_TEXT###quot; double quote • ###BOT_TEXT### nul • \nombre en octal sur 3 chiffres (ou moins si non suivi d'un chiffre). long. mais long sur les stations 32 bits).8.8.Le langage C − cours P.8. On peut également utiliser le nom double au lieu de long float.1 char : caractère (8 bits) Une constante caractère est désignée entre apostrophes (simples quotes). 5.8. On peut par contre utiliser le spécificateur long pour des réels avec une précision accrue. On peut définir certains caractères spéciaux. une mantisse et un exposant.1. int donnera les programmes les plus rapides pour une machine donnée (int = short sur PC. il faut utiliser des unsigned char (de 0 à 255). Sans précision.1 Variables scalaires 28 .

1 Variables scalaires 29 16 32 32 32 64 80 0 à 65535 −2.8.147. mardi=1. exemple : enum jour aujourd_hui=mardi. etc.5. soit mardi.} Un cast transformant un réel en entier prendra la partie entière.1E+4932 (19 chiffres signif." dimanche"}. si nécessaire. On peut forcer une transformation en utilisant le cast.5 donnera donc 5. pour qu'il n'émette pas de message d'erreur (à utiliser avec grande prudence).4E−4932 à 1.7e308 (15 chiffres significatifs) 3.. "jeudi". vendredi.nom[aujourd_hui]). jeudi. "vendredi". le cast ne permet que de faire croire au compilateur que la variable est d'un autre type que ce qu'il attendait. La syntaxe est : (type_résultat) valeur_à_transformer exemple : {float x. Il n'y a aucun test de validité (dimanche+1 donne 7).1.294.648 à 2.483.5 Conversions de type / cast Dans les calculs.Le langage C − cours P. ou indiquer : enum nomdutype liste_variables.647 0 à 4. mais on peut faire: char *nom[7]={"lundi".295 −3. On peut directement mettre la liste des variables à créer (entre le "}" et le ". On a créé un nouveau type. dimanche}.147.1. mardi.8.6 Enumérations On peut définir un nouveau type (d'entiers) sous la forme : [classe] enum nomdutype {liste_valeurs} [liste_variables]. mercredi. "mercredi". suivant l'ordre : char −> int −> long −> float −> double signed −> unsigned Attention la transformation n'est effectuée que le plus tard possible. utiliser (int)(réel_positif+0.) . les char sont automatiquement transformés en int.4e38 (7 chiffres significatifs) −1. Ceci permet de rendre les programmes plus clairs. Pour obtenir l'entier le plus proche .7e308 à 1.5)... De plus les opérations arithmétiques sont toujours effectuées sur des long ou double. avec lundi=0. elle est impossible implicitement.. Attention. Quand un opérateur possède des arguments de type différent. ([] facultatifs) exemple : enum jour {lundi.967. "samedi". Il faut bien noter que le cast n'est une opération de transformation que pour les types scalaires. samedi."). toute variable de type jour pourra valoir soit lundi. pour tous les autres types. x=(float)a. On peut donc faire toutes les opérations entières (aujourd_hui++ par exemple). pour une précision maximale quels que soient les résultats intermédiaires (voir exemples au chapitre expressions arithmétiques). puis printf("%s". qui est un opérateur unaire. 5.8.483. une transformation de type est effectuée automatiquement.4e38 à 3. "mardi". 5/2+3..int a=5. printf affichera un entier. 5.) En fait le type jour est un type int. Cette transformation doit être explicite. On obtiendrait un résultat équivalent avec #define.TRAU unsigned short long (long int) unsigned long float double (long float) long double (non standard) 5.

6. 5.1 Tableaux unidimensionnels Un tableau est un regroupement. jusqu'à tab[9].b=5. l'adresse du début de cette zone est TAB.3}. par exemple.j. aucune erreur ne sera signalée et vous utiliserez une partie de mémoire qui a certainement été réservée pour autre chose. les suivantes seront initialisées à 0 : vecteur vect0={0. 5. Cliquez ici pour une solution. Mais si elle est donnée.9 Tableaux 5.c=6 En utilisant typedef. exemple : int tab[10]. L'arithmétique des pointeurs en C a cette particularité que l'opération dépend du type de variable pointée. Ceci réserve en mémoire − la place pour 10 entiers.9.i. de plusieurs variables simples. Déclarons : int TAB[10]. Ceci réserve en mémoire un espace contigu pouvant contenir 10 entiers.c.2. Attention.f} : d=2.k.pique.4. en utilisant tab[10] ou plus.d=2. Le premier est tab[0]. mais également la soustraction (pointeur − pointeur) qui donne un nombre d'éléments.*ptr.9}.Le langage C − cours P. int chiffres[]={0. couleurs i. Il est possible de définir un tableau de n'importe quel type de composantes (scalaires.2 Tableaux et pointeurs / arithmétique des pointeurs En déclarant.9. Exercice (moyenne) : Ecrire le programme qui lit une liste de Nb nombres.1. Dans ce cas la dimension n'est pas nécessaire.y. structures et même tableaux). Les deux écritures TAB et &TAB[0] sont équivalentes (ainsi que TAB[0] et *TAB). Il est également possible de définir un type tableau par typedef : typedef float vecteur[3]. l'identificateur TAB correspond en fait à l'adresse du début du tableau.carreau.0}. On peut aussi initialiser un tableau. /* les 17 autres à 0 */ On peut également déclarer un tableau sans en donner sa dimension. pointeurs. 5.9 Tableaux 30 . la soustraction (pointeur − entier).e=3. toutes de même type.2.7.f=a=4.trèfle}couleurs.z. on n'a pas besoin de répéter enum dans la déclaration de variables : typedef enum {coeur. On définit donc l'addition (pointeur+entier): TAB+i=&TAB[i].3. elle aura du être réservée autre part (par exemple tableau externe ou argument formel d'une fonction). int TAB[10].0. − la place pour l'entier i. Les opérations de comparaisons entre pointeurs sont donc également possibles.8. calcule et affiche la moyenne puis l'écart entre chaque note et cette moyenne. dans une même variable. int tableau[20]={1. On définit l'opération d'incrémentation pour les pointeurs par TAB+1=adresse de l'élément suivant du tableau. ajouter 1 consistant à ajouter à l'adresse la taille de l'objet pointé.b.TRAU On peut aussi prévoir une codification non continue : enum truc {a=4. vecteur x.5.e. Dans ce cas là le compilateur ne lui réserve pas de place. déclaration : [classe] type nom [nombre_d'éléments]. et est supérieure au nombre de valeurs données.

prévoyez le cas de valeurs égales. for(ptr=TAB.i++) printf("%d : %d\n". } void affiche_tableau(int t[].*ptr++). On pourra décomposer le programme en fonctions. /* affiche TAB[1] puis ajoute 1 à TAB[1]*/ TAB est une "constante pointeur". celle d'un pointeur uniquement la place d'une adresse.ptr<TAB+10 /* ou &TAB[10] */. } void main(void) { int tableau[10]. la décale d'un cran vers le haut (le premier doit se retrouver en dernier). /*met l'adresse du début du tableau dans ptr*/ for(i=0. Exercice (classer) : Classer automatiquement un tableau de Nb entiers puis l'afficher dans l'ordre croissant puis décroissant.max>0.(*ptr)++).Le langage C − cours P.ptr++) printf("%d ". Si vous vous en sentez la force. alors que ptr est une variable (donc TAB++ est impossible). /* ou &TAB[i] puisque scanf veut une adresse*/ } puts("affichage du tableau"). } Exercice (rotation) : Ecrire un programme qui lit une liste de Nb nombres. La déclaration d'un tableau réserve la place qui lui est nécessaire. affiche_tableau(tableau.max−−)*(t++)=0. 5.h> void annule_tableau(int *t. /* attention actuellement on pointe derrière le tableau ! */ ptr−=10.i. Cliquez ici pour une solution. Analysons les instructions suivantes : ptr=TAB.*ptr+1). /* affiche TAB[1] */ printf("%d". /* +1 pour commencer à 1*/ scanf("%d". annule_tableau(tableau. On pourra utiliser des fonctions de l'exercice précédent. /* affiche TAB[0] puis pointe sur TAB[1] */ printf("%d". for(i=0. on ne peut que le passer par adresse (recopier le tableau prendrait de la place et du temps).i+1). Pour passer un tableau en argument d'une fonction. /* affiche (TAB[0])+1 */ printf("%d".i<10.int max) { for(.9 Tableaux 31 .10). l'affiche puis la décale vers le bas.*(ptr+1)).10).TRAU − la place pour un pointeur d'entier (le type pointé est important pour définir l'addition). /* ou plutôt ptr=TAB qui lui n'a pas changé */ printf("%d".i++) { printf("entrez la %dième valeur :\n". int max) { int i.t[i]). exemple utilisant ces deux écritures équivalentes : #include <stdio. On pourra créer un (ou plusieurs) tableau temporaire (donc local).i<max.ptr+i).*ptr). Cliquez ici pour une solution. puts(" ").

TRAU 5.int longmax) idem • int strcmp(char *str1. Exercice (chaînes) : écrire un programme qui détermine le nombre et la position d'une sous−chaîne dans une chaîne (exemple ON dans FONCTION : en position 1 et 6). on trouve des fonctions utiles (limitées au caractères) : • int isdigit(int c) rend un entier non nul si c'est un chiffre ('0' à '9'). Le compilateur crée la chaîne en mémoire de code (constante) et une variable strptr contenant l'adresse de la chaîne.char *source. isascii (0 à 127). le ###BOT_TEXT### indiquant la fin de la chaîne).. mais pas les accents). Le programme pourra donc changer le contenu de strptr (et donc pointer sur une autre chaîne).9. isxdigit (0 à 9.'r'.void *s2. En C. les guillemets " (double quote). On peut au cours du programme modifier le contenu de mess. • void *memcpy(void *dest.char *source.int longueur). c'est pourquoi en entrée elles rajoutent automatiquement le ###BOT_TEXT### (gets.A à F.void *src.Le langage C − cours P. exemples : puts("salut"). on représente les chaînes par un tableau de caractères. tab. char mess[]="bonjour". rend un pointeur sur la destination • char *strncpy(char *destination. iscntrl (0 à 31). >0 si str1>str2. isalnum (isalpha||isdigit).h) possède des fonctions utiles à la manipulation de chaînes : • int strlen(chaîne) donne la longueur de la chaîne (###BOT_TEXT### non compris) • char *strcpy(char *destination. La longueur est à donner en octets (on peut utiliser sizeof) : • int memcmp(void *s1. islower (minuscule). 0 sinon. Cliquez ici pour une solution. certaines fonctionnalités ont été ajoutées aux tableaux dans le cas des tableaux de caractères. • de même : isalpha (A à Z et a à z.h.. mais pas changer le contenu de la chaîne initialement créée. dont le dernier est un caractère de code nul (###BOT_TEXT###). 0 si erreur dès le premier caractère) • de même atol et atof Dans ctype.char *source) recopie la source à la suite de la destination. 5. comme dans les autres langages. printf). return.4 Bibliothèques de fonctions pour tableaux et chaînes Toutes les fonctions standard d'entrée / sortie de chaînes considèrent la chaîne terminée par un ###BOT_TEXT###. à condition de ne pas dépasser 8 caractères (mais on peut en mettre moins. mais pour tous tableaux (sans s'arrêter au ###BOT_TEXT###) sont déclarées dans mem..int longueur).int longmax) idem strcpy mais s'arrête au ###BOT_TEXT### ou longmax (qui doit comprendre le ###BOT_TEXT###) • char *strcat(char *destination.a à f). scanf).. isspace (blanc.###BOT_TEXT###} */ puts (mess).). 5.3 Chaînes de caractères En C. déclarées dans stdlib. Mais on peut également initialiser un pointeur avec une chaîne de caractères : char *strptr="bonjour"..3 Chaînes de caractères 32 . <0 si str1<str2.char *source) recopie la source dans la destination. isupper. La bibliothèque de chaînes (inclure string.. Idem strncmp Des fonctions similaires. On possède également des fonctions de conversions entre scalaires et chaînes.h. /* évite de mettre ={'b'.char*str2) rend 0 si str1= =str2. Une constante caractères est identifiée par ses délimiteurs.'o'. rend un pointeur sur la destination • char *strncat(char *destination.9..h • int atoi(char *s) traduit la chaîne en entier (s'arrête au premier caractère impossible. mess est un tableau de 8 caractères (###BOT_TEXT### compris). en sortie elles affichent jusqu'au ###BOT_TEXT### (puts.9.

car il place dans l'ordre t[0][0]. Egalement tolower 5. Il faut d'abord déclarer une variable pointeur qui contiendra l'adresse du début du tableau.t[0][2]. En quittant proprement le programme.5. au dépends d'autres variables ou tableaux. 5. En retour. tab=(float*)calloc(nb. ni de la libérer. En fait. c'est à dire ligne après ligne. l'adresse du bloc modifié (pas nécessairement la même qu'avant) ou le pointeur NULL en cas d'erreur. Dans un tableau multidimensionnel initialisé. .6}} mais cette écriture est équivalente à {1.t[1][0]. Une erreur fréquente consiste à "perdre" l'adresse du début de la zone allouée (par tab++ par exemple) et donc il est alors impossible d'accéder au début de la zone. Un tableau peut être initialisé : int t[2][3]={{1. int taille) : équivalent à malloc(nb*taille).h ou alloc. − void *realloc(void *pointeur.3. si possible.sizeof(float)).6}.4.. lors de l'exécution.. une matrice est un tableau de lignes. rend c sinon.&nb).{4. Retourne le pointeur NULL en cas d'erreur (en général car pas assez de mémoire). lorsque l'on connaît la taille désiré. On peut expliciter cela par typedef : typedef int ligne[3]. Pointeur est l'adresse retournée lors de l'allocation. Si nécessaire. mais t[1] est aussi un tableau (une ligne). scanf("%d".h (suivant votre compilateur). pour gérer un tableau de NBLIG lignes de NBCOL éléments.5.3}. et retourne un pointeur sur le début du bloc réservé. − void *calloc(int nb.Le langage C − cours P. le bloc est déplacé et son contenu recopié.6 Tableaux multidimensionnels On peut déclarer par exemple int tab[2][3] : matrice de 2 lignes de 3 éléments.t[1][2].TRAU • int toupper(int c) rend A à Z si c est a à z.t[0][1]. une zone de mémoire contiguë.2.9. En utilisant pointeurs et allocation dynamique. accès 5. int nb.int taille) essaie. − void free(void *pointeur) libère la place réservée auparavant par malloc ou calloc.2. donc désigne l'adresse &t[1][0].9. puts("taille désirée ?").5 Allocation dynamique de mémoire La taille déclarée d'un tableau est définie à la compilation. de la taille désirée (mais pas plus). En C. t correspond à l'adresse &t[0][0]. typedef ligne matrice[2]. exemple : float *tab. de réajuster la taille d'un bloc de mémoire déjà alloué (augmentation ou diminution de taille).5 Allocation dynamique de mémoire 33 . la mémoire allouée est automatiquement restituée même si on omet d'appeler free. on peut : • soit créer une matrice complète : allocation par t=malloc(NBLIG* NBCOL* sizeof(élément)).9. malloc et calloc nécessitent un cast pour que le compilateur ne signale pas d'erreur. seule la dimension la plus à gauche peut être omise (ici int t[][3]={. le lien entre les tableaux et pointeurs permet de réserver. Ces fonctions sont définies dans stdlib.} était possible). on peut réserver une zone mémoire (dans la zone appelée "tas" ou "heap") par les fonctions : − void *malloc(int taille) : réserve une zone mémoire contiguë de taille octets.t[1][1]. A l'exécution. il faut donc surdimensionner le tableau (et donc réserver des mémoires dont on ne servira que rarement. Dans le cas d'une taille inconnue à l'avance.

int année. Les noms de champs ont une portée limitée à la structure (c'est à dire qu'un autre objet peut avoir le même nom. Cette méthode est plus rapide que la précédente.lui. Exercice (déterminant) : écrire un programme qui calcule le déterminant d'une matrice carrée (N. Cliquez ici pour une solution. date aujourdhui={24. qui sont des variables composées de plusieurs variables (ou CHAMPS) de types différents.c par *(t+l*NBCOL+c). struct identite id.10 Structures et unions 34 .nom). Ceci permet une optimisation si les lignes n'ont pas toutes la même longueur (traitement de textes par exemple) mais aussi de manipuler facilement les lignes (exemple : échanger deux lignes sans recopier leur contenu). Le déterminant d'une matrice (1. char prenom[20].10. s'il n'est pas cité dans cette structure). 5.jacques. 5. pointeurs..nom[0]." gets(jean. Les champs peuvent être de n'importe quel type valable (scalaires.1 Déclaration déclaration : struct nom_type {déclaration des champs} liste_variables . prenom et age. sizeof(jacques) retournera 52.12.} moi. voire d'autres types: struct identite lui. 5.10 Structures et unions Dans un tableau. nom_type et liste_variables sont optionnels mais au moins l'un des deux doit être présent. • soit créer un tableau de NBLIG pointeurs de lignes. mais par un identificateur. }jean. /*évite de répéter struct*/ 5. puis chaque ligne séparément. car les adresses de chaque début de ligne sont immédiatement connues.groupe[20]. L colonnes) par une matrice (L. il peut être utilisé plus loin pour déclarer d'autres variables.prenom[0]).1) est sont seul élément. tous les constituants doivent être du même type. struct prisonnier {long numero. Il existe (heureusement) d'autres méthodes plus rapides.int mois. int age.lui. groupe[i]) comporte trois champs : nom. tableaux. Cliquez ici pour une solution.. Nom_type (ici identite) est le nom d'un nouveau type. Toute variable de type identité (jean. y compris une structure (à condition d'être déclaré plus haut). NOM_CHAMP . Exercice (matrices) : faire le calcul de multiplication d'une matrice (M lignes. sans calcul. mais remplacement du tableau de pointeurs (dimension prévue à l'avance) par une allocation dynamique.}date. et (pas sur tous les compilateurs) d'initialiser une structure : typedef struct {int jour. jacques.Le langage C − cours P.10.N). Ce n'est pas le cas des structures.1992}. • soit utiliser des pointeurs de pointeurs (même principe que le cas précédent. printf("initiales : %c %c\n". par l'opérateur unaire ".2 Utilisation On accède à une composante par NOM_VARIABLE .TRAU à l'élément l. exemple : struct identite { char nom[30]. Chaque champ n'est plus désigné par un numéro comme dans un tableau. On utilisera bien évidement la récursivité.N) : résultat (M.N).). Il est également possible d'utiliser typedef. sachant qu'il vaut la somme (sur chaque ligne) de l'élément de la ligne en 1ère colonne par le déterminant de la sous−matrice obtenue en enlevant la ligne et la 1ère colonne (en changeant le signe à chaque fois).

tous ceux d'Obernai.ptr−>mois=7.10. ville. faire un programme de recherche automatique de toutes les informations sur les personnes répondant à une valeur d'une rubrique donnée (tous les PATRICK . numéro de téléphone). Depuis la norme ANSI. Cette méthode permet l'utilisation de plusieurs index (par exemple un second par date de naissance). Exercice (tel) A l'aide d'un tableau de personnes (nom. Les différents champs commenceront tous à la même adresse (permet d'utiliser des variables pouvant avoir des types différents au cours du temps. Supposons désirer stocker les adhérents par ordre alphabétique. 5. sur le revers de couverture on indique l'adresse du premier. Une solution un peu plus simple serait de numéroter les pages. on peut utiliser l'affectation pour des structures (recopie de tous les champs). gommer toutes les pages suivantes pour les réécrire une page plus loin. On les utilise comme les structures.jour=14.). code postal. L'opérateur −> permet une simplification d'écriture (il signifie champ pointé) : date *ptr.age). Les champs n'ont alors pas d'adresse (impossible d'utiliser & sur un champ). scanf("%d". il va falloir trouver où l'insérer. On suppose que le tableau est déjà initialisé. Un tableau correspond à une gestion dans un cahier : un adhérent par page.} Les champs sont créés à partir des bits de poids faible. prénom. Appliquons cela . non utilisés par le programme). à une liste d'entiers. La troisième solution est la liste chaînée : les pages sont numérotées.int Crc:6.3 Champs de bits 35 . rue. mais l'insertion d'un nouvel adhérent se fera avec le minimum d'opérations.5 Structures chaînées Le principal problème des données stockées sous forme de tableaux est que celles−ci doivent être ordonnées : le "suivant" doit toujours être stocké physiquement derrière. Sur les compilateurs non ANSI.. 5. dans l'ordre. struct état{unsigned ReadOnly:1. derrière chaque champ.3 Champs de bits En ne définissant que des champs entiers (signés ou non). entrer les adhérents dans n'importe quel ordre et disposer d'un index : un feuille où sont indiqués les noms. sa taille après un ":".id.10.4 Unions déclaration : union nom_type {déclaration des champs} liste_variables . Si un nouvel adhérent se présente." et "−>".10. avec les opérateurs ". *ptr. numéro dans la rue. il faut utiliser des pointeurs. de manière informatique. On utilise ces structures comme les autres. 5. On utilise des pointeurs de structures comme des pointeurs sur n'importe quel autre type. Il suffit pour cela de préciser.&moi. ptr=(struct date *)malloc(sizeof(date)). on peut définir la taille (en bits) de chaque champ.nom). L'utilisation d'une telle liste nécessite un véritable "jeu de piste". Toute insertion ne nécessitera de décalages que dans l'index. sur chaque page est indiquée la page de l'adhérent suivant. associés à leur "adresse" : le numéro de page. avec pour chaque valeur l'adresse (numéro de mémoire) du suivant : 5. puis insérer le nouvel adhérent. mais un seul à un instant donné). ainsi que le passage des structures en arguments de fonction passés par valeur.. etc. Les champs peuvent être de tout type. Cliquez ici pour une solution. Le nom du champ est optionnel (dans le cas de champs réservés. Imaginons gérer une association.Le langage C − cours P. Une composante d'enregistrement s'utilise comme une variable du même type (avec les mêmes possibilités mais aussi les mêmes limitations).groupe[10].TRAU printf("nom %s \n". y compris structures.10.

struct page *premier. struct page *suivant.3 Champs de bits 36 .h> #include <ctype. puts("\nentrez votre entier"). } precedent−>suivant=NULL.&nouveau−>val).h> #include <conio. precedent−>suivant=nouveau.10. return(toupper(getche())= ='O'). precedent=nouveau. les modifications à apporter sont minimes : En C on définira un type structure regroupant une valeur entière et un pointeur : struct page {int val. soit le premier (la liste est dite bouclée). }. scanf("%d".Le langage C − cours P. Au fur et à mesure des besoins on se crée une nouvelle page : nouveau=(struct page *)malloc(sizeof(struct page)). on choisit généralement soit le pointeur NULL. Un pointeur (souvent global) nous indiquera toujours le début de la liste: struct page *premier.*nouveau. int encore(void) /* demande si on en veut encore*/ { printf("encore (O/N) ? ").TRAU Si l'on veut insérer une valeur dans la liste. premier=(struct page *)malloc(sizeof(struct page)). puts("entrez votre premier entier").h> #include <alloc. exemple : #include <stdio. while (encore()) { nouveau=(struct page *)malloc(sizeof(struct page)). struct page *suivant.h> /*ou stdlib. le dernier élément ne doit pas pointer sur n'importe quoi.h*/ struct page {int val. precedent=premier. En n'oubliant pas de préciser le lien avec le précédent : precedent−>suivant=nouveau. }. } void lecture(void) { struct page *precedent. scanf("%d". } 5.&premier−>val).

Les modifications sont aisées. actu=premier. debut=debut−>suivant. La solution de l'exercice précédent contient également cette insertion Ce type de données (structure pointant sur un même type) est utilisé dans d'autres cas. affiche(premier). actu−>val). } Exercice (liste) : modifier la fonction lecture ci−dessus pour que la liste soit stockée dans l'ordre inverse de son introduction (chaque nouvel élément est placé devant la liste déjà existante). } else { prec=actu.Le langage C − cours P. if (toupper(getche())= ='O') { if(actu= =premier)premier=actu−>suivant. } void main(void) { lecture(). free(actu). while(debut!=NULL) { printf("%d ". while (actu!=NULL) { printf("\nvaleur : %d − supprimer celui_ci (O/N) ? ".10. Cliquez ici pour une solution de cet exercice (et du suivant). break.3 Champs de bits 37 . pour représenter un arbre. Exemple : suppression d'un élément : void suppression(void) { struct page *actu. Par exemple. actu=prec−>suivant.*prec.debut−>val). une fois que l'on a repéré l'endroit de la modification. il suffit pour chaque élément de connaître l'adresse de chaque fils : 5. else prec−>suivant=actu−>suivant. } printf("\n").TRAU void affiche(struct page *debut) { printf("\nliste : "). } } } Exercice (insertion) : ajouter au programme précédent une procédure d'insertion d'une valeur dans la liste.

TRAU Remarque : si le nombre de fils n'est pas constant. ainsi que le frère suivant(voir partie algorithmique et structures de données). 5.Le langage C − cours P.3 Champs de bits 38 .10. on a intérêt à stocker uniquement le fils aîné.

le type d'erreur est donné dans la variable errno.h (les autres). unsigned taille). l'adresse du bloc à écrire et la taille 6 Les fichiers de données 39 . La première opération à effectuer est d'ouvrir le fichier. détaillée dans errno. Les fichiers sur support magnétique (bande. Dans ce cas. O_CREAT crée le fichier s'il n'existe pas. Les fichiers étant dépendants du matériel. On peut distinguer les fichiers séquentiels (on accède au contenu dans l'ordre du stockage) ou à accès direct (on peut directement accéder à n'importe quel endroit du fichier). On désigne le fichier destination par son handle (celui rendu par open). d'où gain de place mais incompatibilité entre logiciels). On utilise pour cela des constantes définies dans fcntl. On appelle pour cela la fonction : int open(char *nomfic. disquette.h pour être compatible UNIX et créer un fichier lecture/ écriture/ exécution autorisée.. Mode permet de définir comment on utilisera le fichier. 6. nomfic pointe sur le nom du fichier (pouvant contenir un chemin d'accès). mais au prix d'un temps d'accès aux données très supérieur.6 Les fichiers de données • Fichiers bruts • Fichiers bufférisés Les données stockées en mémoire sont perdues dès la sortie du programme. C'est au programmeur de préparer et gérer ses blocs. cluster.h : O_RDONLY lecture seule. Ceci consiste à définir le nom du fichier (comment il s'appelle sous le système) et comment on veut l'utiliser.h. O_WRONLY écriture seule. prototypées dans stdio. et correspondant à la taille d'un enregistrement physique (secteur..). soit formaté ASCII (un float binaire sera transformé en décimal puis on écrira le caractère correspondant à chaque chiffre). soit lire soit écrire un bloc (l'opération est alors directement effectuée sur disque) : int write(int handle. Les fichiers sont soit binaires (un float sera stocké comme il est codé en mémoire . UNIX) mais pas standardisés. O_EXCL renvoie une erreur si fichier existant (utilisé avec O_CREAT).h (ouverture et fermeture) et dans io. O_TRUNC vide le fichier s'il existait. void *bloc. par une opération OU (|) : O_APPEND positionnement en fin de fichier (permet d'augmenter le fichier). La fonction rend un entier positif dont on se servira par la suite pour accéder au fichier (HANDLE). On accède au fichier par lecture ou écriture de blocs (groupe d'octets de taille définie par le programmeur).1 Fichiers bruts C'est la méthode la plus efficace et rapide pour stocker et récupérer des données sur fichier (mais aussi la moins pratique). ils ne sont pas prévus dans la syntaxe du C mais par l'intermédiaire de fonctions spécifiques. disque) sont par contre conservables. Deux modes spécifiques au PC sont disponibles : O_TEXT change tous les \n en paire CR/LF et inversement. On traite les fichiers par l'intermédiaire de fonctions. On peut combiner cet accès avec d'autres spécifications. O_RDWR lecture et écriture. int mode). On peut ensuite. On choisira en général une taille de bloc constante pour tout le fichier. ou −1 en cas d'erreur. suivant le mode d'ouverture. seul S_IWRITE utile sur PC). disponibles sur la plupart des compilateurs (DOS. au lieu de donner une erreur. sans effet s'il existe (rajouter en 3ème argument S_IREAD | S_IWRITE | S_IEXEC déclarés dans stat. O_BINARY n'effectue aucune transformation.

La fonction retourne le nombre d'octets lus (<=taille.O_RDONLY|O_BINARY))<0) {puts("erreur ouverture"). pour pouvoir traiter le suivant). −1 si erreur. <si fin du fichier en cours de lecture. et le met dans le bloc dont on donne l'adresse et la taille. int nb_lus. nb_lus). La fonction retourne la position atteinte (en nb d'octets). Lorsque l'on ne se sert plus du fichier.} do { nb_lus=read(source. rend la taille d'un fichier (sans déplacer le pointeur de fichier). long filelength(int handle). rend 0 si ok.h> #include <fcntl. Pour déplacer le pointeur de fichier en n'importe que autre endroit. long combien.Le langage C − cours P. close(destination). O_WRONLY| O_CREAT| O_TRUNC| O_BINARY. int read(int handle. 0 si on était déjà sur la fin du fichier.taillebloc). lit dans le fichier désigné par son handle. if (argc!=3) {puts("erreur arguments"). } while ((nb_lus==taillebloc)&&(nb_ecrits>0)). il faut le fermer (obligatoire pour que le fichier soit utilisable par le système d'exploitation. void *bloc. on appelle la fonction : long lseek(int handle. −1 si erreur.h> #include <sys\stat.} if((destination=open(argv[2].return(1). if (nb_lus>0) nb_ecrits= write(destination. entre autre mise à jour de sa taille : int close(int handle) fermeture. Le fichier peut être utilisé séquentiellement (le "pointeur de fichier" est toujours placé derrière le bloc que l'on vient de traiter.(char *)buffer.h> #define taillebloc 1024 int main(int argc. char buffer[taillebloc]. à partir de : début du fichier si code=0. close(source). unsigned taille).char *argv[]) { int source. 6 Les fichiers de données 40 . Exemple : copie de fichier (les noms de fichiers sont donnés en argument du programme) #include <stdio.TRAU (en octets) de ce bloc. position actuelle si 0. return(0).return(2). int code).nb_ecrits. int eof(int handle) dit si on se trouve (1) ou non (0) sur la fin du fichier. −1 si erreur). destination.} if((source=open(argv[1]. déplace le pointeur de fichier de combien octets. −1L si erreur. Le nombre d'octets écrits est retourné. fin du fichier si 2.return(2). S_IREAD| S_IWRITE| S_IEXEC))<0) {puts("erreur ouverture").(char*)buffer.h> #include <io.

int fread(void *bloc. char fputs(char *s. il y a eu erreur (tester ferror ou errno). FILE *id). Sur PC. FILE *id) : écrit la chaîne dans le fichier sans ajouter de \n. Les fichiers bufférisés permettent aussi des sorties formatées : au niveau caractère : char fgetc(FILE *id). sans fermer le fichier (à appeler par exemple avant une instruction qui risque de créer un "plantage").Le langage C − cours P. FILE *id) : lit une chaîne en s'arrêtant au \n ou à max−1 caractères lus.h) sont : FILE *fopen(char *nomfic. int fseek(FILE *id. création si inexistant). et retour du pointeur s ou NULL si erreur. int feof(FILE *id) dit si on est en fin de fichier ou non (0). r+ (lecture et écriture. La fonction void perror(char *s mess) affichera le message correspondant à l'erreur. détaillée dans errno. résultat dans la zone pointée par s. w+ (lecture et écriture mais effacement au départ du fichier si existant).c=fgetc(id)}. int max. rend le dernier caractère écrit ou EOF si erreur. ou le définir par défaut en donnant à la variable _fmode la valeur O_TEXT ou O_BINARY. a+ (lecture et écriture. char *mode) : ouvre le fichier.−1. en général on lui donne le nom du fichier. a (append : écriture à la suite du contenu actuel. long combien.2 Fichiers bufférisés 41 . le résultat étant stocké à l'adresse bloc. positionnement en fin de fichier si existant. le fichier doit exister). La fonction rend le nombre d'éléments lus (<nb si fin de fichier). int fclose(FILE *id) : ferme le fichier. FILE *id) : lit nb éléments dont on donne la taille unitaire en octets. int nb. Ceci signifie qu'une instruction d'écriture n'impliquera pas une écriture physique sur le disque mais dans le buffer. on peut rajouter t ou b au mode pour des fichiers texte (gestion des CR/LF. dans le fichier désigné par id. le pointeur NULL est retourné. Les fichiers sont identifiés non par un entier mais par un pointeur sur une structure FILE (définie par un typedef dans stdio. 6. suivant le mode : r (lecture seule). en y recopiant le reste du buffer si nécessaire. int fflush(FILE *id) : transfère effectivement le reste du buffer sur disque. FILE *id) qui permet de "reculer" d'un caractère. fopen rend un identificateur (ID) qui nous servira pour accéder au fichier. 0 si erreur. position actuelle (mode=1) ou fin du fichier (mode=2). et même char ungetc(char c.1). int taille. le type d'erreur est donné dans une variable errno. int taille.h. Les fonctions disponibles (prototypées dans stdio. création sinon). int code) : déplace le pointeur de fichier de combien octets.TRAU } 6. avec écriture sur disque uniquement quand le buffer est plein. int nb.h). Retourne 0 si tout s'est bien passé. si le fichier existe il est d'abord vidé).2 Fichiers bufférisés Les opérations d'entrée / sortie sur ces fichiers se font par l'intermédiaire d'un "buffer" (bloc en mémoire) géré automatiquement. Retourne 0 si tout c'est bien passé. à partir de : début du fichier (mode=0). Cette fonction est obligatoire pour être sur d'avoir l'intégralité des données effectivement transférées sur le disque. Cette fonction n'est utilisable que si l'on connaît la taille des données dans le fichier (impossible d'aller directement à une ligne donnée d'un texte si on ne connaît pas la longueur de chaque ligne). Cette fonction correspond donc à {fseek(id. option par défaut) ou binaires. si le nombre rendu est différent de nb. En cas d'erreur. au niveau chaîne de caractères : char *fgets(char *s. int fwrite(void *bloc. FILE *id) : écriture du bloc sur fichier. w (écriture. char fputc(char c.

En général. On pourra ensuite apporter les améliorations suivantes : recherche rapide par dichotomie sans lire tout le fichier (en le supposant classé par ordre alphabétique). Les \n sont transformés en CR/LF si fichier en mode texte (spécifique PC). tous formatés sous forme ASCII. ou EOF si erreur. on utilise les fichiers bufférisés : − Soit en accès direct. puis chaque ligne du fichier contiendra une ligne de la matrice. imprimante. le précédent. contiendront en première ligne le nombre de lignes puis le nombre de colonnes. ceci permettant d'accéder directement à un élément donné (le 48ème. Exercice (fic_formaté) : modifier le programme de produit de matrices en lui permettant de donner sur la ligne de commande trois noms de fichiers : les deux premiers contiendront la description des matrices à multiplier. Les fichiers seront formatés.. création de fichiers index classés alphabétiquement sur les noms. le dernier sera créé et contiendra le résultat. avec tous les éléments de même type et même taille (souvent une structure.). avec possibilité d'ajout. département et ville pour accès rapide par dichotomie. On utilisera un fichier binaire à accès direct.. en lecture seule ou écriture seule (il est peu probable que le remplacement d'un élément se fasse avec le même nombre d'octets et nécessiterait un décalage dans le fichier). en lecture et écriture. Un tel fichier s'utilise comme l'écran et le clavier. 0 si erreur).Le langage C − cours P. listeadresses) : rend le nombre de variables lues et stockées.).. l'avant dernier.2 Fichiers bufférisés 42 . ces fichiers seront compréhensibles par n'importe quel autre programme (éditeur de texte. char *format. listearguments) : rend le nb d'octets écrits. 6. par des fonctions similaires. édition du fichier. en format binaire).TRAU int fprintf(FILE *id. suppression.. char *format. Exercice (agenda) : modifier l'agenda de l'exercice tel en permettant de sauver les données sur disque. int fscanf(FILE *id. − Soit en accès séquentiel. avec des éléments de type différent. les autres se faisant par recherche séquentielle.

7 Directives du pré−compilateur Attention. mais pas de gestion de pile. En C on a l'habitude de noter les constantes numériques en majuscules.. #include <nomfic> permet d'insérer à cet endroit un fichier. en le cherchant dans le répertoire actuel (le votre) #define nom valeur : remplace chaque occurrence du nom par la valeur. qui serra cherché dans le répertoire correspondant à la bibliothèque du C (sur PC dans \TC\INCLUDE) #include "nomfic" permet d'insérer à cet endroit un fichier. Il ne faut pas de blanc entre le nom de la macro et la "(" pour différencier d'un define simple.y) (((x)>(y)?(x):(y) replacera max(a. Il faut donc utiliser des parenthèses. exemple : #define PI 3. faire attention en cas de #if imbriqués #ifdef nom : comme #if mais vrai s'il y a eu auparavant un #define nom #ifndef nom : vrai si variable non définie exemples: #ifndef entier #define entier int 7 Directives du pré−compilateur 43 . On ne peut prendre en compte qu'une ligne (le retour à la ligne terminant la définition). les paramètres seront substitués lors de la réécriture.c)) par a>b>c?b:c?a:b>c?b:c #define max(x. Une macro ressemble à une fonction.. #if (expression) : les lignes qui suivent ne seront lues (et compilées que si l'expression est vraie #endif : fin de portée du #if précédent #else : possible mais optionnel. les directives se terminent par le retour à la ligne et pas un ". mais sera d'exécution plus rapide : le texte est directement inséré à l'endroit voulu.".c)) par (((a)>( (((b)>(c))?(b):(c)) )) ? (a) : (((( b)>(c)) ? (b) : (c))) ce qui donne des parenthèses superflues mais le résultat escompté. même si elles semblent inutiles : #define double(a) (a)*2 autre exemple: #define max(x. #undef nom : annule le précédent #define nom .max(b. comme s'il était écrit ici.max(b.1415926 #define begin { #define end } #define macro(parametres) définition : permet la définition d'une macro. #define double(a) a*2 remplacera double (i+5) par i+5*2.y) x>y?x:y replacera max(a.

TRAU /* si une autre bibliothèque incluse plus haut l'a déjà défini. on ne le redéfinit plus */ #endif #ifdef biblio_graphique initialise_ecran().h) inclus ou non plus haut */ 7 Directives du pré−compilateur 44 .Le langage C − cours P. trace(dessin). #else puts("si on avait eu un écran graphique j'aurai fait un dessin"). efface_ecran(). #endif /* biblio_graphique peut être défini dans un "header" (fichier.

WINDOW : choix des fenêtres ouvertes. par exemple.. changement de taille. déplacement. on valide par ESPACE. vous aurez une indication sur tous les formats possibles ainsi que des exemples. utile pour voir à la fois vos résultats et votre programme. surtout après l'avoir effacée par erreur par CTRL Y. Sinon. Placez vous dans votre répertoire (pas celui de Turbo C pour ne pas mélanger avec vos fichier) et appelez TC. En choisissant l'option menus longs. on accède à une commande d'un menu par ALT et lettre en surbrillance. SEARCH : recherche ou remplacement d'un texte dans tout le fichier (CTRL L pour rechercher le suivant).5 par exemple) Turbo C est d'après moi le compilateur le plus intéressant sur PC en phase d'apprentissage : éditeur intégré. au cas ou votre programme planterait la machine (automatisation possible sous options) 8 Utiliser Turbo C (3. débogueur puissant. inspect). PROJECT : un projet contient la liste de fichiers nécessaires au fonctionnement d'un programme (fichiers séparés). HELP : aide En vous plaçant sur une commande d'un menu. sait dans quel header elle est déclarée). sauver le fichier actuel (save ou save as). DEBUG : en mode pas à pas on peut voir ou modifier l'état d'une variable (evaluate.5 par exemple) 45 .. aide en ligne. COMPILE : compiler pour voir les erreurs. il vaut mieux posséder une souris. mode 43 lignes (environnement preferences) et même couleurs.8 Utiliser Turbo C (3. et surtout remettre une ligne de texte dans son état initial (restore line). il faut faire un EXE pour pouvoir utiliser le programme hors de TC. sauvez votre source avant de l'exécuter. Entre autres la fenêtre OUTPUT correspond à l'écran tel que le gère votre programme. Au menu principal. EDIT : couper − coller. voir l'état de la pile (imbrication des fonctions et arguments réels : call stack) voir dans une fenêtre à tout moment l'état d'une variable (add watch). puis choisir le fichier dans la liste). niveau de messages d'erreur de compilation. les touches de raccourci sont indiquées à côté des fonctions des menus. l'appui sur F1 vous détaille ce que permet cette commande. avancer d'une ligne (trace into ou step over). éditeur multifenêtres. On peut exécuter le programme pas à pas : Aller jusqu'à la ligne dans laquelle est le curseur. Les commandes sont accessibles par menus. uniquement si c'est un mot clef du C (mais connaît toutes les fonctions. Ceci permet de voir dans quel ordre s'exécutent les instructions. Dans une fenêtre de texte . Dernier conseil. quitter TC (quit ou ALT X). lié aux messages d'erreur. OPTION : on peut tout choisir : répertoires. tapez printf puis CTRL F1. on change d'option par TAB. reprendre un fichier déjà existant (open. RUN : exécuter le programme. on peut : FILE : gérer les fichiers : en créer un nouveau (new). l'appui sur CTRL F1 vous donne une aide sur le mot sous le curseur.

Le langage C − cours P.TRAU

8 Utiliser Turbo C (3.5 par exemple)

46

9 Liens vers d'autres sites sur le C
Je ne suis pas le seul à publier mon cours sur Internet. Voici d'autres liens, pour compléter (ou remplacer) ce que je propose. • Le cours d'Irène Charon (ENST Paris) : le language est présenté progressivement à partir d'exemples. C'est un très bon complément à qui n'a pas trop aimé ma méthode de présentation (mes étudiants par exemple) • Le cours de Alain Dancel : Très bon cours, très complet. • cours ANSI−C de Fred Faber (Lycée Technique des Arts et Métiers, Luxembourg) • le cours d'Yves Papegay (Inria) (sous Unix) vous cherchez un compilateur (freeware, évidement) ? DJGPP pour DOS, ou GNU−Win32 pour Win 95/NT, ou GCC pour Unix (c'est le seul que j'ai essayé). De nouveaux arrivants : Pacific : sous DOS (freeware), avec un environnement sympa (un peu comme Turbo C), et une doc en pdf (la version Windows est payante). Désormais, Inprise (Borland) vous propose ses compilateurs gratuitement ! (pour certaines versions Turbo C, Turbo Pascal, Borland C, Delphi..., évidement pas les plus récentes).

9 Liens vers d'autres sites sur le C

47

10 Correction des exercices
langage C / Patrick TRAU
1. while_puiss 2. while_err 3. do_while 4. for 5. jeu 6. calcul 7. moyenne 8. rotation 9. classer 10. chaînes 11. matrices 12. déterminant 13. tel 14. liste et insertion 15. agenda

10.1 1. while_puiss
#include <stdio.h> void main(void) { int puissance=1,max; puts("nombre maximal désiré (ne pas dépasser 16000) ?"); scanf("%d",&max); while (puissance<max) printf("%d\n",puissance*=2); }

retour au sujet de cet exercice

10.2 2. while_err
Ce programme démontre les erreurs de calcul toujours effectuées sur des nombres réels. On additione successivement 0.01 (qui n'a pas de représentation finie en binaire) à un réel initialement nul. On compte le nombre de calculs jusqu'à obtenir une erreur de 100%. Dans ce cas il faut 16246 calculs. On peut essayer d'autres pas et d'autres débuts. retour au sujet de cet exercice

10.3 3. do_while
#include <stdio.h> #include <stdlib.h> /* pour rand() */ #include <time.h> /* pour trouver l'heure pour srand */ void main(void) { int solution,reponse,nb_essais=0;

10 Correction des exercices

48

scanf("%d". puts("nombre de notes ? "). else if (nb_essais<4) puts("bravo"). /* reste sera toujours entre 0 et 10 */ do { nb_essais++.srand((unsigned) time(&t)). puts("proposez votre nombre entre 0 et 10"). } /* initialiser le générateur à partir du compteur de temps. printf("trouvé en %d essais\n".Le langage C − cours P.4 4. else if (reponse!=solution) puts("trop petit").nb_essais). scanf("%f". puts("proposez votre nombre entre 0 et 10"). printf("moyenne calculée :%5. else if (nb_essais>6) puts("ce score me semble bien minable").i<N. /* reste sera toujours entre 0 et 10 */ do { nb_essais++.nb_essais=0.2f\n". if (nb_essais==1) puts("vous avez eu un peu de chance").i++) { printf("entrez votre %dième note".h> #include <stdlib.&N). for #include <stdio.somme=0.i+1).srand((unsigned) time(&t)).N. if (reponse>solution) puts("trop grand"). pour qu'il soit plus aléatoire */ solution=rand()%11.h> void main(void) { int i.h> /* pour rand() */ #include <time. float note.5 5.nb_essais). } /* initialiser le générateur*/ solution=rand()%11. } 10.&reponse). somme+=note. { time_t t.&note).h> /* pour trouver l'heure pour srand */ void main(void) { int solution. } retour au sujet de cet exercice 10. for 49 .4 4. jeu #include <stdio. printf("trouvé en %d essais\n".moyenne. } retour au sujet de cet exercice 10.TRAU {time_t t. } while (reponse!=solution). scanf("%d".moyenne). } moyenne=somme/N. scanf("%d". for(i=0. } while (reponse!=solution).reponse.&reponse).

i<Nb.Le langage C − cours P.val2.i<Nb. } while (!fin). ou 1=1 pour finir ? "). scanf("%f%c%f".i++) printf("%dième note : écart : %f\n".val1.6 6. switch (op) { case '*':res=val1*val2. tableau tab.break.h> void main(void) { float val1. } void affichage(float moy) { int i.&val1. case '=':fin++. } 10.&val2).h> #define max 100 typedef float tableau[max].res.6 6. } retour au sujet de cet exercice 10.&Nb). float somme=0.Nb. for (i=0. puts("entrez le nombre de notes à traiter :"). void lecture(void) { int i. char op.tab[i]−moy).break. /* pas besoin de break. je suis déjà au } */ } if (!fin) printf("%f%c%f=%f\n".val2. int fin=0. case '+':res=val1+val2.TRAU retour au sujet de cet exercice 10. do scanf("%d". while ((Nb<=0)||(Nb>max)).i+1). int Nb. for(i=0. for(i=0. calcul 50 .7 7. printf("la moyenne des %d notes est %f\n". } } float moyenne(void) { int i. calcul #include <stdio.i+1.res). case '/':res=val1/val2.break. return(somme/Nb).op.&tab[i]).break.&op.moy). scanf("%f".i<Nb. moyenne #include <stdio. case '−':res=val1−val2.i++) somme+=tab[i].i++) { printf("valeur n° %d ? ". do { puts("calcul à effectuer (par ex 5*2).

puts("tableau initial :").*t++).*t. rotation 51 . int nb) { composante c.&nombre). affichage(moyenne()). lecture(tableau. for (i=1. rotation #include <stdio. } retour au sujet de cet exercice 10. puts("décalage vers le bas :").nombre). affiche(tableau.} *t=c.8 8.h> typedef int composante.i++) printf("%d ". scanf("%d".i<nb. c=*t.nombre).i<=*nb. puts("nombre de valeurs à entrer ? ").i++) {*t=*(t+1).t++).t−−.i++) { printf("%dième valeur : ". decale_bas(tableau. decale_haut(tableau.nb). t=deb+(max−1). int max) { int i. } void decale_bas(composante *deb. puts(" ").i<max.i). scanf("%d".nombre).int i. int max) { composante c.8 8.nombre).} *t=c. puts("décalage vers le haut :"). } void decale_haut(composante *t.TRAU void main(void) { lecture().int *nb) { int i. while (t>deb) {*t=*(t−1). } retour au sujet de cet exercice 10. } void main(void) { composante tableau[100]. int nombre.t++. for(i=1. affiche(tableau. c=*t.Le langage C − cours P. for(i=0. } } void affiche(composante *t. affiche(tableau. void lecture(composante *t.nombre).

/* 1er : recherche du plus petit. int nombre. } copier(tempo. tempo[ind_faits=0]=tab[indice].i<=*nb. classer #include <stdio. /* les suivants : recherche le + petit mais > au précédent */ for(ind_faits=1. puts(" ").indice.i++) if (t[i]==t[indice_dep]) return(i).t++). /* si on est encore là c'est qu'il n'y en pas d'égal */ for(i=0. scanf("%d".i++) if(tab[i]<tab[indice]) indice=i. int nb) { composante tempo[dim]. } void main(void) { composante tableau[dim]. for(i=1. for(i=indice_dep+1.tab. scanf("%d". classer 52 . } void copier(composante *source.indice_resultat=−1.i<max.i<nb_indices.TRAU 10. void lecture(composante *t.i++) if ((t[i]>t[indice_dep]) && ((indice_resultat<0) || (t[i]<t[indice_resultat]))) indice_resu return(indice_resultat). } } void affiche(composante *t.i<nb.nb).i<nb_indices. for(i=0.&nombre). puts("nombre de valeurs à entrer ? ").9 9. /* un malloc(sizeof(composante)*nb) aurait été mieux mais on n'en a pas encore parlé en cours */ int i. puts("tableau initial :"). for(i=0. int nb) /* copie le tableau source dans le tableau dest */ { int i. * −soit la plus petite mais >t[indice_deb] */ { int i. mais d'indice > à indice_dep. composante *dest. for(i=1.nb).i++) { printf("%dième valeur : ".h> #define dim 100 typedef int composante. } void classe(composante tab[].ind_faits++) { indice=indice_min(tab.i).i++) *(dest++)=*(source++).int *nb) { int i.*t++). tempo[ind_faits]=tab[indice].i++) printf("%d ".nb). le 1er si ex aequo */ indice=0. int max) { int i.ind_faits.int indice_dep.i<nb. int nb_indices) /* cherche l'indice de la valeur du tableau : * −soit égale à t[indice_dep]. } int indice_min(composante t[]. lecture(tableau. 10.ind_faits<nb.indice.Le langage C − cours P.9 9.

puts("sous−chaîne à trouver ?").Le langage C − cours P. chaînes #include <stdio.c++) 10.col). } retour au sujet de cet exercice 10. matrices #include <stdio.sch++.pos). float f. else {ch++.int *col) /* lit à l'écran une matrice */ { int l. typedef float *pointeur.c<*col.l<*lig.nombre).char *sch) { int pos=0. classe(tableau.h> #define DIM 10 typedef float ligne[DIM].nombre). void lecture(matrice t.10 10.c. } } void main(void) { char ch[taille].l++) for(c=0. puts("chaîne à tester ? ").lig). puts("tableau classé :"). ch++. puts("nombre de colonnes de la matrice ?").sch)) printf("trouvé en position %d\n". puts("nombre de lignes de la matrice ?").nombre).11 11. gets(sch).} } return(!(*sch)).sch). } void recherche(char *ch. for (l=0. scanf("%d". affiche(tableau. typedef ligne matrice[DIM]. recherche(ch. } retour au sujet de cet exercice 10. gets(ch).sch[taille]. while (*ch) { if (debut_egal(ch.int *lig.h> #define taille 255 int debut_egal(char *ch.TRAU affiche(tableau.char *sch) /* répond si sch est exactement le début de ch */ { while (*sch && *ch) { if (*sch!=*ch) return(0). scanf("%d".pos++.10 10. chaînes 53 .

i<DIM.l.10 10.n). affiche(c.in<n. for(i=0. 0 autre) */ { int i.i++) { printf("ligne %d : ".i. lecture(a.matrice b.j<c.&l).j.im<m.m.1f ".matrice c.j. */ { int i.i<DIM*DIM. zero(t). for(im=0.i++) t[i][i]=1.&n).c. affiche(b. } void main(void) { int m.int n) /* calcul du produit */ { int im.il.&f). zero(c).j<DIM.TRAU { printf("élément [%d.b.in.b.0.l).numcol */ { int i.int m.in++) for(il=0.t[i][j]).m.%d] ? ".n.int l. for(j=0.m.&i.il++) c[im][in]+=a[im][il]*b[il][in].n).j++) t[i][j]=i+j/10. } void affiche(matrice t.l.i<l. for(i=0.i). puts("−−− FOIS −−−").Le langage C − cours P. printf("\n"). puts("−−− FAIT −−−"). chaînes 54 . } } void zero(float *t) /* met toute la matrice à 0 */ { int i.i++) for(j=0. matrice a. scanf("%f".im++) for(in=0. if(i!=l) puts("calcul impossible : dimensions incompatibles").&m.c). lecture(b.int c) /* puts("affichage du tableau ligne par ligne :").i++) *t++=0.l. } } void produit(matrice a. produit(a.n).l. } void unit(matrice t) /* remplit la matrice unité (1 diagonale. for(i=0. affiche(a.i<DIM. } retour au sujet de cet exercice 10. t[l][c]=f. for(i=0.int l. } void init(matrice t) /* initialisation de matrice à numlig.j++) printf("%3.c.il<l.

l<dim. } void unit(matrice t.Le langage C − cours P. float det=0. 0 autre) */ { int i.c<*lig.int dim) /* met toute la matrice à 0 */ { int i.c<dim.h> #include <stdlib.int ligavirer) { int l. */ { int i.c. printf("\n").TRAU 10.l++) 10.j<dim.12 12.i<dim.l<dim.l++) for(c=0.signe=1. } } void copiesauflc(matrice source. for(i=0. void lecture(matrice t. t[l][c]=f.lig).i<l.l.c).j.1f ". for (l=0. } } void zero(matrice t.matrice dest. ld++.c++) { printf("élément [%d. int l.int dim) { matrice sous_m. for(i=0. for(j=0. for(i=0.int l) /* puts("affichage du tableau ligne par ligne :"). nb_appels++.j.j++) t[i][j]=0. if (dim==1) return(m[0][0]).i<dim. for (l=0.i++) { printf("ligne %d : ". typedef float *pointeur.%d] ? ". scanf("%f".c. float f.j++) printf("%3.int dim.l++) if (l!=ligavirer) { for (c=1. determinant #include <stdio. } void affiche(matrice t. determinant 55 .i).l<*lig.ld=0.i++) t[i][i]=1.&f).12 12.int *lig) /* lit une matrice (au clavier) */ { int l.j<l. scanf("%d". } } float determinant(matrice m. int dim) /* remplit la matrice unité (1 diagonale.t[i][j]). puts("dimension de la matrice ?"). zero(t.c++) dest[ld][c−1]=source[l][c]. long nb_appels.dim). typedef ligne matrice[DIM]. for(l=0.h> #define DIM 10 typedef float ligne[DIM].i++)for(j=0.

&taille). printf(" en %ld appels\n". char rue[60].char *). *rech_prenom(fiche *. char *nomchamp[7]={"Nom".char *argv[]) { int taille.13 13. *rech_rue(fiche *. tel 56 . long codepostal. ptrfonction tabfonction[7]={rech_nom. "Rue".h> #include <string. /* au moins je connais le résultat*/ affiche(mat. rech_prenom.char *). "Prénom". *rech_ville(fiche *.prenom.in<dim.matrice b.in.Le langage C − cours P.char *). "Numéro".il<dim. */ unit(mat.int dim) /* calcul du produit */ { int im. typedef struct { char nom[15].l).TRAU { copiesauflc(m.char *).ville.taille).in++) for(il=0. *rech_cp(fiche *.im<dim.dim).char *).dim. matrice mat. char ville[20]. tel #include <stdio.determinant(mat. zero(c.matrice c. "Ville".char*).h> #define DIM 100 enum champs {nom. *rech_nom(fiche *.taille)). *rech_tel(fiche *.cp. "Code Postal".sous_m.h> #include <stdlib. char tel[15]. } void main(int argc. printf("déterminant : %20.char *).char *).il++) c[im][in]+=a[im][il]*b[il][in].13 13. typedef fiche *ptrfiche. /* test avec matrice unité. } fiche. char prenom[20].im++) for(in=0.tel}.char *).rue. int num. } void produit(matrice a.nb_appels). rech_num. typedef ptrfiche (*ptrfonction)(ptrfiche. signe=−signe.17f ". det+=signe*m[l][0]*determinant(sous_m.dim−1).taille). */ taille=atoi(argv[1]).num. } retour au sujet de cet exercice 10. fiche fiche fiche fiche fiche fiche fiche fiche *rech_nom(fiche *. } return(det). 10. for(im=0.il. "Tel"}. /* lecture(mat. *rech_num(fiche *.

rech_tel}.n)))pf++. gets(tab−>prenom). f−>prenom. gets(tab−>nom).} fiche *rech_tel(fiche *pf.} fiche *rech_num(fiche *pf.char *n) {while ((pf−>nom[0])&&(!idem(pf−>tel.} fiche *rech_rue(fiche *pf. f−>codepostal. sscanf(lig. rech_ville. } fiche *rech_nom(fiche *pf. return(pf).char *n) {while ((pf−>nom[0])&&(!idem(pf−>prenom. for (i=nom.char *s2) /* compare deux chaines. void affiche(fiche *f) { if(f−>nom[0]) printf("%s %s\n%d. do { printf("nom (rien pour finir) ?").char *n) {while ((pf−>nom[0])&&(!idem(pf−>rue. } void lecture(fiche *tab) { char lig[40].char *n) {while ((pf−>nom[0])&&(!idem(pf−>ville. f−>nom. printf(" rue ? "). 10.char *n) {while ((pf−>nom[0])&&(!idem(pf−>nom. On pourrait supposer égalité quand la chaine s2 est incluse dans s1 */ { return(strcmp(s1. return(pf).nomchamp[i]). printf(" N° ? "). f−>num.i. tel 57 .n)))pf++. return(pf).} int choix(void) { char lig[40].} fiche *rech_cp(fiche *pf. else printf("fiche inconnue\n").13 13. f−>tel).&(tab−>num)).} fiche *rech_ville(fiche *pf. } int idem(char *s1.s2)?0:1)."%d".n)))pf++. printf("\nou −1 pour quitter.Le langage C − cours P.char *n) {while ((pf−>nom[0])&&(pf−>codepostal!=atoi(n)))pf++.rep.char *n) {while ((pf−>nom[0])&&(pf−>num!=atoi(n)))pf++. return(pf).n)))pf++. ou non (0). f−>ville. sscanf(lig.&rep). Type de recherche désirée ? "). gets(lig).} fiche *rech_prenom(fiche *pf.i<=tel. rech_cp. gets(lig). return(pf)."%d". if(tab−>nom[0]) { printf(" prénom ? ").TRAU rech_rue. f−>rue. return(pf). %s\n%ld %s\nTel : %s\n". return(rep). return(pf). dit si elles sont égales (1). enum champs i.i++) printf("%d:%s ".n)))pf++.

liste et insertion #include #include #include #include <stdio. 10. } } while ((tab++)−>nom[0]).&nouveau−>val). }. printf("quel(le) %s recherche−t'on ? ". } retour au sujet de cet exercice 10. gets(tab−>ville). } while (c>=0)."%ld".&premier−>val).nomchamp[c]).*nouveau. printf(" code postal ? "). } void lecture(void) { struct page *precedent. int encore(void) /* demande si on en veut encore*/ { printf("encore (O/N) ? "). liste et insertion 58 . puts("\nentrez votre entier"). scanf("%d".h> struct page {int val.h> <conio. printf("n° de téléphone ? "). precedent=nouveau. } void main(void) { enum champs c. puts("entrez votre premier entier").h> <alloc. printf(" ville ? "). } precedent−>suivant=NULL.clef)). while (encore()) { nouveau=(struct page *)malloc(sizeof(struct page)). do { if (((c=choix())<0)||(c>6)) break. affiche(tabfonction[c](tab. lecture(tab).Le langage C − cours P. gets(tab−>tel). premier=(struct page *)malloc(sizeof(struct page)).14 14. precedent=premier. gets(clef). struct page *suivant. char clef[40]. struct page *premier. sscanf(lig. fiche tab[DIM]. return(toupper(getche())=='O').h> <ctype. scanf("%d". precedent−>suivant=nouveau.&(tab−>codepostal)).14 14.TRAU gets(tab−>rue). gets(lig).

} else { prec=actu. printf("\nnouvelle valeur ? "). while(prec!=NULL) { printf("\nvaleur : %d − insérer après celui_ci (O/N) ? ". while (actu!=NULL) { printf("\nvaleur : %d − supprimer celui−ci (O/N) ? ".*prec. debut=debut−>suivant. } printf("\n"). break. prec−>val). break.TRAU } void affiche(struct page *debut) { printf("\nliste : ").*prec.&(nouveau−>val)). free(actu). actu=premier. nouveau−>suivant=prec−>suivant. else prec−>suivant=actu−>suivant. while(debut!=NULL) { printf("%d ".actu−>val).14 14. if (toupper(getche())=='O') { nouveau=(struct page *)malloc(sizeof(struct page)). scanf("%d". } else prec=prec−>suivant. } void suppression(void) { struct page *actu. if (toupper(getche())=='O') { nouveau=(struct page *)malloc(sizeof(struct page)). prec−>suivant=nouveau. } } } void ajouter(void) { struct page *nouveau. actu=prec−>suivant. } } } 10.&(nouveau−>val)).debut−>val). if (toupper(getche())=='O') { if(actu==premier)premier=actu−>suivant. printf("\najouter en premier (O/N) ? "). } else { prec=premier.Le langage C − cours P. printf("\nnouvelle valeur ? "). scanf("%d". liste et insertion 59 . premier=nouveau. nouveau−>suivant=premier.

} while(encore()). agenda 60 . long codepostal.TRAU void main(void) { lecture(). rech_cp. char *nomchamp[7]={"Nom".char *).Le langage C − cours P.h> <ctype. rech_num."Prénom". "Code Postal". } while(encore()). affiche(premier). affiche(premier). fiche *rech_tel(fiche *. char ville[20].num.h> /* définitions des types et variables associées */ enum champs {nom. fiche *rech_rue(fiche *.15 15.prenom.char *). char tel[15].15 15. do { suppression()."Ville".char *). 10. affiche(premier).char *). ptrfonction tabfonction[7]= {rech_nom. #define taille sizeof(fiche) typedef fiche *ptrfiche. typedef ptrfiche (*ptrfonction)(ptrfiche.dat".char *). agenda #include #include #include #include #include <stdio.h> <string."Numéro". fiche *rech_nom(fiche *. } retour au sujet de cet exercice 10.rue. char rue[60].tel}. char prenom[20]. typedef struct { char nom[15]. /* définitions des fonctions de recherche. fiche *rech_num(fiche *. rech_prenom. fiche *rech_prenom(fiche *. int num.cp.char*). fiche *rech_ville(fiche *.char *). rech_ville. fiche *rech_cp(fiche *. } fiche.char *).h> <stdlib.ville. /* fichier de données */ char *nomfic="agenda. regroupées dans un tableau */ fiche *rech_nom(fiche *. rech_tel}.h> <conio."Rue"."Tel"}.char *). do { ajouter(). /* variables globales */ FILE *fic. rech_rue.

&(f. printf(" code postal ? "). if ((toupper(*s1)!=toupper(*s2))||(!*s1)||(!*s2)) return(0). printf(" prénom ? ").fic)!=1) { puts("impossible d'ajouter cette fiche au fichier ").15 15. printf("nom ? ").f−>codepostal.nb).s2++. } void ajouter(void) { char lig[40]. printf("%d fiches présentes dans l'agenda\n".nom)."a+b"))==NULL) { puts("ouverture impossible du fichier de données"). %s\n%ld %s\nTel : %s\n".f−>ville.f−>tel). nb=(int)ftell(fic)/taille. printf(" Numero ? "). gets(f. fseek(fic. dit si elles sont égales (1). f−>rue. gets(f. gets(lig).ville). ou non (0). gets(lig).char *s2) /* compare deux chaines. gets(f."%ld".prenom). printf("n° de téléphone ? "). } nb++. exit(0). gets(f.codepostal)).f−>nom. f−> prenom. sscanf(lig. else printf("fiche inconnue\n"). Une des chaines peut se terminer par *. } 10.&(f. printf(" rue ? ").rue). } fseek(fic. On considère égales majuscules et minuscules.) { if (((!*s1)&&(!*s2))||(*s1=='*')||(*s2=='*')) return(1). fiche f.. agenda 61 .2).2).TRAU int nb. } int idem(char *s1.Le langage C − cours P. printf(" ville ? "). exit(1). sscanf(lig. s1++. if(fwrite(&f.taille. on supposera identique si tout ce qui précède l'* était identique */ { for(.num)). f−>num. détermine le nb de fiches de fic */ { if ((fic=fopen(nomfic. /* nb de fiches dans le fichier */ void init(void) /* ouvre le fichier."%d".0L.tel). } void affiche(fiche *f) { if((f!=NULL)&&(f−>nom[0])) printf("%s %s\n%d.1.0. gets(f.

clef))."%d".1.nomchamp[i]).&rep). case 'R':recherche(). } } while (rep!='Q'). Type de recherche désirée ? "). if (nblu==1) return(pf). switch (rep=toupper(getch())) { case 'A':ajouter(). do nblu=fread(pf. affiche(tabfonction[c](&f.puts("Au revoir"). } /* les autres recherches sont à continuer */ int choix(void) { char lig[40]. do { if (((c=choix())<0)||(c>6)) break. Recherche d'une fiche. } void main(void) { char rep.break.Le langage C − cours P. } void recherche(void) { enum champs c.fic).i<=tel. agenda 62 .15 15. printf("\nou −1 pour quitter. for (i=nom. } retour au sujet de cet exercice 10. else return(NULL).taille. printf("quel(le) %s recherche−t'on ? ".break. init().char *n) { int nblu. do { puts("Ajouter une fiche.n))).nomchamp[c]).i. enum champs i.rep.0L. fiche f. gets(lig). fseek(fic. default :puts("option non prévue"). return(rep).0).i++) printf("%d:%s ". sscanf(lig. gets(clef).TRAU } fiche *rech_nom(fiche *pf.break. Quitter le prog ? "). while ((nblu==1)&&(!idem(pf−>nom. char clef[40]. } while (c>=0). case 'Q':fclose(fic).

2 B • bibliothèque [1] • bibliothèques standard [1] • bit [1] • blanc [1] • bloc [1] [2] [3] [4] • boucle [1] • break [1] [2] • buffer [1] 11.B.V.3 C • calloc [1] • caractère [1] [2] • case [1] • cast [1] [2] • chaîne [1] [2] • champ [1] • char [1] [2] • classe [1] [2] • close [1] • commentaire [1] • conio.O.W 11.Q.L.F.1 A • accès direct [1] [2] • accès séquentiel [1] • addition [1] • adresse [1] • affectation [1] [2] • alloc.h [1] • allocation dynamique [1] • ANSI [1] [2] [3] [4] • antislash [1] • arbre [1] • argc [1] • argument [1] [2] [3] [4] [5] [6] ♦ formel [1] [2] ♦ réel [1] [2] • argv [1] • associativité [1] • atof [1] • atoi [1] • atol [1] • auto [1] 11.T.h [1] 11 Langage C − Index 63 .H.N.C.P.R.D.11 Langage C − Index A.K.I.E.G.M.S.U.

h [1] • exit [1] • expression [1] [2] • extern [1] 11.4 D 64 .5 E • else [1] • entête [1] • de fonction [1] • entier [1] [2] • entrées/sorties [1] • enum [1] • énumération [1] • EOF [1] [2] • errno.h [1] 11.Le langage C − cours P.h [1] • feof [1] • fflush [1] • fgetc [1] • fgets [1] • fichier [1] [2] • filelength [1] • float [1] • fonction [1] [2] [3] • fopen [1] • for [1] • format printf [1] 11.TRAU • continue [1] • contrôle [1] • conversion [1] • corps [1] • ctype.4 D • déclaration [1] [2] [3] ♦ de type [1] ♦ globale [1] ♦ locale [1] • décrémentation [1] • default [1] • define [1] [2] [3] • deuxaire [1] • directive [1] • division [1] • do while [1] • double [1] • durée de vie [1] 11.6 F • faire tant que [1] • fclose [1] • fcntl.

9 I • identificateur [1] • if [1] [2] ♦ imbriqué [1] • ifdef [1] • ifndef [1] • include [1] [2] • incrémentation [1] • instruction [1] • int [1] • isalnum [1] • isalpha [1] • isdigit [1] • islower [1] • isspace [1] • isupper [1] 11.10 K • Kernigham [1] 11.11 L • label [1] • liste [1] • long [1] [2] [3] • longueur d'identificateur [1] 11.Le langage C − cours P.7 G • getch [1] • getchar [1] • getche [1] • gets [1] • goto [1] • goto calculé [1] 11.7 G 65 .8 H • handle [1] • heap [1] 11.TRAU • formaté [1] [2] • fprintf [1] • fputc [1] • fputs [1] • fread [1] • free [1] • fscanf [1] • fseek [1] • fwrite [1] 11.

12 M • macro [1] • main [1] • malloc [1] [2] • matrice [1] • mem.14 O • opérande [1] • opérateur [1] [2] • open [1] 11.TRAU • lseek [1] • Lvalue [1] 11.15 P • paramètre [1] • passage d'argument [1] • pile [1] [2] [3] • pointeur [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] • pour [1] • pré−compilateur [1] • printf [1] [2] • priorité [1] • produit [1] • prototype [1] • putch [1] • puts [1] [2] 11.Le langage C − cours P.16 Q • quote [1] 11.12 M 66 .h [1] • memcmp [1] • memcpy [1] 11.17 R • récursivité [1] • réel [1] [2] • rand [1] • read [1] • realloc [1] • register [1] • return [1] [2] • Ritchie [1] 11.13 N • NULL [1] [2] 11.

20 U • unaire [1] • undef [1] • ungetc [1] • union [1] • unsigned [1] [2] [3] 11.TRAU • Rvalue [1] 11.Le langage C − cours P.19 T • tableau [1] [2] [3] • tailles [1] • tant que [1] • tas [1] • ternaire [1] • tolower [1] • toupper [1] • typedef [1] [2] [3] [4] 11.18 S • séquentiel [1] • scalaire [1] • scanf [1] [2] • short [1] [2] • si − Sinon [1] • soustraction [1] • sprintf [1] • sscanf [1] • static [1] [2] [3] • stdio.h [1] • strlen [1] • strncat [1] • strncpy [1] • struct [1] [2] • structuré [1] • structure [1] [2] • switch [1] 11.h [1] [2] • stdlib.18 S 67 .h [1] [2] • strcat [1] • strcmp [1] • strcpy [1] • string.21 V • variable [1] [2] • variables locales [1] • visibilité [1] • visible [1] • void [1] 11.

22 W • while [1] • write [1] 11.TRAU 11.22 W 68 .Le langage C − cours P.

"},"eligible_for_exclusive_trial_roadblock":false,"eligible_for_seo_roadblock":false,"exclusive_free_trial_roadblock_props_path":"/doc-page/exclusive-free-trial-props/55210300","flashes":[],"footer_props":{"urls":{"about":"/about","press":"/press","blog":"http://literally.scribd.com/","careers":"/careers","contact":"/contact","plans_landing":"/subscribe","referrals":"/referrals?source=footer","giftcards":"/giftcards","faq":"/faq","accessibility":"/accessibility-policy","faq_paths":{"accounts":"https://support.scribd.com/hc/sections/202246346","announcements":"https://support.scribd.com/hc/sections/202246066","copyright":"https://support.scribd.com/hc/sections/202246086","downloading":"https://support.scribd.com/hc/articles/210135046","publishing":"https://support.scribd.com/hc/sections/202246366","reading":"https://support.scribd.com/hc/sections/202246406","selling":"https://support.scribd.com/hc/sections/202246326","store":"https://support.scribd.com/hc/sections/202246306","status":"https://support.scribd.com/hc/en-us/articles/360001202872","terms":"https://support.scribd.com/hc/sections/202246126","writing":"https://support.scribd.com/hc/sections/202246366","adchoices":"https://support.scribd.com/hc/articles/210129366","paid_features":"https://support.scribd.com/hc/sections/202246306","failed_uploads":"https://support.scribd.com/hc/en-us/articles/210134586-Troubleshooting-uploads-and-conversions","copyright_infringement":"https://support.scribd.com/hc/en-us/articles/210128946-DMCA-copyright-infringement-takedown-notification-policy","end_user_license":"https://support.scribd.com/hc/en-us/articles/210129486","terms_of_use":"https://support.scribd.com/hc/en-us/articles/210129326-General-Terms-of-Use"},"publishers":"/publishers","static_terms":"/terms","static_privacy":"/privacy","copyright":"/copyright","ios_app":"https://itunes.apple.com/us/app/scribd-worlds-largest-online/id542557212?mt=8&uo=4&at=11lGEE","android_app":"https://play.google.com/store/apps/details?id=com.scribd.app.reader0&hl=en","books":"/books","sitemap":"/directory"}},"global_nav_props":{"header_props":{"logo_src":"/images/landing/home2_landing/scribd_logo_horiz_small.svg","root_url":"https://www.scribd.com/","search_term":"","small_logo_src":"/images/logos/scribd_s_logo.png","uploads_url":"/upload-document","search_props":{"redirect_to_app":true,"search_url":"/search","search_test":"control","query":"","search_page":false}},"user_menu_props":null,"sidebar_props":{"urls":{"bestsellers":"https://www.scribd.com/bestsellers","home":"https://www.scribd.com/","saved":"/saved","subscribe":"/archive/pmp_checkout?doc=55210300&metadata=%7B%22context%22%3A%22pmp%22%2C%22action%22%3A%22start_trial%22%2C%22logged_in%22%3Afalse%2C%22platform%22%3A%22web%22%7D","top_charts":"/bestsellers","upload":"https://www.scribd.com/upload-document"},"categories":{"book":{"icon":"icon-ic_book","icon_filled":"icon-ic_book_fill","url":"https://www.scribd.com/books","name":"Books","type":"book"},"news":{"icon":"icon-ic_articles","icon_filled":"icon-ic_articles_fill","url":"https://www.scribd.com/news","name":"News","type":"news"},"audiobook":{"icon":"icon-ic_audiobook","icon_filled":"icon-ic_audiobook_fill","url":"https://www.scribd.com/audiobooks","name":"Audiobooks","type":"audiobook"},"magazine":{"icon":"icon-ic_magazine","icon_filled":"icon-ic_magazine_fill","url":"https://www.scribd.com/magazines","name":"Magazines","type":"magazine"},"document":{"icon":"icon-ic_document","icon_filled":"icon-ic_document_fill","url":"https://www.scribd.com/docs","name":"Documents","type":"document"},"sheet_music":{"icon":"icon-ic_songbook","icon_filled":"icon-ic_songbook_fill","url":"https://www.scribd.com/sheetmusic","name":"Sheet Music","type":"sheet_music"}},"categories_array":["mixed","book","audiobook","magazine","news","document","sheet_music"],"selected_content_type":"mixed","username":"","search_overlay_props":{"search_input_props":{"focused":false,"keep_suggestions_on_blur":false}}}},"recommenders":{"related_titles_recommender":{"item_props":[{"type":"document","id":41226990,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/41226990/108x144/28f8fb982f/1399876507?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/41226990/216x288/76e6a7510f/1399876507?v=1","title":"Mini-projet-n°2-DAIGL-STS21","short_title":"Mini-projet-n°2-DAIGL-STS21","author":"jamaifox","tracking":{"object_type":"document","object_id":41226990,"track":"flattened_recommender","doc_uuid":"Q54KXMllzBaK0AgV8AFyvp6+5vk="},"url":"https://www.scribd.com/document/41226990/Mini-projet-n-2-DAIGL-STS21"},{"type":"document","id":210252933,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/210252933/108x144/2ea3ec7329/1445271602?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/210252933/216x288/aa08303786/1445271602?v=1","title":"C_sur_dsPIC","short_title":"C_sur_dsPIC","author":"Ayoub Ayay","tracking":{"object_type":"document","object_id":210252933,"track":"flattened_recommender","doc_uuid":"qenP68z0UpSnymKOB2EckBySKW4="},"url":"https://www.scribd.com/document/210252933/C-sur-dsPIC"},{"type":"document","id":74517816,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/74517816/108x144/d9e35ad938/1322843856?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/74517816/216x288/99a423bb3e/1322843856?v=1","title":"InfoS2-TD2","short_title":"InfoS2-TD2","author":"Mohamed Hmem","tracking":{"object_type":"document","object_id":74517816,"track":"flattened_recommender","doc_uuid":"d+Bo2+LEygzK1g0WaBBtOeTxVC4="},"url":"https://www.scribd.com/document/74517816/InfoS2-TD2"},{"type":"document","id":228487448,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/228487448/108x144/8df7cc0d64/1402084381?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/228487448/216x288/41e14a6094/1402084381?v=1","title":"Rapport 1","short_title":"Rapport 1","author":"Imad Belmoujahid","tracking":{"object_type":"document","object_id":228487448,"track":"flattened_recommender","doc_uuid":"HMqfOVrzALw5x18zgOe0H3rG3fw="},"url":"https://www.scribd.com/document/228487448/Rapport-1"},{"type":"document","id":368468943,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/368468943/108x144/61ae795267/1515150055?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/368468943/216x288/c310ae70f2/1515150055?v=1","title":"08 09 Poly Langage c","short_title":"08 09 Poly Langage c","author":"isambensalah","tracking":{"object_type":"document","object_id":368468943,"track":"flattened_recommender","doc_uuid":"uWFSyyozzLFHLkFBiiZmQUQGPak="},"url":"https://www.scribd.com/document/368468943/08-09-Poly-Langage-c"},{"type":"document","id":230731654,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/230731654/108x144/bcc79fd6b8/1403380450?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/230731654/216x288/ca7cb39065/1403380450?v=1","title":"ex11","short_title":"ex11","author":"Harun Mouad","tracking":{"object_type":"document","object_id":230731654,"track":"flattened_recommender","doc_uuid":"1uW7ELLZlvl8iWnuxQI64KEUHlg="},"url":"https://www.scribd.com/document/230731654/ex11"},{"type":"document","id":274729455,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/274729455/108x144/d8dfbf1035/1439740162?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/274729455/216x288/9157238479/1439740162?v=1","title":"introC","short_title":"introC","author":"Jad Sami","tracking":{"object_type":"document","object_id":274729455,"track":"flattened_recommender","doc_uuid":"omDBD2lvZyxWGgc5fVC17dI+2c0="},"url":"https://www.scribd.com/presentation/274729455/introC"},{"type":"document","id":334536812,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/334536812/108x144/2085c5a01a/1482084868?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/334536812/216x288/d7fa42c89c/1482084868?v=1","title":"Cours C S3","short_title":"Cours C S3","author":"sadik","tracking":{"object_type":"document","object_id":334536812,"track":"flattened_recommender","doc_uuid":"HcnODiEGryvF+TExB+jGwS5MMco="},"url":"https://www.scribd.com/document/334536812/Cours-C-S3"},{"type":"document","id":209324340,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/209324340/108x144/d774ca43b4/1393405042?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/209324340/216x288/1af1961575/1393405042?v=1","title":"Fon Ctions","short_title":"Fon Ctions","author":"Seydou Ali Tahirou","tracking":{"object_type":"document","object_id":209324340,"track":"flattened_recommender","doc_uuid":"ihLhVZPIv6J/6wSDUhXtl3EwrvY="},"url":"https://www.scribd.com/document/209324340/Fon-Ctions"},{"type":"document","id":367778857,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/367778857/108x144/df27504744/1514034314?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/367778857/216x288/bc92ec11dc/1514034314?v=1","title":"Techniques Deprogram C","short_title":"Techniques Deprogram C","author":"Karim Benyoussef","tracking":{"object_type":"document","object_id":367778857,"track":"flattened_recommender","doc_uuid":"U0GIB7nh+zIId0aJgZlUURmamLs="},"url":"https://www.scribd.com/presentation/367778857/Techniques-Deprogram-C"},{"type":"document","id":221253441,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/221253441/108x144/f0522ea550/1434524805?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/221253441/216x288/ed0e10e29a/1434524805?v=1","title":"Graf Cet","short_title":"Graf Cet","author":"فدوى غاني","tracking":{"object_type":"document","object_id":221253441,"track":"flattened_recommender","doc_uuid":"dPPLc4q4hMCmiiHTo93k+UCU+I8="},"url":"https://www.scribd.com/document/221253441/Graf-Cet"},{"type":"document","id":291986356,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/291986356/108x144/57f7b7c45f/1449090833?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/291986356/216x288/793c3443ef/1449090833?v=1","title":"Chapitre 1 - Concepts de base du langage C++","short_title":"Chapitre 1 - Concepts de base du langage C++","author":"TchouarHamzaReda","tracking":{"object_type":"document","object_id":291986356,"track":"flattened_recommender","doc_uuid":"LMRfbH8HdsxmfnwQaODh+hjHACs="},"url":"https://www.scribd.com/presentation/291986356/Chapitre-1-Concepts-de-base-du-langage-C"},{"type":"document","id":42658460,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/42658460/108x144/303950d512/1337689512?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/42658460/216x288/869417e87f/1337689512?v=1","title":"algorithmiques1","short_title":"algorithmiques1","author":"Mustapha Semmaa","tracking":{"object_type":"document","object_id":42658460,"track":"flattened_recommender","doc_uuid":"XyZlIExp0i/VG4ySVZTG7t7zLQE="},"url":"https://www.scribd.com/document/42658460/algorithmiques1"},{"type":"document","id":309214691,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/309214691/108x144/d2e598b8ba/1460861779?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/309214691/216x288/1c4655a2df/1460861779?v=1","title":"Cours C Avancé V1","short_title":"Cours C Avancé V1","author":"AbdelkhalekBenOmar","tracking":{"object_type":"document","object_id":309214691,"track":"flattened_recommender","doc_uuid":"fIqw79QZvX12W42nQdJua2kNjL4="},"url":"https://www.scribd.com/document/309214691/Cours-C-Avance-V1"},{"type":"document","id":193856067,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/193856067/108x144/4b4871e6b2/1400118029?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/193856067/216x288/ae7ff1e3e9/1400118029?v=1","title":"Diapos Langage Cmini PIC","short_title":"Diapos Langage Cmini PIC","author":"Salah Dahouathi","tracking":{"object_type":"document","object_id":193856067,"track":"flattened_recommender","doc_uuid":"e+CINSZnREBF8iLzS/qm0zUuXXQ="},"url":"https://www.scribd.com/document/193856067/Diapos-Langage-Cmini-PIC"},{"type":"document","id":193505341,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/193505341/108x144/6e8be3f400/1427526493?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/193505341/216x288/0a8d117c00/1427526493?v=1","title":"Poly Copies Mas 3","short_title":"Poly Copies Mas 3","author":"jawad114","tracking":{"object_type":"document","object_id":193505341,"track":"flattened_recommender","doc_uuid":"maxJyiB327vvmtWZp5vCPA477T8="},"url":"https://www.scribd.com/document/193505341/Poly-Copies-Mas-3"},{"type":"document","id":126554389,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/126554389/108x144/297058ed8b/1527284553?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/126554389/216x288/321a6fa592/1527284553?v=1","title":"Tp Chronometre","short_title":"Tp Chronometre","author":"Abderrazzak Riali","tracking":{"object_type":"document","object_id":126554389,"track":"flattened_recommender","doc_uuid":"LLDybBNw8zyk91asg2chkqzoW6o="},"url":"https://www.scribd.com/document/126554389/Tp-Chronometre"},{"type":"document","id":137513457,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/137513457/108x144/e149a6a903/1433910399?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/137513457/216x288/8b9400f457/1433910399?v=1","title":"Algorithm e","short_title":"Algorithm e","author":"fstfes","tracking":{"object_type":"document","object_id":137513457,"track":"flattened_recommender","doc_uuid":"Ctef21mX8DWZ7uiHZ6U/UqOQrLI="},"url":"https://www.scribd.com/document/137513457/Algorithm-e"},{"type":"document","id":228806435,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/228806435/108x144/91483a2335/1402330043?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/228806435/216x288/a5fbc1b612/1402330043?v=1","title":"unx3","short_title":"unx3","author":"Salma Brb","tracking":{"object_type":"document","object_id":228806435,"track":"flattened_recommender","doc_uuid":"7PUDw2dR1xfboOk89r5NZ7W0eqg="},"url":"https://www.scribd.com/document/228806435/unx3"},{"type":"document","id":353683272,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/353683272/108x144/330d5f189c/1499959264?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/353683272/216x288/c6ed392aa0/1499959264?v=1","title":"Cours GTK 9","short_title":"Cours GTK 9","author":"Mohamadou Ndjidda","tracking":{"object_type":"document","object_id":353683272,"track":"flattened_recommender","doc_uuid":"fYRkix0O2g7LiiFYxSaoAWAqFMM="},"url":"https://www.scribd.com/document/353683272/Cours-GTK-9"},{"type":"document","id":38267725,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/38267725/108x144/9c5032f471/1351113440?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/38267725/216x288/fa29793d52/1351113440?v=1","title":"polycpp","short_title":"polycpp","author":"Ayoub Affani","tracking":{"object_type":"document","object_id":38267725,"track":"flattened_recommender","doc_uuid":"pTC5Ud7IS7wzY3uiwvZp/gsp2Cs="},"url":"https://www.scribd.com/document/38267725/polycpp"},{"type":"document","id":341396401,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/341396401/108x144/695f0fa346/1489073828?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/341396401/216x288/7667b20081/1489073828?v=1","title":"Initiation Au Langage C Sur PIC Correction","short_title":"Initiation Au Langage C Sur PIC Correction","author":"Bounegab Youcef","tracking":{"object_type":"document","object_id":341396401,"track":"flattened_recommender","doc_uuid":"fNRvsyS8ZKuhnRr47yqdfzv60HQ="},"url":"https://www.scribd.com/document/341396401/Initiation-Au-Langage-C-Sur-PIC-Correction"},{"type":"document","id":212634023,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/212634023/108x144/15c522acdf/1394921445?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/212634023/216x288/d2739b504f/1394921445?v=1","title":"cours_c","short_title":"cours_c","author":"Mohamed Meski","tracking":{"object_type":"document","object_id":212634023,"track":"flattened_recommender","doc_uuid":"5gmaVriNXgKnJsbV9Xz5Zcr1FoI="},"url":"https://www.scribd.com/document/212634023/cours-c"},{"type":"document","id":47181622,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/47181622/108x144/b88ce15804/1368020094?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/47181622/216x288/05eb37b978/1368020094?v=1","title":"c++","short_title":"c++","author":"Btihal Souani","tracking":{"object_type":"document","object_id":47181622,"track":"flattened_recommender","doc_uuid":"6zA3nEUr2TFrnE/QU9pu/wf5Glc="},"url":"https://www.scribd.com/doc/47181622/c"},{"type":"document","id":373003221,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/373003221/108x144/64b5b65fe9/1520252734?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/373003221/216x288/4cdc8d6b75/1520252734?v=1","title":"AideMemoireC.pdf","short_title":"AideMemoireC.pdf","author":"Omar Oubaha","tracking":{"object_type":"document","object_id":373003221,"track":"flattened_recommender","doc_uuid":"XzenL6U37nJDmULyZDpOU1wpdJA="},"url":"https://www.scribd.com/document/373003221/AideMemoireC-pdf"},{"type":"document","id":193870935,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/193870935/108x144/bce3f6c15a/1400118073?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/193870935/216x288/7bf3ea3c82/1400118073?v=1","title":"Trucs Et Astuces","short_title":"Trucs Et Astuces","author":"Salah Dahouathi","tracking":{"object_type":"document","object_id":193870935,"track":"flattened_recommender","doc_uuid":"BNEmQLWexZ4lzmxIR18RNqV52f8="},"url":"https://www.scribd.com/document/193870935/Trucs-Et-Astuces"},{"type":"document","id":69308015,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/69308015/108x144/c55eda3c3d/1352240806?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/69308015/216x288/a1dce28e10/1352240806?v=1","title":"cours_C","short_title":"cours_C","author":"Gzouni Abeda","tracking":{"object_type":"document","object_id":69308015,"track":"flattened_recommender","doc_uuid":"SkhZuAIZQuPgi+D67kQv9mSs3nI="},"url":"https://www.scribd.com/document/69308015/cours-C"},{"type":"document","id":331521760,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/331521760/108x144/28821bf102/1479487750?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/331521760/216x288/658111bc3f/1479487750?v=1","title":"Resume c","short_title":"Resume c","author":"Tec Ens","tracking":{"object_type":"document","object_id":331521760,"track":"flattened_recommender","doc_uuid":"l7m8rcdOrOv47siO/8rewqZr+uQ="},"url":"https://www.scribd.com/document/331521760/Resume-c"},{"type":"document","id":93241062,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/93241062/108x144/4873a5c219/1377511984?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/93241062/216x288/7aabbc78c9/1377511984?v=1","title":"Cours VB","short_title":"Cours VB","author":"erraha5052","tracking":{"object_type":"document","object_id":93241062,"track":"flattened_recommender","doc_uuid":"gnRTU80hJ/cM54reOp8WxcOihCA="},"url":"https://www.scribd.com/presentation/93241062/Cours-VB"},{"type":"document","id":346659479,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/346659479/108x144/bf75c555ed/1493387308?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/346659479/216x288/d24858fb52/1493387308?v=1","title":"Langage C Pour Micro v1.0","short_title":"Langage C Pour Micro v1.0","author":"sevemasse","tracking":{"object_type":"document","object_id":346659479,"track":"flattened_recommender","doc_uuid":"Ala/H9rPKGrC0zY6p7PektnPWuQ="},"url":"https://www.scribd.com/document/346659479/Langage-C-Pour-Micro-v1-0"},{"type":"book","id":253264900,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/253264900/108x144/dcda7770b5/1537400315?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/253264900/216x288/ca2dc9eb25/1537400315?v=1","title":"Sapiens: A Brief History of Humankind","short_title":"Sapiens","author":"Yuval Noah Harari","tracking":{"object_type":"document","object_id":253264900,"track":"flattened_recommender","doc_uuid":"Yovl3mQlpe1cjQBMCj7PlQVViEs="},"url":"https://www.scribd.com/book/253264900/Sapiens-A-Brief-History-of-Humankind"},{"type":"book","id":212863738,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/212863738/108x144/5bad102ef1/1537398211?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/212863738/216x288/8fc36df455/1537398211?v=1","title":"The Unwinding: An Inner History of the New America","short_title":"The Unwinding","author":"George Packer","tracking":{"object_type":"document","object_id":212863738,"track":"flattened_recommender","doc_uuid":"l19Slegs1eQKaMhu82LhnivuHMU="},"url":"https://www.scribd.com/book/212863738/The-Unwinding-An-Inner-History-of-the-New-America"},{"type":"book","id":244157917,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/244157917/108x144/c55ae5929d/1537390132?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/244157917/216x288/c42f4ff9aa/1537390132?v=1","title":"Yes Please","short_title":"Yes Please","author":"Amy Poehler","tracking":{"object_type":"document","object_id":244157917,"track":"flattened_recommender","doc_uuid":"RsotksNQepxraGVXO0glwyWollU="},"url":"https://www.scribd.com/book/244157917/Yes-Please"},{"type":"book","id":239488191,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/239488191/108x144/a9a21bdc0e/1537389437?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/239488191/216x288/73448c1779/1537389437?v=1","title":"The Innovators: How a Group of Hackers, Geniuses, and Geeks Created the Digital Revolution","short_title":"The Innovators","author":"Walter Isaacson","tracking":{"object_type":"document","object_id":239488191,"track":"flattened_recommender","doc_uuid":"FQczXvxpnPpbWn9cm9WJ3WDkJ6Y="},"url":"https://www.scribd.com/book/239488191/The-Innovators-How-a-Group-of-Hackers-Geniuses-and-Geeks-Created-the-Digital-Revolution"},{"type":"book","id":282766939,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/282766939/108x144/1355dd3a71/1537398877?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/282766939/216x288/076d3f356c/1537398877?v=1","title":"Dispatches from Pluto: Lost and Found in the Mississippi Delta","short_title":"Dispatches from Pluto","author":"Richard Grant","tracking":{"object_type":"document","object_id":282766939,"track":"flattened_recommender","doc_uuid":"N2mOWdvWvLRKJwn9nNeD7KX+Xn4="},"url":"https://www.scribd.com/book/282766939/Dispatches-from-Pluto-Lost-and-Found-in-the-Mississippi-Delta"},{"type":"book","id":263504218,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/263504218/108x144/986fa89e8b/1537398194?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/263504218/216x288/c40eb7e9a8/1537398194?v=1","title":"Elon Musk: Tesla, SpaceX, and the Quest for a Fantastic Future","short_title":"Elon Musk","author":"Ashlee Vance","tracking":{"object_type":"document","object_id":263504218,"track":"flattened_recommender","doc_uuid":"J1wYPPusiRcQ5QjBMFUqissting="},"url":"https://www.scribd.com/book/263504218/Elon-Musk-Tesla-SpaceX-and-the-Quest-for-a-Fantastic-Future"},{"type":"book","id":224419023,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/224419023/108x144/48b209bbb5/1537392946?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/224419023/216x288/39263c2334/1537392946?v=1","title":"John Adams","short_title":"John Adams","author":"David McCullough","tracking":{"object_type":"document","object_id":224419023,"track":"flattened_recommender","doc_uuid":"rYOPSzpCyF+MnQrqaCiPPcYaNkI="},"url":"https://www.scribd.com/book/224419023/John-Adams"},{"type":"book","id":163646054,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/163646054/108x144/c8eb9eae18/1537388558?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/163646054/216x288/d6d700f05f/1537388558?v=1","title":"Devil in the Grove: Thurgood Marshall, the Groveland Boys, and the Dawn of a New America","short_title":"Devil in the Grove","author":"Gilbert King","tracking":{"object_type":"document","object_id":163646054,"track":"flattened_recommender","doc_uuid":"2rHubQF+6P1En3cBIL0tv/ckpbI="},"url":"https://www.scribd.com/book/163646054/Devil-in-the-Grove-Thurgood-Marshall-the-Groveland-Boys-and-the-Dawn-of-a-New-America"},{"type":"book","id":224258670,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/224258670/108x144/3c7a87a449/1537404584?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/224258670/216x288/ef3c1ca84d/1537404584?v=1","title":"The Prize: The Epic Quest for Oil, Money & Power","short_title":"The Prize","author":"Daniel Yergin","tracking":{"object_type":"document","object_id":224258670,"track":"flattened_recommender","doc_uuid":"zssdQ5Hv3wBKSDYZNZ6iCNEeLCc="},"url":"https://www.scribd.com/book/224258670/The-Prize-The-Epic-Quest-for-Oil-Money-Power"},{"type":"book","id":225916486,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/225916486/108x144/241cf75eb3/1537396990?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/225916486/216x288/a042fe186a/1537396990?v=1","title":"A Heartbreaking Work Of Staggering Genius: A Memoir Based on a True Story","short_title":"A Heartbreaking Work Of Staggering Genius","author":"Dave Eggers","tracking":{"object_type":"document","object_id":225916486,"track":"flattened_recommender","doc_uuid":"L/UXtfBEaeOClcg93cC71HTv+Rg="},"url":"https://www.scribd.com/book/225916486/A-Heartbreaking-Work-Of-Staggering-Genius-A-Memoir-Based-on-a-True-Story"},{"type":"book","id":224355300,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/224355300/108x144/0f2130a60a/1537393381?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/224355300/216x288/9b9b19254a/1537393381?v=1","title":"Grand Pursuit: The Story of Economic Genius","short_title":"Grand Pursuit","author":"Sylvia Nasar","tracking":{"object_type":"document","object_id":224355300,"track":"flattened_recommender","doc_uuid":"rb707oYZ0IDpyi565zEt9fczvBQ="},"url":"https://www.scribd.com/book/224355300/Grand-Pursuit-The-Story-of-Economic-Genius"},{"type":"book","id":238704340,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/238704340/108x144/2fd0be1590/1537395500?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/238704340/216x288/191539db56/1537395500?v=1","title":"This Changes Everything: Capitalism vs. The Climate","short_title":"This Changes Everything","author":"Naomi Klein","tracking":{"object_type":"document","object_id":238704340,"track":"flattened_recommender","doc_uuid":"Fy22vdaZaod9kXjL4Inoa1WN+5w="},"url":"https://www.scribd.com/book/238704340/This-Changes-Everything-Capitalism-vs-The-Climate"},{"type":"book","id":224369806,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/224369806/108x144/6fb23377a8/1537393292?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/224369806/216x288/b1d476d0fb/1537393292?v=1","title":"The Emperor of All Maladies: A Biography of Cancer","short_title":"The Emperor of All Maladies","author":"Siddhartha Mukherjee","tracking":{"object_type":"document","object_id":224369806,"track":"flattened_recommender","doc_uuid":"U4QWxNbd3W1I3SMylh2IiCKg4nA="},"url":"https://www.scribd.com/book/224369806/The-Emperor-of-All-Maladies-A-Biography-of-Cancer"},{"type":"book","id":224410295,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/224410295/108x144/514b1bea0b/1537392965?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/224410295/216x288/f7c9469e6c/1537392965?v=1","title":"Team of Rivals: The Political Genius of Abraham Lincoln","short_title":"Team of Rivals","author":"Doris Kearns Goodwin","tracking":{"object_type":"document","object_id":224410295,"track":"flattened_recommender","doc_uuid":"EIvzpLDyzw3JeyXalY8twuoWhI0="},"url":"https://www.scribd.com/book/224410295/Team-of-Rivals-The-Political-Genius-of-Abraham-Lincoln"},{"type":"book","id":293461549,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/293461549/108x144/07628d60db/1537393721?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/293461549/216x288/8d1185b7ff/1537393721?v=1","title":"The New Confessions of an Economic Hit Man","short_title":"The New Confessions of an Economic Hit Man","author":"John Perkins","tracking":{"object_type":"document","object_id":293461549,"track":"flattened_recommender","doc_uuid":"M5XVem2pkFY83VhavFkJfr4Gr6o="},"url":"https://www.scribd.com/book/293461549/The-New-Confessions-of-an-Economic-Hit-Man"},{"type":"book","id":239588474,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/239588474/108x144/149fb5e6af/1537401191?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/239588474/216x288/15f36354f8/1537401191?v=1","title":"Rise of ISIS: A Threat We Can't Ignore","short_title":"Rise of ISIS","author":"Jay Sekulow","tracking":{"object_type":"document","object_id":239588474,"track":"flattened_recommender","doc_uuid":"AAxT/HVLXcCKEJXyI0WMjx5t6xY="},"url":"https://www.scribd.com/book/239588474/Rise-of-ISIS-A-Threat-We-Can-t-Ignore"},{"type":"book","id":202691564,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/202691564/108x144/f0e6e6416d/1537398953?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/202691564/216x288/56a5d067c6/1537398953?v=1","title":"Smart People Should Build Things: How to Restore Our Culture of Achievement, Build a Path for Entrepreneurs, and Create New Jobs in America","short_title":"Smart People Should Build Things","author":"Andrew Yang","tracking":{"object_type":"document","object_id":202691564,"track":"flattened_recommender","doc_uuid":"9xodMM5zDQaLDUXgWSXo2uqM9rA="},"url":"https://www.scribd.com/book/202691564/Smart-People-Should-Build-Things-How-to-Restore-Our-Culture-of-Achievement-Build-a-Path-for-Entrepreneurs-and-Create-New-Jobs-in-America"},{"type":"book","id":211302755,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/211302755/108x144/2424de51a2/1537400705?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/211302755/216x288/09ee7462f3/1537400705?v=1","title":"The Hard Thing About Hard Things: Building a Business When There Are No Easy Answers","short_title":"The Hard Thing About Hard Things","author":"Ben Horowitz","tracking":{"object_type":"document","object_id":211302755,"track":"flattened_recommender","doc_uuid":"q0FOZi0D5TOHEjDNwhzjaobzmh4="},"url":"https://www.scribd.com/book/211302755/The-Hard-Thing-About-Hard-Things-Building-a-Business-When-There-Are-No-Easy-Answers"},{"type":"book","id":182553141,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/182553141/108x144/1b40063d80/1537395613?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/182553141/216x288/098f7f1651/1537395613?v=1","title":"The World Is Flat 3.0: A Brief History of the Twenty-first Century","short_title":"The World Is Flat 3.0","author":"Thomas L. Friedman","tracking":{"object_type":"document","object_id":182553141,"track":"flattened_recommender","doc_uuid":"ViZvykN9u7lLXbiodBvuagZePt4="},"url":"https://www.scribd.com/book/182553141/The-World-Is-Flat-3-0-A-Brief-History-of-the-Twenty-first-Century"},{"type":"book","id":234028503,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/234028503/108x144/2c4440aa6c/1537398525?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/234028503/216x288/cfe54b8013/1537398525?v=1","title":"Bad Feminist: Essays","short_title":"Bad Feminist","author":"Roxane Gay","tracking":{"object_type":"document","object_id":234028503,"track":"flattened_recommender","doc_uuid":"qzopNNHtr0WT4L3g/khyK31+ayo="},"url":"https://www.scribd.com/book/234028503/Bad-Feminist-Essays"},{"type":"book","id":224349281,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/224349281/108x144/4df0918cea/1537406035?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/224349281/216x288/befa0c6317/1537406035?v=1","title":"How To Win Friends and Influence People","short_title":"How To Win Friends and Influence People","author":"Dale Carnegie","tracking":{"object_type":"document","object_id":224349281,"track":"flattened_recommender","doc_uuid":"t0Wm7NE/rwPjoOLzCQPYV68PS24="},"url":"https://www.scribd.com/book/224349281/How-To-Win-Friends-and-Influence-People"},{"type":"book","id":224426877,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/224426877/108x144/f22cf865fe/1537389528?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/224426877/216x288/a73f25e252/1537389528?v=1","title":"Angela's Ashes: A Memoir","short_title":"Angela's Ashes","author":"Frank McCourt","tracking":{"object_type":"document","object_id":224426877,"track":"flattened_recommender","doc_uuid":"hmARVkQhlOFuLf2sZy+aDZ0+ZgI="},"url":"https://www.scribd.com/book/224426877/Angela-s-Ashes-A-Memoir"},{"type":"book","id":224326250,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/224326250/108x144/b659f5fb6a/1537397015?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/224326250/216x288/900e8864ca/1537397015?v=1","title":"Steve Jobs","short_title":"Steve Jobs","author":"Walter Isaacson","tracking":{"object_type":"document","object_id":224326250,"track":"flattened_recommender","doc_uuid":"8coQ0WNGPKG4LBdEdgfIXYlL8M0="},"url":"https://www.scribd.com/book/224326250/Steve-Jobs"},{"type":"book","id":254039238,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/254039238/108x144/a8c6c5e065/1537396259?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/254039238/216x288/0e4e5ae0d4/1537396259?v=1","title":"Leaving Berlin: A Novel","short_title":"Leaving Berlin","author":"Joseph Kanon","tracking":{"object_type":"document","object_id":254039238,"track":"flattened_recommender","doc_uuid":"63tj/oFod/xWhyFAE6d12m8asn4="},"url":"https://www.scribd.com/book/254039238/Leaving-Berlin-A-Novel"},{"type":"book","id":182565115,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/182565115/108x144/50e3fc9eb2/1537394705?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/182565115/216x288/8bbf81282a/1537394705?v=1","title":"The Silver Linings Playbook: A Novel","short_title":"The Silver Linings Playbook","author":"Matthew Quick","tracking":{"object_type":"document","object_id":182565115,"track":"flattened_recommender","doc_uuid":"4yVlurnF1RMQG++yTfKIG5ep5zw="},"url":"https://www.scribd.com/book/182565115/The-Silver-Linings-Playbook-A-Novel"},{"type":"book","id":337536061,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/337536061/108x144/8c1b451da6/1537402649?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/337536061/216x288/45d81f5c37/1537402649?v=1","title":"The Sympathizer: A Novel (Pulitzer Prize for Fiction)","short_title":"The Sympathizer","author":"Viet Thanh Nguyen","tracking":{"object_type":"document","object_id":337536061,"track":"flattened_recommender","doc_uuid":"bSkwKlFa0dImeAQsimFlW445XZk="},"url":"https://www.scribd.com/book/337536061/The-Sympathizer-A-Novel-Pulitzer-Prize-for-Fiction"},{"type":"book","id":249309502,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/249309502/108x144/06f5527c5d/1537390787?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/249309502/216x288/ec3bf7c24b/1537390787?v=1","title":"Extremely Loud and Incredibly Close: A Novel","short_title":"Extremely Loud and Incredibly Close","author":"Jonathan Safran Foer","tracking":{"object_type":"document","object_id":249309502,"track":"flattened_recommender","doc_uuid":"GjlbjPGlwPkmOMjwCOwlQeZ7PwY="},"url":"https://www.scribd.com/book/249309502/Extremely-Loud-and-Incredibly-Close-A-Novel"},{"type":"book","id":224306619,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/224306619/108x144/7eeca5a1bc/1537400821?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/224306619/216x288/4a8f75444a/1537400821?v=1","title":"The Light Between Oceans: A Novel","short_title":"The Light Between Oceans","author":"M.L. Stedman","tracking":{"object_type":"document","object_id":224306619,"track":"flattened_recommender","doc_uuid":"pRDeAY8uIBAcmfCs6RHuK+4AhLM="},"url":"https://www.scribd.com/book/224306619/The-Light-Between-Oceans-A-Novel"},{"type":"book","id":273440534,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/273440534/108x144/b7e49e07d3/1537398680?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/273440534/216x288/aaec1b2b1a/1537398680?v=1","title":"The Incarnations: A Novel","short_title":"The Incarnations","author":"Susan Barker","tracking":{"object_type":"document","object_id":273440534,"track":"flattened_recommender","doc_uuid":"3cBtTI4sR1YuzDu+rjPIWIPygng="},"url":"https://www.scribd.com/book/273440534/The-Incarnations-A-Novel"},{"type":"book","id":273582508,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/273582508/108x144/fb92cadae3/1537393928?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/273582508/216x288/135562ba06/1537393928?v=1","title":"You Too Can Have a Body Like Mine: A Novel","short_title":"You Too Can Have a Body Like Mine","author":"Alexandra Kleeman","tracking":{"object_type":"document","object_id":273582508,"track":"flattened_recommender","doc_uuid":"BjJ/jG4Dg/cevoNuk/mJQMX3mZE="},"url":"https://www.scribd.com/book/273582508/You-Too-Can-Have-a-Body-Like-Mine-A-Novel"},{"type":"book","id":249308781,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/249308781/108x144/8ccbad3c4a/1537398356?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/249308781/216x288/b0591f1a45/1537398356?v=1","title":"Life of Pi","short_title":"Life of Pi","author":"Yann Martel","tracking":{"object_type":"document","object_id":249308781,"track":"flattened_recommender","doc_uuid":"/1O6zBVE7QHWLn5HoMc1JRMhi10="},"url":"https://www.scribd.com/book/249308781/Life-of-Pi"},{"type":"book","id":182546874,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/182546874/108x144/817bab2149/1537396991?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/182546874/216x288/a6b6573207/1537396991?v=1","title":"The Love Affairs of Nathaniel P.: A Novel","short_title":"The Love Affairs of Nathaniel P.","author":"Adelle Waldman","tracking":{"object_type":"document","object_id":182546874,"track":"flattened_recommender","doc_uuid":"2TS8G9KlXlFsRh9ZtdftgbyGWDM="},"url":"https://www.scribd.com/book/182546874/The-Love-Affairs-of-Nathaniel-P-A-Novel"},{"type":"book","id":235583696,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/235583696/108x144/a9f15763be/1537400740?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/235583696/216x288/7c5ab0af0f/1537400740?v=1","title":"We Are Not Ourselves: A Novel","short_title":"We Are Not Ourselves","author":"Matthew Thomas","tracking":{"object_type":"document","object_id":235583696,"track":"flattened_recommender","doc_uuid":"f66XbkcaX3+/mOdKUz6gU2o40xE="},"url":"https://www.scribd.com/book/235583696/We-Are-Not-Ourselves-A-Novel"},{"type":"book","id":250006950,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/250006950/108x144/2a1edbdeca/1537390855?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/250006950/216x288/139a0bb438/1537390855?v=1","title":"The First Bad Man: A Novel","short_title":"The First Bad Man","author":"Miranda July","tracking":{"object_type":"document","object_id":250006950,"track":"flattened_recommender","doc_uuid":"6MaBfVzvqaHbdHwZMJnnz1olitg="},"url":"https://www.scribd.com/book/250006950/The-First-Bad-Man-A-Novel"},{"type":"book","id":224248577,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/224248577/108x144/d525463c67/1537385712?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/224248577/216x288/2b59844b99/1537385712?v=1","title":"The Rosie Project: A Novel","short_title":"The Rosie Project","author":"Graeme Simsion","tracking":{"object_type":"document","object_id":224248577,"track":"flattened_recommender","doc_uuid":"QVnzoFxoF4TwBZ5A2InZ1HYMmuI="},"url":"https://www.scribd.com/book/224248577/The-Rosie-Project-A-Novel"},{"type":"book","id":231689346,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/231689346/108x144/7e5fbbde4a/1537385935?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/231689346/216x288/b7fe80231f/1537385935?v=1","title":"The Blazing World: A Novel","short_title":"The Blazing World","author":"Siri Hustvedt","tracking":{"object_type":"document","object_id":231689346,"track":"flattened_recommender","doc_uuid":"+RilNNDdLOvIKPdTtGYJt7JNi98="},"url":"https://www.scribd.com/book/231689346/The-Blazing-World-A-Novel"},{"type":"book","id":224252178,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/224252178/108x144/68dbc1000d/1537391527?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/224252178/216x288/57a65a5750/1537391527?v=1","title":"Brooklyn: A Novel","short_title":"Brooklyn","author":"Colm Toibin","tracking":{"object_type":"document","object_id":224252178,"track":"flattened_recommender","doc_uuid":"7VMlq9JZ7KAoSeQgl1MgfzA60Qg="},"url":"https://www.scribd.com/book/224252178/Brooklyn-A-Novel"},{"type":"book","id":224285255,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/224285255/108x144/144bc668f6/1537385513?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/224285255/216x288/9dbee53a6c/1537385513?v=1","title":"The Flamethrowers: A Novel","short_title":"The Flamethrowers","author":"Rachel Kushner","tracking":{"object_type":"document","object_id":224285255,"track":"flattened_recommender","doc_uuid":"d7AsUhc+WJQlXX6JaTwu6gU7PZI="},"url":"https://www.scribd.com/book/224285255/The-Flamethrowers-A-Novel"},{"type":"book","id":235411767,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/235411767/108x144/b2ad7aa7d5/1537392923?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/235411767/216x288/1740216c8c/1537392923?v=1","title":"A Man Called Ove: A Novel","short_title":"A Man Called Ove","author":"Fredrik Backman","tracking":{"object_type":"document","object_id":235411767,"track":"flattened_recommender","doc_uuid":"wOU887uQNXAKiaqkcgGW5a8pYjk="},"url":"https://www.scribd.com/book/235411767/A-Man-Called-Ove-A-Novel"},{"type":"book","id":163580087,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/163580087/108x144/865888b820/1537397087?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/163580087/216x288/a50ec4d378/1537397087?v=1","title":"Bel Canto","short_title":"Bel Canto","author":"Ann Patchett","tracking":{"object_type":"document","object_id":163580087,"track":"flattened_recommender","doc_uuid":"Zq6ByP20TOaHRlZFcaVzftJOvWM="},"url":"https://www.scribd.com/book/163580087/Bel-Canto"},{"type":"book","id":224270540,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/224270540/108x144/f484685ce1/1537404485?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/224270540/216x288/f0d4e09ce0/1537404485?v=1","title":"The Master","short_title":"The Master","author":"Colm Toibin","tracking":{"object_type":"document","object_id":224270540,"track":"flattened_recommender","doc_uuid":"VoQGdg/VzEY8LA2wFe1H0Osb0Bo="},"url":"https://www.scribd.com/book/224270540/The-Master"},{"type":"book","id":249308236,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/249308236/108x144/0b356a7d6a/1537389969?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/249308236/216x288/cbef455d67/1537389969?v=1","title":"Interpreter of Maladies","short_title":"Interpreter of Maladies","author":"Jhumpa Lahiri","tracking":{"object_type":"document","object_id":249308236,"track":"flattened_recommender","doc_uuid":"u/yw2+trGzwE/fmf/eOi3YEG6VU="},"url":"https://www.scribd.com/book/249308236/Interpreter-of-Maladies"},{"type":"book","id":163564256,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/163564256/108x144/19b813ddea/1537389207?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/163564256/216x288/50918b57c9/1537389207?v=1","title":"Beautiful Ruins: A Novel","short_title":"Beautiful Ruins","author":"Jess Walter","tracking":{"object_type":"document","object_id":163564256,"track":"flattened_recommender","doc_uuid":"B0/Zb0SatSLdN3oYnWr35L+kDHI="},"url":"https://www.scribd.com/book/163564256/Beautiful-Ruins-A-Novel"},{"type":"book","id":224248520,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/224248520/108x144/57b8f15c1c/1537401360?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/224248520/216x288/2fc602273a/1537401360?v=1","title":"The Kitchen House: A Novel","short_title":"The Kitchen House","author":"Kathleen Grissom","tracking":{"object_type":"document","object_id":224248520,"track":"flattened_recommender","doc_uuid":"VSryR8aJm8mwUvo60w8JgDr1q90="},"url":"https://www.scribd.com/book/224248520/The-Kitchen-House-A-Novel"},{"type":"book","id":163579056,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/163579056/108x144/b0cc4a522d/1537395400?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/163579056/216x288/cc1bed9752/1537395400?v=1","title":"The Art of Racing in the Rain: A Novel","short_title":"The Art of Racing in the Rain","author":"Garth Stein","tracking":{"object_type":"document","object_id":163579056,"track":"flattened_recommender","doc_uuid":"lcJtMnAT3c7sIe5Rmn1e0QdaPVk="},"url":"https://www.scribd.com/book/163579056/The-Art-of-Racing-in-the-Rain-A-Novel"},{"type":"book","id":182560283,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/182560283/108x144/229169a793/1537393351?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/182560283/216x288/fc0b9ebffa/1537393351?v=1","title":"Wolf Hall: A Novel","short_title":"Wolf Hall","author":"Hilary Mantel","tracking":{"object_type":"document","object_id":182560283,"track":"flattened_recommender","doc_uuid":"6vEPL+piF/L///oOe3DBEKL87J4="},"url":"https://www.scribd.com/book/182560283/Wolf-Hall-A-Novel"},{"type":"book","id":246897514,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/246897514/108x144/60f21686b1/1537402140?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/246897514/216x288/4b640ccfe4/1537402140?v=1","title":"The Wallcreeper","short_title":"The Wallcreeper","author":"Nell Zink","tracking":{"object_type":"document","object_id":246897514,"track":"flattened_recommender","doc_uuid":"lmwSK40PwdEjJqLxlFvpE083L5Y="},"url":"https://www.scribd.com/book/246897514/The-Wallcreeper"},{"type":"book","id":163603389,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/163603389/108x144/9281c90791/1537401342?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/163603389/216x288/a0de7e7dea/1537401342?v=1","title":"A Prayer for Owen Meany: A Novel","short_title":"A Prayer for Owen Meany","author":"John Irving","tracking":{"object_type":"document","object_id":163603389,"track":"flattened_recommender","doc_uuid":"WtcMP/W5juNF8Kw0AXHkEMJ5AIM="},"url":"https://www.scribd.com/book/163603389/A-Prayer-for-Owen-Meany-A-Novel"},{"type":"book","id":163647832,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/163647832/108x144/9f4ce0c73a/1537387861?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/163647832/216x288/c8974e0a45/1537387861?v=1","title":"The Cider House Rules","short_title":"The Cider House Rules","author":"John Irving","tracking":{"object_type":"document","object_id":163647832,"track":"flattened_recommender","doc_uuid":"AbJu0kY+aQh+5+3j0fMxECf1stw="},"url":"https://www.scribd.com/book/163647832/The-Cider-House-Rules"},{"type":"book","id":224266633,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/224266633/108x144/d0de7b5bf4/1537405002?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/224266633/216x288/a40600a76d/1537405002?v=1","title":"The Perks of Being a Wallflower","short_title":"The Perks of Being a Wallflower","author":"Stephen Chbosky","tracking":{"object_type":"document","object_id":224266633,"track":"flattened_recommender","doc_uuid":"R6vmmSD5jEZlkv8YnMgUdD3OzHY="},"url":"https://www.scribd.com/book/224266633/The-Perks-of-Being-a-Wallflower"},{"type":"book","id":182522032,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/182522032/108x144/671b9a055b/1537389359?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/182522032/216x288/ec6eb5c88b/1537389359?v=1","title":"The Bonfire of the Vanities: A Novel","short_title":"The Bonfire of the Vanities","author":"Tom Wolfe","tracking":{"object_type":"document","object_id":182522032,"track":"flattened_recommender","doc_uuid":"9HM4fTcUmrs9UJdJQFt3NomI4lA="},"url":"https://www.scribd.com/book/182522032/The-Bonfire-of-the-Vanities-A-Novel"},{"type":"book","id":216442529,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/216442529/108x144/7945e537de/1537389496?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/216442529/216x288/95db88293e/1537389496?v=1","title":"Lovers at the Chameleon Club, Paris 1932: A Novel","short_title":"Lovers at the Chameleon Club, Paris 1932","author":"Francine Prose","tracking":{"object_type":"document","object_id":216442529,"track":"flattened_recommender","doc_uuid":"OhrZP1kmW1ba4xt7JxB3oLRZgrk="},"url":"https://www.scribd.com/book/216442529/Lovers-at-the-Chameleon-Club-Paris-1932-A-Novel"},{"type":"book","id":231689506,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/231689506/108x144/640ee9da4e/1537401608?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/231689506/216x288/ce52320e76/1537401608?v=1","title":"Little Bee: A Novel","short_title":"Little Bee","author":"Chris Cleave","tracking":{"object_type":"document","object_id":231689506,"track":"flattened_recommender","doc_uuid":"5zwZl50WLguzZmTlAGy9RTsUUrI="},"url":"https://www.scribd.com/book/231689506/Little-Bee-A-Novel"}],"title_link":null,"title":null,"track_opts":{"compilation_id":"xz+RZDzjycYuxggy2q5jqt0l6nI=","module_id":"EV3wFKIiS09yUGxzlSbdfbGg52Y=","widget_name":"right sidebar","track_id":"flattened_recommender"}},"footer_recommenders":{"recommenders":[{"item_props":[{"type":"document","id":41226990,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/41226990/108x144/28f8fb982f/1399876507?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/41226990/216x288/76e6a7510f/1399876507?v=1","title":"Mini-projet-n°2-DAIGL-STS21","short_title":"Mini-projet-n°2-DAIGL-STS21","author":"jamaifox","tracking":{"object_type":"document","object_id":41226990,"track":"similar_to","doc_uuid":"Q54KXMllzBaK0AgV8AFyvp6+5vk="},"url":"https://www.scribd.com/document/41226990/Mini-projet-n-2-DAIGL-STS21"},{"type":"document","id":210252933,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/210252933/108x144/2ea3ec7329/1445271602?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/210252933/216x288/aa08303786/1445271602?v=1","title":"C_sur_dsPIC","short_title":"C_sur_dsPIC","author":"Ayoub Ayay","tracking":{"object_type":"document","object_id":210252933,"track":"similar_to","doc_uuid":"qenP68z0UpSnymKOB2EckBySKW4="},"url":"https://www.scribd.com/document/210252933/C-sur-dsPIC"},{"type":"document","id":74517816,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/74517816/108x144/d9e35ad938/1322843856?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/74517816/216x288/99a423bb3e/1322843856?v=1","title":"InfoS2-TD2","short_title":"InfoS2-TD2","author":"Mohamed Hmem","tracking":{"object_type":"document","object_id":74517816,"track":"similar_to","doc_uuid":"d+Bo2+LEygzK1g0WaBBtOeTxVC4="},"url":"https://www.scribd.com/document/74517816/InfoS2-TD2"},{"type":"document","id":228487448,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/228487448/108x144/8df7cc0d64/1402084381?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/228487448/216x288/41e14a6094/1402084381?v=1","title":"Rapport 1","short_title":"Rapport 1","author":"Imad Belmoujahid","tracking":{"object_type":"document","object_id":228487448,"track":"similar_to","doc_uuid":"HMqfOVrzALw5x18zgOe0H3rG3fw="},"url":"https://www.scribd.com/document/228487448/Rapport-1"},{"type":"document","id":368468943,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/368468943/108x144/61ae795267/1515150055?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/368468943/216x288/c310ae70f2/1515150055?v=1","title":"08 09 Poly Langage c","short_title":"08 09 Poly Langage c","author":"isambensalah","tracking":{"object_type":"document","object_id":368468943,"track":"similar_to","doc_uuid":"uWFSyyozzLFHLkFBiiZmQUQGPak="},"url":"https://www.scribd.com/document/368468943/08-09-Poly-Langage-c"},{"type":"document","id":230731654,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/230731654/108x144/bcc79fd6b8/1403380450?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/230731654/216x288/ca7cb39065/1403380450?v=1","title":"ex11","short_title":"ex11","author":"Harun Mouad","tracking":{"object_type":"document","object_id":230731654,"track":"similar_to","doc_uuid":"1uW7ELLZlvl8iWnuxQI64KEUHlg="},"url":"https://www.scribd.com/document/230731654/ex11"},{"type":"document","id":274729455,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/274729455/108x144/d8dfbf1035/1439740162?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/274729455/216x288/9157238479/1439740162?v=1","title":"introC","short_title":"introC","author":"Jad Sami","tracking":{"object_type":"document","object_id":274729455,"track":"similar_to","doc_uuid":"omDBD2lvZyxWGgc5fVC17dI+2c0="},"url":"https://www.scribd.com/presentation/274729455/introC"},{"type":"document","id":334536812,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/334536812/108x144/2085c5a01a/1482084868?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/334536812/216x288/d7fa42c89c/1482084868?v=1","title":"Cours C S3","short_title":"Cours C S3","author":"sadik","tracking":{"object_type":"document","object_id":334536812,"track":"similar_to","doc_uuid":"HcnODiEGryvF+TExB+jGwS5MMco="},"url":"https://www.scribd.com/document/334536812/Cours-C-S3"},{"type":"document","id":209324340,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/209324340/108x144/d774ca43b4/1393405042?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/209324340/216x288/1af1961575/1393405042?v=1","title":"Fon Ctions","short_title":"Fon Ctions","author":"Seydou Ali Tahirou","tracking":{"object_type":"document","object_id":209324340,"track":"similar_to","doc_uuid":"ihLhVZPIv6J/6wSDUhXtl3EwrvY="},"url":"https://www.scribd.com/document/209324340/Fon-Ctions"},{"type":"document","id":367778857,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/367778857/108x144/df27504744/1514034314?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/367778857/216x288/bc92ec11dc/1514034314?v=1","title":"Techniques Deprogram C","short_title":"Techniques Deprogram C","author":"Karim Benyoussef","tracking":{"object_type":"document","object_id":367778857,"track":"similar_to","doc_uuid":"U0GIB7nh+zIId0aJgZlUURmamLs="},"url":"https://www.scribd.com/presentation/367778857/Techniques-Deprogram-C"},{"type":"document","id":221253441,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/221253441/108x144/f0522ea550/1434524805?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/221253441/216x288/ed0e10e29a/1434524805?v=1","title":"Graf Cet","short_title":"Graf Cet","author":"فدوى غاني","tracking":{"object_type":"document","object_id":221253441,"track":"similar_to","doc_uuid":"dPPLc4q4hMCmiiHTo93k+UCU+I8="},"url":"https://www.scribd.com/document/221253441/Graf-Cet"},{"type":"document","id":291986356,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/291986356/108x144/57f7b7c45f/1449090833?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/291986356/216x288/793c3443ef/1449090833?v=1","title":"Chapitre 1 - Concepts de base du langage C++","short_title":"Chapitre 1 - Concepts de base du langage C++","author":"TchouarHamzaReda","tracking":{"object_type":"document","object_id":291986356,"track":"similar_to","doc_uuid":"LMRfbH8HdsxmfnwQaODh+hjHACs="},"url":"https://www.scribd.com/presentation/291986356/Chapitre-1-Concepts-de-base-du-langage-C"},{"type":"document","id":42658460,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/42658460/108x144/303950d512/1337689512?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/42658460/216x288/869417e87f/1337689512?v=1","title":"algorithmiques1","short_title":"algorithmiques1","author":"Mustapha Semmaa","tracking":{"object_type":"document","object_id":42658460,"track":"similar_to","doc_uuid":"XyZlIExp0i/VG4ySVZTG7t7zLQE="},"url":"https://www.scribd.com/document/42658460/algorithmiques1"},{"type":"document","id":309214691,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/309214691/108x144/d2e598b8ba/1460861779?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/309214691/216x288/1c4655a2df/1460861779?v=1","title":"Cours C Avancé V1","short_title":"Cours C Avancé V1","author":"AbdelkhalekBenOmar","tracking":{"object_type":"document","object_id":309214691,"track":"similar_to","doc_uuid":"fIqw79QZvX12W42nQdJua2kNjL4="},"url":"https://www.scribd.com/document/309214691/Cours-C-Avance-V1"},{"type":"document","id":193856067,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/193856067/108x144/4b4871e6b2/1400118029?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/193856067/216x288/ae7ff1e3e9/1400118029?v=1","title":"Diapos Langage Cmini PIC","short_title":"Diapos Langage Cmini PIC","author":"Salah Dahouathi","tracking":{"object_type":"document","object_id":193856067,"track":"similar_to","doc_uuid":"e+CINSZnREBF8iLzS/qm0zUuXXQ="},"url":"https://www.scribd.com/document/193856067/Diapos-Langage-Cmini-PIC"},{"type":"document","id":193505341,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/193505341/108x144/6e8be3f400/1427526493?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/193505341/216x288/0a8d117c00/1427526493?v=1","title":"Poly Copies Mas 3","short_title":"Poly Copies Mas 3","author":"jawad114","tracking":{"object_type":"document","object_id":193505341,"track":"similar_to","doc_uuid":"maxJyiB327vvmtWZp5vCPA477T8="},"url":"https://www.scribd.com/document/193505341/Poly-Copies-Mas-3"},{"type":"document","id":126554389,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/126554389/108x144/297058ed8b/1527284553?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/126554389/216x288/321a6fa592/1527284553?v=1","title":"Tp Chronometre","short_title":"Tp Chronometre","author":"Abderrazzak Riali","tracking":{"object_type":"document","object_id":126554389,"track":"similar_to","doc_uuid":"LLDybBNw8zyk91asg2chkqzoW6o="},"url":"https://www.scribd.com/document/126554389/Tp-Chronometre"},{"type":"document","id":137513457,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/137513457/108x144/e149a6a903/1433910399?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/137513457/216x288/8b9400f457/1433910399?v=1","title":"Algorithm e","short_title":"Algorithm e","author":"fstfes","tracking":{"object_type":"document","object_id":137513457,"track":"similar_to","doc_uuid":"Ctef21mX8DWZ7uiHZ6U/UqOQrLI="},"url":"https://www.scribd.com/document/137513457/Algorithm-e"},{"type":"document","id":228806435,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/228806435/108x144/91483a2335/1402330043?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/228806435/216x288/a5fbc1b612/1402330043?v=1","title":"unx3","short_title":"unx3","author":"Salma Brb","tracking":{"object_type":"document","object_id":228806435,"track":"similar_to","doc_uuid":"7PUDw2dR1xfboOk89r5NZ7W0eqg="},"url":"https://www.scribd.com/document/228806435/unx3"},{"type":"document","id":353683272,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/353683272/108x144/330d5f189c/1499959264?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/353683272/216x288/c6ed392aa0/1499959264?v=1","title":"Cours GTK 9","short_title":"Cours GTK 9","author":"Mohamadou Ndjidda","tracking":{"object_type":"document","object_id":353683272,"track":"similar_to","doc_uuid":"fYRkix0O2g7LiiFYxSaoAWAqFMM="},"url":"https://www.scribd.com/document/353683272/Cours-GTK-9"},{"type":"document","id":38267725,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/38267725/108x144/9c5032f471/1351113440?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/38267725/216x288/fa29793d52/1351113440?v=1","title":"polycpp","short_title":"polycpp","author":"Ayoub Affani","tracking":{"object_type":"document","object_id":38267725,"track":"similar_to","doc_uuid":"pTC5Ud7IS7wzY3uiwvZp/gsp2Cs="},"url":"https://www.scribd.com/document/38267725/polycpp"},{"type":"document","id":341396401,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/341396401/108x144/695f0fa346/1489073828?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/341396401/216x288/7667b20081/1489073828?v=1","title":"Initiation Au Langage C Sur PIC Correction","short_title":"Initiation Au Langage C Sur PIC Correction","author":"Bounegab Youcef","tracking":{"object_type":"document","object_id":341396401,"track":"similar_to","doc_uuid":"fNRvsyS8ZKuhnRr47yqdfzv60HQ="},"url":"https://www.scribd.com/document/341396401/Initiation-Au-Langage-C-Sur-PIC-Correction"},{"type":"document","id":212634023,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/212634023/108x144/15c522acdf/1394921445?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/212634023/216x288/d2739b504f/1394921445?v=1","title":"cours_c","short_title":"cours_c","author":"Mohamed Meski","tracking":{"object_type":"document","object_id":212634023,"track":"similar_to","doc_uuid":"5gmaVriNXgKnJsbV9Xz5Zcr1FoI="},"url":"https://www.scribd.com/document/212634023/cours-c"},{"type":"document","id":47181622,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/47181622/108x144/b88ce15804/1368020094?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/47181622/216x288/05eb37b978/1368020094?v=1","title":"c++","short_title":"c++","author":"Btihal Souani","tracking":{"object_type":"document","object_id":47181622,"track":"similar_to","doc_uuid":"6zA3nEUr2TFrnE/QU9pu/wf5Glc="},"url":"https://www.scribd.com/doc/47181622/c"},{"type":"document","id":373003221,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/373003221/108x144/64b5b65fe9/1520252734?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/373003221/216x288/4cdc8d6b75/1520252734?v=1","title":"AideMemoireC.pdf","short_title":"AideMemoireC.pdf","author":"Omar Oubaha","tracking":{"object_type":"document","object_id":373003221,"track":"similar_to","doc_uuid":"XzenL6U37nJDmULyZDpOU1wpdJA="},"url":"https://www.scribd.com/document/373003221/AideMemoireC-pdf"},{"type":"document","id":193870935,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/193870935/108x144/bce3f6c15a/1400118073?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/193870935/216x288/7bf3ea3c82/1400118073?v=1","title":"Trucs Et Astuces","short_title":"Trucs Et Astuces","author":"Salah Dahouathi","tracking":{"object_type":"document","object_id":193870935,"track":"similar_to","doc_uuid":"BNEmQLWexZ4lzmxIR18RNqV52f8="},"url":"https://www.scribd.com/document/193870935/Trucs-Et-Astuces"},{"type":"document","id":69308015,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/69308015/108x144/c55eda3c3d/1352240806?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/69308015/216x288/a1dce28e10/1352240806?v=1","title":"cours_C","short_title":"cours_C","author":"Gzouni Abeda","tracking":{"object_type":"document","object_id":69308015,"track":"similar_to","doc_uuid":"SkhZuAIZQuPgi+D67kQv9mSs3nI="},"url":"https://www.scribd.com/document/69308015/cours-C"},{"type":"document","id":331521760,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/331521760/108x144/28821bf102/1479487750?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/331521760/216x288/658111bc3f/1479487750?v=1","title":"Resume c","short_title":"Resume c","author":"Tec Ens","tracking":{"object_type":"document","object_id":331521760,"track":"similar_to","doc_uuid":"l7m8rcdOrOv47siO/8rewqZr+uQ="},"url":"https://www.scribd.com/document/331521760/Resume-c"},{"type":"document","id":93241062,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/93241062/108x144/4873a5c219/1377511984?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/93241062/216x288/7aabbc78c9/1377511984?v=1","title":"Cours VB","short_title":"Cours VB","author":"erraha5052","tracking":{"object_type":"document","object_id":93241062,"track":"similar_to","doc_uuid":"gnRTU80hJ/cM54reOp8WxcOihCA="},"url":"https://www.scribd.com/presentation/93241062/Cours-VB"},{"type":"document","id":346659479,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/346659479/108x144/bf75c555ed/1493387308?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/346659479/216x288/d24858fb52/1493387308?v=1","title":"Langage C Pour Micro v1.0","short_title":"Langage C Pour Micro v1.0","author":"sevemasse","tracking":{"object_type":"document","object_id":346659479,"track":"similar_to","doc_uuid":"Ala/H9rPKGrC0zY6p7PektnPWuQ="},"url":"https://www.scribd.com/document/346659479/Langage-C-Pour-Micro-v1-0"}],"title_link":null,"title":"Documents Similar To 38625550-490DCADFd01","track_opts":{"compilation_id":"xz+RZDzjycYuxggy2q5jqt0l6nI=","module_id":"rL2cyuDMwxr3Mhj7Y3Yu8iohBqw=","widget_name":"document_carousel"}}]},"seo_new_docs_recommenders":{"recommenders":[]}},"seo_roadblock_props_path":"/doc-page/seo-roadblock-props/55210300","signup_context":null,"toolbar":{"search_path":"/search-4gen?allowed_pages=1%2C2%2C3%2C49%2C50%2C51&auth_token=FYLYy0Mad7Sz%2FDw7fcjTVDEbp9k%3D&authenticity_token=SyjC4oo%2B7vgewkAkHGrlZaCUTk4mOPjdbeeBGZ%2FhJhC5LiZgWzBnevg64w9E5NVgvUlZE5mRxdoEeWZcoJ%2BMAQ%3D%3D&expires=1538013164&wordDocumentId=55210300&wordUploadId=58049260"},"renewal_nag_props":null}-->