Le Langage C Initiation à la programmation

Slides:



Advertisements
Présentations similaires
Premier programme en C :
Advertisements

RESUMES Module II1 SOMMAIRE CYCLE 1 : Saisir – Afficher – Données
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
Procédures et fonctions
Un survol du language C.
PRO-1027 Programmation Scientifique en C
C++ Les fonctions. Présentation Utilité : Dès qu'un programme dépasse la centaine de lignes de code, il est pratique de pouvoir le décomposer en plusieurs.
1 Chapitre 2 La numération binaire. 2 Chapitre 2 : La numération binaire Introduction 1 - Le système binaire 2 - La conversion des nombres entiers 2.1.
CINI – Li115 1 Semaine 9 Algorithmes de tri ● Introduction ● Tri à bulle ● - principe ● - algorithme ● - efficacité ● Tri par sélection ● - principe, algorithme,
Tableaux et Pointeurs Chaînes de Caractères Programmation Impérative II.
Chapitre 4 la représentation des nombres. Chapitre 4 : La représentation des nombres 1 - Introduction 1.1 – Notion de mot 2 - La représentation des entiers.
CINI – Li115 1 Semaine 3 Boucles (suite), tirages aléatoires, bibliothèque graphique ● Imbrication d'instructions if et for ● Boucles for imbriquées ●
1- Introduction 1ère partie Le langage SQL 2- Connexion 3- Structure & Contenu 4- Requêtes.
1 Programmation en C++ C++ de base ● Programme C++ ● Variables, objets, types ● Fonctions ● Namespace ● Tests ● Boucles ● Pointeurs, références.
1 Programmation en C++ C++ de base ● Programme C++ ● Variables, objets, types ● Types et opérations fondamentales ● Tests ● Boucles ● Pointeurs, références.
Tableaux en C Mardi 2/05.
Le Langage JavaScript pour le web
Synthèse TP 2 Codeblock 1 Les objectifs de ce tp sont :
Ajouter le code dans une page html
I- ANALYSE DU BESOIN / Plan
Les tables de multiplication au ce1 « Une construction réfléchie des tables favorise-t-elle leur mémorisation et leurs transferts ? » DOUARCHE Vaéa.
Les tableaux différencier les variables simples des variables indicées (ordonnées et numérotées) un identificateur unique désigne un ensemble, une collection.
Les Instructions Itératives (Les Boucles)
Introduction au Langage Pascal
Cours de programmation en langage C (Norme ANSI)
DOC MYCK : Programmation
Représentation des nombres réels
Quelques Termes INFORMATIQUE ? ORDINATEUR ( Système Informatique)?
Chapitre 1 nombres, chaînes de caractères, booléens, et VARIABLES
Pas de variable globale
Les notions de classe et d'objet
Algorithmiques Abdelbasset KABOU
Eléments d’Informatique Cours11 – Allocation dynamique, listes chaînées Catherine Recanati.
Pointeurs et langage C.
Algorithmique et programmation de modèles numériques
Instructions de contrôle
Représentation de l’information en binaire:
AO (Architecture des ordinateurs)
Principes de programmation (suite)
Algorithmique Langage C
Semaine 11 Les pointeurs (suite)
Les fonctions.
Les fonctions.
Algorithmiques Abdelbasset KABOU
SIF-1053 Architecture de ordinateurs
Langages de programmation TP3
Codage et Représentation de l’Information
L’I NSTRUCTION DE T EST A LTERNATIF Réalisé par : OUZEGGANE Redouane Département de Technologie Faculté de Technologie – Université A.Mira, Bejaia Année.
L ES I NSTRUCTIONS I TÉRATIVES (L ES B OUCLES ) Réalisé par : OUZEGGANE Redouane Département de Technologie Faculté de Technologie – Université A.Mira,
Cours N°9: Algorithmiques Les Tableaux 1
Les tableaux.
Programmation en C++ C++ de base
Structure D’une Base De Données Relationnelle
1 RECURSIVITE PRESENTATION Ch. PAUL ALGORITHMIQUE Présentation de la récursivité.
Calcul Scientifique Initiation à SCILB
Eléments de base du langage C
1 Copyright © 2004, Oracle. Tous droits réservés. Extraire des données à l'aide de l'instruction SQL SELECT.
Bases de données sous Access. Initiation aux bases de données  Structure d’une base de données.
MINISTÈRE DE L’ENSEIGNEMENT SUPÉRIEUR ET DE LA RECHERCHE SCIENTIFIQUE
Les classes et les objets
Sylvie DELAËT 2002 Architecture des machines Bienvenus en Amphi d’Architecture des Machines.
Position, dispersion, forme
RABAH M ed Ali 2018/2019
Opérateurs et fonctions arithmétiques Opérateurs de relation Opérateurs logiques Cours 02.
Flowchart Itération Cours 04.
Principes de programmation (suite)
Chapitre 2 : Représentation de l’information dans la machine Introduction Représentation des nombres négatifs –Signe / valeur absolue –Complément à 1 –Complément.
Eléments de base du langage C
Codification et représentation de l’information Enseignant: Mahseur mohammed Groupe FB: mi2016ua1 Chaine YT: Cours informatique.
DONNÉE DE BASE QM Manuel de formation. Agenda 2  Introduction  Objectif de la formation  Données de base QM: Caractéristique de contrôle Catalogue.
Transcription de la présentation:

Le Langage C Initiation à la programmation Présenté par Ghislain AKINOCHO 02/03/08 1 1

PLAN Généralités Création d’un programme C Historique du langage Création d’un programme C Edition du programme Compilation Edition des liens Bibliothèques de fonctions prédéfinies Les composants d’un programme C 02/03/08 2

I - GENERALITES Historique du langage C Le langage a été crée en 1972 par Denis Ritchie avec un objectif relativement limité : l’écriture d’un système d’exploitation (UNIX). Mais ses qualités opérationnelles l’ont très vite fait adopter par une large communauté de programmeurs. 02/03/08 3 3

I - GENERALITES Historique du langage C Kernighan et Ritchie réalisent une première définition rigoureuse de ce langage en publiant l’ouvrage The C programming Language en 1978. De nombreux compilateurs ont alors vu le jour en se fondant sur cette définition. 02/03/08 4 4

I - GENERALITES Historique du langage C Le succès international du langage à conduit à sa normalisation dans cet ordre : ANSI (American National Standard Institute)‏ ISO (International Standardization Organisation)‏ CEN en 1993 (Comité Européen de Normalisation)‏ 02/03/08 5 5

I - GENERALITES Historique du langage C Fort heureusement, toutes ses normes sont identiques, et l’usage veut qu’on parle de « C ANSI » ou de « C Norme ANSI » 02/03/08 6 6

II – Création d’un programme C La manière de développer et d’utiliser un programme en langage C dépend de l’environnement de programmation dans lequel on travaille. 02/03/08 7 7

II – Création d’un programme C Les grandes étapes de la création d’un programme en langage C (indépendamment de l’environnement) sont : L’édition du programme La compilation L’édition des liens 02/03/08 8 8

II – Création d’un programme C L’édition du programme Elle consiste à créer un texte qu’on nomme : programme source. Il est conservé dans un ou plusieurs fichiers (fichier source). Un fichier, en général peut, en plus de son nom, être caractérisé par un groupe de caractères qu’on appelle : extension ou parfois type 02/03/08 9 9

II – Création d’un programme C L’édition du programme La plupart du temps, en langage C les fichiers sources porteront l’extension C 02/03/08 10 10

II – Création d’un programme C La compilation Elle consiste à traduire le programme source (ou le contenu d’un fichier source) en langage machine en faisant appel à un programme ou logiciel nommé compilateur. Le résultat de cette opération porte le nom de module objet. 02/03/08 11 11

II – Création d’un programme C La compilation En C, la traduction d’un fichier source se déroule en deux étapes totalement indépendantes : Un prétraitement Une compilation proprement dite 02/03/08 12 12

II – Création d’un programme C La compilation Généralement, on parle de préprocesseur pour désigner le programme réalisant le prétraitement. L’étape de prétraitement correspond à une modification du texte du fichier source. 02/03/08 13 13

II – Création d’un programme C La compilation Cette modification est basée essentiellement sur l’interprétation d’instructions particulières dites directives à destination du préprocesseur. Elles sont reconnaissables par le fait qu’elles commencent par le symbole #. 02/03/08 14 14

II – Création d’un programme C La compilation Les deux directives les plus importantes sont : La directive d’inclusion d’autres fichiers sources #include La directive de définition de macros ou de symboles #define 02/03/08 15 15

II – Création d’un programme C La compilation La directive #include est surtout utilisée pour incorporer le contenu de fichiers prédéfinis dits fichiers en-tête, indispensable à la bonne utilisation des fonctions de la bibliothèque standard, la plus connue #include <stdio.h> 02/03/08 16 16

II – Création d’un programme C La compilation La seconde est généralement exploitée par le programmeur dans les définitions de symboles telles que : #define TAILLE_MAX 50 #define NBnotes 30 02/03/08 17 17

II – Création d’un programme C La compilation Bien que formé d’instructions machine, le module objet obtenu après la seconde étape (compilation proprement dite) n’est pas exécutable tel quel car : Il peut lui manquer d’autres modules objets Il lui manque les instructions exécutables des fonctions standard appelées dans le fichier source (par exemple printf, scanf, …)‏ 02/03/08 18 18

II – Création d’un programme C L’édition des liens Le rôle de l’éditeur des liens est précisément de réunir les différents modules objets et y compris ceux des fonctions de la bibliothèque standard afin de constituer un programme exécutable (ensemble autonome d’instructions en langage machine)‏ 02/03/08 19 19

II – Création d’un programme C L’édition des liens Ce programme rangé dans un fichier peut ultérieurement être exécuté sans qu’il soit nécessaire de faire appel à un quelconque composant de l’environnement de programmation. 02/03/08 20 20

III - Les bibliothèques de fonctions prédéfinies Utilisation La pratique en C exige l'utilisation de bibliothèques de fonctions. Ces bibliothèques sont disponibles dans leur forme précompilée (extension: .LIB) Pour pouvoir les utiliser, il faut inclure des fichiers en-tête (header files - extension .H) dans nos programmes 02/03/08 21

III - Les bibliothèques de fonctions prédéfinies Ces fichiers en-têtes contiennent des 'prototypes' des fonctions définies dans les bibliothèques et créent un lien entre les fonctions précompilées et nos programmes. Lors de la programmation en C, nous travaillerons avec différents types de fichiers identifiés par leurs extensions : 02/03/08 22

III - Les bibliothèques de fonctions prédéfinies *.C – fichier source *.OBJ – fichiers compilés (module objet)‏ *.EXE – fichiers compilés et liés (version exécutable)‏ *.LIB – bibliothèque de fonctions précompilées *.H – fichiers en-têtes (header files) 02/03/08 23

EXEMPLE Nous avons écrit un programme qui fait appel à des fonctions mathématiques prédéfinies (sqrt(), pow(,))‏ Pour pouvoir utiliser ces fonctions, le programme a besoin de la bibliothèque maths.lib Il faudrait donc inclure le fichier en-tête correspondant dans le code source du programme à l’aide de l’instruction #include <maths.h> 02/03/08 24

EXEMPLE Après la compilation, les fonctions precompilées des bibliothèques seront ajoutées à notre programme pour former une version exécutable du programme 02/03/08 25

Bibliothèques précompilées Illustration Fichiers en-têtes #include<stdio.h> void main()‏ { …. } maths.h stdio.h Bibliothèques précompilées Génération du module objet .OBJ maths.lib Edition des liens stdio.lib Programme exécutable .EXE 02/03/08 26 26

Premier programme C Programme Hello, World #include <stdio.h> main ()‏ /*Notre premier programme en C */ { printf("Hello, World\n"); return 0; } 02/03/08 27 27

IV – Composants d’un programme C Les programmes en C sont composés essentiellement de fonctions et de variables et donc pour une pratique, il est indispensable de se familiariser avec les caractéristiques fondamentales de ces éléments. 02/03/08 28 28

IV – Composants d’un programme C Les fonctions En C, le programme principal et les sous- programmes sont définis comme fonctions. Il n'existe pas de structures spéciales pour le programme principal ni de procédures (comme en Pascal ou en langage algorithmique). 02/03/08 29 29

IV – Composants d’un programme C Définition d’une fonction en C typeRés NomFonct (typeParam1 Param1, typeParam2 Param2, … )‏ { <Déclarations locales> <instructions> } 02/03/08 30 30

IV – Composants d’un programme C En C, une fonction est définie par : Une ligne déclarative qui contient : typeRés – le type du résultat de la fonction NomFonct – le nom de la fonction typeParam1 Param1 – les types et les noms des paramètres de la fonction. Un bloc d’instructions délimité par des accolades {} 02/03/08 31

IV – Composants d’un programme C Ce bloc d’instructions contient : <déclarations locales> - Les déclarations des données locales (données qui sont uniquement connues et utilisées à l’intérieur de la fonction)‏ <instructions> - La liste d’instructions qui définit les actions qui doivent être exécutées. 02/03/08 32

IV – Composants d’un programme C Résultat d’une fonction Par définition, toute fonction en C fournit un résultat dont le type doit être défini. Le type de résultat par défaut proposé par le C est int. Le retour du résultat se fait en général par l’instruction return Le type d’une fonction qui ne retourne pas de résultats (procédures en algo ou en PAS), est déclaré comme void (vide). 02/03/08 33

IV – Composants d’un programme C Les paramètres d’une fonction La définition des paramètres (arguments) d'une fonction est placée entre parenthèses ( ) derrière le nom de la fonction. Si une fonction n'a pas besoin de paramètres, les parenthèses restent vides ou contiennent le mot void. 02/03/08 34

IV – Composants d’un programme C Les paramètres d’une fonction La fonction minimale qui ne fait rien et qui ne fournit aucun résultat est alors: void rien() {} Instructions En C, toute instruction simple est terminée par un point-virgule ; Par exemple : printf("hello, world\n"); 02/03/08 35

IV – Composants d’un programme C La fonction main C’est la fonction principale des programmes en C. Elle se trouve obligatoirement dans tous les programmes. L’exécution d’un programme entraîne automatiquement l’appel de la fonction main 02/03/08 36

IV – Composants d’un programme C Définition de la fonction main main()‏ { <déclarations> <instructions> return 0; } 02/03/08 37

IV – Composants d’un programme C Résultat de main Tout programme devrait en principe retourner une valeur comme code d’erreur à son environnement. Par conséquent, le type de résultat de main est toujours int. Le type de main peut donc ne pas être déclaré explicitement car c’est le type par défaut. 02/03/08 38

IV – Composants d’un programme C Résultat de main Les programmes se termineront alors par : return 0; qui indique à l’environnement que le programme s’est terminé avec succès, sans anomalies. 02/03/08 39

IV – Composants d’un programme C Les variables Les variables sont des emplacements mémoire portant un nom et dont le contenu est susceptible d’évoluer ou de varier comme son nom l’indique. Ces variables contiennent des valeurs qui sont utilisées pendant l’exécution du programme. 02/03/08 40

IV – Composants d’un programme C Les identificateurs Dans un programme en C, les noms de fonctions et de variables sont composés d’une suite de lettres et de chiffres. Cette suite de caractères est désigné par un nom qu’on appelle identificateur. Le premier caractère doit être une lettre. Le symbole ‘_’ est considéré comme une lettre 02/03/08 41

IV – Composants d’un programme C Les identificateurs L’ensemble des symboles utilisables est donc : {0,1,2,…,9,A,B,…,Z,_,a,b,…,z} C distingue les majuscules des minuscules, ainsi : « Nomvar » est différent de « nomvar » 02/03/08 42

IV – Composants d’un programme C Remarque: Il est déconseillé d'utiliser le symbole '_' comme premier caractère pour un identificateur, car il est souvent employé pour définir les variables globales de l'environment C. 02/03/08 43

IV – Composants d’un programme C Les commentaires Un commentaire commence toujours par les deux symboles '/*' et se termine par les symboles '*/'. Il est interdit d'utiliser des commentaires imbriqués. Exemple /* Ceci est un commentaire correct */ /* Ceci est /* évidemment */ défendu */ 02/03/08 44

Un mot clé ne peut pas être employé comme identificateur!! IV – Composants d’un programme C Les mots-clés Certains mots sont réservés par le langage à un usage bien défini. On les nomme des mots clés. Un mot clé ne peut pas être employé comme identificateur!! 02/03/08 45

IV – Composants d’un programme C Listes des mots clés du langage C classés par ordre alphabétique auto default float register struct volatile break do for return switch while case double goto short typedef char else if signed union const enum int sizeof unsigned continue extern long static void 02/03/08 46

IV – Composants d’un programme C Le format libre Le langage C autorise une mise en page parfaitement libre. En particulier : une instruction peut s’étendre sur un nombre quelconque de lignes une même ligne peut comporter autant d’instructions que voulu. Cette liberté de mise en page peut aboutir si l’on n’y prend garde, à l’édition de programmes illisibles. 02/03/08 47

Retour à l’exemple Hello World!! La fonction main ne reçoit pas de données, donc la liste des paramètres est vide. La fonction main fournit un code d'erreur numérique à l'environnement, donc le type du résultat est int et n'a pas besoin d'être déclaré explicitement. Le programme ne contient pas de variables, donc le bloc de déclarations est vide. 02/03/08 48

Retour à l’exemple Hello World!! La fonction main contient deux instructions: l'appel de la fonction printf avec l'argument "hello, world\n"; Effet: Afficher la chaîne de caractères hello world\n. la commande return avec l'argument 0; Effet: Retourner la valeur 0 comme code d'erreur à l'environnement. 02/03/08 49

Retour à l’exemple Hello World!! La suite de symboles '\n' à la fin de la chaîne de caractères "hello, world\n" est la notation C pour 'passage à la ligne' (angl: new line). En C, il existe plusieurs couples de symboles qui contrôlent l'affichage ou l'impression de texte. 02/03/08 50

Retour à l’exemple Hello World!! Ces séquences d'échappement sont toujours précédées par le caractère d'échappement '\' et correspondent aux caractères dits non- imprimables (\, ′, ″) . Exemples : \\ \′ \″ 02/03/08 51

Retour à l’exemple Hello World!! printf et la bibliothèque <stdio> La fonction printf fait partie de la bibliothèque de fonctions standard <stdio> qui gère les entrées et les sorties de données. La première ligne du programme: #include <stdio.h> instruit le compilateur d'inclure le fichier en-tête 'stdio.h' dans le texte du programme. 02/03/08 52

V - LES TYPES DE BASE La manipulation d’une information fait intervenir la notion de type, c’est-à-dire la manière dont elle est codée en mémoire. La connaissance de ce type est nécessaire pour la plupart des opérations qu’on souhaite lui faire subir On distingue les types simples dans lesquels une information est caractérisée, à un instant par une seule valeur. 02/03/08 53

V - LES TYPES DE BASE Les types entiers Les types agrégés dans lesquels, une information est carctérisée par un ensemble de valeurs. Les types entiers La norme ANSI prévoit six types entiers différents caractérisés par deux paramètres : La taille de l’emplacement mémoire utilisé pour les représenter Un attribut précisant s’ils sont signés ou pas 02/03/08 54

V - LES TYPES DE BASE Types entiers (2/6)‏ Entier court signé short short int signed short signed short int 2o -32 767 à +32 767 codé sur 16bits Entier court non signé unsigned short unsigned short int 0 à 65 535 02/03/08 55

V - LES TYPES DE BASE Types entiers (4/6)‏ Entier signé int signed int 2o -32 767 à +32 767 codé sur 16bits Entier non signé unsigned int unsigned 0 à 65 535 02/03/08 56

V - LES TYPES DE BASE Types entiers (6/6)‏ Entier long signé long long int signed long signed long int 4o -2 147 483 647 à +2 147 483 647 codé sur 32bits Entier long non signé unsigned long unsigned long int 0 à 4 294 967 295 02/03/08 57

V - LES TYPES DE BASE Notation des constantes entières Décimale Notation usuelle d’un nombre entier avec ou sans signe 345 +78 -456 Octale Notation en base 8 012 équivalent à 10 en décimal Hexadécimale Notation en base 16 0x1A equivalent 26 en décimal 02/03/08 58

V - LES TYPES DE BASE Les types caractères Le langage C dispose de deux types caractères, l’un signé, l’autre non signé unsigned char 1o 0 à 255 (char)‏ signed char 1o -127 à +127 (char) 02/03/08 59

V - LES TYPES DE BASE Une variable de type char peut être définie au choix, comme : Un nombre entier pouvant représenter n’importe quel caractère du jeu de caractères de la machine utilisée; Un nombre entier occupant la plus petite cellule mémoire adressable. Sur les machines actuelles les plus répandues, cela signifie généralement un octet (8bits). 02/03/08 60

V - LES TYPES DE BASE Notion de constantes caractères Les constantes de type « caractère »  correspondant aux caractères imprimables : ′a′ ′U′ ′+′ ′ %′  correspondant aux caractères non imprimables (\, ′, ″,?) \\ \′ \? \″ 02/03/08 61

Caractères disposant d’une notation spéciale Notation en C Code ASCII (hexadécimal)‏ Abréviation usuelle Signification \ a 07 BEL Cloche ou bip \ b 08 BS Retour arrière (Backspace)‏ \ f 0C FF Saut de page \ n 0A LF Saut de ligne \ r 0D CR Retour charriot \ t 09 HT Tabulation horizontal \ v 0B VT Tabulation verticale \ \ 5C \ \ ′ 2C ′ \ ″ 22 ″ \ ? 3F ? 02/03/08 62

V - LES TYPES DE BASE Les types flottants Ils permettent de représenter, de manière approchée, une partie des nombres réels. Pour ce faire, ils s’inspirent de la notation scientifique qui consiste à écrire un nombre sous la forme 1.5 1022 ; dans cette notation, l’expression 1.5 est la mantisse et 22 l’exposant. En C, nous avons le choix entre trois types de rationnels : float, double et long double 02/03/08 63

V - LES TYPES DE BASE Les types flottants float 6 3.4e-38 3.4e+38 4octets double 15 1.7e-308 1.7e+308 8octets Long double 19 <+/-> 63.4e-4932 <+/-> 3.4e+4932 10 octets 02/03/08 64

V - LES TYPES DE BASE Les types flottants Comme dans la plupart des langages, les constantes peuvent s’écrire indifféremment suivant l’une des deux notations (décimale et exponentielle)‏ La notation décimale Elle comporte obligatoirement un point (qui joue le rôle de notre virgule)‏ la partie entière ou décimale peut être omise 12.4 -0.67 -.54 4. .87 02/03/08 65

V - LES TYPES DE BASE Les types flottants La notation exponentielle Elle utilise la lettre e (ou E) pour introduire un exposant entier (puissance de 10) avec ou sans signe. La mantisse peut être n’importe quel nombre décimal ou entier (le point peut être absent dès qu’on utilise un exposant)‏ 02/03/08 66

V - LES TYPES DE BASE Les types flottants Exemples : 4.25E4 4.25e+4 42.5E3 54.27E-32 542.7E-33 5427e-34 48e13 48.e13 48.0E13 02/03/08 67

V - LES TYPES DE BASE Le type booléen En C il n'existe pas de type spécial pour variables booléennes. Tous les types de variables numériques peuvent être utilisés pour exprimer des opérations logiques: valeur logique faux  valeur numérique zéro valeur logique vrai  toute valeur différente de zéro 02/03/08 68

V - LES TYPES DE BASE Déclaration de variables simples En C <type> <NomVar1>,< NomVar2>, … ,<NomVarN> Exemples : int compteur,X,Y; long AL; float hauteur,largeur,moyenne; double masse_atomique; char touche; int t_pressee; 02/03/08 69 69

V - LES TYPES DE BASE Initialisation des variables Initialisation En C, il est possible d’initialiser les variables lors de leur déclaration : int MAX = 1023; char TAB = '\t'; float x = 1.05e-4; 02/03/08 70

V - LES TYPES DE BASE const En utilisant l’attribut const, nous pouvons indiquer que la valeur d’une variable ne change pas au cours d’un programme : const int MAX = 767; const float PI = 3.14; const double e = 2.718281828459; const char NEWLINE = '\n'; 02/03/08 71

VI– OPERATEURS / EXPRESSIONS Les opérateurs binaires et unaires Les opérateurs binaires (portant sur deux opérandes) sont : L’addition (+)‏ La multiplication (*)‏ La soustraction (-)‏ La division (/) (entière et rationnelle!) Le modulo (%) (reste d'une div. entière) 02/03/08 72

VI– OPERATEURS / EXPRESSIONS Les opérateurs unaires (portant sur une opérande) sont : ++ et -- En dehors de toute affectation elle incrémente l’opérande associée, par exemple : i++; et ++i; sont équivalents à i = i + 1; Lorsqu’ils sont utilisés dans une affectation tout dépend de la position de l’opérateur par rapport à l’opérande, par exemple : 02/03/08 73

VI– OPERATEURS / EXPRESSIONS j = i++; est équivalent à j = i; et i = i+1; j = ++i; est équivalent à i = i+1; et j = i; 02/03/08 74

VI– OPERATEURS / EXPRESSIONS Les opérateurs logiques && et logique (and)‏ || ou logique (or)‏ ! non logique (not)‏ 02/03/08 75

VI– OPERATEURS / EXPRESSIONS Opérateurs de comparaison == égal à != différent de <,<=,>,>= inférieur à, … 02/03/08 76

VI– OPERATEURS / EXPRESSIONS Opérations logiques Les opérateurs logiques considèrent toute valeur différente de zéro comme vrai et égale à zéro comme faux 1 && 9 1 !78.89 0 0||!(32 > 12) 0 02/03/08 77

VI– OPERATEURS / EXPRESSIONS Les opérateurs d’affectation En C, les affectations se traduisent par l’opérateur « = » Exemple i = 6; Affectation de 6 à la variable i. Une affectation telle que i = i + 4; peut se traduire par une formulation plus compacte : i += 4; 02/03/08 78

VI– OPERATEURS / EXPRESSIONS Pour la plupart des expressions de la forme : expr1 = (expr1) op (expr2)‏ Il existe une formulation équivalente : expr1 op= expr2 Exemple : i = i/4; est équivalent à i /= 4; i = i%2; est équivalent à i %= 2; 02/03/08 79

VI– OPERATEURS / EXPRESSIONS Conversions implicites Les opérateurs arithmétiques n’étant définis que lorsque les deux opérandes sont de même type, il est cependant possible de faire intervenir dans une expression des opérandes de types différents (« expression mixte »)‏ 02/03/08 80

VI– OPERATEURS / EXPRESSIONS Exemple int n, p; float x ; n * x + p; Compte tenu des règles de priorité, le compilateur doit d’abord effectuer le produit n * x. Pour que cela soit, il effectuera une conversion de la valeur de n dans le float. La multiplication portera alors sur deux opérandes de type float et fournira un résultat de type float. 02/03/08 81

VI– OPERATEURS / EXPRESSIONS Exemple int n, p; float x ; n * x + p; Pour l’addition, on se retrouve à nouveau dans la même situation (float + int). Le même mécanisme de conversion est mis en place et le résultat final est un float. 02/03/08 82

VI– OPERATEURS / EXPRESSIONS La formation des expressions est définie par recurrence : Les constantes et les variables sont des expressions. Les expressions peuvent être combinées entre elles par des opérateurs et former ainsi des expressions plus complexes. Les expressions peuvent contenir des appels de fonctions et peuvent apparaître comme paramètres dans les appels de fonctions. 02/03/08 83

VI– OPERATEURS / EXPRESSIONS Exemples i=0 i++ X=pow(A,4) printf(" Bonjour !\n") a=(5*x+10*y)*2 (a+b)>=100 position!=limite 02/03/08 84

VI– OPERATEURS / EXPRESSIONS Instructions Une expression comme : i=0 ou i++ ou X=pow(A,4) devient une instruction, si elle est suivie d’un point-virgule. 02/03/08 85

VI– OPERATEURS / EXPRESSIONS Exemples i=0; i++; X=pow(A,4); printf(" Bonjour !\n"); a=(5*x+10*y)*2; (a+b)>=100; position!=limite; 02/03/08 86

VII – LIRE ET ECRIRE DES DONNEES La bibliothèque standard <stdio> contient un ensemble de fonctions qui assurent la communication de la machine avec le monde extérieur. Les principales sont : printf() écriture formatée des données scanf() lecture formatée des données putchar() écriture d’un caractère getchar() lecture d’un caractère 02/03/08 87

VII – LIRE ET ECRIRE DES DONNEES printf()‏ La fonction printf est utilisée pour transférer du texte, des valeurs de variables ou des résultats d'expressions vers le fichier de sortie standard stdout (par défaut l'écran). Ecriture formatée en C printf("<format>",<Expr1>,<Expr2>, ... )‏ <format> : format de représentation <Expr1>,…: variables et expressions dont les valeurs sont à représenter 02/03/08 88

VII – LIRE ET ECRIRE DES DONNEES printf()‏ La partie <format> est en fait une chaîne de caractères qui peut contenir : du texte des séquences d’échappement (\n , \t, \’)‏ des spécificateurs de format Ils indiquent comment la manière dont les valeurs des expressions <Expr1 … N> sont imprimées. (Un spécificateur de format pour chaque exppression <Expr1 … N> )‏ Ils commencent toujours par le symbole % et se terminent par un ou deux caractères qui indiquent le format d'impression. 02/03/08 89

VII – LIRE ET ECRIRE DES DONNEES Exemple : La suite d’instructions int a = 12; int b = 4; printf("%d fois %d est %d\n", a, b, a*b); va afficher à l’écran 12 fois 4 est 48 02/03/08 90

VII – LIRE ET ECRIRE DES DONNEES Quelques spécificateurs de format pour printf SYMBOLE TYPE IMPRESSION COMME %d %i int entier relatif %o int entier en octal %x int entier en Hexa %c char caractère %f float réel 02/03/08 91

VII – LIRE ET ECRIRE DES DONNEES scanf()‏ La fonction scanf est la fonction symétrique à printf; elle nous offre pratiquement les mêmes conversions que printf, mais en sens inverse. Lecture formatée en langage algorithmique lire <NomVariable1>,<NomVariable2>, ... Lecture formatée en C scanf("<format>",<AdrVar1>,<AdrVar2>, ...) "<format>" : format de lecture des données <AdrVar1>,... : adresses des variables auxquelles les données seront attribuées 02/03/08 92

VII – LIRE ET ECRIRE DES DONNEES La fonction scanf reçoit ses données à partir du fichier d'entrée standard stdin (par défaut le clavier). * La chaîne de format détermine comment les données reçues doivent être interprétées. * Les données reçues correctement sont mémorisées successivement aux adresses indiquées par <AdrVar1>,... . * L'adresse d'une variable est indiquée par le nom de la variable précédé du signe &. 02/03/08 93

VII – LIRE ET ECRIRE DES DONNEES La suite d'instructions: int JOUR, MOIS, ANNEE; scanf("%i %i %i", &JOUR, &MOIS, &ANNEE); lit trois entiers relatifs, séparés par des espaces, tabulations ou interlignes. Les valeurs sont attribuées respectivement aux trois variables JOUR, MOIS et ANNEE. 02/03/08 94

VII – LIRE ET ECRIRE DES DONNEES Ecriture d’un caractère La commande, putchar('a'); transfère le caractère a vers le fichier standard de sortie stdout. Les arguments de la fonction putchar sont généralement des caractères (c.-à- d. des nombres entiers entre 0 et 255)‏ 02/03/08 95

VII – LIRE ET ECRIRE DES DONNEES Exemples char A = 225; char B = '\a'; int C = '\a'; putchar('x'); /* afficher la lettre x */ putchar('?'); /* afficher le symbole ? */ putchar('\n'); /* retour à la ligne */ putchar(65); /* afficher le symbole avec le code 65 (ASCII: 'A') */ putchar(A); /*afficher la lettre avec le code 225 (ASCII:'ß') */ putchar(B); /* beep sonore */ putchar(C); /* beep sonore */ 02/03/08 96

VII – LIRE ET ECRIRE DES DONNEES Lecture d’un caractère Une fonction plus souvent utilisée que putchar est la fonction getchar, qui lit le prochain caractère du fichier d'entrée standard stdin. Type du résultat Les valeurs retournées par getchar sont généralement des caractères (0 - 255), le type résultat de getchar est int. En général, getchar est utilisé dans une affectation: int C; C = getchar(); 02/03/08 97

VIII – LA STRUCTURE ITERATIVE Les structures de contrôle définissent la suite dans laquelle les instructions sont effectuées. Constatons déjà que la particularité la plus importante des instructions de contrôle en C est le fait que les 'conditions' en C peuvent être des expressions quelconques qui fournissent un résultat numérique. La valeur zéro correspond à la valeur logique faux et toute valeur différente de zéro est considérée comme vrai. 02/03/08 98

VIII – LA STRUCTURE ITERATIVE if – else La structure alternative en langage algorithmique si (<expression logique>) alors <bloc d'instructions 1> sinon <bloc d'instructions 2> fsi Si l'<expression logique> fournit une valeur différente de zéro, alors le <bloc d'instructions 1> est exécuté Si l'<expression logique> fournit la valeur zéro, alors le <bloc d'instructions 2> est exécuté 02/03/08 99

VIII – LA STRUCTURE ITERATIVE La structure alternative en C if ( <expression> ) <bloc d'instructions 1> else <bloc d'instructions 2> Si l'<expression> fournit une valeur différente de zéro, alors le <bloc d'instructions 1> est exécuté Si l'<expression> fournit la valeur zéro, alors le <bloc d'instructions 2> est exécuté 02/03/08 100

VIII – LA STRUCTURE ITERATIVE Exemples if (a > b) max = a; else max = b; if (EGAL) printf("A est égal à B\n"); printf("A est différent de B\n"); 02/03/08 101

VIII – LA STRUCTURE ITERATIVE Les opérateurs conditionnels Le langage C possède une paire d'opérateurs un peu exotiques qui peut être utilisée comme alternative à if - else et qui a l'avantage de pouvoir être intégrée dans une expression: <expr1> ? <expr2> : <expr3> Si <expr1> fournit une valeur différente de zéro, alors la valeur de <expr2> est fournie comme résultat Si <expr1> fournit la valeur zéro, alors la valeur de <expr3> est fournie comme résultat 02/03/08 102

VIII – LA STRUCTURE ITERATIVE Exemple La suite d'instructions if (A>B) MAX=A; else MAX=B; peut être remplacée par MAX = (A > B) ? A : B; 02/03/08 103

IX – LA STRUCTURE REPETITIVE En C, nous disposons de trois structures qui nous permettent la définition de boucles conditionnelles: la structure : while la structure : do – while la structure : for Théoriquement, ces structures sont interchangeables, c.- à-d. il serait possible de programmer toutes sortes de boucles conditionnelles en n'utilisant qu'une seule des trois structures. 02/03/08 104

IX – LA STRUCTURE REPETITIVE while La structure while correspond tout à fait à la structure tant que du langage algorithmique. La structure tant que en langage algorithmique tant que (<expression logique>) faire <bloc d'instructions> ftq Tant que l'<expression logique> fournit la valeur vrai, le <bloc d'instructions> est exécuté. Si l'<expression logique> fournit la valeur faux, l'exécution continue avec l'instruction qui suit ftant. Le <bloc d'instructions> est exécuté zéro ou plusieurs fois. 02/03/08 105

IX – LA STRUCTURE REPETITIVE La structure while en C while ( <expression> )‏{ <bloc d'instructions> } Tant que l'<expression> fournit une valeur différente de zéro, le <bloc d'instructions> est exécuté. Si l'<expression> fournit la valeur zéro, l'exécution continue avec l'instruction qui suit le bloc d'instructions. Le <bloc d'instructions> est exécuté zéro ou plusieurs fois. 02/03/08 106

IX – LA STRUCTURE REPETITIVE Exemple 1 /* Afficher les nombres de 0 à 9 */ int I = 0; while (I<10) { printf("%i \n", I); I++; } 02/03/08 107

IX – LA STRUCTURE REPETITIVE do – while La structure do - while est semblable à la structure while, avec la différence suivante : while évalue la condition avant d'exécuter le bloc d'instructions, do - while évalue la condition après avoir exécuté le bloc d'instructions. Ainsi le bloc d'instructions est exécuté au moins une fois. 02/03/08 108

IX – LA STRUCTURE REPETITIVE La structure do - while en C do { <bloc d'instructions> } while ( <expression> ); Le <bloc d'instructions> est exécuté au moins une fois et aussi longtemps que l'<expression> fournit une valeur différente de zéro. En pratique, la structure do - while n'est pas si fréquente que while; mais dans certains cas, elle fournit une solution plus élégante. Une application typique de do - while est la saisie de données qui doivent remplir une certaine condition. 02/03/08 109

IX – LA STRUCTURE REPETITIVE Exemple 1 float N; do { printf("Donnez un nombre entre 1 et 10 :"); scanf("%f", &N); } while (N<1 || N>10); 02/03/08 110

IX – LA STRUCTURE REPETITIVE for La structure for en Pascal et la structure pour en langage algorithmique sont utilisées pour faciliter la programmation de boucles de comptage. La structure for en C est plus générale et beaucoup plus puissante. 02/03/08 111

IX – LA STRUCTURE REPETITIVE La structure for en C for ( <expr1> ; <expr2> ; <expr3> ) <bloc d'instructions> est équivalent à : <expr1>; while ( <expr2> ) { <expr3>; } 02/03/08 112

IX – LA STRUCTURE REPETITIVE <expr1> est évaluée une fois avant le passage de la boucle. Elle est utilisée pour initialiser les données de la boucle. <expr2> est évaluée avant chaque passage de la boucle. Elle est utilisée pour décider si la boucle est répétée ou non. <expr3> est évaluée à la fin de chaque passage de la boucle. Elle est utilisée pour réinitialiser les données de la boucle. Le plus souvent, for est utilisé comme boucle de comptage : for ( <init.> ; <cond. répétition> ; <compteur> ) <bloc d'instructions> 02/03/08 113

IX – LA STRUCTURE REPETITIVE Exemple int I; for (I=0 ; I<=20 ; I++) printf("Le carré de %d est %d \n", I, I*I); En pratique, les parties <expr1> et <expr2> contiennent souvent plusieurs initialisations ou réinitialisations, séparées par des virgules. 02/03/08 114

IX – LA STRUCTURE REPETITIVE Exemple int n, tot; for (tot=0, n=1 ; n<101 ; n++) tot+=n; printf("La somme des nombres de 1 à 100 est %d\n", tot); 02/03/08 115

IX – LA STRUCTURE REPETITIVE Choix de la structure répétitive Si le bloc d'instructions ne doit pas être exécuté si la condition est fausse, alors utilisez while ou for. Si le bloc d'instructions doit être exécuté au moins une fois, alors utilisez do - while. Si le nombre d'exécutions du bloc d'instructions dépend d'une ou de plusieurs variables qui sont modifiées à la fin de chaque répétition, alors utilisez for. 02/03/08 116

X – LES TABLEAUX Les tableaux à une dimension Un tableau (uni-dimensionnel) est un ensemble d’éléments de même type désignés par un identificateur unique : Chaque élément est repéré par un indice précisant sa position au sein de l’ensemble tab 1 2 3 4 5 25 -2 36 -21 21 02/03/08 117

X – LES TABLEAUX Exemple La déclaration int mois[12]={31,28,30,31,30,31,30,31,30,31,30,31} définit un tableau de type int de dimension 12. Les douze composantes sont initialisées par les valeurs 31,28 ... , 30,31. On peut accéder à la première composante du tableau par mois[0], à la deuxième par mois[1],..., à la dernière par mois[11] 02/03/08 118

X – LES TABLEAUX Initialisation et réservation automatique L'Initialisation Lors de la déclaration d'un tableau, on peut initialiser ses composantes en indiquant la liste des valeurs respectives entre accolades. Exemples : int A[5] = {10,7,9,0,6}; float B[3] = {13.50,7.00,12.4}; Il faut veiller à ce que le nombre de valeurs dans la liste corresponde à la dimension du tableau. Si la liste ne contient pas assez de valeurs pour toutes les composantes, les composantes restantes sont initialisées à 0.

X – LES TABLEAUX Initialisation et réservation automatique La réservation automatique Si la dimension du tableau n'est pas indiquée explicitement lors de l'initialisation, alors l'ordinateur réserve automatiquement le nombre d'octets nécéssaires. Exemples : Int A[] = {10,20,30,40,50}; Réservation de 5*sizeof(int) octets (dans notre cas : 10)‏

X – LES TABLEAUX Initialisation et réservation automatique La réservation automatique Exemples : int B[5] = {12,23,43,34,21}; B : 12 | 23 | 43 | 34 | 21 int A[5] = {10,20,30}; A : 10 | 20 | 30 | 0 | 0 int C[3] = {12,13,14,15,16}; ERREUR !!

X – LES TABLEAUX Accès aux composantes d’un tableau Considérons un tableau T de dimension N: En langage algorithmique, l'accès au premier élément du tableau se fait par T[1] l'accès au dernier élément du tableau se fait par T[N] En C, l'accès au premier élément du tableau se fait par T[0] l'accès au dernier élément du tableau se fait par T[N-1] 02/03/08 122

X – LES TABLEAUX Affectation avec des valeurs provenant de l'extérieur main()‏ { int A[5]; int i; /* Compteur */ for(i=0;i<5;i++)‏ scanf("%d ", &A[i]); return 0; }

X – LES TABLEAUX Remarques Comme scanf a besoin des adresses des différentes composantes du tableau, il faut faire précéder le terme A[i] par l'opérateur adresse '&'. La commande de lecture scanf doit être informée du type exact des données à lire.(Ici: %d ou %i pour lire des valeurs du type int)

X – LES TABLEAUX Affichage du contenu d'un tableau main()‏ { int A[5]; int i; /* Compteur */ for(i=0;i<5;i++)‏ printf("%d ", A[i]); return 0; }

X – LES TABLEAUX Les tableaux à deux dimensions Un tableau 2D est un tableau de L lignes et C colonnes Tab ...... ... L lignes C colonnes 02/03/08 126

X – LES TABLEAUX Exemple Considérons un tableau NOTES à une dimension pour mémoriser les notes de 20 élèves d'une classe dans un devoir: int NOTE[20] = {15, 14, ... , 16, 11}; Pour mémoriser les notes des élèves dans les 10 devoirs, il faut rassembler plusieurs de ces tableaux uni-dimensionnels dans un tableau NOTES à deux dimensions : 1 ... 18 19 NOTES 15 14 16 11 02/03/08 127

X – LES TABLEAUX On obtient alors : int NOTE[10][20] = {{15,14, ... ,16,11}, {19,14, ... ,9,15}, ... ... ... {10,10, ... ,14,14}}; NOTES 15 14 ...... 16 11 19 9 ... 10 Sur une ligne nous retrouvons les notes de tous les élèves dans un devoir. Sur une colonne, nous retrouvons toutes les notes d'un élève. 10 lignes 20 colonnes 02/03/08 128

X – LES TABLEAUX Affectation et Affichage Accès en lecture En algo Accès en lecture Afficher(NOTES [1,3])‏ { La note contenue en ligne 1 colonne 3 est affichée à l’écran} Accès en écriture NOTES[2,4]  36 lire(NOTES[2,4])‏ { La valeur fournie est enrégistré en ligne 2 colonne 4} 02/03/08 129

X – LES TABLEAUX Affectation et Affichage Accès en lecture En C Accès en lecture printf("%d",NOTES[0][2]); { La note contenue en ligne 1 colonne 3 est affichée à l’écran} Accès en écriture NOTES[1][3] = 36; scanf("%d",&NOTES[1][3]); { La valeur fournie est enrégistré en ligne 2 colonne 4} 02/03/08 130

XI – LES CHAINES DE CARACTERES Il n'existe pas de type spécial chaîne ou string en C. Une chaîne de caractères est traitée comme un tableau à une dimension de caractères. Il existe quand même des notations particulières et une bonne quantité de fonctions spéciales pour le traitement de tableaux de caractères. 02/03/08 131

XI – LES CHAINES DE CARACTERES Déclaration de chaînes de caractères en C char <NomVariable> [<Longueur>]; Exemples char NOM [20]; char PRENOM [20]; char PHRASE [300]; 02/03/08 132

XI – LES CHAINES DE CARACTERES Espace à réserver Lors de la déclaration, nous devons indiquer l'espace à réserver en mémoire pour le stockage de la chaîne. La représentation interne d'une chaîne de caractères est terminée par le symbole '\0' . Ainsi, pour un texte de n caractères, nous devons prévoir n+1 octets. Malheureusement, le compilateur C ne contrôle pas si nous avons réservé un octet pour le symbole de fin de chaîne; l'erreur se fera seulement remarquer lors de l'exécution du programme ... 02/03/08 133

XI – LES CHAINES DE CARACTERES Mémorisation d’un tableau de caractères char TXT[10] = "BONJOUR !"; .. 'B' 'O' 'N' 'J' 'U' 'R' ' ' '!' '\0' ... Adresse: 2A0 2A1 2A2 2A3 2A4 2A5 2A6 2A7 2A8 2A9 2AA 02/03/08 134

XI – LES CHAINES DE CARACTERES Observation Pour la mémorisation de la chaîne de caractères "BONJOUR !", C a besoin de dix (!!) octets. 'a' est un caractère constant, qui a une valeur numérique: P.ex: 'a' a la valeur 97 dans le code ASCII. "a" est un tableau de caractères qui contient deux caractères: la lettre 'a' et le caractère NUL: '\0' 'x' est codé dans un octet "x" est codé dans deux octets

XI – LES CHAINES DE CARACTERES Manipulation des chaînes de caractères Les bibliothèques de fonctions de C contiennent une série de fonctions spéciales pour le traitement de chaînes de caractères. Nous verrons comment utiliser quelques unes d’entre elles en TP!! 02/03/08 136

XII – LES POINTEURS Lorsque l’on déclare une variable, par exemple un entier i, l’ordinateur réserve un espace mémoire pour y stocker les valeurs de i L’emplacement de cet espace dans la mémoire est nommé adresse Un pointeur est tout simplement une variable spéciale qui permet de stocker l’adresse d’une autre variable Par exemple si nous déclarons une variable entière i (inialisée à 10) et que l’on déclare un pointeur p dans lequel on range l’adresse de i (on dit que p pointe sur i ), on a par exemple le schema suivant : nom de variable i p mémoire : … 10 124 adresse : 226 02/03/08 137

XII – LES POINTEURS Remarques Si un pointeur P contient l'adresse d'une variable A, on dit que 'P pointe sur A'. Les pointeurs et les noms de variables ont le même rôle: Ils donnent accès à un emplacement dans la mémoire interne de l'ordinateur. Il faut quand même bien faire la différence: Un pointeur est une variable qui peut 'pointer' sur différentes adresses. Le nom d'une variable reste toujours lié à la même adresse. 02/03/08 138

XII – LES POINTEURS Les opérateurs principaux La manipulation des pointeurs en C requiert : L’opérateur & dit « adresse de » : pour obtenir l’adresse d’une variable L’opérateur * dit «  contenu de » : pour obtenir le contenu d’une adresse L'opérateur 'adresse de' : & &<NomVariable> fournit l'adresse de la variable <NomVariable> L'opérateur 'contenu de' : * *<NomPointeur> désigne le contenu de l'adresse référencée par le pointeur <NomPointeur> 02/03/08 139

XII – LES POINTEURS Déclaration d'un pointeur <Type> *<NomPointeur> déclare un pointeur <NomPointeur> qui peut recevoir des adresses de variables du type <Type> int *PtrNum; peut être interprétée comme suit: "*PtrNum est du type int" ou "PtrNum est un pointeur sur int" ou "PtrNum peut contenir l'adresse d'une variable du type int" 02/03/08 140

XII – LES POINTEURS Remarque Lors de la déclaration d'un pointeur en C, ce pointeur est lié explicitement à un type de données. Ainsi, la variable PtrNum déclarée comme pointeur sur int ne peut pas recevoir l'adresse d'une variable d'un autre type que int. 02/03/08 141

XII – LES POINTEURS Exemple : main (){ int n,m; int *p; /* déclaration d’une variable de type pointeur sur un entier */ n = 20; m = 10; p = &n;/*p pointe sur n ou p reçoit l’adresse de n */ *p = m; return 0; } 02/03/08 142

XII – LES POINTEURS Pointeurs et Tableaux le nom d'un tableau est un pointeur constant sur le premier élément du tableau. En d'autre termes: &tableau[0]et tableau sont une seule et même adresse. En déclarant un tableau A de type int et un pointeur P sur int, int A[10]; int *P; l'instruction: P = A; est équivalente à P = &A[0]; 02/03/08 143

XII – LES POINTEURS Si P pointe sur une composante quelconque d'un tableau, alors P+1 pointe sur la composante suivante. Plus généralement, P+i pointe sur la i-ième composante derrière P et P-i pointe sur la i-ième composante devant P. 02/03/08 144

XII – LES POINTEURS Ainsi, après l'instruction, P = A; le pointeur P pointe sur A[0], et *(P+1) désigne le contenu de A[1] *(P+2) désigne le contenu de A[2] ... ... *(P+i) désigne le contenu de A[i] 02/03/08 145

XII – LES POINTEURS Pointeurs et chaînes de caractères De la même façon qu'un pointeur sur int peut contenir l'adresse d'un nombre isolé ou d'une composante d'un tableau, un pointeur sur char peut pointer sur un caractère isolé ou sur les éléments d'un tableau de caractères. Un pointeur sur char peut en plus contenir l'adresse d'une chaîne de caractères constante et il peut même être initialisé avec une telle adresse. 02/03/08 146

XII – LES POINTEURS Affectation On peut attribuer l'adresse d'une chaîne de caractères constante à un pointeur sur char: Exemple char *C; C = "Chaine de caractères constante"; Nous pouvons lire cette chaîne constante (p.ex: pour l'afficher), mais il n'est pas recommandé de la modifier, parce que le résultat d'un programme qui essaie de modifier une chaîne de caractères constante n'est pas prévisible en ANSI-C. 02/03/08 147

XII – LES POINTEURS char A[ ] = "Bonjour !"; /* un tableau */ char *B = "Bonjour !"; /* un pointeur */ A est un tableau qui a exactement la grandeur pour contenir la chaîne de caractères et la terminaison '\0'. Les caractères de la chaîne peuvent être changés, mais le nom A va toujours pointer sur la même adresse en mémoire. B est un pointeur qui est initialisé de façon à ce qu'il pointe sur une chaîne de caractères constante stockée quelque part en mémoire. Le pointeur peut être modifié et pointer sur autre chose. La chaîne constante peut être lue, copiée ou affichée, mais pas modifiée. 02/03/08 148

XII – LES POINTEURS Conclusions Utilisons des tableaux de caractères pour déclarer les chaînes de caractères que nous voulons modifier. Utilisons des pointeurs sur char pour manipuler des chaînes de caractères constantes (dont le contenu ne change pas). Utilisons de préférence des pointeurs pour effectuer les manipulations à l'intérieur des tableaux de caractères. (voir aussi les remarques ci-dessous). 02/03/08 149

XIII – LES FONCTIONS Le langage C permet de découper un programme en plusieurs parties nommées souvent « fonctions ». Cela se justifie par le fait que : Un programme écrit d’un seul tenant devient difficile à comprendre dès qu’il atteint plus de deux pages de texte. Une écriture modulaire permet de le scinder en plusieurs parties. Chacune de ces parties peut également être décomposée, si nécessaire, en module plus élémentaires. L’on évite les séquences d’instructions répétitives 02/03/08 150

XIII – LES FONCTIONS Elle permet le partage d’outils communs qu’il suffit d’avoir écrits et mis au point une seule fois On définit une fonction en respectant la syntaxe suivante : typeRés NomFonct (typeParam1 Param1, typeParam2 Param2, … )‏ { <Déclarations locales> <instructions> } Par exemple : int plusUn (int a) { return a+1 ; 02/03/08 151

XIII – LES FONCTIONS Déclaration et définition de fonctions En général, le nom d'une fonction apparaît à trois endroits dans un programme: lors de la définition lors de la déclaration lors de l'appel 02/03/08 152

XIII – LES FONCTIONS Définition Dans la définition d'une fonction, nous indiquons: le nom de la fonction le type, le nombre et les noms des paramètres de la fonction le type du résultat fourni par la fonction les données locales à la fonction les instructions à exécuter 02/03/08 153

XIII – LES FONCTIONS Formalisme typeRés NomFonct (typeParam1 Param1, { <Déclarations locales> <instructions> } 02/03/08 154

XIII – LES FONCTIONS Déclaration En C, il faut déclarer chaque fonction avant de pouvoir l'utiliser. La déclaration informe le compilateur du type des paramètres et du résultat de la fonction. A l'aide de ces données, le compilateur peut contrôler si le nombre et le type des paramètres d'une fonction sont corrects. Si dans le texte du programme la fonction est définie avant son premier appel, elle n'a pas besoin d'être déclarée. 02/03/08 155

XIII – LES FONCTIONS Notion de prototype La déclaration d'une fonction se fait par un prototype de la fonction qui indique uniquement le type des données transmises et reçues par la fonction. Déclaration : Prototype d'une fonction <TypeRés> <NomFonct> (<TypePar1>, <TypePar2>, ...); ou <TypeRés> <NomFonct> (<TypePar1> <NomPar1>, <TypePar2> <NomPar2>, ... ); 02/03/08 156

XIII – LES FONCTIONS Renvoyer un résultat Par définition, toutes les fonctions fournissent un résultat d'un type que nous devons déclarer. Une fonction peut renvoyer une valeur d'un type simple ou l'adresse d'une variable ou d'un tableau. Pour fournir un résultat en quittant une fonction, nous disposons de la commande return: 02/03/08 157

XIII – LES FONCTIONS L'instruction return <expression>; a les effets suivants: conversion automatique du résultat de l'expression dans le type de la fonction renvoi du résultat terminaison de la fonction 02/03/08 158

XIII – LES FONCTIONS Exemples La fonction CARRE du type double calcule et fournit comme résultat le carré d'un réel fourni comme paramètre. double CARRE(double X) { return X*X; } 02/03/08 159

XIII – LES FONCTIONS Paramètres d’une fonction En C, le passage des paramètres se fait toujours par la valeur, c.-à-d. les fonctions n'obtiennent que les valeurs de leurs paramètres et n'ont pas d'accès aux variables elles-mêmes. Les paramètres d'une fonction sont à considérer comme des variables locales qui sont initialisées automatiquement par les valeurs indiquées lors d'un appel. A l'intérieur de la fonction, nous pouvons donc changer les valeurs des paramètres sans influencer les valeurs originales dans les fonctions appelantes. 02/03/08 160

XIII – LES FONCTIONS Passage par valeur Exemple Carre int carre (int x) { return (x*x); Avant appel i = 3 } de carre j = ? void exemple () { int i =3; Appel de i = 3 x = 3 int j ; carre j = carre (i) ; printf (″%d″ , j) ; Après appel j = 9 9 02/03/08 161

XIII – LES FONCTIONS Passage par adresse 02/03/08 162

FIN 02/03/08 163