programtion c

126
I.U.T. de Marne-La-Vallée Introduction à l'informatique et programmation en langage C (DUT Génie Thermique et Energie) Jean Fruitet [email protected] 1999

Upload: anas-addi

Post on 16-Dec-2015

218 views

Category:

Documents


4 download

DESCRIPTION

language c

TRANSCRIPT

  • I.U.T. de Marne-La-Valle

    Introduction l'informatiqueet programmation en langage C

    (DUT Gnie Thermique et Energie)

    Jean Fruitet

    [email protected]

    1999

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 2

    I.U.T. de Marne-La-Valle

    Introduction l'informatique

    et programmation en langage C(DUT Gnie Thermique et Energie)

    Jean Fruitet

    [email protected]

    Avertissement 3

    Caractrisation dun problme informatique 3

    Introduction linformatique 5

    Le codage binaire 7

    Notion dalgorithme et de machine accs direct 14

    Langage C 19

    Processus itratifs 43

    Fonctions et sous-programmes 44

    Notion de complexit 48

    Des donnes aux structures de donnes : tableaux, calcul matriciel 50

    Calcul numrique : fonctions numriques, rsolution d'quation, intgration61

    Structures de donnes : ensembles, listes, piles, files, hachage, arbres, graphes76

    Algorithmes de tri 112

    Bibliographie 123

    Table des matires 122

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 3

    Avertissement

    Ce cours sadresse aux tudiants de premire anne de DUT de Gnie Thermique et Energie(GTE). Il leur est prsent en quelques dizaines dheures une trentaine les rudiments de laprogrammation numrique et des notions dalgorithmique. Ces tudiants n'tant pas destins unecarrire dinformaticien professionnel, je naborde pas lalgorithmique dans tous ses raffinements. Enparticulier les notions pourtant fondamentales de preuve de programme et danalyse de complexitne sont pas voques.

    Ce cours est divis en quatre parties :

    - notion d'informatique et de codage ;

    - structure d'un ordinateur : la machine accs direct (MAD / RAM) ;

    - langage de programmation : le langage C ;

    - algorithmique numrique et structures de donnes.

    Aprs quelques notions de thorie de l'information et de codage (codage binaire, reprsentationdes entiers et des flottants) j'introduis la programmation de fonctions numriques sur ordinateur PCsous MS-DOS puis l'utilisation de quelques structures de donnes fondamentales (tableaux, piles,files, arbres, graphes) et les principaux algorithmes de tri. Ce cours ne fait donc aucune place latechnologie des ordinateurs, leur architecture, systme d'exploitation et de fichiers. Il n'est pas nonplus question d'apprentissage de logiciels bureautiques (traitement de texte ou de tableur). Ce n'estpas que ces connaissances ne soient pas ncessaires aux techniciens, mais je laisse d'autresenseignants le soin d'y contribuer.

    Sagissant de la syntaxe dun langage de programmation, jintroduis le langage RAM, pour passerrapidement au langage C. J'insiste beaucoup dans ce cours sur la ncessit d'une programmationstructure descendante. Cette dmarche est recommande depuis des lustres par tous les spcialistes.Malheureusement l'exprience montre que livr lui-mme le programmeur moyen se permet desliberts qui rendent rapidement ses programmes illisibles et inutilisables. Mais ce ne sera pas fauted'avoir t prvenu...

    Caractrisation dun problme informatique

    L'art de programmer, c'est l'art de faire rsoudre des problmes par des machines. Il sagit biendun art, au sens de lartisan, qui passe par une longue priode dapprentissage et dimitation. Danscet exercice certains individus ont des dispositions naturelles ; pour les autres un apprentissagerigoureux fournit les rudiments dune mthode. Le reste est affaire de travail et dinvestissementpersonnels.

    Un ordinateur est dnu dintelligence ; il ne peut donc rsoudre que les problmes pour lesquelsexiste une mthode de rsolution algorithmique, cest--dire une recette dterministe. De plus, mmesi la recette existe en thorie pour rsoudre tel problme, encore faut-il que lnonc du problme lespace des paramtres et lensemble des solutions soient de dimension finie, en raison de lalimitation en taille de la mmoire des machines. Enfin, condition ultime, la mise en oeuvre dunalgorithme doit avoir une dure finie. Un problme dont la solution ncessite de disposer dun tempsinfini nest pas considr comme rsoluble par ordinateur. Ces trivialits vont donc limiter nosambitions de programmeur une classe de problmes assez restreinte, dautant que ne nousdisposons pas de puissantes machines de calcul.

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 4

    2.1. Le traitement de linformation

    Linformatique est la science du traitement de linformation. Une information est un lment deconnaissance susceptible dtre cod, transmis et trait de manire automatique. Le codagenumrique en nombres binaires tant adapt la conception de machines lectroniques, une partieessentielle du cours dinformatique porte sur la reprsentation des nombres et la logique (algbre deBoole) binaires. Je considrerai comme acquises les notions dopration lmentaire (addition,soustraction, multiplication et division relle et euclidienne) sur les ensembles de nombres naturels,relatifs, rationnels, rels et complexes, qui ne seront pas redfinies, non plus que les oprationsensemblistes union, intersection, complmentation, ni les notions de relation binaire, relationdquivalence et relation dordre partiel ou total. Concernant les notions de constante numrique, devariable, dinstruction daffectation, de test, de boucle, qui sont au centre des techniques deprogrammation, elles seront redfinies ou prcises selon les besoins.

    2.2. Quelques exemples de problmes

    Lordinateur fonctionne en binaire, mais il peut rsoudre des problmes autres quenumriques. Et bien que le calculateur lectronique soit linstrument privilgi de lingnieur, cenest pas en programmant des problmes numriques quon apprend le plus efficacement programmer. Pourtant il est de tradition dans les sections techniques et scientifiques de commencerpar des exercices numriques :

    - Rsoudre une quation du second degr coefficients rels dans le corps de nombrescomplexes.

    - Programmer la division euclidienne de deux entiers en nemployant que des soustractions.

    - Trouver le plus grand diviseur commun de deux nombres naturels (PGDC).

    - Enumrer les n premiers nombres premiers.

    - Tester la conjecture polonaise.

    - Calculer le nime lment de la suite de Fibonacci.

    - Calculer le minimum, le maximum, la moyenne et lcart-type dune distribution numrique.

    - Calculer les zros dun polynome, tracer graphiquement le graphe d'une fonction numrique

    - inverser une matrice.

    Dautres problmes qui ne sont pas strictement numriques sont pourtant tout aussi instructifspour lart de la programmation. Ils seront soit traits soit voqus :

    - Trouver un mot dans un dictionnaire.

    - Construire un arbre hirarchique

    - Ordonner une liste de mots.

    - Fusionner deux listes de mots dj ordonns.

    - Enumrer les parcours dun graphe et trouver le plus court chemin entre deux sommets.

    - Filtrer une image, etc.

    Dmarche

    Partant dun problme lmentaire nous montrerons comment le reformuler en des termessusceptibles dtre traits par un ordinateur idal. Puis nous coderons ces algorithmes en langage C.Nous encourageons le lecteur implanter ses propres solutions, les modifier, ventuellement lesamliorer ou les rutiliser pour dautres applications.

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 5

    Tous les exemples fournis en C ont t tests sur compilateur Turbo C sur PC et Think C surMacintosh. Je remercie par avance celles et ceux qui voudront bien me transmettre remarques etsuggestions.

    Introduction linformatique

    L'Informatique est la science du traitement automatique de l'information.

    La notion d'information est assez gnrale. Pour l'informatique elle prend un sens particulier : Uneinformation est un lment ou un systme de connaissance pouvant tre transmis au moyen d'unsupport et d'un codage appropri et pouvant tre compris.

    Par exemple des hiroglyphes (codage) sur un papyrus gyptien (support) constituent uneinformation sur la socit gyptienne antique ds qu'on a t en mesure de les lire et d'en comprendrele sens (Champollion au XIXme sicle).

    Une information est une fonction du temps, puisque le contenu d'un message est sujet changerau cours du temps. L'information "La mer est 'calme' dans le Golfe de Gascogne" estparticulirement prissable... Quand le vent se lve et que la houle se forme, la mer devient 'agite'.L'tat de la mer est une information qui peut prendre des valeurs diffrentes, au cours du temps.

    Langage

    La plupart des informations que les Humains changent sont supportes par un langage, c'est--dire des groupes de sons (les mots), qu'il faut assembler "d'une certaine manire" (grammaire) pourque les phrases aient un sens... Avec l'invention de l'criture, ces mots ont eu une transcription(recodage) sous forme de symboles graphiques (des formes) dessins ou imprims.

    Le concept de mot est fondamental en informatique, de mme que celui de langage. Un langageest un ensemble de mots construits avec les lettres choisies dans un alphabet. Les mots sontassembls en phrases selon des rgles de grammaire prcises qui dfinissent la syntaxe du langage.Le sens attach ces phrases, c'est--dire leur signification, constitue la smantique.

    L'essentiel de ce cours va consister expliquer comment sont commandes les machines que nousnommons ordinateurs, capables d'excuter des tches complexes de traitement de l'information.

    Traitement de l'information

    Le traitement de l'information consiste en une suite d'oprations transformant une reprsentationde cette information en une autre reprsentation plus facile manipuler ou interprter.

    Exemples :

    "3*2" remplac par "6"

    "Mille neuf cent quatre vingt treize" est remplac par "1993"

    "La somme des carrs des cts de l'angle droit d'un triangle rectangle est gale au carr del'hypotnuse" est remplac par "Thorme de Pythagore"

    "Championne olympique 1992 et 1996 du 400 mtres fminin" est remplac par "Marie-JosPrec".

    Dans une entreprise, traiter l'information peut consister tablir la paye, faire la facturation, grerle stock, dresser un bilan. Dans un atelier, diriger un robot. En mtorologie, reconnatre un cyclonesur une photo satellite...

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 6

    Ordinateur

    Un ordinateur est une machine qui permet d'effectuer des traitements sur des donnes l'aide deprogrammes. Les donnes (les paramtres du problme, par exemple les notes des tudiants du coursd'informatique) ainsi que le programme (par exemple le calcul de la moyenne des notes) sont fournis la machine par l'utilisateur au moyen de dispositifs de saisie (le clavier). Le rsultat du traitementest recueilli la sortie de l'ordinateur (l'cran, limprimante) sous forme de texte.

    Un peu d'histoire

    C'est en 1945 que le principe des ordinateurs a t invent. Mais on peut faire remonter sesorigines au boulier et aux premires machines calculer mcaniques. Blaise Pascal (1623-1662)inventa l'ge de 18 ans une machine base de roues dentes et d'engrenages qui ralise d'elle-mmeles additions et les soustractions. Il suffit d'indiquer les chiffres et l'opration faire.

    Au XIXme sicle l'anglais Babbage conoit deux grandes machines dont le principe tait correct,mais qui ne purent tre ralises en raison de difficults techniques et financires. Il tait sans doutetrop tt. Ce n'est qu'au XXme sicle que sous la pression du dveloppement conomique et desbesoins militaires (Deuxime guerre mondiale) des scientifiques et des ingnieurs s'attelrent laconstruction de gigantesques machines calculer. La plus fameuse de ces machines fut la "HarvardMark 1" qui mesurait 16 mtres de long, pesait 5 tonnes et comprenait 800 000 lments, etpourtant n'avait pas plus de puissance qu'une simple calculette de poche actuelle !

    La vritable rvolution pour les machines calculer viendra des progrs de l'lectronique et de lalogique mathmatique. Le premier calculateur lectronique, l'ENIAC, destin calculer la trajectoirede projectiles pour l'arme amricaine, fut construit partir de 1943. Il pesait 30 tonnes, comportait17 468 tubes vide et additionnait 5000 nombres en une seconde. Mais on ne peut considrer cettemachine comme un ordinateur, car il n'tait pas vritablement automatique et n'utilisait pas deprogramme interne.1

    Sur le plan technique les progrs dcisifs seront raliss dans les annes 1950 avec l'invention en1947 du transistor (qui donne son nom aux postes de radio portables). Les transistors sont descomposants lectroniques qui remplace partout les lampes vides ; rassembls par dizaines puiscentaines de milliers sur des circuits intgrs ils permettent de raliser des puces lectroniques quienvahissent les automates (lave linge, magntoscopes, circuits d'allumage de voiture, calculettes...)et les ordinateurs.

    Sur le plan conceptuel, c'est aux anglais George Boole (1815-1864), inventeur de l'algbrebinaire, l'algbre de la logique, et Alan Turing (1912-1954) et aux amricains d'origine europenneJohn Von Neumann (1903-1957) et Norbert Wiener (1894-164) que nous devons l'avance dcisivequi mne des calculateurs aux ordinateurs. Leurs travaux aboutissent la construction du premierordinateur en 1948 Manchester, en Grande-Bretagne, le "Manchester Mark 1".

    Ce qui caractrise un ordinateur

    La machine conue par John Von Neumann comporte trois innovations majeures :

    - elle a une mmoire importante, dans laquelle sont archives les donnes et le programme.

    - elle a un programme enregistr dans la mmoire, qui dcrit l'ensemble des instructions raliser.

    1 Philippe BRETON "Une histoire de l'Informatique" - Collection Points Sciences - Editions La Dcouverte, Le Seuil1990.

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 7

    - elle a une unit centrale de commande interne qui organise le travail en appliquant lesinstructions du programme et dirige les changes de donnes avec l'extrieur de la machine.

    Matriel et logiciel

    Un ordinateur est constitu de composants matriels (hardware ) et de composants logiciels(software ). Les composants matriels sont essentiellement des cartes lectroniques, des circuitsintgrs, des cbles lectriques, des supports de mmoires de masse (disques durs) et des dispositifsd'entre/sortie (priphriques : clavier, cran, imprimante). Les logiciels, qui pilotent lefonctionnement des composant matriels, sont des programmes stocks sous forme code dans lammoire de l'ordinateur. Pour tre interprts par l'unit centrale ces programmes doivent tretraduits dans le langage des machines, le langage binaire.

    Le codage binaire

    Toute l'information qui transite dans un ordinateur est code avec des mots forms seulement dedeux symboles (ou de deux 'tats') nots 0 et 1. Cela tient la nature des composants lectriques etmagntiques utiliss pour coder l'information.

    Dans les mmoires d'ordinateur, chaque unit lmentaire d'information peut tre reprsente parun minuscule aimant. Chaque aimant est orient soit dans un sens (tat 0), soit dans le sens oppos(tat 1)...

    C'est le mme principe qui est appliqu aux changes de donnes. Pour transmettre un 1, il fautappliquer sur un conducteur lectrique une diffrence de potentiel suprieure quelques voltspendant une priode "assez" longue, de l'ordre de la micro seconde (1/1 000 000 me de seconde).Pour transmettre un 0, il faut maintenir une diffrence de potentiel infrieure 1 volt pendant lamme dure.

    Par exemple pour coder le nombre 13 en binaire, il faut les quatre chiffres binaires 1101. En effet13 peut tre dcompos comme une somme de puissances de 213 = 8 + 4 + 1

    = 1 * 8 + 1 * 4 + 0 * 2 + 1 * 1 en dcimal= 1 * 23 + 1 * 22 + 0 * 21 + 1 * 20on ne conserve que les coefficients= 1 1 0 1 en binaire

    Reprsentation des informations en binaire

    Pour coder de l'information , que ce soient des nombres, (PI=3,141592...), du texte (ce cours),des schmas, des images, des sons, des relations ("Pierre est le pre de Jacques et le frre deMarie"), les circuits lectroniques d'un ordinateur ne peuvent utiliser que des mots en binaire.

    Montrons d'abord comment il est possible de coder n'importe quel nombre entier naturel IN={0,1, 2, 3, ... ,1 000, ..., 1 000 000, ...} en binaire.

    Puis nous en ferons autant pour les lettres et les mots de la langue franaise. Enfin il faudramontrer que les images, les sons et les relations aussi peuvent se coder en binaire.

    Passer du dcimal au binaireIl suffit de dcomposer un nombre dcimal en une somme de puissances de 2. On peut par exemplecommencer par crire la table des premires puissances de 2 :20 = 1 21 = 2 22 = 2x2 = 4 23 = 2x2x2 = 824 = 25 = 2x...x2 = 26 = 27 =28 = 29 = 210 = 211 =

    Exercice 1 : Montrer que le nombre 256 est une puissance de 2.Exercice 2 : Montrer que le nombre 131 est une somme de puissances de 2

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 8

    Exercice 3 : Donner la reprsentation binaire des 10 premiers nombres entiers :0 = 0x20 -> 0; 1=1x20 -> 1 ; 2=1x21 -> 103 = 1x2 + 1x1 = 1x21 + 1x20 -> 114 = 1x4+ 0x2 + 0x1 = 1x22 + 0x21 + 0x20-> 1005 = 1x4 + 0x2 + 1x1 =6 =7 =8 =9 =10 =

    Passer du binaire au dcimal

    Le codage binaire a un inconvnient majeur pour l'tre humain, son manque de lisibilit...Quelle est la reprsentation dcimale du nombre dont la reprsentation binaire est : 1001 1110 ?Rponse : 1x27+ 0x26 + 0x25 +1x24 + 1x23 + 1x22 + 1x21 + 0x20

    = 1x128 + 0x64 + 0x32 +1x16 + 1x8 + 1x4 + 1x2 + 0x1= 158

    Exercice 4 : Mme question pour 1111 1111Exercice 5 : Combien de chiffres binaires faut-il pour reprsenter le nombre dcimal 10000 ?

    Oprations usuelles en binaireLes deux oprations binaires de base sont- l'addition- la multiplication

    Table d'addition binaire0 + 0 = 00 + 1 = 11 + 0 = 11 + 1 = 0 avec une retenue de 1

    Table de multiplication binaire0 x 0 = 00 x 1 = 01 x 0 = 01 x 1 = 1

    Exercice 6 :En utilisant la table d'addition binaire calculez en binaire les nombres suivants :

    1001 + 101001111 + 11010 + 1111111 1111 + 1111 1111

    Exercice 7 : En utilisant la table de multiplication et d'addition binaires calculez en binaire lesnombres suivants :

    1001 x 11111 x 10100 x 1011111 x 1111

    Oprations logiques

    En logique binaire une variable logique (boolenne) est VRAI (TRUE = 1) ou FAUSSE (FALSE= 0). Une expression logique est constitue de plusieurs variables logiques combines par desconnecteurs (oprateurs) logiques :

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 9

    Les oprateurs logiques lmentaires sont :- NON [NOT]- ET [AND]- OU [OR]- OU EXCLUSIF [XOR]

    Table de vrit du NONNON 0 = 1NON 1 = 0

    Table de vrit du OU0 OU 0 = 00 OU 1 = 11 OU 0 = 11 OU 1 = 1

    Table de vrit du ET0 ET 0 = 00 ET 1 = 01 ET 0 = 01 ET 1 = 1

    Table de vrit du OU EXCLUSIF [XOR]0 XOR 0 = 00 XOR 1 = 11 XOR 0 = 11 XOR 1 = 0

    Exercice 8 : Donner la valeur de vrit {VRAI ou FAUX} des assertions suivantes :A : 102 est un nombre pair B : 11 est un multiple de 3 C : 102 est un nombre pair ET 102 est divisible par 3 D : 11 est multiple de 3 ET 102 est divisible par 3 E : 108 est multiple de 9 OU 11 est divisible par 3

    Les nombres entiers et les nombres rels dcimaux

    L'ensemble des entiers naturels : IN = {0,1,2..,100,101,...1000,...}- IN est ordonn ; il a un plus petit lment 0 ;- Il n'y a pas de plus grand lment : tout lment a un successeur

    L'ensemble des entiers relatifs : Z = Z+ U Z-

    Z = {...,-1000,...,-100,..., -3,-2,-1, 0, 1,2..,100,101,...1000,...}- Z est ordonn- il n'y a ni plus grand ni plus petit lment : tout lment de Z a un prdcesseur et un successeur.

    Oprations sur les entiers

    Oprateurs unaires :- (moins) : oppossucc : successeurrenvoie le nombre suivant dans l'ordre des entierspred: prdcesseurrenvoie le nombre prcdentmaxint :renvoie le plus grand entier reprsent sur la machine

    Oprateurs binaires :+ - * DIV MOD /

    Oprateurs de comparaison := < >=

    Axiomes :associativit de + et *; distributivit de * sur +; relation d'ordre

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 10

    Implmentation des entiers non signs

    En raison des limitations d'espace mmoire, on ne peut reprsenter que des intervalles denombres.Deux difficults rsoudre : choix des intervalles et reprsentation des nombres ngatifsImplantation courante sur 2 octets:l'intervalle slectionn est [0..65535]Il s'agit de gnrer une reprsentation de ce nombre en base 2 occupant au plus deux octets, soit 16bits.

    Exemple pour n = 54710On dcompose 547 en puissances successives de 2 :

    54710= 512 + 32 + 2 + 1 = 1*29 +1*25 +1*21 +1*20

    et on ne code que les coefficients de la dcomposition, la reprsentation binaire de n estBin(n) = 0000 0010 0010 0011

    Le plus grand nombre entier non sign reprsentable est donc :1111 1111 1111 1111

    = 1*215 +1*214 +1*213 +1*211 +1*210 +1*29 +1*28+ 1*27 +1*26 +1*25 +1*24 +1*23 +1*22 +1*21 +1*20

    = 1*216 - 1 La reprsentation dcimale de ce nombre est doncDec(n) = 65 536 - 1 = 65 53510

    Implmentation des entiers signs

    L'intervalle slectionn est [-32768.. +32767]

    Soit un nombre n de Z. Il s'agit de gnrer une reprsentation de ce nombre en base 2 occupantau plus deux octets, soit 16 bits. Si le nombre est positif et infrieur 215 (32 768) on le reprsentecomme un entier non sign. Si le nombre est ngatif et suprieur -32768, le problme est dereprsenter le signe et de pouvoir passer d'un nombre son oppos de faon simple.Une mthode trs rpandue est la mthode du complment 2. On travaille MODULO 216

    On reprsente Bin(216 + n) = 65 536 - 547 = 64 989= 1111 1101 1101 1101

    Une vrification de l'expression calcule consiste effectuer une somme bit bit de 547 et de -547Si la reprsentation est correcte on doit trouver 0 :

    0000 0010 0010 0011+ 1111 1101 1101 1101_____________________________

    Report 0000 0000 0000 0000Le report (ou retenue) n'est bien sr pas reprsent.Donc un nombre entier sign reprsent sur 16 bits dont le bit de poids fort est 1 doit treconsidr comme un nombre NEGATIF : sa valeur est -(216 - Dec(n2))

    Algorithme de conversion d'un nombre en binaire complment 2 sur un octet :

    Trouver l'oppos d'un nombre en complment 2 :Soit n = 0000 0101 = 510

    Son oppos est -5 obtenu en inversant tous les 1 en 0 et tous les 0 en 1 et en ajoutant 1:0000 0101--> 1111 1010 + 1 = 1111 1011 = -5

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 11

    Vrification : 5 + (-5) = 0

    0000 0101+1111 1011------- --- 0000 0000 report ignor

    Exercice :Trouver les reprsentations binaires en complment deux sur deux octets des nombres suivants :

    -1; -2; 31000; -31000-33000 est-il reprsentable ?

    Les nombres rels.

    L'ensemble IR ne peut pas tre reprsent de faon complte en machine.

    On retrouve les mmes difficults pour reprsenter les rels que pour reprsenter les entiers :l'ordinateur n'a pas une mmoire infinie. On reprsente donc un sous-ensemble fini de IR. Touttraitement (opration, reprsentation) peut tre entache derreur. Un calcul mathmatique permetdestimer limportance de cette erreur.

    Oprations sur les rels :Opration unaire : - (oppos)Oprations binaires :+ - * / Comparaisons= < > =Fonctions relles :cos sin log puisssqrt Axiomes

    Corps ordonnx * (y + z)= x * y + x * z: distributivitOn retrouve certains axiomes des entiers plus ceux des rationnels (inverse)plus quelques caractristiques intressantes (densit)

    La notation scientifique normalise

    On appelle notation normalise d'un rel celle o le premier chiffre significatif est placimmdiatement aprs la virgule (ou le point dcimal).

    Exemple :1989 = 0.1989 E4

    Pour stocker ce nombre en mmoire, il suffit de stocker l'exposant 4 et la partie dcimale appelemantisse 1989

    Exemple : crire PI en notation normalise p = 3.1415926535... = 0.31415926535 E1

    Reprsentation des nombres rels en binaireTout nombre rel peut tre reprsent dans une base quelconque :

    a = M * B eavec B : base ; e : exposant ; M : mantisse (qui peut tre une suite infinie de chiffres...)

    En notation normalise on a les conditions :(1/B)

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 12

    les bits 1 8 sont la caractristique E qui est reprsente par un entier binaire sur 8 bits dcal dela valeur 127

    les bits 9 31 sont pour exprimer la mantisse F en binaire,Exemple : 0.8 sera cod :

    s=0 E=126 F. ........ .......................0 01111110 10011001100110011001100 codage binaire. ........ ........... ............0 1 8 9 31 n de bit

    Dcomposition d'un nombre rel dcimal en binaireSoit le nombre 0.8 convertir en binaire. On constate dabord que son signe est positif, donc

    S=0. On cherche ensuite le dcomposer en une somme de puissances de 2.

    0.8 = 20 x 0.80.8 x 2 = 1.6donc 0.8 = 1.6 / 2 = 2-1 x 1.6 = 2-1 x 1 + 2-1 x 0.60.6 x 2 = 1.2donc 0.8 = 2-1 x 1 + 2-2 x 1.20.2 x 2 = 0.4donc 0.8 = 2-1 x 1 + 2-2 x 1 + 2-3 x 0.40.4 x 2 = 0.8donc 0.8 = 2-1 x 1 + 2-2 x 1 + 2-3 x 0 + 2-4 x 0.80.8 x 2 = 1.6donc ... on retrouve une expression dj rencontre qui va se rpter infiniment

    0.8 = (-1)0 x 1. 10011001100110011.... x 2-1

    Finalement on ne code que les chiffres binaires de la dcomposition :signe = 0 car 0.8 est positifE = 126 car 126-127 = -1F = 10011001100110011....

    Exemple 2 : 0.75 en base 2 donnera0.75 x 2 = 1.5donc 0.75 = 2-1 x 1.50.5 x 2 = 1.0 donc 0.75 = 2-1 x 1 + 2-2 x 1.00.75 = (-1) x 2 126-127 x 1.10000000000000000000000Exercice : Montrer que le nombre dcimal 0.1 na pas de reprsentation finie en binaire.

    Rels en double prcision

    En augmentant le nombre d'octets attribus la reprsentation des rels, on amliore la prcisionen consacrant plus de bits la mantisse, mais on n'augmente pas l'intervalle des rels reprsents caron conserve le mme nombre de bits pour la caractristique.

    Les nombres rationnelsLa reprsentation des rels a de gros dfauts ds qu'il s'agit par exemple de comparer des nombresmanifestement gaux mais dont on ignore si l'ordinateur les identifiera.

    x = 0.000 020 et y = 0.000 019 999...;u = 20 ; v = 19 999...

    Comment est reprsentz = (x/y) et r = (u/v) ? Sont-ils perus comme gaux ?Il peut tre avantageux de dfinir directement un type de donnes NOMBRE RATIONNEL quireprsentera de faon exacte tous les nombres quivalents une fraction entire...

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 13

    Codage des informations non numriques

    Textes

    Les textes peuvent tre reprsents en binaire condition d'associer chaque lettre de l'alphabetune reprsentation numrique, par exemple son rang dans l'ordre alphabtique : A serait cod1 ; B,de rang 2 serait cod 10 en binaire; C cod 11, etc. Mais ce codage est insuffisant car il faut aussipouvoir coder les signes de ponctuation . , ; ? ! , distinguer les minuscules des MAJUSCULES, lescaractres accentus, etc.La table ASCII (American Standard Code for Interexchange Information) propose un codage de 128caractres diffrents sur 7 bits. Dans la table ASCII la lettreA est cod 65B est cod 66C estcod 67... Z est cod 90a est cod 97b est cod 98... 0 est cod 481 est cod 49... 9 estcod 57...Les caractres accentus des langues europennes ont ncessit l'ajout d'un huitime bit de codage,d'o la table ASCII tendue avec 256 caractres. Mais ce n'tait pas suffisant pour certaines languescomme le japonais ; un codage sur 16 bits est en cours de normalisation sous le nom d'UNICODE. Ilsupplantera dans l'avenir le code ASCII.

    Les images

    Le codage des images en noir et blanc ne prsente pasde difficult. Il suffit d'observer la loupe unephotographie de journal pour en comprendre le principe. Si une image est superpose une grille trs fine, chaquecarr de la grille color en NOIR par l'image est cod 1,chaque carr BLANC est cod 0. Il suffit donc de codertoute l'image sous forme dun tableau deux dimensions de0 et de 1.

    Image 12 lignes de 8 colonnes Recodage binaire 0001 1100 0011 1110 0110 1011 0011 1110 0011 1110 0001 1100 0000 1000 0001 1100 0111 1110 1111 1111 1111 1101 1111 1111

    Le codage des sons est plus compliqu. Il faut d'abord transformer chaque son en un signallectrique continu (c'est le rle du microphone), puis chantillonner ce signal lectrique (discrtiser)et le numriser. On dispose alors d'un srie de nombres qui reprsentent le signal sonore...

    Les relationsLe cours de bases de donnes (seconde anne GTE) introduit le modle entit/association qui permetde reprsenter les informations "Marie est la mre de Pierre et de Franoise" ; "Pierre et Franoiseont achet ensemble le vhicule Renault Clio 1234 ZA 75", "Marie a une Citron ZX" ; "la Twingo3987 TT 51 n'est personne", etc., sous forme de tables relationnelles.

    PERSONNE POSSEDE VEHICULENom Mre Propritaire Vhicule ImmatriculationMarque Modle

    Marie ? Pierre 1234 ZA 75 1234 ZA 75 Renault Clio

    Pierre Marie Franoise 1234 ZA 75 1001 AR 34 Citron ZX

    Franoise Marie Marie 1001 AR 34 3987 TT 51 Renault Twingo

    PERSONNE VEHICULE

    "est la mre de"

    "possde"

    n:m

    1:n

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 14

    Notion dalgorithme

    Un algorithme est un procd automatique qui transforme une information symbolique en uneautre information symbolique. Seuls les problmes qui sont susceptibles d'tre rsolus par unalgorithme sont accessibles aux ordinateurs.

    DONNEES ---- transformation ------> RESULTATEntre ----- algorithme ---------> Sortie

    Ce qui caractrise l'excution d'un algorithme, c'est la ralisation d'un nombre fini d'oprationslmentaires (instructions) ; chacune d'elles est ralisable en un temps fini. La quantit de donnesmanipules au cours du traitement est donc finie.

    La notion d'opration lmentaire dpend du degr de raffinement adopt pour la description duprocd. Ainsi, chaque algorithme peut tre considr comme une opration lmentaire dans unprocd plus important.Exemple dalgorithme : Factorisation de ax2+bx+c quand a0.Algorithme A :

    soient x1 et x2 les zros de ax2+bx+c ;

    alors ax2+bx+c = a (x-x1) (x-x2).Algorithme B

    soit D= b2-4ac;si D = 0 alors soient x1 et x2 gaux -b/2asinon si D > 0 alors soient x1=(-b+D)/2a et x2= (-b-D)/2asinon soient x1=(-b+i(-D))/2a et x2= (-b-i(-D))/2a;

    alors ax2+bx+c = a (x-x1) (x-x2).

    Traduction de lalgorithme dans un langage de programmation

    Avant de faire traiter la factorisation deax2+bx+c quand a 0 par un ordinateur, il fauttraduire cet algorithme dans le langage binairesusceptible dtre excut par la machine.Cette transformation est le travail duprogrammeur. Il dispose pour cela dunlangage de programmation dit de haut niveau,cest--dire quun tre humain peut apprendreet manipuler sans trop de difficults, et deprogrammes spcialiss, appels compilateurs,qui font la conversion dun fichier crit dans lelangage de haut niveau en code binaireexcutable par la machine cible. Une foiscompil, le programme (sil est correct) peuttre excut de multiples fois. Les rsultats deson excution (les sorties) dpendent desparamtres fournis en entre.

    Programme source

    Programme binaire

    COMPILATION

    EXECUTIONS

    Une factorisation de 3x +11x-4 est 3(x-1/3)(x+4)

    2

    ..

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 15

    Avant de passer la phase de programmation il est donc ncessaire de dfinir trs prcisment lecahier des charges du programme, cest--dire dans quelles conditions initiales il devra fonctionner,comment il devra procder (algorithme) et sous quelle forme seront prsents les rsultats.

    Types de donnes et structures de contrle

    Dans lexemple de la factorisation ci-dessus, les entits manipules sont des nombres (complexeset rels), des coefficient constants (a, b, c), une inconnue (x), des variables x1 et x2, le symbole Ddu discriminant et les oprations lmentaires sur lensemble des nombres rels (, =, +, -, *, /).On dira que les types de donnes sont des constantes et des variables de type rel. Lalgorithmeemploie aussi des structures de contrle conditionnelles : Si (condition) alors instruction sinoninstruction.. Un instruction est soit une affectation D= b2-4ac; , soit un test si D = 0 alors .Le langage de programmation devra fournir des quivalents de toutes ces entits. Enfin le langagedoit permettre de crer un programme qui reoive des paramtres saisie de la valeur descoefficients et retourne des rsultats lutilisateur affichage.

    Un langage de programmation graphique

    Traduisons dabord lalgorithme de factorisation dans un langage graphique lmentaire, bienadapt lexpression des algorithmes peu complexes.

    OUI

    NON

    ?

    instruction;

    initialisation;

    Structures de contrle

    test

    (Branchement)

    a,b,crels;

    OUINON

    a0;

    D=b*b-4*a*c;

    (D=0)

    NON

    (D>0)

    x1=(-b+D)/2*a; x2=(-b- D)/2*a;

    x1=(-b+i (- D))/2*a; x2=(-b-i (- D))/2*a;

    FIN DU PROGRAMME;

    x2=-b/2*a;

    x1=-b/2*a;

    Factorisation d'un polynme du second degr coefficients rels

    OUI

    Affichera (x-x1) (x-x2);

    Chaque bote peut contenir une ouplusieurs instructions excutessquentiellement, cest--dire succes-sivement dans lordre de lecture de hauten bas. Un test est une expression detype boolen, savoir prenant la valeurVRAI ou la valeur FAUX lors de sonvaluation. Enfin les branchements sontparcourus dans le sens des flches.

    Il suffit dexcuter chaque instruction la lettre, en suivant les flches dsignes la suite de chaque test pour rsoudre leproblme de factorisation. On constateque cette reprsentation fait lconomiedun test par rapport la rsolutionmathmatique.

    Cependant peu nombreux sont lesprogrammes capables dinterprterdirectement un langage graphique, aussifaut-il exprimer le programme dans unlangage littral.

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 16

    Modle d'ordinateur abstrait et langage de programmation

    Passons donc la traduction de lalgorithme dans un langage de programmation lmentaire, lelangage de la machine RAM (Random Acces Machine : Machine Accs Direct, voir le coursdalgorithmique).Les algorithmes sont crits pour une machine abstraite qui a les caractristiques d'une machine deVon Neumann. Elle comprend : - des organes d'entre et de sortie (interface avec l'utilisateur) ; - une mmoire unique pour le programme et les donnes ; - une unit centrale comportant notamment un compteur dinstruction, un processeur arithmtiqueet logique, des registres et des ttes de lecture et d'criture et un moyen d'accs la mmoire ; - un jeu d'instructions excutables par l'unit centrale.

    Organe d'entre

    Unit centrale

    Compteur

    U A L

    Mmoire

    Programme

    Donnes

    Organe de sortie

    Tte d'criture

    Tte de lecture

    La mmoire est une suite de cases dont les indices sont appels adresses. Une partie de lammoire contient le programme, traduction de l'algorithme au moyen des instructions de la machine.Le compteur dinstruction contient l'adresse de la prochaine instruction excuter. L'autre partie dela mmoire contient les donnes.

    Caractristiques :- l'unit centrale accde directement (en temps constant) une case mmoire partir de son adresse[random acces].- La mmoire est infinie (mais le programme est fini).- Chaque case mmoire contient une donne lmentaire de taille arbitraire. On peut ainsi ymmoriser des entiers arbitrairement grands.- Chaque instruction s'excute en temps constant.

    Variables et types

    Une case mmoire de la machine abstraite est aussi appele une variable. Dans les programmeson dsigne une variable par un identificateur littral plutt que par son adresse, et, par abus delangage, on dit "la variable x " plutt que "la variable d'identificateur x ". Le type d'une variabledfinit l'ensemble des valeurs qu'elle peut prendre du point de vue implantation en machine, le typedcide aussi de la taille de lespace mmoire occup par la donne.

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 17

    Types simples et types combins

    Les types simples sont- l'entier {....,-1 000 000,... -1 000,... -3,-2,-1, 0, 1, 2, 3, ..10, ..,100, .., 1 000, .....}- le boolen {VRAI, FAUX} [boolean {TRUE, FALSE}]- le caractre {'0','1','2',..,'9',..,'A','B',..,'Z',..,'a','b',...}- l'numr (Ex.: [violet,bleu,vert,jaune,rouge])- le 'rel' flottant (Ex.: valeur approche de PI0.3141592 E+1)

    A partir des types simples des oprateurs permettent de construire des types plus complexes :- couples d'entiers (rationnels)- couples de flottants (nombres complexes)- chanes de caractres (Ex.: "CECI EST UNE CHAINE DE CARACTERES")- tableaux (Ex.: les 8 premires puissances de 2 en base 10 : [1, 2, 4, 8, 16, 32, 64, 128])- ensembles (Ex.: ensemble de couples d'entiers :{ (0,1), (1,2), (2,4), (3,8), (4,16), (5,32), (6,64),(7,128)}- structures (Ex.: fiche de rpertoire : (Nom, Prnom, Date de naissance, Adresse, Tlphone))

    Sur chaque type est dfini un domaine et un ensemble d'oprations :- Addition, multiplication, successeur sur les entiers naturels- Addition, soustraction, multiplication, successeur, prdcesseur, modulo sur les entiers relatifs- Addition, soustraction, multiplication, division, exponentiation, logarithme sur les rels- Oprations logiques ET, OU, NON sur les boolens- Union, intersection, complmentation, produit cartsien sur les ensembles- Concatnation sur les chanes de caractres,etc.

    Oprations de bases

    Les oprations de base sur tous les types de variables sont les oprations d'entre-sortie etl'affectation.. Soient x et y des identificateurs de variables.

    lire(x) signifie : copier la valeur qui est en face de la tte de lecture (sur l'organe d'entre) dans lacase-mmoire identifie par x ; puis placer la tte de lecture sur la donne suivante.

    crire(x) signifie : copier la valeur contenue dans la case mmoire identifie par x sur l'organe desortie en face de la tte d'criture ; puis avancer cette tte.

    x = expression se lit x reoit expression et signifie : valuer l'expression et placer la valeurobtenue dans la case-mmoire identifie par x.. Si y apparat dans l'expression, la valeur contenuedans la case-mmoire correspondant y est utilise pour l'valuation :Ex : x = x + y : Le contenu de la case mmoire dsigne par x est remplac par la somme desvaleurs contenues dans les cases mmoires dsignes par x et par y. Le contenu original de x estperdu, celui de y est conserv. (2)

    Les structures de contrle du langage- composition squentielle

    { instruction1; instruction2; ...; instructionN;}- composition conditionnelle :

    {SI (condition) ALORS (instruction1) SINON (instruction2)}- composition itrative

    {POUR (numration) FAIRE (instruction)}{TANT QUE (test) FAIRE (instruction)}

    - des appels de fonctions et sous-programmes .

    2Pour prparer le lecteur aux conventions du langage C, nous conviendrons de noter laffectation par un signe = etlgalit par ==.

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 18

    De faon plus prcise la syntaxe du langage est dfinie par la grammaire formelle suivante(simplifie du langage C) :

    ::=type du rsultat identificateur (type paramtre);{ suite d'instructions spares par des points-virgules }

    ::= | { suite d'instructions sparespar des points-virgules } |si (test) sinon |pour (i =d f ) faire |tant que (test) faire

    ::=

    variable =expression |lire(identificateur) | crire(expression) |retour(expression);

    L'instruction retour(expression); a pour effet d'arrter l'excution de l'algorithme et de produire lavaleur de l'expression. Une expression est bien parenthse au sens de lalgbre et prend une valeurdu type des lments qui la composent.

    Avec ce langage, traduisons lalgorithme de factorisation. Nous obtenons une fonction quiretourne un couple de polynmes (ventuellement complexes) de degr 1.

    Fonction factorisation dun polynme rel de degr 2couple de polynmes de degr 1 factorisation ( polynme rel de degr 2 ax2+bx+c);

    {rel D;

    D =b2-4acsi (D==0)

    retour((x+b/2a), (x+b/2a);sinon si (D>0)

    retour((x-(-b+D)/2a), (x-(-b-D)/2a));sinon

    retour((x-(-b+i (-D))/2a), (x-(-b-i (-D))/2a));}

    Traduit dans le langage de la machine RAM, lalgorithme de factorisation reste encore trsproche de ses origines mathmatiques. Lultime transformation va le traduire dans un langageeffectif, le langage C, pour obtenir un programme excutable par une machine relle.

    Conclusion

    Cet expos de la factorisation dun polynme nous a permis de passer par les trois tapes decration dun programme numrique :

    dfinition du problme,

    rdaction de lalgorithme en termes mathmatiques,

    traduction dans un langage de programmation (la traduction en langage C sera aborde auchapitre suivant).

    Il faut insister ici sur lextrme rigueur de la syntaxe des langages de programmation. Toutes lesconstantes, variables et fonctions utilises doivent tre types et dfinies avant appel. Lesinstructions respectent une grammaire prcise, qui caractrise le langage ; les fonctions disponibles(plusieurs centaines en C) fournissent une grande varit doutils dont la matrise ne peut sacqurirque peu peu... Cet apprentissage ne doit pas tre confondu avec une formation lart de laprogrammation qui peut dbuter avec des exercices plus simples et moins rebutants.

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 19

    Le langage C.

    Le langage C est un langage dingnieur destin la cration dapplications informatiques.Beaucoup douvrages lui ont t consacrs. Le plus important est d aux crateurs du langage eux-mme, Denis Ritchie et Brian Kerninghan. On en trouvera la rfrence dans la bibliographie. Unprogramme en C est constitu dun (ou plusieurs) fichiers sources organiss dune faonconventionnelle. Voici une traduction en C de lalgorithme de factorisation. Les cadres (qui ne sontpas ncessaires dans un programme, mais permettent ici de fixer les ides) dlimitent cinq partiesfonctionnellement interdpendantes du fichier source.

    /* entte : fichiers inclus */

    #include #include /* etc. */

    /* dclarations de constantes et de variables globales */

    #define FALSE 0 #define TRUE 1 float a, b, c;

    void factorisation(float a, float b, float c);/* prototypes de fonctions */

    (1)

    (2)

    (3)

    void main (void) /* programme principal */ { printf("Factorisation d'un polynme rel de degr 2\n"); printf("Entrez trois nombres rels a, b, c (a0)\n"); scanf("%f %f %f", &a, &b, &c); if (a==0) { printf("Erreur de saisie\n"); exit(0); } factorisation(a, b, c); } /* fin du programme */

    /* dfinition des fonctions */void factorisation(float a, float b, float c) /* on assume que a est non nul */ { float delta = b*b - 4*a*c; /* delta est le discriminant */ /* c'est une variable locale */ printf("La factorisation donne \n"); if (delta==0) printf(" (%f)(x-(%f))(x-(%f))\n", a,-b/(2*a),-b/(2*a)); else if (delta>0) printf(" (%f)(x-(%f))(x-(%f))\n", a,(-b-sqrt(delta))/2*a, (-b+sqrt(delta))/2*a); else printf(" (%f)(x+(%f)+(%f)i)(x+(%f)-(%f)i)\n", a, b/(2*a), sqrt(-delta)/2*a, b/(2*a), sqrt(-delta)/2*a); }

    (4)

    (5)

    Le bloc (1) est celui des fichiers inclus. Sa premire ligne, #include , invoque labibliothque des fonctions dentre-sortie (saisie au clavier scanf() et affichage lcran

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 20

    printf() ). La deuxime ligne, #include , fait appel aux fonctionsmathmatiques (sqrt() : racine carre).

    Vient ensuite bloc (2) la dfinition des constantes et des variables globales, cest--dire vuesdepuis tous les points du programme :

    #define FALSE 0

    #define TRUE 1

    float a, b, c;

    Puis on trouve le prototype de la fonction factorisation() :

    void factorisation (float a, float b, float c);

    Celle-ci prend trois paramtres a, b, c : les coefficients du polynme factoriser de typefloat ; mais comme elle ne retourne aucune valeur, elle est type void .

    Enfin cest le bloc (4) de la fonction main(). Cest le point dentre du programme. Toutprogramme en Langage C a une fonction main() et une seule. Celle-ci affiche deux lignes de messageet lit ensuite le clavier scanf(%f %f %f, &a, &b, &c); jusqu lentre de troisnombres flottants. Aprs avoir test la condition (a0) la fonction factorisation() estappele et le programme se termine.

    Le dernier bloc (5) est le code de la fonction factorisation() . Le lecteur reconnatra ladfinition du discriminant et lexpression des diffrentes factorisations selon la valeur de . Nousnentrerons pas maintenant dans le dtail de la syntaxe des fonctions printf() et scanf() , quisont parmi les plus compliques du langage C. Je renvoie le lecteur aux ouvrages cits en rfrenceet au support du cours de langage C.

    Les tapes suivantes consistent compiler ce programme source, puis lier le fichier objetobtenu aprs compilation avec les bibliothques standard et mathmatique, ce qui produit unprogramme excutable. En cas derreur, ou pour modifier ce programme, il faut reprendre toute lasquence en rditant le fichier source...C est troitement associ UNIX Le Systme d'Exploitation (Operating System) UNIX dveloppaux Laboratoires Bell (ATT Corporation - USA) par B.W. Kernigham et D.M. Ritchie dans lesannes 70, a t crit en C, dvelopp pour l'occasion.Unix est multi-tches et multi-utilisateurs, sur mini et stations de travail. Sa diffusion a assur lesuccs de C chez les universitaires et les ingnieurs.Unix est aujourd'hui fortement concurrent d'OS2 sur micros puissants...

    Caractristiques succintes du langage C

    Le langage C est un langage des annes 70, donc 'moderne' par rapport FORTRAN ou BASIC,procdural (description linaire des tats de la mmoire, comme Fortran, Basic, Lisp, Pascal...,contrairement aux langages dclaratifs comme SQL ou Prolog (ensemble de faits et de rgles +moteur d'infrence).

    C est structur en blocs fonctionnels imbriqus. C fait appel des variables locales chaque blocou des variables globales plusieurs blocs.

    C supporte l'appel de fonctions et c'est un langage typ : les variables et les fonctions utilisesdoivent tre dclares et leur types et vrifi la compilation. C est un langage compil : le codesource est transform en code objet et li pour produire un excutable.

    Compar PASCAL, C est plus CONCIS mais plus obscur. C est mieux standardis, mais lescompilateurs C sont plus libraux que les compilateurs Pascal pour la vrification des types dedonnes.

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 21

    Pour s'assurer du portage d'un programme en C sur d'autres compilateurs, il est fortementconseill de respecter les spcifications ANSI et de tenir compte des avertissements (warnings) lacompilation.

    C est le langages des programmeurs systme... mais sa disponibilit sur tous les systmesinformatiques en fait un langage indispensable (avec Fortran pour les applications scientifiques).

    C n'est pas un langage objets comme C++ ou Java.

    Evolutions

    Le futur de C est li la programmation parallle, au dveloppement des rseaux et laProgrammation Oriente Objets (C++, Java). L'apprentissage de C est un bon investissement pourl'ingnieur logiciel ou le chercheur amen utiliser des stations de travail, condition deprogrammer souvent.

    Structures en blocsUn bloc est une squence d'une ou plusieurs instructions commenant par une accolade ouvrante {termine par une accolade fermante }.

    Exemple de structure en blocs pour un programme de jeu d'checs

    /* Programme Jeu d'checs */

    Initialiser_VariablesInitialiser_AffichageTANT_QUE (La_Partie_Continue){ SI (C_est_mon_Tour) { Dterminer_mouvement_Suivant (); Mettre__jour_Affichage (); Mettre__jour_Variables (); } SINON { Attendre_Dplacement_Adverse(); Vrifier_Validit(); Mettre__jour_Affichage(); Mettre__jour_Variables(); } }

    Chaque Fonction() peut son tour tredcompose en blocs :

    /* Fonction */Dterminer_mouvement_Suivant(){ Chercher_Tous_les_coups_Autoriss(); POUR (Tous_ces_Coups) { Evaluer_la_Position(); SI (Meilleure_Position_Jusque_l) {

    Mettre__Jour_le_Mouvement_Slectionn(); } } RENVOI (Mouvement_Slectionn);}

    Variables locales et variables globales

    Dans chaque bloc il est possible de dfinir des variables locales - dont l'accs n'est licite qu'l'intrieur du bloc considr- dont la valeur est indtermine sauf affectation explicite,- dont l'emplacement mmoire est libr la sortie du bloc.Les variables globales plusieurs blocs sont connues- dans le bloc englobant o elles sont dfinies,- dans les blocs internes au bloc englobant, sauf en cas de masquage par une redfinition sous lemme nom de variable.Dans l'exemple suivant on vrifie que la variable globale i vaut 1 en entre et en sortie du premierbloc et n'est pas affecte par la variable i interne au deuxime bloc.

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 22

    /* Structure en Blocs -- EXO1.C */#include main() /* Programme principal */{ /* Dbut du premier bloc */int i, n; /* Dfinition */i=1; /* Affectations */n=5;printf("Entre du 1er Bloc\n");printf("Variable i=%d\n",i);printf("Nombre d'itrations %d\n",n);

    { /* second bloc */ int i; /*i Redfini */ /* Oubli de l'affectation */ printf("Entre du 2me Bloc: iredfini et non affect=%d\n",i); for (i=0; i

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 23

    Constantes et variablesLe langage C utilise les constantes numriques et les constantes caractres- entiers :0, 1, 2, -1, -2 , etc.- flottants :0.0, 0.3141592E1,- caractres : 'a', 'b', 'c',..., 'A', 'B', 'C', etc.,- constantes chanes de caractres :"CECI est une chane de caractres" .Les variables sont des adresses de la mmoire dsignes par des identificateurs littrauxcommenant par une lettre (exemple : i, j, x, y, entier1, entier_2, bilan_energetique )

    Mots rservs

    Les mots rservs ne peuvent pas servir de noms de variables.auto extern short break float sizeof case for static chargoto struct continue if switch default int typedef do longunion double register unsigned else return while

    Mots rservs supplmentaires pour la norme ANSIconst signed volatile enum void

    Mots rservs supplmentaires pour le compilateur Turbo Casm huge pascal cdecl interrupt far near

    Types de donnes

    Il faut dclarer le type de toutes les variables et de toutes les fonctions, qui indique la foisl'intervalle de dfinition et les oprations licitesTypes simplesType Signification Taille (bits) Valeurs limitesint entier 16 -32768 +32768short entier 16 -32768 +32768long entier 32 -2 147 483 648 +2 147 483 648char caractre 8 -128..+127float rel +-10 E-37 +-10 E+38double rel +-10 E-307 +-10 E+308

    Une variable entire peut tre dclare 'unsigned'unsigned int 160 .. 65535

    Le type BOOLEAN est simul en donnant la valeur 0 (FAUX) ou la valeur 1 (VRAI) une variableentire.Les constantes de type caractre ont une valeur entire dans la table ASCIIchar c1 = 'A',

    c2 = '\x41'; /* reprsentation hexadcimale */

    Caractres spciauxcaractres nom symbole code code hexa dcimal\n newline LF 0A 10\t tabulation HT 09 9\b backspace BS 08 8\r return CR 0D 13\f form feed FF 0C 12\a bell BEL 07 7\\ backslash 5C 92\' single quote 27 39\" double quote 22 34

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 24

    Instruction d'affectation

    L'assignation est une instruction qui affecte une valeur une variable. Cette valeur peut provenirde l'valuation d'une constante, d'une expression ou d'une fonction.Le symbole= dsigne l'affectation (assignation). int i, j, k; /* dclaration */

    i = j = 5; /* assignation de 5 j et de j i */k = 7; /* assignation de 7 k */

    Transtypage (cast)

    C permet des assignations entre variables de types diffrents.Une variable dclare char, occupantun octet de mmoire, peut tre transtype en int, occupant deux octets de mmoire.

    Rgles de transtypage (casting)char --> int le char se retrouve dans l'octet le moins significatif ; si le caractre a t dclar

    unsigned char, il n'y a pas d'expansion du signe, sinon on retrouve le bit de poids fort rpt 8 foisdans l'octet le plus significatif.

    int --> char perte de l'octet le plus significatifint --> long expansion du bit de signelong --> int rsultat tronqu (perte des deux octets les plus significatifs)unsigned --> long les deux octets les plus significatifs sont mis 0int --> floatexemple : 15 --> 15.0float --> intperte de la partie dcimale : 2.5 --> 2 Si la partie entire du rel est suprieure

    32767 le rsultat sera aberrant.float --> doublepas de difficultdouble --> floatperte de prcision

    Quand des expressions mlangent les types, le transtypage est automatique.

    Oprateurs

    C emploie plusieurs oprateurs : arithmtiques, de comparaison, logiques... La priorit desoprateurs entre eux permet d'valuer d'une expression.

    Oprateurs arithmtiques

    Par ordre de priorit dcroissanteSymbole Signification * / multiplication division (entire et relle) + - addition soustraction % reste de la division entire (modulo)

    Oprateurs de comparaison

    Si une expression est FAUSSE elle renvoie une valeur nulle , si elle est VRAIE elle renvoie unevaleur non nulle.

    Les oprateurs && et || permettent de combiner des expressions logiquesPar ordre de priorit dcroissante :Symbole Signification

    ! NON (inverse une condition)> >= <

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 25

    Table de vrit de l'oprateur ET AND &&FAUX && FAUX == FAUXFAUX && VRAI == FAUXVRAI && FAUX == FAUXVRAI && VRAI == VRAI

    Table de vrit de l'oprateur OU : OR : ||FAUX || FAUX == FAUXFAUX || VRAI == VRAIVRAI || FAUX == VRAIVRAI || VRAI == VRAI

    Incrmentation et dcrmentation

    L'instruction i = i +1; remplace la valeur de i par i+1 ; c'est une incrmentation qui peut aussis'crirei++; ou ++i;

    De mme i = i - 1; peut s'crirei - -; ou - - i;

    Remarque: avec l'instructioni++, i est affect puis incrment, avec ++i, i est incrment puisaffect, avec l'instructioni--, i est affect puis dcrment, avec - -i, i est dcrment puis affectet enfin avec i- - , i est affect puis dcrment.

    Si (e1) et (e2) sont des expressions et "op" une opration prise parmi la liste + - * / % > & | ^alors

    (e1) = (e1) op (e2);peut s'crire (e1) op = (e2);On conomise une valuation de e1.

    Attention aux parenthses : x *= y + 1;est quivalent x = x * (y+1);et non x = x * y + 1;

    Autrement dit si x==3, y==4 le rsultat de cette instruction remplacera x par 15 et non pas par 13 !

    Structures conditionnelles

    Pour les structures conditionnelles, la condition value doit tre de type entier (short, int, long)ou char. Toute fonction qui renvoie une valeur d'un de ces types peut tre teste dans la condition.

    if / elseif (condition) /* commentaire de la condition si */

    instruction;

    if (condition) { /* dbut de bloc*/

    instruction1; instruction2;

    } /* fin de bloc */

    if (condition) instruction_si;

    else /* sinon */ instruction_sinon;

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 26

    Conditions imbriquesif (condition1)

    inst1;else if (condition2)

    inst2; else if (condition3)

    inst3; else /* chaque else se rapporte au if le plus proche sauf si on utilise des accoladescomme dans l'exemple suivant */ inst4;

    Regroupement d'instructions

    if (cond1) /* premier if */{

    if (cond2)inst1;

    else if (cond3) inst2;}else /* sinon se rapportant au premier if */

    inst3;

    Affectation conditionnelleif (i>j) z = a; else z = b; est quivalent z = (i>j) ? a : b;

    Slection (switch)L'instruction switch est une sorte d'aiguillage. Elle permet de remplacer plusieurs instructionsimbriques. La variable de contrle est compare la valeur des constantes de chaque cas (case). Sila comparaison russit, l'instruction du case est excute jusqu' la premire instruction breakrencontre.

    switch (variable_controle){ case valeur1 : instruction1;

    break; /* sortie du case */ casevaleur2 : instruction2;

    break; casevaleur3 : /* plusieurs */ casevaleur4 : /* tiquettes */ casevaleur5 : instruction3; /* pour la mme instruction */

    break; default: instruction4; /* cas par dfaut */

    break; /* facultatif mais recommand */}

    variable_controle doit tre de type entier (int, short, char, long).break fait sortir du slecteur. En l'absence de break, l'instruction suivante est excute ; on peutainsi tester plusieurs cas diffrents et leur attribuer la mme instruction.

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 27

    Boucles et sautsLes boucles consistent rpter plusieurs fois la mme squence d'instructions. La sortie de boucleest ralise en testant une condition (de type boolen VRAI ou FAUX).

    While, Tant que .

    while (condition)instruction;

    while (condition){

    instruction1;instruction2;

    }La condition est value avant d'entrer dans la boucle. La boucle est rpte tant que la condition estVRAIE.

    For, Pour.for (initialisation; condition d'arrt; incrmentation)

    instruction;for (initialisation; condition d'arrt; incrmentation){

    instruction1;instruction2;...

    }

    La condition est value avant d'entrer dans la boucle. L'incrmentation de la variable de contrle estfaite la fin de chaque tour de boucle.

    Exemple :int i;for (i=1; i

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 28

    Tableaux

    Un tableau est une suite de cellules conscutives en mmoire pouvant contenir des donnes detype identique. La taille du tableau et le type des donnes doivent tre dclars en mme temps quele tableau. Le nombre de dimensions n'est pas limit. L'indice (adresse relative de chaque cellule parrapport au dbut du tableau) doit tre une expression entire ; la premire cellule a l'indice 0.

    Tableaux une dimensionExemples :

    int t[5];Nom du tableau est t ; les cellules sont de type entier (int) ; la taille 5 ; indexe de 0 4

    long l[2];Nom du tableau est l; les cellules sont de type entier (long) ; la taille 2; indexe de 0 1

    char hexa[17];Nom du tableau est hexa ; cellules de type char ; taille 17

    Un tableau peut tre affect en mme temps qu'il est dclar :int tabint[5] = {0, 10, 100,}; /* les autres cellules 0 */char binaire[2] = {'0', '1'};

    AffectationPour initialiser un tableau, il faut dsigner ses diffrentes cellules :

    t[0] = tabint[4] = 10000; /* affectation en cascade */hexa[0] = '0';for (i=0; i

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 29

    Pointeurs

    Un pointeur est une variable qui contient l'adresse d'une autre variable.

    Selon le type de donne contenu l'adresse en question, on aura un pointeur d'entier, de float,double, char, ou de tout autre type. En accdant cette adresse, on peut accder indirectement lavariable et donc la modifier.

    Dclaration de pointeur

    Pour dclarer un variable pointeur on utilise l'oprateur * plac aprs le type du pointeur.Un pointeur sur entier est dclar parint *p;Un pointeur sur rel float *p;Un pointeur sur caractrechar *p;Pointeur sur pointeur de type doubledouble **tab;

    la variable tab est un pointeur pointant sur un pointeur qui pointe sur un flottant double !

    La dclaration int *p signifie que *p est un entier et donc que p est un pointeur sur un entier.

    Oprateur adresse (&)

    On dispose de deux oprateurs unaires pour manipuler les pointeurs, & et *L'oprateur d'adresse & renvoie l'adresse de l'objet dsign.

    int i, j; /* dclarations d'entiers i et j */int *p1, *p2;/* dclaration de pointeurs sur des entiers */i = 5; /* affectation */j = 2 * i;/* affectation */p1 = &i;/* p1 contient l'adresse de i */p2 = &j;/* p2 pointe sur j */

    Cet oprateur & ne peut tre employ que sur les variables et les lments de tableaux ; lesconstantes &3 et les expressions &(i+1) sont interdites.

    Oprateur valeur (*)L'oprateur * considre son oprande comme un pointeur et en renvoie le contenu.

    p1 = &i;reoit l'adresse de i; donc pointe sur ij = *p1;j prend la valeur contenue l'adresse pointe par p1, donc la valeur de i ;:cette

    instruction est quivalente j = i;int *p, *q, x, y;Partout o un entier peut tre employ, *p peut l'tre aussi :p = &x;/* p pointe sur x */x = 10; /* x vaut 10 */y = *p1 - 1;/* y vaut 9 */*p += 1;/* incrmente x de 1 : x vaut 11 */(*p)++;/* incrmente aussi de 1 la variable pointe par p, donc x vaut 12. */

    Attention aux parenthses :*p++ est TRES DIFFERENT de (*p)++

    car ++ et * sont valus de droite gauche et *p++ incrmente le pointeur p (l'adresse) et non lecontenu de p

    *p = 0; /* comme p pointe sur x, maintenant x vaut 0 */q = p; /* p et q pointent maintenant sur la mme adresse donc *q devient zro ! */

    Pointeurs et tableaux

    En C le compilateur transforme toute dclaration de tableau en un pointeur sur le premier lmentdu tableau.

    int tabint[10]; est donc quivalent int *tabint; ( la rservation mmoire prs).

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 30

    Exemples :int i, j, *p;p = &tabint[0]; p pointe sur le premier lment de tabinti = *p; recopie le contenu de tabint[0] dans ip++; p pointe sur le second lment de tabintp+j; adresse de tabint[j]*(p+j); contenu de tabint[j]

    Tableaux de pointeursUn tableau de pointeurs est un tableau dont les lments sont des pointeurs.

    char *mois[13];int *valeurs[5];

    Allocation dynamique de mmoire

    Quand on utilise des pointeurs il est indispensable de toujours savoir quels lments sontmanipuls dans les expressions et si de l'espace mmoire a t rserv par le compilateur pourstocker les objets points. En effet, alors qu'une dclaration de tableau rserve de l'espace mmoiredans l'espace des donnes pour la variable et ses lments, celle d'un pointeur ne rserve que la placepour une adresse !

    La dclaration double x[NOMBRE]; rserve un espace de stockage pour NOMBRE lments detype rel double et la variable x[0] stocke l'adresse de l'lment n zro (le premier lment).Par contre la dclarationdouble *x; ne rserve que le seul espace destin au pointeur x, AUCUNespace n'est rserv pour une ou plusieurs variables en double prcision.

    La rservation d'espace est la charge du programmeur qui doit le faire de faon explicite, enutilisant les fonctions standard malloc(), calloc(), ou realloc().

    Ces fonctions sont prototypes dans et char * malloc( unsigned taille);rserve taille octets, sans initialisation de l'espacechar * calloc( unsigned nombre, unsigned taille); rserve nombre lments de taille octets

    chacun ; l'espace est initialis 0.void * realloc( void *block, unsigned taille); modifie la taille affecte au bloc de mmoire

    fourni par un prcdent appel malloc() ou calloc().void free( void *block); libre le bloc mmoire point par un prcdent appel malloc(), calloc()

    ou realloc().

    Ces fonctions doivent tre transtypes pour rserver de l'espace pour des types de donnes quisont diffrents du type (char *). Elles retournent le pointeur NULL (0) si l'espace disponible estinsuffisant.

    Exemples :char *s, *calloc();s = (char *) calloc(256, sizeof(char)); /* rserve 256 octets initialiss '\0' */float *x;x = (float *) malloc(sizeof(float)); /* rserve un espace pour un rel de type double */

    L'allocation dynamique de mmoire se fait dans le tas (mmoire systme dynamique) ; la taille decelui-ci varie en cours d'excution, et peut n'tre pas suffisante pour allouer les variables, provoquantle plantage du programme. Il faut donc tester le retour des fonctions d'allocation et traiter les erreurs.

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 31

    Exemple de traitement d'allocation dynamique.

    #define BUFSIZE 100long *numero;if (!(numero = (long *) calloc(BUFSIZE, sizeof(long))) )

    /* Si chec rservation de BUFSIZE emplacement de type long */ {

    fprintf(stderr, "ERREUR espace mmoire insuffisant !\n");exit (1); /* fin anticipe du programme ; code de retour 1 */

    }else /* le programme continue */

    L'espace allou une variable peut tre libr par free(), dont l'argument est un pointeur rservdynamiquement.

    free(s);free(x);free(numero);

    Programme principal et fonctions

    Les fonctions permettent de dcomposer un programme en entits restreintes. Une fonction peutse trouver :- dans le mme module de texte (toutes les dclarations et instructions qui la composent s'ytrouvent),- tre incluse automatiquement dans le texte du programme (#include)- ou compile sparment puis lie (linked) au programme.

    Une fonction peut tre appele partir du programme principal, d'une autre fonction ou d'elle-mme (rcursivit). Elle peut retourner une valeur (int par dfaut) ou ne pas en retourner (dclarevoid, assimilable une procdure Pascal). Une fonction peut possder ses propres variables ; elle n'aqu'un seul point d'entre et peut avoir plusieurs points de sortie.

    Dclaration de fonction avec prototypage

    Le prototypage permet au compilateur de faire une vrification de type au moment de la dfinitionet de l'appel./* prototype de fonction : entte de dclaration suivi par ';' dclaration avecles types des arguments entre les parenthses */type_retourn nom_fonction ( type variable1, type variable2, ...) ';'

    Dfinition

    La dfinition de la fonction (la liste des instructions) reprend le mme texte que pour le prototypesans ';'type_retourn nom_fonction (type variable1, type variable2, ...){

    /* corps de la fonction *//* dclarations de variables locales la fonction *//* initialisations *//* instructions; */return ( valeur_retourne );

    }

    Arguments et valeur retourne.

    Les arguments de la fonction sont passs par VALEUR ; une copie provisoire de chaqueargument est passe la fonction qui ne peut donc pas modifier l'argument initial d'une fonctionappelante.

    Mais si on passe un pointeur (une adresse) une fonction,celle-ci modifiera ainsi l'argument : c'estun passage par VARIABLE ou par ADRESSE. On obtient le mme rsultat en passant un tableau

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 32

    la fonction, puisque les tableaux sont considrs par le compilateur comme un pointeur sur lepremier lment du tableau.

    Une fonction dclare void ne retourne rien. La valeur retourne peut tre ignore par la fonctionappelante.

    Si la fonction ne contient pas de return( ); la valeur retourne n'a pas de sens particulier.

    /* Appel de fonction */#include /* Entres/Sorties */

    /* prototype */int demo (int i, double n);

    void main(void) /* Programme principal */{

    int i; /* Dfinitions */double n;i=2; /* Affectations */n=10.0;printf("APPEL DE FONCTIONS \n");printf("Valeurs avant appel\n");printf("Variable i=%d\n",i);printf("Variable n=%f\n",n);if (i)

    printf("Valeur renvoye par fonction =%d\n",demo(i,n));printf("Valeurs aprs appel\n");printf("Variable i=%d\n",i);printf("Variable n=%f\n",n);printf("\n");

    }

    int demo (int i, double n) /* dfinition de fonction */{

    n = n / i;printf("\nValeurs dans la fonction\n");printf(" Variable i=%d\n",i);pr intf(" Variable n=%f\n",n);return((int)n);

    }

    -----------------------------------------------APPEL DE FONCTIONSValeurs avant appelVariable i=2Variable n=10.000000

    Valeurs dans la fonction Variable i=2 Variable n=5.000000

    Valeur renvoye par fonction =5Valeurs aprs appelVariable i=2Variable n=10.000000----------------------------------------------

    Remarque :

    La fonction demo(i,n) fait la division de n par i, retourne le rsultat transtyp entier mais nemodifie ni la valeur de n ni celle de i. Le contrle de i avant la division est indispensable pour viterune division par zro.

    L'exemple suivant propose une fonction qui modifie (par permutation) les lments d'un tableau;le tableau est pass la fonction qui renvoie un tableau modifi./* Appel de fonction */

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 33

    #include "stdio.h" /* Entres/Sorties */#define MAXTAB 10 /* Constante */

    int echange (int i, int n[]); /* prototype de fonction */

    /* dfinition de la fonction */int echange (int i, int n[]) /* un tableau en argument */{ int j, aux; for (i=0, j=MAXTAB-1; i < j; i++, j--) {

    printf(" Echange %4d et %4d\n",n[i],n[j]);aux = n[i];n[i] = n[j];n[j] = aux;

    } return(i);}

    void main(void) /* Programme principal */{ /* Dfinitions */ int i; int tabint[MAXTAB] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; /* Affectations */ printf("APPEL DE FONCTION PAR VARIABLE \n"); printf("Valeurs du tableau avant appel\n"); for (i=0; i

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 34

    L'appel de echange(i,j) avec i et j entiers n'aura aucun effet car ces paramtres sont passs parvaleur et ne sont pas modifis en dehors de echange().

    void echange (int *x, int *y) /* CORRECT */{ int aux; aux = *y; *y = *x; *x = aux;}Maintenant l'appel de echange(&i,&j) modifie les variables i et j car les adresses des paramtressont passes la fonction (on parlera de passage par VARIABLE ou par ADRESSE).

    Fonctions rcursives

    Si le texte de la fonction fait appel la fonction elle-mme, la fonction est rcursive. A chaqueappel rcursif, l'ensemble des variables locales est sauvegard dans une pile et restaur au sortir del'appel rcursif. C'est le compilateur qui se charge de grer la pile ; l'utilisateur doit veiller ce queles appels rcursifs se terminent . Sinon une erreur d'excution se produit quand la pile des appels estpleine (stack overflow).

    /* version rcursive de la fonction factorielle */#include unsigned long fact( unsigned long n); /* factorielle */

    void main(void ){

    unsigned long u;printf("Entrez un nombre ");scanf("%ld ",&u);printf("Factorielle %ld : %ld\n",u, fact(u));

    }

    unsigned long fact( unsigned long n){

    if (n

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 35

    Exemple : Que fait le programme ci-dessous ?#include #include char *nom_de_mois(int n){ static char *mois[13] = {"erreur", "janvier", "fvrier", "mars", "avril", "mai", "juin", "juillet", "aot", "septembre" "octobre", "novembre", "dcembre" }; return ((n < 1 || n > 12) ? mois[0] : mois[n]);}

    main(int argc, char *argv[]){ char *nom_de_mois(); if (argc > 1) printf( "\n", nom_de_mois(atoi(argv[1]))); else printf("Usage %s numro\n", argv[0]);}

    StructureUne structure est une collection de donnes regroupes sous un seul nom.

    DclarationLe type hms (heure, minute, seconde) struct hms { /* dclaration et nom de la structure */ int h, m, s; /* champs de la structure */ } heurelocale; /* nom de variable */Le type date utilise aussi le type hms : struct date { char *nom_jour, nom_mois[4]; int jour, mois, annee; struct hms heure; /* structure dans une structure */ }; /* le nom de variable est facultatif */

    AffectationL'oprateur . (point) permet d'accder aux composantes d'une structure.heurelocale.h = 10;heurelocale.m = 07;heurelocale.s = 55;

    printf("%02d:%02d%:%02d\n",heurelocale.h,heurelocale.m,heurelocale.s) ;

    L'oprateur -> (Flche = MoinsSuprieur) permet d'accder aux composants d'un pointeur sur unestructure.struct date * ddnaissance = (struct date) *calloc(1, sizeof(struct date));

    strcpy(ddnaissance->nom_jour, "Lundi");strcpy(ddnaissance->nom_mois, "MAR");ddnaissance->jour=19; ddnaissance->mois=3; ddnaissance->annee=1999;

    Union

    Une union est une variable qui peut contenir ( diffrents moments) des objets de types et detailles diffrents.Exemple :

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 36

    union mot_machine { char quatrecar[4]; int deuxentier[2]; long unlong; } *mot;Cette union, dont l'encombrment mmoire est de 4 octets, peut tre initialise de diffrentes faons.Soit octet par octet : mot->quatrecar[0] = 'a'; mot->quatrecar[1] = 'b'; mot->quatrecar[2] = 'c'; mot->quatrecar[3] = 'd';Soit par sries de deux octest : mot->deuxentier[0] = 0; mot->deuxentier[1] = 1;soit d'un seul coup : mot->unlong = 1234567;De plus l'espace mmoire dsign par l'union peut tre interprt selon chacun de ces aspects par lecompilateur...

    Directives de compilation

    TypedefLe mot rserv typedef cre de nouveaux noms de types de donnes (synonymes de types djdfinis).Exemple : typedef char * STRING; fait de STRING un synonyme de "char * "

    #define#define et #include sont des commandes du prprocesseur de compilation.#define est un mot rserv qui permet de dfinir une macroExemple :#define ESC 27A la compilation la chaine ESC sera remplace par 27 dans tout le fichier contenant cette dfinitionde macro.Attention : une macro n'est pas une instruction donc il ne faut pas terminer la dfinition d'unemacro par le caractre ';'

    #define sum(A,B) ((A) + (B))Cette macro remplace tous les appels de sum() avec deux paramtres par l'expression somme. Lesparenthses ( ) vitent les erreurs d'association...

    #include#include Inclusion du fichier nom.h situ dans le rpertoire spcifi par l'option de compilation -I enTURBOC.

    #include "nom.h"Inclusion du fichier nom.h cherch dans le rpertoire courant puis dans les rpertoires spcifis parl'option de compilation -I en TURBOC.

    Directives de compilatio

    Les directives de compilation permettent d'inclure ou d'exclure du programme des portions detexte selon 'valuation de la condition de compilation.

    #if defined (symbole) /* inclusion si symbole est dfini */#ifdef (symbole) /* idem que #if defined */#ifndef (symbole) /* inclusion si symbole non dfini */

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 37

    #if (condition) /* inclusion si condition vrifie */#else /* sinon */#elif /* else if */#endif /* fin de si */#undef symbole /* supprime une dfinition */

    Exemple :#ifndef (BOOL)#define BOOL char /* type boolean */#endif

    #ifdef (BOOL) BOOL FALSE = 0; /* type boolean */ BOOL TRUE = 1; /* dfinis comme des variables */#else #define FALSE 0 /* dfinis comme des macros */ #define TRUE 1#endif

    #if 0 Cette partie du texte sera ignore par le compilateur cela permet de crer des commentaires imbriqus et d'carter momentanment dutexte source des parties deprogramme.#endif

    Les entres/ sorties et les fichiers

    Pour des questions de portabilit du langage C, les entres sorties (affichage ; saisie de caractres; lecture/criture de fichiers) qui sont tout fait dpendantes du matriel, n'ont pas t inclusent dansle langage... Il n'y a pas de mots rservs pour les raliser.Cependant chaque compilateur fournit une bibliothque de fonctions standard ralisant les principalesentres sorties. Cette bibliothque est dsigne sous le nom de fichier stdio.hTout fichier source qui fait rfrence une fonction de la bibliothque standard doit donc contenir laligne #include en dbut de fichier.

    Un faon lgante de considrer les entres / sorties - c'est--dire le clavier, l'cran, les mmoiresde masse - c'est de les traiter soit comme des fichiers squentiels (clavier, cran) soit comme desfichiers accs direct (la mmoire). Le langage C fournit pour chaque type de fichier une collectionde fonctions ralisant les oprations lmentaires de lecture et d'criture.Ces entres / sorties ont pour support des flux (de caractres, de blocs, etc.). Un flux est reprsentde faon logique par un type FILE du fichier stdio.h .FILE est un nom pour une structure dont les champs (tampon, caractre courant, nom du flux...)sont utiliss par les fonctions d'entre sortie 3.Trois flux sont prdfinis : stdin, stdout, stderr, qui sont respectiveemnt l'entre standard, la sortiestandard et la sortie erreur standard. A ces flux sont associs par le systme d'exploitation, et ceciindpendamment du programme, des fichiers ou des priphriques au moment du lancement duprogramme. Les affectations par dfaut sont le clavier (stdin) et l'cran (stdout et sdterr), mais ellespeuvent tre modifies par des redirections.

    Fonctions d'entres / sorties

    Les principales fonctions d'entres / sorties [input / output] concernent la lecture des caractres auclavier et l'criture des caractres l'cran.

    3 Je ne saurais trop conseiller l'apprenti programmeur l'excellent ouvrage de Jacquelin Charbonnel "Langage C, lesfinesses d'un langage redoutable" Collection U Informatique - Armand Colin 1992

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 38

    Les fonctions de lecture getchar(), gets() et scanf() lisent leurs donnes sur stdin .Les fonction getc(), fgets() et fscanf() leur sont apparentes pour les flux nonprdfinis de type FILE * .Les fonctions d'criture putchar(), puts() et printf() crivent leurs donnes sur lasortie standard stdout . Les fonctions putc(), fputc() et fprintf() s'adressent desflux non prdfinis, de type FILE * .Les fonctions fread() et fwrite() permettent de lire et d'crire des blocs d'enregistrements.La fonction fseek() positionne le pointeur de flux une position donne (dplacement de la ttede "lecture / criture") ; la fonction ftell() indique la position courante du pointeur de flux.

    Lecture du clavier / criture l'cran : getchar() et putchar(), gets() et puts()getchar() : lecture (par le processeur) d'un caractre au clavier, "l'entre standard"Syntaxe :int getchar(void);Renvoie un entier sur l'entre standard (cet entier est un code ASCII) ; renvoie EOF quand ellerencontre la fin de fichier ou en cas d'erreur.putchar() : criture (par le programme) d'un caractre sur l'cran, "la sortie standard"Syntaxe :int putchar(int c);Place son argument sur la sortie standard. Retourne c si la sortie est raliss, EOF en cas d'erreur.Les entres de getchar() et les sorties putchar() peuvent tre rediriges vers des fichiers.gets() : lecture d'une chaine de caractres au clavier.Syntaxe :char *gets(char *s);Lit une chaine depuis l'entre standard stdin et la place dans la chane s. La lecture se termine larception d'un NEWLINE (saut de ligne) lequel est remplac dans s par un caractre ASCII nul '\0'de fin de chane. Renvoie NULL quand elle rencontre la fin de fichier ou en cas d'erreur.puts() : criture d'une chaine de caractres l'cran.Syntaxe :int puts(const char *s);Recopie la chaine s dans la sortie standard stdout et ajoute un saut de ligne. Renvoie le derniercaractre crit ou EOF en cas d'erreur.

    Formatage des entres clavier / sorties cran : printf() et scanf()

    Les fonctions de la famille de printf() et de scanf() permettent les sorties et les entresformates de chanes de caractres. Un tableau de leurs caractristiques assez complexes est donnen annexe.

    Fichiers de donnes

    Il s'agit de fichiers non prdfinis, par exemple des donnes traiter par programme.On distingue selon le type de support et de contenu les fichier squentiels : squence d'enregistrements auxquels on accde dans l'ordre squentiel,

    c'est--dire du premier au dernier en passant par tous les enregistrements intermdiaires. Parexemple une bande magntique (K7 audio). Le clavier est vu par l'ordinateur comme un fichiersquentiel en lecture. L'cran est un fichier en criture (pas ncessairement squentiel).

    les fichier accs direct : squence d'enregistrements sur mmoire externe ou interne auxquels onaccde directement, par l'adresse individuelle de chaque enregistrement (mmoire vive RAM :Random Access Memory) ou par indirection (tableau index).

    les fichier binaires : ce sont des fichiers structurs sous forme d'enregistrements (struct en langageC), dont le contenu doit tre interprt par le programme qui les a crs.

    les fichiers textes : ce sont des documents textuels en ASCII, qu'une commande comme TYPEpeut afficher.

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 39

    Oprations sur les fichiers

    Un fichier est caractris par un nom et une adresse logique attribus par le propritaire du fichieret convertis en adresse physique absolue dans le systme de fichiers de l'ordinateur (rle du systmed'exploitation [Operating System]).

    Les opration de base sur les fichiers sont :- cration du fichier (attribution d'un nom et d'une adresse logique / physique) ;- ouverture du fichier en criture, en lecture, en mode ajout ;- lecture d'un enregistrement ;- criture d'un enregistrement ;- positionnement de la tte de lecture (le tampon) en dbut, en fin, une adresse relative au dbut ou la fin du fichier ;- fermeture du fichier ;- suppression du fichier.L'accs aux enregistrements constitutifs du fichier traiter se fait au travers d'une fentre appeletampon [buffer] (de lecture ou d'criture, selon l'opration ralise), qui est une variable du mmetype que les enregistrements constitutifs du fichier, ce qui conduit voir ce tampon commecontenant un lment du fichier.

    Descripteurs et flux

    La gestion des fichiers tant troitement dpendante de la plateforme matrielle et logicielle(systme d'exploitation), nous ne prsenterons ici que ce qui concerne MS-DOS. On dispose defonctions quivalentes dans les autres systmes d'exploitation. Deux mthodes de gestions de fichierssont possibles dans l'envionnement MS-DOS :

    - par descripteur de fichier [handler]

    - par association au fichier d'un bloc de contrle [File Control Block] et d'un pointeur de flux[FILE *]

    Fonctions C utilisant un descripteurCe sont des fonctions de bas niveau. Leur emploi est plutt destin la programmation systme.

    Fonctions C utilisant un fluxCes fonctions accdent des flux, donc manipulent des objets de type FILE - type dfini dans lefichier stdio.h.

    fopen() : ouvre un fichier dont le nom et le mode sont passs en paramtres.Syntaxe :FILE *fopen(char * nomfichier, char * mode);mode dfinit les attributs du fichier ; il peut prendre les valeurs"r"fichier binaire, ouverture en lecture [read] partir du dbut"w" fichier binaire, cration et ouverture en criture [write] (s'il existe le fichier est vid)"a"fichier binaire, ouverture en ajout [append] partir de la fin du fichier"r+" fichier binaire, ouverture en lecture / criture partir du dbut"w+" fichier binaire, recr en lecture / criture [write] (s'il existe le fichier est vid)"a+" fichier binaire, ouverture en lecture / criture partir de la fin

    "rt" fichier texte, ouverture en lecture [read] partir du dbut"wt" fichier texte, cration et ouverture en criture [write] (s'il existe le fichier est vid)"at" fichier texte, ouverture partir de la fin du fichier"r+t" fichier texte, ouverture en lecture / criture partir du dbut"w+t"fichier texte, recr en lecture / criture (s'il existe le fichier est vid)"a+t"fichier texte, ouverture en lecture / criture partir de la fin

    Un pointeur sur un tampon de type FILE est cr et renvoy par la fonction fopen() quiretourne NULL si l'opration a chou.

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 40

    Exemple :#include #include #include #define MAXNOM 40#define MAXMODE 4int main(void)/* ouverture d'unfichier texte en modeajout */ {FILE *fichier;

    char nomfichier[MAXNOM] = "biblio.txt";if ((fichier = fopen(nomfichier, "a+t")) != NULL){ /* le fichier est accessible */

    fprintf(fichier,"%s, %d pages\n","Langage C",50);fclose(fichier);

    }else

    fprintf(stderr,"Ouverture de %s imp ossible\n",nomfichier);}

    fwrite() : criture d'enregistrements dans le fichierSyntaxe :int fwrite(type_tampon *tampon, int longueur, int nombre,FILE *fichier);le tampon a le mme type que les enregistrements dans le fichierla longueur est obtenue avec sizeof(type_tampon)nombre est le nombre d'enregistrements crits la fois,fwrite() retourne le nombre d'enregistrements crits dans le fichier ou -1 en cas d'erreur.

    fread() : lire des enregistrements dans un fichierSyntaxe :int fread(type_tampon *tampon, int longueur, int nombre,FILE *fichier);le tampon a le mme type que les enregistrements dans le fichierla longueur est obtenue avec sizeof(type_tampon)nombre est le nombre d'enregistrements lus la fois,fread() retourne le nombre d'enregistrements lus dans le fichier ou -1 en cas d'erreur.

    fclose() : fermeture du fichierSyntaxe :int fclose(FILE *fichier);fclose() retourne 0, ou -1 en cas d'erreur.

    fseek() : dplacement de la tte de lecture sur le fichierSyntaxe :int fseek(FILE *fichier, long distance, int position);fseek() fait pointer le pointeur associ au fichier la position situe distance octets au-del del'emplacement position.distance : diffrence en octets entre position d'origine du pointeur fichier et la nouvelle position. Enmode texte, distance doit tre 0 ou une valeur renvoye par ftell() .position : une des trois positions d'origine pour le pointeur de fichier (Dbut : SEEK_SET, Curseur :SEEK_CUR, Fin : SEEK_END)L'opration suivant un appel fseek() sur un fichier ouvert en mode mise jour peut aussi bien treune lecture qu'une criture.fseek() renvoie 0 si succs (pointeur repositionn), non 0 si chec.Voir aussi fgetpos(), fopen(), fsetpos(), ftell(), lseek(), rewind(), setbuf(), tell().

    Exemple : Dterminer la taille d'un fichier#include long filesize(FILE *f);

    int main(void) {FILE *fichier;fichier= fopen("biblio.txt", "a+t");if (fichier != NULL) {

    fprintf(fichier,"%s, %dpages\n","LangageC",50);fprintf(fichier,"%s, %dpages\n","Algorithmique",80);

    printf("La taille du fichier %s est %ld octets\n",filesize(fichier));fclose(fichier);

    }return (0); }

    long filesize(FILE *f) {long curpos, l;

    curpos = ftell(f); /* indique la position courante */fseek(f, 0, SEEK_END); /* fin du fichier */l = ftell(f); /* rcupre la position en octets */fseek(f, curpos, SEEK_SET); /* replace la tte */return (l);

    }

  • Introduction la programmation

    Jean Fruitet - IUT de Marne La Valle - 41

    Formatage des entres / sorties dans des fichiers : fprintf() et fscanf()

    Les fonctions fprintf() et de fscanf() permettent les sorties et les entres formates sur les fichiers.Elles s'emploient comme les fonctions printf() et scanf() en indiquant en plus la rfrence du fluxtrait.Exemple : Lecture d'un fichier de tempratures temp.dat

    /* temp.dat ---17/11/1997 1318/11/1997 1819/11/1997 17--------------- */#include

    int main(void){int temp;char jour[12];FILE *ft;

    ft=fopen("temp.dat", "rt");if (ft==NULL)

    return(-1); /* erreur de lecture */while (! feof(ft)) /* jusqu' la fin du fichier */ {

    fscanf(ft,"%s %d\n ",jour,&temp);printf("La temprature du %s est %d degrs\n", jour,

    temp);}fclose(ft);return (0);}

    CompilationLa compilation de programmes en C s'effectue en plusieurstapes.

    1) PrcompilationLe prcompilateur supprime les commentaires des fichiers sources, inclut les fichiers #include etsubstitue les dfinitions #define dans tout le fichier (*.C)

    2) Compilation (compile)Les fichiers sont alors recods en fichiers (binaire) (*.OBJ). Les noms de fonctions sontremplacs par des tiquettes.

    3) Liaison (link)Les diffrents fichiers objets sont ensuites "lis", c'est--dire que les tiquettes d'appel de fonctionssont remplaces par l'adresse de celles-ci dans leur propre fichier objet. On obtient un fichierexcutable (*.EXE).

    La compilation est interrompue en cas d'erreur fatale. Les "warnings" sont des erreurs non fatalesdont il faut tenir compte pour avoir un programme peu prs fiable et portable.Mais ce n'est pas parce que la compilation s'est passe sans erreur que le programme est correct. Lecompilateur ne vrifie pas les dbordements de tableau (Range Check error), ni bien sr les erreursd'allocation en mmoire dynamique ou la cohrence du programme.

    Interdpendance de fichiersIl est possible en C de partager un programme en plu