Académique Documents
Professionnel Documents
Culture Documents
Nombre de séances de CM : 10
Durée de la séance de CM : 02H00
Structure Structure
#include <stdio.h> // declaration des fichiers d’en-tête Importation des bibliothèques
#include<stdio.h>
//Décalaration des constantes #include<conio.h>
// déclaration des types et fonctions Déclaration des constantes
#define nom_cte val
//déclarations des variables globales
nom_cte est le nom utilisé pour le désigner dans le programme et val sa valeur fixée
int main()// Début du programme principal Exemple : #define DEUX 5
{
Corps du programme
// Déclaration des variables
int main ( )
printf("Hello, world\n"); {
return 0 printf ( "Bonjour à tous \n! " ) ;
getch ( ) ;
}
return 0 ;
}
1
Fonction principale (main) Fonction principale (main)
int main ( ) Commentaires
{déclaration des variables séquence de caractères ignorée par le compilateur,
2
directive # define Éléments de base
définition de symboles ; #define remplacé remplaçant Type
substituer « rempacé » par « remplaçant » dans le fichier source Variables
#define entier int permet de remplacer le mot « entier » par Opérateurs
« int » dans le texte.
expressions
#define bonjour printf("bonjour")
définition de macros.
définition des symboles avec des paramètres
#define carre(a) a*a
identificateur Variables
Utiliser pour désigner les différents objets manipulés par porte un nom permettant de l’identifier.
le programme : variables, fonctions, etc toujours la déclarer avant toute utilisation.
peut se faire n’importe où dans le programme,
formés d’une suite de caractères choisis parmi les
n’est visible (accessible) que partout dans les accolades qui
lettres ou les chiffres, dont le premier est toujours entourent cette déclaration.
une lettre. Possibilité de l’initialiser à la déclaration
caractère souligné (_) est considéré comme une lettre syntaxe de déclaration :
Sensibilité à la casse : majuscules différentes des <Type> <liste des variables> ;
minuscules <type> var1=val1, var2=val2…;
Mots-clés: réservés par le langage à un usage bien int a, i=0;
défini, ne doivent pas être utilisés comme char c1,c2;
const int n = 20 ; // n est une variable mais sa valeur ne doit pas changer
identificateur
3
Instructions de base Instructions de base
Saisie des valeurs : récupérer les valeurs saisies par un Affectation
utilisateur et la placer dans une variable var, on utilise la se fait avec le symbole = (variable (lvalue)= expression;) →
Expression est évaluée est sa valeur sauvegardée dans variable.
fonction suivante :
peut se aussi se faire k = i = 5 (k= (i=5);
scanf ( "%descripteur" , &var);
Le programme attend jusqu'à ce que l'utilisateur ait saisi une
Affichage
valeur et valide. La valeur saisie est alors affectée à la variable Pour afficher le contenu d’une variable à l’écran, on utilise la
<variable>. fonction :
Variable toujours précédée par &. printf ( "%descripteur" , <variable >);
Les caractères spéciaux :
Fin de ligne : \n
Tabulation : \t
4
Types de données Opérateurs
Caractères arité 1 (opérateur unaire) ;
type char;
Arité 2 (opérateur binaire);
représenter le code ASCII d'un caractère, il est donc codé sur 1 octet.
descripteur d’un char :%c. Arité 3 (opérateur ternaire)
Affectation
char a ;
a=‘T’; // Affectation du caractère T à la variable a
Un opérateur peut être:
Constantes préfixé (opération avant l’opérande)
valeur portant un nom, pas modifiables. postfixé (opérateur près opérande)
définit dans l'entête de la source, avec #include.
#define <NOM CONSTANTE> <valeurConstante>,
Utiliser la fonction sizeof(x) pour connaitre la taille de x en nombre d’octets.
5
Opérateurs binaires Opérateurs binaires
décalage de bits à droite : a >> n multiplication: *
effectue n décalages des bits de la Division: /
représentation binaire de a vers la droite. Modulo: %
décalage de bits à gauche: a << n Addition: +
effectue n décalage des bits de la représentation Soustraction :-
binaire de a vers la gauche.
Multiplication et division sont prioritaires sur
l’addition et la différence
6
Opérateurs ternaire Opérateurs séquentiels
<variable> = (<condition >) ? <valeur si exprimer plusieurs calculs successifs au sein d’une même
vrai> : < valeur si faux> ; expression.
a * b , i + j // d’abord a*b puis i+j
Valeur si vrai: valeur que variable prend si la
i++, j = i + k // ……………………
condition est VRAI associativité de gauche à droite
Valeur si faux : valeur que variable prend si la i++, j = i+k, j-- //………………
condition est FAUX
condition : expression booléenne
Exemple: affecter à x le maximum de a et b
x= (a>=b)? a:b;
x=a==b?x:y attention à la priorité
7
Conversion implicite Instructions composées
1. Que faire quand on additionne un « int » et
un « float » par exemple?
2. Le type ayant la plus grande représentation
Traitements conditionnels
(nombre de bits) domine
int -> long -> float -> double -> long double Instructions répétitives
Exemple
int n; long p; float x
n * p + x est un float
8
Traitements conditionnels Traitements répétitifs
Switch
switch(<nomvariable >) Boucle pour for
{ boucle tant que while
case <valeur 1> : <bloc instructions 1 > ; break ;
case <valeur 2> : <bloc instructions 2 > ; break ; Répéter … jusqu’à (faire …
...
case <valeur n> : <bloc instructions n > ; break ;
tant que) do …while
default : <Bloc instructions par défaut>
}
« break » pour sortir du switch en sautant les valeurs
suivantes
9
Traitements répétitifs (do…while)
do
{
Types de données structurés
<bloc instructions >
}
Tableaux
while(<condition >);
Évaluer la condition après chaque passage dans la Chaines de caractères
boucle. pointeurs
exécuter le corps de la boucle tant que la condition Structures
est vérifiée.
énumérations
Pas absolument équivalente à répéter (en algo)
tableaux tableaux
Ensemble d’éléments (variables) de même type, Initialisation à la déclaration
identifié par un nom. disposer par ordre d'indice croissant en les séparant par
des virgules les éléments du tableau.
Chaque variable du tableau numérotée, par un
<type> <nom>[<taille >] = <valeur d’initialisation >;
indice. <type> <nom>[<taille >] = {<valeur 0 >, <valeur 1 >, . . . , <valeur
les indices commencent toujours à 0. n-1>}
Possibilité d’ommettre la dimension
int tab[] = { 10, 20, 5, 0, 3 } ;
Déclaration
Accès aux éléments
<type> <nomdutableau>[<taille >] ; accéder à l’élément d’indice i : T[i]; 0 ≤ i ≤ n-1.
10
tableaux Pointeurs
tableaux à plusieurs indices l’adresse d’une lvalue (variable): &
<type> <nomdutableau>[<taille1 >][taille2]... ; manipuler des adresses à l’aide des pointeurs
Initialisation int * ad ; // ad est un pointeur sur un entier
<type> <nom>[<taille1 >][taille2] = {liste des valeurs}; int n ; // n est un entier
Possibilité de disposer les éléments ligne par ligne n = 20 ;
entre accolades ad = &n ; // variable ad la valeur de l’expression &n, ie
<type> <nom>[<taille >] [ligne]= {{ligne1},{ligne2},….} //l’adresse de n
*ad = 30 ; // met dans le mot dont l’adresse est dans ad, la valeur
//30, n prend la valeur 30
11
Chaînes de caractères Chaînes de caractères (E/S)
Accès aux éléments Fonctions classiques
Par accéder à l’élément d’indice i+1 de la chaîne ch : Utiliser scanf et printf avec pour descripteur %s
ch[i] scanf(‘’%s ’’, ch) // absence de &
Tableau de chaine de caractères NB: la chaine se termine avec un délimiteur classique (espace,…)
Tableau de pointeurs sur les char
Fonctions spécifiques
char * jour[7] = { "lundi", "mardi", "mercredi", "jeudi", "vendredi",
Lecture : fgets (<chaine >, <taille >, stdin ) ;
"samedi", "dimanche« }
gets(ch)
Accès aux éléments
Ecriture: puts
Jour[i]
puts (ch)
NB: seule la fin de ligne marque la fin de la chaine
12
bibliothèque string.h bibliothèque string.h
strcpy ( ch1, ch2 ) : strchr ( ch, car )
recopie la chaîne ch2 dans l’emplacement recherche, dans chaîne ch, la première position
du caractère car.
d’adresse ch1.
strrchr ( ch, car )
la taille de ch1 soit suffisante pour recherche, dans chaîne ch, la dernière position
accueillir la chaîne ch2. du caractère car.
strncpy ( ch1, ch2, lgmax ) strstr ( ch, ss_ch )
limiter la recopie au lgmax premiers recherche, dans chaîne ch la première
caractères. occurrence complète de la sous-chaîne ss_ch
13
Structure (enregistrement) Structure (accès aux éléments)
exemple : un article est caractérisé par un Séparer le nom de la variable et
numéro, une quantité et un prix.
struct enreg celui du champ par un « . »
{ Nom_variable.nom_champ *
int numero ;
int qte ;
scanf(‘’%d’’,&art1.numero)
float prix ; art1.qte=0;
};
Affectation des enregistrements
struct enreg art1, art2 ;// une déclaration de
variables art2=art1;
14
typedef (enregistrement) Tableaux + structures
Un champ peut être de type tableau
typedef struct
struct personne { char nom[30] ;
{ int numero ;
char prenom [20] ;
int qte ; float heures [31] ;
float prix ; } employe, etudiant;
} Article;
Article devient désormais un type et on peut Nom et prenom sont des tableaux de 30 caractères ;
déclarer les variables de ce type heures qui est un tableau de 31 flottants
Accès aux éléments:
Article art1, art2 ;
etudiant.prenom
Printf(‘’%f’’,etudiant.heures[0]);
15
pointeur Pointeur et tableau
manipulation des adresses par l’intermédiaire de
variables int t[10];
t est équivalente à &t[0].
nom_type * variable variable est un pointeur sur un
t est comme étant de type pointeur sur le type correspondant aux
objet de type nom_type
éléments du tableau : int *.
*variable accès à la valeur pointée par le pointeur
équivalences :
variable
t+1 &t[1]
&variable pointeur (adresse) de la variable t+i &t[i]
int * ad ; t[i] * (t+i)
int n ; Exemple: initialiser un tableau de 10 entiers à 1
n = 20 ; int i ;
ad = &n ; for (i=0 ; i<10 ; i++)
*ad = 30 ; * (t+i) = 1 ;
16
Sous - programmes Sous – programmes (fonctions)
scinder en plusieurs parties et de regrouper dans Possibilité de ne pas utiliser la valeur de
le programme principal les instructions en
retour
décrivant les enchaînements
Exemple: printf ou scanf
éviter des séquences d’instructions répétitives
partage d’outils (fonctions)
Possibilité de ne fournir aucune valeur
Deux formes:
(void);
Procédure : aucun retour Le type de retour peut être quelconque
Fonction: retour attendu (instruction return) Possibilité pour une fonction de modifier les
valeurs de certains de ses arguments
NB: en C, tout sous programme est une fonction
17
Sous – programmes (définition) Sous – programmes (utilisation)
Avec un retour Doit être au moins déclarée ou définie avant tout
Type nomFonction (paramètres) appel
{ {
/* …..
Nomprocedure (paramètres)
Declaration des variables locales
type a=nomFonction(paramètres)
*/
….
<bloc d’instructions> }
Return <valeur de retour>
}
int double(int a){ Tout se passe comme si l’appel avait fait une copie de la
valeur de l’argument et utiliser cette copie
return 2*a;
} void permuter (int a, int b)
main()
int main() { int c ;
{ void permuter (int a, int b) ;
printf ("début echange : %d int n=10, p=20 ;
{int x=5;
%d\n", a, b) ; printf ("avant appel : %d %d\n", n, p)
printf(‘’%d’’, double(x)); c=a ;a=b;b=c; ;
… printf ("fin echange : %d permuter(n, p) ;
} %d\n", a, b) ; printf ("après appel : %d %d", n, p)
}
}
18
Passage de paramètres (par adresse) Paramètres en nombre variable
Passer l’adresse du paramètre que son nom Fichier à incluire #include <stdarg.h>
Modifier sa valeur à travers son adresse en mémoire
déclaration:
Paramètre modifié après l’appel si la fonction l’a modifié
main() type nom_fonction(paramètres fixes,…) les
void permuter (int *a, int *b)
{ int c ; { void permuter(int a, int b) ; « … » indiquent que la partie variable des
printf ("début echange : %d int n=10, p=20 ; paramètres
%d\n", *a, *b) ; printf ("avant appel : %d %d\n",
c = *a ; *a = *b ; *b = c ; n, p) ; Cas des fonctions scanf et printf
printf ("fin echange : %d %d\n", permuter(&n, &p) ;
*a, *b) ;
}
printf ("après appel : %d %d", n,
p)
}
19
Variables globales Variables locales
Déclarées hors du bloc Portée limitée au bloc où elles sont déclarées
Peut-être utilisée dans n’importe quel sous programme Aucun lien avec les variables globales de même nom
du fichier, à condition d’être déclarée avant Variable locale statique: conserve d’un appel à l’autre;
Permet d’échanger les données entre les sous initialisé à 0 par défaut
programmes static type nom_variable;
int i ; main()
void test(void) { for (i=1 ; i<=5 ; i++) void test_static(void)
{ printf ("%de appel\n", i) ; { static int i ;
test() ;
} i++ ;
} printf ("appel numéro : %d\n", i) ;
}
20
Passage des structures en paramètres
Passage par adresse
void init(struct etudiant * e){
e->matricule=‘’16Z002’’;
e->age=17;
Gestion dynamique de la mémoire
}
Appel
etudiant e1;
init(&e1);
Accès aux élément: * ou ->
(*e1).matricule ou e1->age
21
Fonction de création de l’espace Libération de l’espace
Syntaxe: void * malloc (size_t taille) pouvoir récupérer des emplacements dont on n’a plus
besoin.
Précision de la taille des éléments
libérer un emplacement préalablement alloué.
Fonction sizeof()
Fonction : free
long * adr ; free(adr)
adr = malloc (100 * sizeof(long)) ; Libère l’espace réservé à adr
22
Fichiers
Déclaration
FILE * nom_fichier;
Ouverture lier le nom logique (utilisé dans le
programme au nom physique (vu dans l’explorateur)
Fichiers
nom_fichier = fopen (chemin, « mode") ;
chemin: emplacement du fichier
mode: comment ouvrir le fichier
En lecture: r
En écriture : w
En ajout: a
…
23
Fichiers (lecture) Fichiers (lecture)
fread (&var, sizeof(type de var), nb_blocs, Lecture et affichage du contenu du fichier F
nom_fichier) ; do
&var : adresse d’un bloc d’informations à écrire ;
sizeof(typede var) : taille d’un bloc, en octets
{ fread (&n, sizeof(int), 1, F) ;
Nb_blocs : nombre de blocs de cette taille que l’on if ( !feof(F) ) printf ("\n%d", n) ;
souhaite transférer dans le fichier;
}
nom_fichier : adresse de la structure décrivant le fichier.
feof (F) : fin du fichier F, plus de données à lire
while ( !feof(F) ) ;
Fichiers (prédifinis)
stdin : unité d’entrée (par défaut, le clavier) ;
stdout : unité de sortie (par défaut, l’écran) ;
stderr : unité d’affichage des messages
d’erreurs (par défaut, l’écran).
stdaux : unité auxiliaire ;
stdprt : imprimante
24