Table Of ContentIIUUTT AA LLyyoonn 11
IIUUTT AA LLyyoonn 11
IInnffoorrmmaattiiqquuee
IInnffoorrmmaattiiqquuee
PPPPPPrrrrrrooooooggggggrrrrrraaaaaammmmmmmmmmmmaaaaaatttttitiiiiooioooonnnnnn pp pppprrrrrrooooooccccccéééééédddddduuuuuurrrrrraaaaaallllleeleeee
dddddduuuuuu CC CCCC-----A-AAAAANNNNNNSSSSSSIIIII I aa aaaauuuuuu CC CCCC++++++++++++
CC
~~ AA.. PP.. ~~ AAnnnnééee 22000033 ~~22000044 UUCCBB
~~ AA.. PP.. ~~ AAnnnnééee 22000033 ~~22000044 UULLBB
LL
Université LYON I ~ IUT-A Département Informatique ~ A.P. ~ Programmation procédurale: du C-ANSI au C++ 0
Programmation procédurale - du C-ANSI au C++
Chapitre 1 Eléments du langage C-ANSI page 1
Chapitre 2 Les types construits page 23
Chapitre 3 Les fonctions page 43
Chapitre 4 Les fichiers page 51
Chapitre 5 Compléments page 63
Chapitre 6 Les programmes multi-fichiers page 69
Chapitre 7 Du C-ANSI au C++ en programmation procédurale page 83
Annexe A La bibliothèque standard page 93
Annexe B Squelette d'un programme en langage C page 115
Annexe C Table ASCII page 117
Annexe D Bibliographie succincte page 119
Avertissement:
Le présent document constitue le support papier du cours de programmation du premier
semestre de première année. L'auteur n'autorise pas son utilisation ou sa diffusion en dehors
du Département Informatique de l'IUT-A de l'Université Lyon-I.
Merci de signaler les erreurs ou fautes constatées. Bonne lecture.
A. P.
Université LYON I ~ IUT-A Département Informatique ~ A.P. ~ Programmation procédurale: du C-ANSI au C++ 1
CHAPITRE 1 - ELEMENTS DE BASE DU LANGAGE C-ANSI
1 Introduction:
Ce polycopié s’adresse aux étudiants en première année du département Informatique de
l’IUT-A de l’Université LYON-I. Il a pour but de présenter les éléments du langage C dans
l’environnement système Unix, mais n’a pas pour vocation d’être un cours sur les concepts et
méthodes de programmation. Il existe à ce propos, d’autres documents au département
auxquels il faut se référer. Il en est de même pour le développement de programme C ou C++
avec l'outil Visual Studio.
Le lecteur trouvera en annexe une bibliographie indicative, sachant que le manuel qui fait
autorité reste l’ouvrage de KERNIGHAN et RITCHIE intitulé " C-ANSI " publié aux
éditions MASSON. En particulier sont évoqués dans l’ouvrage cité, l’historique et les
évolutions du langage C.
2 L’organisation d’un programme C :
Le langage C est dédié à la programmation procédurale. Un programme est un ensemble de
séquences d’opérations sur des structures de données qui se déroulent suivant un schéma
établi par un algorithme. La philosophie de la programmation procédurale est de décomposer
et de structurer un programme pour faciliter sa construction et sa maintenance.
Les niveaux de décomposition en C sont dans l’ordre hiérarchique décroissant:
• le module : c’est un fichier texte comprenant la définition de fonctions
• la fonction : c’est un ensemble de blocs
• le bloc : c'est un ensemble d'instructions; un bloc est délimité par les caractères { et }
• l'instruction: une instruction est une structure de contrôle ou une expression; une
expression se termine par la caractère;
La décomposition dépend de la complexité du problème à traiter. Ainsi suivant le cas, un
programme peut être obtenu à partir :
• d’un seul module qui ne comprend qu’une seule fonction (cas rare)
• d’un seul module comprenant plusieurs fonctions
• de plusieurs modules comprenant eux-mêmes une ou plusieurs fonctions.
Parmi l’ensemble des fonctions qui constituent un programme, il en existe une particulière qui
constitue le point d’entrée du programme et qui s’appelle main(). Il ne doit y avoir qu’une
seule fonction main() par programme, même s'il est composé de plusieurs modules.
Université LYON I ~ IUT-A Département Informatique ~ A.P. ~ Programmation procédurale: du C-ANSI au C++ 2
3 Production d’un exécutable :
Un programme exécutable est donc le résultat de la compilation et de l’édition des liens entre
modules. La compilation donne à partir d’un fichier texte appelé source un module objet.
L’édition des liens est la phase qui permet à partir de plusieurs modules objets créés par
l’utilisateur ou déjà existants dans une bibliothèque, d’obtenir un exécutable.
On obtient dans l'environnement Unix donc le schéma de production suivant :
Fichier texte: le nom du fichier comprend l’extension .c
Fichier source
Compilation Phase de traduction par le compilateur
Fichier objet : le nom est identique au fichier source mais
l’extension est maintenant .o
Fichier objet
Autre fichier objet Bibliothèque de
fichiersobjects
Edition des liens
Fic hier Fichier exécutable d’extension .e
exécutable
Université LYON I ~ IUT-A Département Informatique ~ A.P. ~ Programmation procédurale: du C-ANSI au C++ 3
Afin de faciliter la phase de compilation pour les premiers TP qui ne nécessitent pas la
réalisation de plusieurs modules, il existe au département, une procédure de compilation
appelée ccomp. Pour invoquer cette procédure il suffit de passer la commande :
ccomp tp1.c
Cette procédure génère soit un fichier exécutable d’extension .e (tp1.e dans l’exemple),
soit un fichier des erreurs d’extension .err (tp1.err ici).
La compilation séparée de plusieurs modules en vue de l’obtention d’un exécutable est
abordée au chapitre 6 du présent document.
4 Structure d’un fichier texte C :
Nous ne nous intéressons dans un premier temps qu’aux programmes C ne comprenant qu’un
seul module texte; les principes de la programmation modulaire sont décrits au chapitre 6.
Dans cette optique, le niveau de décomposition d'un programme est alors la fonction avec une
fonction particulière appelée main(). Une fonction est paramètrable de sorte que le
traitement qu’elle effectue soit généralisable. La fonction main() n’échappe pas à cette
règle, mais dans un premier temps, on considérera qu’il s’agit d’une fonction particulière qui
ne reçoit aucun argument et qui ne retourne rien.
Un programme constitué à partir d’un seul module comprend donc :
Des définitions générales
La fonction main
fonction 1
fonction 2
Exemple :
Soit le programme qui souhaite la bienvenue aux nouveaux étudiants :
#include <stdio.h>
char pnom[25] ;
void main(void) {
printf("\n Entrez votre prenom : " ) ;
scanf("%s",pnom) ;
printf("\n\n Bienvenue a l’IUT %s",pnom) ;
}
Université LYON I ~ IUT-A Département Informatique ~ A.P. ~ Programmation procédurale: du C-ANSI au C++ 4
Ce programme amène plusieurs remarques :
1. même un programme très simple invoque des fonctions qui ont déjà été écrites et qui sont
archivées en tant que modules objet dans une bibliothèque. Ici les fonctions d’entrée-sortie
scanf et printf sont des fonctions de la bibliothèque standard fournie avec le
compilateur C.
2.pour utiliser des fonctions de la bibliothèque standard, il faut annoncer le type de
paramètres qu’elles attendent et le type de valeur retournée s’il y en a. Cette annonce est
réalisée par un prototype de la fonction qui indique ces renseignements. C’est le rôle de la
directive #include d’inclure les fichiers où se trouvent les prototypes des fonctions de
la bibliothèque qui vont être utilisées.
3.la directive #include n’est pas destinée au compilateur, mais au préprocesseur. Le
préprocesseur effectue une analyse du texte source avant le compilateur et effectue
l’inclusion du texte indiqué chaque fois qu’il rencontre cette directive. Ici on inclut un
texte appelé <stdio.h>. Ce fichier est appelé un fichier d’en-tête (ou headers d’ou le
.h). Tous les headers se trouvent sous le répertoire /usr/include/ ou dans
/usr/local/include. Il s’agit donc de fichiers texte contenant des définitions et des
prototypes de fonctions.
4. pour indiquer qu’une fonction ne reçoit pas d’argument, on met (void) après son
identificateur. Pour indiquer qu’elle ne retourne rien on met void devant son
identificateur.
5 Eléments du langage C :
5-1 Identificateurs, symboles, mots réservés :
Un identificateur est un nom donné à une variable, une constante ou une fonction. Il est
défini par le programmeur, et peut être constitué à partir de lettres (minuscules et majuscules
étant différentes), du caractère de soulignement _ et de chiffres. Cependant un identificateur
ne doit pas commencer par un chiffre. Les implémentations récentes du C-ANSI admettent
des identificateurs pouvant aller jusqu'à 31 caractères.
Les symboles sont des caractères ou groupe de caractères utilisés principalement pour
représenter des opérateurs ou des caractère spéciaux.
& ~ " # { } ( ) [ ] | \ / * - + % , ; . < > = ! ?
Université LYON I ~ IUT-A Département Informatique ~ A.P. ~ Programmation procédurale: du C-ANSI au C++ 5
Les mots réservés sont des identificateurs servant de mots-clés au langage C.
auto break case char
const continue default do
double else enum extern
float for goto if
int long register return
short sizeof static struct
switch typedef union unsigned
void volatile while
Les commentaires dans un programme C commencent par la séquence /* et se terminent par
la séquence */ quel que soit le nombre de lignes entre les deux. On ne peut pas inclure un
commentaire dans un commentaire.
5-2 Les objets manipulés :
Un objet au sens de la programmation procédurale est caractérisé par :
1) un identificateur
2) un type qui impose :
• une représentation interne
• des opérateurs associés
3) une valeur variable ou constante
a) Les types de base :
type char : codé sur un octet et considéré comme un entier sur 8 bits signés ou non
(unsigned); un caractère est représenté par le code ASCII donné en annexe
type int : entier en représentation interne en complément à 2; ils sont signés ou non
signés(unsigned) . On distingue :
short :codés sur 2 octets
long :codés sur 4 octets
int :codés sur 2 ou 4 octets suivant la machine cible
type float : nombre réel en représentation interne suivant la norme IEEE 754. On
distingue :
float : simple précision codé sur 4 octets
double : double précision codés sur 8 octets
Université LYON I ~ IUT-A Département Informatique ~ A.P. ~ Programmation procédurale: du C-ANSI au C++ 6
b) Mécanisme de construction de type :
En dehors des types de base, il existe également le type tableau, le type structure, le type
union, et le type pointeur. Ces types sont étudiés au chapitre 2. Enfin le langage C offre la
possibilité au programmeur de construire lui-même ses propres types grâce à la directive
typedef. Il s'agit en fait de renommer un type existant (soit un type de base soit un type
construit) afin d'en améliorer la compréhension suivant le contexte. La syntaxe pour définir
un type nouveau est la suivante: typedef type Nouveautype;
Exemple:
typedef int Age; /* Age est maintenant un type nouveau */
Age anciennete; /* anciennete est une variable de type Age */
c) Les constantes :
constantes entières : on les exprime généralement en décimal ou en hexadécimal précédées
alors de 0x.Une constante correspondant à un entier long est suffixée
par la lettre L
Exemple :
127 constante en base 10
0x7F constante en base 16
127L constante entier long en base 10
0177 constante entier long en base 8
constantes réelles : on les exprime soit avec une partie fractionnaire, soit sous forme mantisse
plus exposant
Exemple :
25.8 forme fractionnaire
1.03e-2 forme avec exposant
constantes chaînes : en C, il n’existe pas de type primitif chaîne. Une chaîne est traitée
comme une suite d’octets se terminant par le caractère '\0' (octet au 0
binaire). On peut définir une constante chaîne de caractères en donnant sa
valeur encadrée par les caractères spéciaux " "; il s’agira d’une suite
d’octets terminée par '\0'. On peut aussi utiliser le mécanisme de
substitution de texte offert par le préprocesseur, mais il ne s’agira alors
que de définir des constantes symboliques qui ne pourront pas être
utilisées en tant que chaîne constante.
Université LYON I ~ IUT-A Département Informatique ~ A.P. ~ Programmation procédurale: du C-ANSI au C++ 7
Exemple :
"ceci est un message" chaîne constante terminée par '\0'
#define TAILLE 10 substitution dans le texte de TAILLE par 10
constantes caractère : une constante caractère est de type entier mais codée sur un octet. Le
codage peut se faire de plusieurs façons:
• on écrit le caractère entre apostrophes
• on code le caractère en donnant la valeur décimal de con code ASCII
• on code le caractère sous la forme '\ooo' ou la séquence ooo est la
représentation en base 8 du code ASCII du caractère à coder
• on code le caractère sous la forme '\xhhh' où la séquence hhh est
la représentation en base 16 du code ASCII du caractère à coder
Exemple :
c='A' c est le caractère A
c=65 idem mais on donne le code ASCII de A en décimal
c='\101' code ASCII de A est en octal
c='\x41' code ASCII de A est en hexadécimal
Il existe également des caractères spéciaux permettant de coder des caractères courants. Ces
caractères sont notés sous la forme '\lettre'. On donne ici les caractères spéciaux les
plus usuels.
'\b' caractère backspace (retour arrière)
'\n' caractère saut de ligne (new line)
'\t' caractère de tabulation horizontale
'\\' caractère \
d) Les variables :
On définit une variable en précisant son type et son identificateur. On ne peut pas utiliser une
variable non définie. Il est possible en langage C d’initialiser une variable au moment de sa
définition.
Exemple:
int x=3; /* definition de la variable x comme entier initialisé à
la valeur 3 */
Université LYON I ~ IUT-A Département Informatique ~ A.P. ~ Programmation procédurale: du C-ANSI au C++ 8
Les termes de déclaration et de définition sont souvent confondus. Ils ne sont pourtant pas
porteur du même sens. Une définition implique une allocation mémoire, celle ci étant faite au
moment de la traduction du source, alors qu'une déclaration ne constitue que l'association d'un
identificateur à un type. Il n'y a pas alors de réservation mémoire; nous verrons ainsi qu'un
objet peut être déclaré plusieurs fois dans le cas de la programmation modulaire, alors qu'il ne
doit être défini qu'une seule fois.
La définition d'un objet implique également des règles de visibilité (c'est à dire où cet objet
peut être atteint). Les règles de portée des variables sont étudiées au chapitre 3.
Le C-ANSI permet de préciser au moment de la définition d'un objet que ce dernier ne devra
pas être modifié. On utilise pour cela le qualificatif const. Etant donné que l'objet ne pourra
plus être modifié par la suite, il doit donc être initialisé au moment de sa définition.
Exemple:
const int x=3;
5-3 Les opérateurs :
Les opérateurs permettent de construire des expressions. Ils spécifient les calculs à effectuer
sur leurs arguments appelés opérandes qui sont soit des objets (variables ou constantes) soit
des sous-expressions.
a) Les expressions :
Une expression est construite à partir d'opérandes ou d'expressions, reliés par un opérateur.
Un opérateur ne peut s'appliquer que sur un certain type d'opérande. En conséquence une
expression a elle même un type résultant suivant les types des opérandes et de l'opérateur qui
la composent et en fonction de certaines conversions étudiées plus loin.
Exemples:
• l'expression x + y est constitué de l'opérateur + et des opérandes x et y qui peuvent être
de type int ou float. Le résultat est de type int si x et y sont de type int; il est de
type float si x et/ou y sont de type float.
• l'expression x + (y*z) est constituée de l'opérande x et de la sous-expression (y*z).
Le type du résultat est soit int soit float suivant le type des opérandes.
Université LYON I ~ IUT-A Département Informatique ~ A.P. ~ Programmation procédurale: du C-ANSI au C++ 9
Description:Chapitre 7 Du C-ANSI au C++ en programmation procédurale page 83. Annexe A La Le langage C est dédié à la programmation procédurale. Un programme est un Pour assurer la comptabilité des types, on passe par