Vous êtes sur la page 1sur 63

MODULE

Programmation en C
Université Thomas SANKARA
Sciences et Technologies
MPCI/L1/S2

Boureima KOUSSOUBE
❖Doctorant
❖Ingénieur de conception
❖Enseignant/Formateur
1
Objectif général
❑Comprendre le fonctionnement des programmes en
langage C

❑Prérequis
Cours d’initiation à la programmation en C (L1/S1)

2
Plan
• Généralité
• Etapes de création d’un programme
• Structure générale d’un programme en C
• Pointeurs
• Allocation dynamique
• Les chaines de caractère
• Structures
• Les types énumérés
• Fonctions
3
Généralité
Programme
❑Séquence d’instructions exécutable par un ordinateur

Langage de programmation
❑Ensemble de règles permettant à un être humain d’écrire
des programmes ( code source ) .
Exemple de langage de programmation:
➢C
➢C++
➢PYTHON
➢JAVA
➢MATLAB
4
Généralité
❑Historique
À l'époque où les ordinateurs pesaient des tonnes et faisaient la
taille de votre maison, on a commencé à inventer un langage de
programmation appelé l'Algol. Puis on a créé un nouveau langage
appelé le CPL, qui évolua lui-même en BCPL, qui prit ensuite le
nom de langage B.
Le langage C a été inventé au cours de l'année 1972 dans les
Laboratoires Bell . Il était développé en même temps qu'Unix par
Dennis Ritchie et Kenneth Thompson.

5
Généralité
❑Historique
Le langage C, s'il a subi quelques modifications, reste encore
un des plus utilisés aujourd'hui. Un peu plus tard, on a
proposé d'y ajouter des choses : une sorte d'amélioration, si
vous voulez. Ce nouveau langage, que l'on a appelé « C++ »,
est entièrement basé sur le C.
Le C++ n'est pas meilleur que le langage C, il permet juste de
programmer différemment.

6
Généralité
Types de programmes

❑Les programmes graphiques sont des programmes qui affichent


des fenêtres que l'on peut ouvrir, réduire, fermer, agrandir…
▪ Exemple : Word, Excel ...
Les programmeurs parlent de GUI (Graphical User Interface –
interface utilisateur graphique, en français).

❑Les programmes en console ont été les premiers à apparaître. À


l'époque, l'ordinateur ne gérait que le noir et blanc, et il n'était
pas assez puissant pour créer des fenêtres comme on le fait
aujourd'hui.
7
Etapes de création d’un programme
• Création d’un programme
❑Editer le programme
❑Compiler le programme
➢Erreur syntaxique
❑Exécuter le programme
➢Erreur sémantique

8
Etapes de création d’un programme
• Outils nécessaires
❑un éditeur de texte pour écrire le code source du programme. Ex:
bloc note
❑un compilateur pour transformer (« compiler ») votre source en
binaire. Ex
❑un débogueur pour vous aider à traquer les erreurs dans votre
programme. Ex

9
Etapes de création d’un programme
❖Identification des fichiers
• Lors de la programmation en C, nous travaillons donc avec
différents types de fichiers qui sont identifiés par leurs
extensions:
➢.C : fichiers source
➢.OBJ : fichiers compilés (versions objet)
➢.EXE : fichiers compilés et liés (versions exécutables)

10
Etapes de création d’un programme
❖Identification des fichiers

11
Etapes de création d’un programme
❖Préprocesseur
• Une particularité propre aux compilateurs C est qu'ils ne
travaillent pas directement sur le code source fourni par le
programmeur. En fait une phase, spéciale de réécriture du
programme précède toute compilation
• L'utilitaire se chargeant de cette phase de prétraitement se
nomme le préprocesseur.
• Notons que toutes les instructions du préprocesseur commencent
par un caractère « # ». Si vous oubliez ce premier caractère
l'instruction ne sera plus considérée comme une instruction du
préprocesseur, mais comme une instruction C prise en charge par
le compilateur. 12
Etapes de création d’un programme
❖L'instruction #include
Elle permet l'inclusion de fichiers.
En C, c'est grâce à ce mécanisme que nous allons pouvoir faire de
la programmation modulaire. Effectivement, coder 2 million de
lignes de code dans un seul est unique fichier, pour être très
problématique (temps de compilation extrêmement long, très
mauvaise maintenabilité du programme, ...). Il est donc conseillé
de répartir un tel programme dans plusieurs fichiers.
La syntaxe #include <filename> permet de rechercher le fichier
d'entête parmi celles proposées de base avec votre compilateur.
La syntaxe #include "filename" permet de rechercher le fichier
d'entête parmi celles développées au sein de votre programme. 13
Etapes de création d’un programme
❖La bibliothèque standard de C
<stdio.h> : Fournit les capacités centrales d'entrée/sortie du
langage C, comme la fonction printf.
<stdlib.h> : Pour exécuter diverses opérations dont la conversion,
la génération de nombres pseudo-aléatoires, l'allocation de mémoire,
le contrôle de processus, la gestion de l'environnement et des signaux,
la recherche et le tri.
<string.h> : Pour manipuler les chaînes de caractères.
<time.h> Pour convertir entre différents formats de date et d'heure
<math.h>: Pour calculer des fonctions mathématiques courantes.
<complex.h> : Pour manipuler les nombres complexes
14
Etapes de création d’un programme
❖Préprocesseur
• L'instruction #define

15
Etapes de création d’un programme
❖Préprocesseur
• Remarque: le mot clé #Define ne sera pas compris par le
préprocesseur alors que l'instruction #define sera
parfaitement prise en charge.

16
Etapes de création d’un programme
❖Compilation
La compilation d'un fichier se passe en deux temps : en premier
lieu, le préprocesseur C est invoqué, ce qui produit un fichier
temporaire en mémoire, puis ensuite, la phase de compilation
est lancée sur ce fichier temporaire.

17
Etapes de création d’un programme
• Compilateur
GNU Compiler Collection, abrégé en GCC, est un ensemble de
compilateurs créés par le projet GNU. GCC est un logiciel libre
capable de compiler divers langages de programmation, dont C,
C++, Objective-C, Java, Ada et Fortran. GCC est utilisé pour le
développement de la plupart des logiciels libres.

Il s'agit d'un compilateur multiplateformes, incontournable sur les


systèmes Unix. Il est fourni sous forme de sources et se compile
avec le compilateur C existant du système

18
Etapes de création d’un programme
❖Edition des liens
• La phase d'édition des liens permet de rassembler tous les fichiers .o
pour produire l'exécutable.
• Cette étape est requise, car comme le programme est réparti sur
différents fichiers, quand vous en compilez un seul, les appels aux
fonctions définies dans d'autres fichiers de codes ne peuvent être
correctement liés.
• La phase d'édition des liens interconnecte donc tous les appels de
fonctions inter-fichiers. Seul l'exécutable finalement produit peut être
exécuté (un .o ne pouvant pas correctement fonctionner)

19
Etapes de création d’un programme
❑Les IDE
Un IDE est un ensemble d'outils et d'installations dont les programmeurs
ont besoin pour le développement et la conception de logiciels. Il fournit
au programmeur un environnement dans lequel il peut écrire et tester
ses codes
1.Code::Blocks
2.NetBeans
3.CodeLite
4.Turbo C++
5.DevC++

20
Etapes de création d’un programme
Code::Blocks

21
Structure générale d’un programme en C

• Exemple 1

#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Bonjour !\n");
return 0;
}

22
Structure générale d’un programme en C
• Exemple 1
#include < stdio.h > qui permet d’utiliser les fonctions de la
bibliothèque stdio.h dans le programme C. Cette bibliothèque
contient notamment les fonctions d’affichage à l’écran printf
et de lecture au clavier scanf. Autre bibliothèque :
#include<math.h> (Fichiers
Mathématiques).
#include <graph.h>(Fonctions Graphiques).

int main(void) :déclaration de la fonction main, le programme


principal.
23
Structure générale d’un programme en C
• Exemple 1
{
printf("Bonjour !\n");
return 0;
}
Corps du programme
oprintf : un affichage du mot “Bonjour !” à l’écran
o\n : retour à la ligne après l’affichage du mot “Bonjour !”.
oreturn 0:Il indique seulement que la valeur 0 est retournée au
système (ce qui indique que le programme ce termine sans erreur).
24
Structure générale d’un programme en C
• Exemple 1
• NB
❖Chaque instruction se termine par un point virgule.
❖Les instructions sont placées dans les accolades du main
❖Les (bons) programmeurs mettent des commentaires pour clarifier
leur code. /∗ commentaire ici ∗/

25
Structure générale d’un programme en C
• Les bibliothèques et les fonctions prédéfinies
❖Utilisation des bibliothèques de fonctions
La pratique en C exige l'utilisation de bibliothèques de fonctions.
Ces bibliothèques sont disponibles dans leur forme précompilées
(extension: .LIB). Pour pouvoir les utiliser, il faut inclure des fichiers
en-tête (extension .h) dans nos programmes. Ces fichiers
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.
L'instruction # include insère les fichiers en-tête indiqués comme
arguments dans le texte du programme au moment de la
compilation. 26
Structure générale d’un programme en C
• Exemple 2
#include <stdio.h>
int main(void)
{
int a;
int b;
int c;
printf(‘’Entrez la valeur de a/n’’);
scanf(‘’%d’’, &a);
printf(‘’Entrez la valeur de b /n’’);
scanf(‘’%d’’, &b);
c=a+b;
printf(‘’Somme de %d et %d est egale %d’’, a,b,c);
return 0;
} 27
Les pointeurs
• VARIABLES
Dans un programme, il apparaît des variables qui permettent de donner
des noms à des données. Chaque variable doit avoir un type (nombre
entier, nombre réel, caractère, suite de caractères, ou type plus complexe).
Chaque variable a aussi un identificateur qui est le nom de la variable. Une
déclaration d’une variable peut être de la forme : int nbre1;
➢ int type de la variable nbre1
➢ nbre1 nom de la variable
➢ &nbre1 adresse de la variable
❑Pour afficher l’adresse d’une variable
❑Utiliser %p
28
Les pointeurs
• MÉMOIRE CENTRALE ET ADRESSES (Exemple)

Adresses Valeurs
0x0000001 000110 nbre1
0x0000002


0x0000A01
0x0000A02 000111 Nbre 2


0x00B0001
0x0000D04
… 29
Les pointeurs
• VARIABLES DE TYPE POINTEUR
• Un pointeur est une variable d'un type spécial qui contient l'adresse
d'une autre variable.
• On dit qu'il pointe vers cette variable. Celui-ci devra aussi connaitre le
type de la variable vers laquelle il pointe puisque la taille d'une variable
(en octets) dépend de son type. La déclaration d'un pointeur devra
donc indiquer le type d'objet vers lequel il pointe (on dit d'un pointeur
qu’il est type)

30
Les pointeurs
• LES SYNTAXES DE DECLARATION
❑type *identificateur;
int *X;
oX : adresse de la variable pointée
o*X : valeur de la variable pointée
o&X : adresse du pointeur

31
Les pointeurs
• MÉMOIRE CENTRALE, ADRESSES et POINTEURS
Exemple : int* Nbre1
Adresses Valeurs
0x0000001 000110 Nbre1
0x0000002


0x0000A01
0x0000A02 *Nbre1


0x00B0001
0x0000D04
… 32
Les pointeurs
• LES SYNTAXES DE DECLARATION
❑type *identificateur;
int *x, y;
❑Type* identificateur;
int* x, y;
On accède a la valeur stockée a l'adresse contenue dans un pointeur
grâce a l'operateur unaire
int a;
int* x;
x=&a;
a et *x font référence au même emplacement mémoire
*x = 3; /* l’objet pointe par x prend pour valeur 3 */
33
Les pointeurs
• EXEMPLE
#include <stdio.h>
int main(void)
{
int x = 2;
int *p = &x; /* x et *p deviennent synonymes */
*p = 3;
printf("La nouvelle valeur de x est %d\n", x);
/* doit afficher la valeur 3 */
return 0;
}
34
Les pointeurs
• Initialisation d’un pointeur
❑La déclaration d'un pointeur alloue un espace mémoire pour le
pointeur mais pas pour l'objet pointe. Le pointeur pointe sur
n'importe quoi au moment de sa déclaration. Il est conseille
d'initialiser tout pointeur avant son utilisation effective avec la
valeur NULL (constante prédéfinie qui vaut 0) ce qui, par
convention, indique que le pointeur ne pointe sur rien.

35
Les pointeurs
• PASSAGE DE PARAMÈTRE PAR VALEUR
❑Lorsqu’on passe un paramètre à une fonction, la fonction ne peut pas
modifier la variable. La variable est automatiquement recopiée et la
fonction travaille sur une copie de la variable. La modification de la
copie n’entraîne pas une modification de la variable originale. C’est le
passage de paramètre par valeur.

36
Les pointeurs
• PASSAGE DE PARAMÈTRE PAR VALEUR
#include <stdio.h>
void NeModifiePas(int x)
{
x = x+1; /* le x local est modifie, pas le x du main */
}
int main(void)
{
int x=1;
NeModifiePas(x);
printf("%d", x); /* affiche 1 : valeur de x inchangee */
return 0;
}
37
Les pointeurs
• PASSAGE DE PARAMÈTRE PAR ADRESSE
L’idée du passage par adresse est que, pour modifier une variable par un appel
de fonction, il faut passer en paramètre non pas la variable, mais un pointeur qui
pointe sur la variable. Ainsi, le paramètre est l’adresse de x. Lorsqu’on modifie
la mémoire à cette adresse, la donnée x est modifiée, car on travaille bien sur
l’emplacement mémoire de x

38
Les pointeurs
PASSAGE DE PARAMÈTRE PAR ADRESSE : Exemple
#include <stdio.h>
void Modifie(int *p) /* la fonction suivante prend en paramètre un pointeur */
{ *p = *p+1;
}
int main(void)
{ int x=1; /* la varible x n’est pas un pointeur */
int *p;
p = &x; /* pointeur qui pointe sur x */
Modifie(p);
printf("%d", x); /* affiche 2 */
return 0;
}
39
Les pointeurs
• PASSAGE DE PARAMÈTRE PAR ADRESSE
❑Lors de l’appel de la fonction Modifie, le pointeur p est recopié, et la
fonction Modifie travaille sur une copie du pointeur p. Cependant, les
pointeurs p et sa copie contiennent la même valeur, qui est l’adresse de x.

❑ Lorsqu’on modifie l’objet qui se trouve à cette adresse, on modifie x.


L’utilisation explicite d’un pointeur dans le main est superflue, on peut
passer directement l’adresse de x à la fonction, sans avoir besoin de
définir une variable de type pointeur dans le main.

40
Les pointeurs
• PASSAGE DE PARAMÈTRE PAR ADRESSE
#include <stdio.h>
void Modifie(int *p) /* parametre de type pointeur */
{
*p = *p+1; /* ce pointeur p a pour valeur &x (x du main) */
}
int main(void)
{
int x=1;
Modifie(&x); /* on passe directement l’adresse de x */
printf("%d", x); /* affiche 2 */
return 0;
}
41
Allocation dynamique
• Révision
Ecrire une programme qui demande a l’utilisateur d’entre la
taille du tableau et saisi les éléments
• Pointeur de tableau
La déclaration d'un tableau réserve de la place en mémoire pour
les éléments du tableau et fournit une constante de type pointeur
qui contient l'adresse du premier élément du tableau. Cette
constante est identifié par l'identificateur donné au tableau (sans
crochets). C'est cette constante de type pointeur qui va permettre
de manipuler facilement un tableau en particulier pour le passer en
paramètre d'une fonction puisqu'on ne passera a la fonction que
l'adresse du tableau et non tous ses éléments.

42
Allocation dynamique
• Pointeur de tableau : exemple
int tab[10];
déclare un tableau de 10 éléments. tab contient l'adresse du premier élément et donc
l'expression:
tab == &tab[0] est VRAIE. On a donc de même:
*tab == tab[0]
tab[1] == *(tab+1)
tab[k] == *(tab+k)
Les deux écritures sont autorisées. La différence entre un tableau et un pointeur est
qu'un tableau est une constante non modifiable alors qu'un pointeur est une variable.

43
Allocation dynamique
• ALLOCATION AVEC malloc (calloc)
La déclaration de variables dans la fonction main ou globalement réserve de l'espace en
mémoire pour ces variables pour toute la durée de vie du programme. Elle impose par
ailleurs de connaitre avant le début de l’exécution l'espace nécessaire aux stockage de
ces variables et en particulier la dimension des tableaux. Or dans de nombreuses
applications le nombre d’éléments d'un tableau peut varier d'une exécution du
programme a l'autre. La bibliothèque stdlib fournit des fonctions qui permettent de
réserver et de libérer de manière dynamique (a l’exécution) la mémoire. La fonction qui
permet de réserver de la mémoire est malloc. Par exemple, pour réserver de la
mémoire pour un entier x, on écrira:
type* nomvariable;
Nomvariable = (type*) malloc(sizeof(type));
• int* x;
• x=(int*) malloc(sizeof(int));
44
Les chaines de caractères
Définition
• Une chaîne de caractères (appelée string en anglais) est une suite de
caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu
de caractères, défini par le code ASCII.
• En langage C, une chaîne de caractères est un tableau, comportant
plusieurs données de type char, dont le dernier élément est le
caractère nul '\0', c'est-à-dire le premier caractère du code ASCII
(dont la valeur est 0).

45
Les chaines de caractères
• Créer une chaîne de caractères
• Pour définir une chaîne de caractères en langage C, il
suffit de définir un tableau de caractères. Le nombre
maximum de caractères que comportera la chaîne sera
égal au nombre d'éléments du tableau moins un
(réservé au caractère de fin de chaîne).
• char tab[25];

46
Les chaines de caractères
• initialiser une chaîne de caractères

❖Longueur explicite
char chaine[25] = { 'B', 'o', 'n', 'j', 'o', 'u', 'r' };

❖Longueur implicite
char chaine[] = { 'B', 'o', 'n', 'j', 'o', 'u', 'r', '\0' };

47
Les chaines de caractères
• Exemple

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char chaine[255];
printf("Quel est votre prénom ? ");
scanf("%s", &chaine);
printf("Bonjour %s !\n", chaine);
return 0;
}
48
LES STRUCTURES
• DÉFINITION
Une structure est un type qui permet de stocker plusieurs données, de
même type ou de types différents, dans une même variable de type
structure. Une structure est composée de plusieurs champs, chaque champ
correspondant à une donnée.

• UTILISATION
• La gestion d'un répertoire
• Représentation de nombre complexe
• …

49
LES STRUCTURES
• SYNTAXE
struct nom
{
type1 champ1 ;
type2 champ2 ;
-------
typen champn ;
};

50
LES STRUCTURES
• EXEMPLE 1: DÉCLARATION D’UNE STRUCTURE
Déclaration d’une structure étudiant qui contient trois
champs de type différent.
Struct etudiant
{
char nom [30];
char prenom [30];
float matricule;
};
❖La déclaration d’une variable de type struct etudiant :
struct etudiant E1;
Possibilité de l’affectation globale : E1=E2
51
LES STRUCTURES
• EXEMPLE 2: DÉCLARATION D’UNE STRUCTURE
Le langage C permet de créer de nouveaux noms de types de
données grâce a la fonction typedef.
typedef struct vecteur
{
float x,y,z;
}Vect3D;
• La déclaration d’une variable de type Vect3D:
Vect3D P;

52
LES STRUCTURES
• EXEMPLE 3: INITIALISATION
• struct etudiant
{
char nom [30] ;
char prenom [20] ;
int age ;
int note;
};
struct etudiant E1 = {"KABORE", "Paul", 10} ;

❑Possibilité de l’affectation globale : E2=E3


53
LES STRUCTURES
• UTILISATION D’UNE STRUCTURE ET DES FONCTIONS
Exercice application
1. Ecrire une fonction de saisie des coordonnées d’un vecteur,
2. Ecrire une fonction qui prend en paramètre deux vecteurs et
qui renvoi leur somme.
3. Ecrire une fonction qui prend en paramètre deux vecteurs et
qui renvoi leur produit scalaire.
4. Ecrire une fonction qui affiche des coordonnées d’un vecteur,
5. Tester toutes ces fonctions dans un programme principal

54
Types énumérés
Définition
Énumération (ou enum) est un type de données défini par l'utilisateur
en C. Il est principalement utilisé pour attribuer des noms à des
constantes entières. Ces noms facilitent la lecture et la maintenance
d'un programme.

Syntaxe
enum nomdutype {liste d’énumérateurs};
enum est un mot-clé C, nomdutype sert d’identificateur du type défini,
liste d’identificateurs correspond a la liste de noms des constantes
entières.

55
Types énumérés

• Exemples simples
enum Semestre { AUTOMNE, PRINTEMPS, ETE,HIVER};
enum Sexe {MASCULIN, FEMININ};

56
Types énumérés
• Exemples
#include < stdio.h>
enum semaine { dimanche, lundi, mardi, mercredi, jeudi, vendredi, samedi };
int main(void){
enum semaine jour;
jour=mercredi;
printf("le jour est : %d \n", jour);
printf("le numéro du jour suivant est : %d \n", jour + 1);
return 0;
}

57
Les fonctions
• Définition
❖une suite d’instructions ;
❖marquée à l’aide d’un nom ;
❖qui a vocation à être exécutée à plusieurs reprises ;
❖qui rassemble des instructions qui permettent d’effectuer une
tâche précise

58
Les fonctions
• Fonction itérative
• Itérer : répéter n fois un processus en faisant changer la
valeur des variables jusqu’a obtention du résultat.

• Fonction récursive
Une fonction récursive est, en programmation, une fonction qui
s’appelle elle-même.

59
Les fonctions
• Fonction récursive
type nondelafonction(type1 p1, type2 p2,..., typek pk)
début
si condition faire
retourner calcul;
sinon faire
FonctionRécursive(...);
...
FonctionRécursive(...);
retourner quelque-chose;
fin.
60
Les fonctions
• Fonction factoriel récursive
unsigned int factoriel (unsigned int n)
{
if (n == 1 || n == 0)
return 1;
else
return n * factoriel (n - 1);
}

61
Les fonctions
❑Exemple de fonction récursive

62
FIN

63

Vous aimerez peut-être aussi